{
	"version": 0,
	"name": "Spec → PR",
	"resources": [
		{
			"id": "specs",
			"label": "Specs",
			"icon": "📝",
			"properties": { "Title": "title", "Status": "status" }
		}
	],
	"state": { "pageId": "…", "prUrl": "https://github.com/…/pull/42" },
	"nodes": [
		{
			"id": "code",
			"label": "Coding agent implements the spec and opens or updates the PR",
			"agentic": true,
			"reads": ["pageId", "prUrl?"],
			"writes": ["prUrl"],
			"out": null
		},
		{
			"id": "qa",
			"label": "QA agent runs the change end to end",
			"agentic": true,
			"reads": ["prUrl"],
			"out": null,
			"aux": {
				"label": "fails",
				"color": "blue",
				"shape": { "failures": ["Login button 404s"] }
			},
			"error": { "shape": { "logsUrl": "…" } }
		},
		{
			"id": "review",
			"label": "Review agent reviews the PR",
			"agentic": true,
			"reads": ["prUrl"],
			"out": null,
			"aux": {
				"label": "changes requested",
				"color": "amber",
				"shape": { "comments": ["Missing tests"] }
			}
		},
		{
			"id": "notify",
			"label": "Ping Slack that the PR is ready",
			"reads": ["prUrl"],
			"out": null
		},
		{
			"id": "blocked",
			"label": "Mark the spec Blocked and link the QA logs",
			"reads": ["pageId"],
			"uses": ["specs"],
			"out": null
		}
	],
	"edges": [
		{
			"from": null,
			"to": "code",
			"label": "When a spec page is created in Specs",
			"uses": ["specs"],
			"shape": { "pageId": "…", "title": "Add dark mode" },
			"writes": ["pageId"]
		},
		{ "from": "code", "to": "qa" },
		{ "from": "qa", "to": "review" },
		{ "from": "qa.aux", "to": "code", "limit": 5 },
		{ "from": "review", "to": "notify" },
		{ "from": "review.aux", "to": "code", "limit": 3 },
		{ "from": "notify", "to": null },
		{ "from": "qa.error", "to": "blocked" },
		{ "from": "blocked", "to": null }
	]
}
