opencastle 0.32.8 → 0.32.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/cli/convoy/spec-builder.d.ts +16 -0
  2. package/dist/cli/convoy/spec-builder.d.ts.map +1 -1
  3. package/dist/cli/convoy/spec-builder.js +115 -62
  4. package/dist/cli/convoy/spec-builder.js.map +1 -1
  5. package/dist/cli/pipeline.d.ts.map +1 -1
  6. package/dist/cli/pipeline.js +279 -116
  7. package/dist/cli/pipeline.js.map +1 -1
  8. package/dist/cli/plan.d.ts.map +1 -1
  9. package/dist/cli/plan.js +19 -7
  10. package/dist/cli/plan.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/cli/convoy/spec-builder.ts +124 -58
  13. package/src/cli/pipeline.ts +324 -128
  14. package/src/cli/plan.ts +25 -7
  15. package/src/dashboard/dist/data/convoys/demo-api-v2.json +3 -3
  16. package/src/dashboard/dist/data/convoys/demo-auth-revamp.json +4 -4
  17. package/src/dashboard/dist/data/convoys/demo-dashboard-ui.json +18 -18
  18. package/src/dashboard/dist/data/convoys/demo-data-pipeline.json +9 -9
  19. package/src/dashboard/dist/data/convoys/demo-deploy-ci.json +1 -1
  20. package/src/dashboard/dist/data/convoys/demo-docs-update.json +3 -3
  21. package/src/dashboard/dist/data/convoys/demo-perf-opt.json +4 -4
  22. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  23. package/src/dashboard/public/data/convoys/demo-api-v2.json +3 -3
  24. package/src/dashboard/public/data/convoys/demo-auth-revamp.json +4 -4
  25. package/src/dashboard/public/data/convoys/demo-dashboard-ui.json +18 -18
  26. package/src/dashboard/public/data/convoys/demo-data-pipeline.json +9 -9
  27. package/src/dashboard/public/data/convoys/demo-deploy-ci.json +1 -1
  28. package/src/dashboard/public/data/convoys/demo-docs-update.json +3 -3
  29. package/src/dashboard/public/data/convoys/demo-perf-opt.json +4 -4
  30. package/src/orchestrator/prompts/fix-prd.prompt.md +4 -9
  31. package/src/orchestrator/prompts/generate-convoy.prompt.md +1 -0
  32. package/src/orchestrator/prompts/generate-prd.prompt.md +29 -0
  33. package/src/orchestrator/prompts/validate-prd.prompt.md +14 -37
@@ -42,28 +42,28 @@
42
42
  "name": "libs/auth/src/jwt-middleware.ts",
43
43
  "type": "file",
44
44
  "task_id": "auth-t2",
45
- "created_at": "2026-03-18T01:38:47.255Z"
45
+ "created_at": "2026-03-18T16:27:21.681Z"
46
46
  },
47
47
  {
48
48
  "id": "artifact-demo-auth-revamp-libs-auth-src-rls-policies-sql",
49
49
  "name": "libs/auth/src/rls-policies.sql",
50
50
  "type": "file",
51
51
  "task_id": "auth-t3",
52
- "created_at": "2026-03-18T01:38:47.255Z"
52
+ "created_at": "2026-03-18T16:27:21.681Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-auth-revamp-reports-auth-review-summary-md",
56
56
  "name": "reports/auth-review-summary.md",
57
57
  "type": "summary",
58
58
  "task_id": "auth-t5",
59
- "created_at": "2026-03-18T01:38:47.255Z"
59
+ "created_at": "2026-03-18T16:27:21.681Z"
60
60
  },
61
61
  {
62
62
  "id": "artifact-demo-auth-revamp-tests-auth-integration-test-ts",
63
63
  "name": "tests/auth/integration.test.ts",
64
64
  "type": "file",
65
65
  "task_id": "auth-t4",
66
- "created_at": "2026-03-18T01:38:47.255Z"
66
+ "created_at": "2026-03-18T16:27:21.681Z"
67
67
  }
68
68
  ],
69
69
  "has_more_events": false,
@@ -46,47 +46,47 @@
46
46
  ],
47
47
  "artifact_count": 6,
48
48
  "artifacts": [
49
+ {
50
+ "id": "artifact-demo-dashboard-ui-reports-panel-review-dashboard-md",
51
+ "name": "reports/panel-review-dashboard.md",
52
+ "type": "summary",
53
+ "task_id": "ui-t7",
54
+ "created_at": "2026-03-18T16:27:21.681Z"
55
+ },
56
+ {
57
+ "id": "artifact-demo-dashboard-ui-reports-visual-regression-json",
58
+ "name": "reports/visual-regression.json",
59
+ "type": "json",
60
+ "task_id": "ui-t6",
61
+ "created_at": "2026-03-18T16:27:21.681Z"
62
+ },
49
63
  {
50
64
  "id": "artifact-demo-dashboard-ui-src-components-DonutChart-tsx",
51
65
  "name": "src/components/DonutChart.tsx",
52
66
  "type": "file",
53
67
  "task_id": "ui-t3",
54
- "created_at": "2026-03-18T01:38:47.255Z"
68
+ "created_at": "2026-03-18T16:27:21.681Z"
55
69
  },
56
70
  {
57
71
  "id": "artifact-demo-dashboard-ui-src-components-KpiCard-tsx",
58
72
  "name": "src/components/KpiCard.tsx",
59
73
  "type": "file",
60
74
  "task_id": "ui-t2",
61
- "created_at": "2026-03-18T01:38:47.255Z"
75
+ "created_at": "2026-03-18T16:27:21.681Z"
62
76
  },
63
77
  {
64
78
  "id": "artifact-demo-dashboard-ui-src-components-design-tokens-ts",
65
79
  "name": "src/components/design-tokens.ts",
66
80
  "type": "file",
67
81
  "task_id": "ui-t1",
68
- "created_at": "2026-03-18T01:38:47.255Z"
69
- },
70
- {
71
- "id": "artifact-demo-dashboard-ui-reports-panel-review-dashboard-md",
72
- "name": "reports/panel-review-dashboard.md",
73
- "type": "summary",
74
- "task_id": "ui-t7",
75
- "created_at": "2026-03-18T01:38:47.256Z"
76
- },
77
- {
78
- "id": "artifact-demo-dashboard-ui-reports-visual-regression-json",
79
- "name": "reports/visual-regression.json",
80
- "type": "json",
81
- "task_id": "ui-t6",
82
- "created_at": "2026-03-18T01:38:47.256Z"
82
+ "created_at": "2026-03-18T16:27:21.681Z"
83
83
  },
84
84
  {
85
85
  "id": "artifact-demo-dashboard-ui-src-styles-animations-css",
86
86
  "name": "src/styles/animations.css",
87
87
  "type": "file",
88
88
  "task_id": "ui-t4",
89
- "created_at": "2026-03-18T01:38:47.256Z"
89
+ "created_at": "2026-03-18T16:27:21.681Z"
90
90
  }
91
91
  ],
92
92
  "has_more_events": false,
@@ -37,26 +37,26 @@
37
37
  "dlq_entries": [],
38
38
  "artifact_count": 3,
39
39
  "artifacts": [
40
- {
41
- "id": "artifact-demo-data-pipeline-src-etl-schema-ts",
42
- "name": "src/etl/schema.ts",
43
- "type": "file",
44
- "task_id": "etl-t1",
45
- "created_at": "2026-03-18T01:38:47.256Z"
46
- },
47
40
  {
48
41
  "id": "artifact-demo-data-pipeline-src-etl-pipeline-ts",
49
42
  "name": "src/etl/pipeline.ts",
50
43
  "type": "file",
51
44
  "task_id": "etl-t2",
52
- "created_at": "2026-03-18T01:38:47.257Z"
45
+ "created_at": "2026-03-18T16:27:21.682Z"
46
+ },
47
+ {
48
+ "id": "artifact-demo-data-pipeline-src-etl-schema-ts",
49
+ "name": "src/etl/schema.ts",
50
+ "type": "file",
51
+ "task_id": "etl-t1",
52
+ "created_at": "2026-03-18T16:27:21.682Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-data-pipeline-tests-etl-pipeline-test-ts",
56
56
  "name": "tests/etl/pipeline.test.ts",
57
57
  "type": "file",
58
58
  "task_id": "etl-t3",
59
- "created_at": "2026-03-18T01:38:47.257Z"
59
+ "created_at": "2026-03-18T16:27:21.682Z"
60
60
  }
61
61
  ],
62
62
  "has_more_events": false,
@@ -51,7 +51,7 @@
51
51
  "name": ".github/workflows/ci.yml",
52
52
  "type": "file",
53
53
  "task_id": "ci-t1",
54
- "created_at": "2026-03-18T01:38:47.257Z"
54
+ "created_at": "2026-03-18T16:27:21.683Z"
55
55
  }
56
56
  ],
57
57
  "has_more_events": false,
@@ -42,21 +42,21 @@
42
42
  "name": "docs/ARCHITECTURE.md",
43
43
  "type": "file",
44
44
  "task_id": "docs-t1",
45
- "created_at": "2026-03-18T01:38:47.257Z"
45
+ "created_at": "2026-03-18T16:27:21.683Z"
46
46
  },
47
47
  {
48
48
  "id": "artifact-demo-docs-update-docs-README-md",
49
49
  "name": "docs/README.md",
50
50
  "type": "file",
51
51
  "task_id": "docs-t1",
52
- "created_at": "2026-03-18T01:38:47.257Z"
52
+ "created_at": "2026-03-18T16:27:21.683Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-docs-update-docs-api-reference-json",
56
56
  "name": "docs/api-reference.json",
57
57
  "type": "json",
58
58
  "task_id": "docs-t2",
59
- "created_at": "2026-03-18T01:38:47.257Z"
59
+ "created_at": "2026-03-18T16:27:21.683Z"
60
60
  }
61
61
  ],
62
62
  "has_more_events": false,
@@ -42,28 +42,28 @@
42
42
  "name": "reports/bundle-analysis.json",
43
43
  "type": "json",
44
44
  "task_id": "perf-t1",
45
- "created_at": "2026-03-18T01:38:47.256Z"
45
+ "created_at": "2026-03-18T16:27:21.682Z"
46
46
  },
47
47
  {
48
48
  "id": "artifact-demo-perf-opt-reports-web-vitals-improvement-md",
49
49
  "name": "reports/web-vitals-improvement.md",
50
50
  "type": "summary",
51
51
  "task_id": "perf-t4",
52
- "created_at": "2026-03-18T01:38:47.256Z"
52
+ "created_at": "2026-03-18T16:27:21.682Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-perf-opt-src-charts-index-ts",
56
56
  "name": "src/charts/index.ts",
57
57
  "type": "file",
58
58
  "task_id": "perf-t2",
59
- "created_at": "2026-03-18T01:38:47.256Z"
59
+ "created_at": "2026-03-18T16:27:21.682Z"
60
60
  },
61
61
  {
62
62
  "id": "artifact-demo-perf-opt-src-utils-image-loader-ts",
63
63
  "name": "src/utils/image-loader.ts",
64
64
  "type": "file",
65
65
  "task_id": "perf-t3",
66
- "created_at": "2026-03-18T01:38:47.256Z"
66
+ "created_at": "2026-03-18T16:27:21.682Z"
67
67
  }
68
68
  ],
69
69
  "has_more_events": false,
@@ -1,25 +1,25 @@
1
1
  {
2
- "hash": "6f3a0532",
2
+ "hash": "5b4f7f3a",
3
3
  "configHash": "30f8ea04",
4
- "lockfileHash": "8703c4ad",
5
- "browserHash": "b7dda761",
4
+ "lockfileHash": "97dd4ca5",
5
+ "browserHash": "5e0c0fdd",
6
6
  "optimized": {
7
7
  "astro > cssesc": {
8
8
  "src": "../../../../../node_modules/cssesc/cssesc.js",
9
9
  "file": "astro___cssesc.js",
10
- "fileHash": "c1cf7e09",
10
+ "fileHash": "e6cc8cd0",
11
11
  "needsInterop": true
12
12
  },
13
13
  "astro > aria-query": {
14
14
  "src": "../../../../../node_modules/aria-query/lib/index.js",
15
15
  "file": "astro___aria-query.js",
16
- "fileHash": "e7144660",
16
+ "fileHash": "1b619d97",
17
17
  "needsInterop": true
18
18
  },
19
19
  "astro > axobject-query": {
20
20
  "src": "../../../../../node_modules/axobject-query/lib/index.js",
21
21
  "file": "astro___axobject-query.js",
22
- "fileHash": "66fabf2f",
22
+ "fileHash": "7383e20b",
23
23
  "needsInterop": true
24
24
  }
25
25
  },
@@ -51,21 +51,21 @@
51
51
  "name": "docs/api-v2-contract.json",
52
52
  "type": "json",
53
53
  "task_id": "api-t1",
54
- "created_at": "2026-03-18T01:38:47.256Z"
54
+ "created_at": "2026-03-18T16:27:21.682Z"
55
55
  },
56
56
  {
57
57
  "id": "artifact-demo-api-v2-reports-security-gate-failure-md",
58
58
  "name": "reports/security-gate-failure.md",
59
59
  "type": "summary",
60
60
  "task_id": "api-t3",
61
- "created_at": "2026-03-18T01:38:47.256Z"
61
+ "created_at": "2026-03-18T16:27:21.682Z"
62
62
  },
63
63
  {
64
64
  "id": "artifact-demo-api-v2-src-api-rate-limiter-ts",
65
65
  "name": "src/api/rate-limiter.ts",
66
66
  "type": "file",
67
67
  "task_id": "api-t2",
68
- "created_at": "2026-03-18T01:38:47.256Z"
68
+ "created_at": "2026-03-18T16:27:21.682Z"
69
69
  }
70
70
  ],
71
71
  "has_more_events": false,
@@ -42,28 +42,28 @@
42
42
  "name": "libs/auth/src/jwt-middleware.ts",
43
43
  "type": "file",
44
44
  "task_id": "auth-t2",
45
- "created_at": "2026-03-18T01:38:47.255Z"
45
+ "created_at": "2026-03-18T16:27:21.681Z"
46
46
  },
47
47
  {
48
48
  "id": "artifact-demo-auth-revamp-libs-auth-src-rls-policies-sql",
49
49
  "name": "libs/auth/src/rls-policies.sql",
50
50
  "type": "file",
51
51
  "task_id": "auth-t3",
52
- "created_at": "2026-03-18T01:38:47.255Z"
52
+ "created_at": "2026-03-18T16:27:21.681Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-auth-revamp-reports-auth-review-summary-md",
56
56
  "name": "reports/auth-review-summary.md",
57
57
  "type": "summary",
58
58
  "task_id": "auth-t5",
59
- "created_at": "2026-03-18T01:38:47.255Z"
59
+ "created_at": "2026-03-18T16:27:21.681Z"
60
60
  },
61
61
  {
62
62
  "id": "artifact-demo-auth-revamp-tests-auth-integration-test-ts",
63
63
  "name": "tests/auth/integration.test.ts",
64
64
  "type": "file",
65
65
  "task_id": "auth-t4",
66
- "created_at": "2026-03-18T01:38:47.255Z"
66
+ "created_at": "2026-03-18T16:27:21.681Z"
67
67
  }
68
68
  ],
69
69
  "has_more_events": false,
@@ -46,47 +46,47 @@
46
46
  ],
47
47
  "artifact_count": 6,
48
48
  "artifacts": [
49
+ {
50
+ "id": "artifact-demo-dashboard-ui-reports-panel-review-dashboard-md",
51
+ "name": "reports/panel-review-dashboard.md",
52
+ "type": "summary",
53
+ "task_id": "ui-t7",
54
+ "created_at": "2026-03-18T16:27:21.681Z"
55
+ },
56
+ {
57
+ "id": "artifact-demo-dashboard-ui-reports-visual-regression-json",
58
+ "name": "reports/visual-regression.json",
59
+ "type": "json",
60
+ "task_id": "ui-t6",
61
+ "created_at": "2026-03-18T16:27:21.681Z"
62
+ },
49
63
  {
50
64
  "id": "artifact-demo-dashboard-ui-src-components-DonutChart-tsx",
51
65
  "name": "src/components/DonutChart.tsx",
52
66
  "type": "file",
53
67
  "task_id": "ui-t3",
54
- "created_at": "2026-03-18T01:38:47.255Z"
68
+ "created_at": "2026-03-18T16:27:21.681Z"
55
69
  },
56
70
  {
57
71
  "id": "artifact-demo-dashboard-ui-src-components-KpiCard-tsx",
58
72
  "name": "src/components/KpiCard.tsx",
59
73
  "type": "file",
60
74
  "task_id": "ui-t2",
61
- "created_at": "2026-03-18T01:38:47.255Z"
75
+ "created_at": "2026-03-18T16:27:21.681Z"
62
76
  },
63
77
  {
64
78
  "id": "artifact-demo-dashboard-ui-src-components-design-tokens-ts",
65
79
  "name": "src/components/design-tokens.ts",
66
80
  "type": "file",
67
81
  "task_id": "ui-t1",
68
- "created_at": "2026-03-18T01:38:47.255Z"
69
- },
70
- {
71
- "id": "artifact-demo-dashboard-ui-reports-panel-review-dashboard-md",
72
- "name": "reports/panel-review-dashboard.md",
73
- "type": "summary",
74
- "task_id": "ui-t7",
75
- "created_at": "2026-03-18T01:38:47.256Z"
76
- },
77
- {
78
- "id": "artifact-demo-dashboard-ui-reports-visual-regression-json",
79
- "name": "reports/visual-regression.json",
80
- "type": "json",
81
- "task_id": "ui-t6",
82
- "created_at": "2026-03-18T01:38:47.256Z"
82
+ "created_at": "2026-03-18T16:27:21.681Z"
83
83
  },
84
84
  {
85
85
  "id": "artifact-demo-dashboard-ui-src-styles-animations-css",
86
86
  "name": "src/styles/animations.css",
87
87
  "type": "file",
88
88
  "task_id": "ui-t4",
89
- "created_at": "2026-03-18T01:38:47.256Z"
89
+ "created_at": "2026-03-18T16:27:21.681Z"
90
90
  }
91
91
  ],
92
92
  "has_more_events": false,
@@ -37,26 +37,26 @@
37
37
  "dlq_entries": [],
38
38
  "artifact_count": 3,
39
39
  "artifacts": [
40
- {
41
- "id": "artifact-demo-data-pipeline-src-etl-schema-ts",
42
- "name": "src/etl/schema.ts",
43
- "type": "file",
44
- "task_id": "etl-t1",
45
- "created_at": "2026-03-18T01:38:47.256Z"
46
- },
47
40
  {
48
41
  "id": "artifact-demo-data-pipeline-src-etl-pipeline-ts",
49
42
  "name": "src/etl/pipeline.ts",
50
43
  "type": "file",
51
44
  "task_id": "etl-t2",
52
- "created_at": "2026-03-18T01:38:47.257Z"
45
+ "created_at": "2026-03-18T16:27:21.682Z"
46
+ },
47
+ {
48
+ "id": "artifact-demo-data-pipeline-src-etl-schema-ts",
49
+ "name": "src/etl/schema.ts",
50
+ "type": "file",
51
+ "task_id": "etl-t1",
52
+ "created_at": "2026-03-18T16:27:21.682Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-data-pipeline-tests-etl-pipeline-test-ts",
56
56
  "name": "tests/etl/pipeline.test.ts",
57
57
  "type": "file",
58
58
  "task_id": "etl-t3",
59
- "created_at": "2026-03-18T01:38:47.257Z"
59
+ "created_at": "2026-03-18T16:27:21.682Z"
60
60
  }
61
61
  ],
62
62
  "has_more_events": false,
@@ -51,7 +51,7 @@
51
51
  "name": ".github/workflows/ci.yml",
52
52
  "type": "file",
53
53
  "task_id": "ci-t1",
54
- "created_at": "2026-03-18T01:38:47.257Z"
54
+ "created_at": "2026-03-18T16:27:21.683Z"
55
55
  }
56
56
  ],
57
57
  "has_more_events": false,
@@ -42,21 +42,21 @@
42
42
  "name": "docs/ARCHITECTURE.md",
43
43
  "type": "file",
44
44
  "task_id": "docs-t1",
45
- "created_at": "2026-03-18T01:38:47.257Z"
45
+ "created_at": "2026-03-18T16:27:21.683Z"
46
46
  },
47
47
  {
48
48
  "id": "artifact-demo-docs-update-docs-README-md",
49
49
  "name": "docs/README.md",
50
50
  "type": "file",
51
51
  "task_id": "docs-t1",
52
- "created_at": "2026-03-18T01:38:47.257Z"
52
+ "created_at": "2026-03-18T16:27:21.683Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-docs-update-docs-api-reference-json",
56
56
  "name": "docs/api-reference.json",
57
57
  "type": "json",
58
58
  "task_id": "docs-t2",
59
- "created_at": "2026-03-18T01:38:47.257Z"
59
+ "created_at": "2026-03-18T16:27:21.683Z"
60
60
  }
61
61
  ],
62
62
  "has_more_events": false,
@@ -42,28 +42,28 @@
42
42
  "name": "reports/bundle-analysis.json",
43
43
  "type": "json",
44
44
  "task_id": "perf-t1",
45
- "created_at": "2026-03-18T01:38:47.256Z"
45
+ "created_at": "2026-03-18T16:27:21.682Z"
46
46
  },
47
47
  {
48
48
  "id": "artifact-demo-perf-opt-reports-web-vitals-improvement-md",
49
49
  "name": "reports/web-vitals-improvement.md",
50
50
  "type": "summary",
51
51
  "task_id": "perf-t4",
52
- "created_at": "2026-03-18T01:38:47.256Z"
52
+ "created_at": "2026-03-18T16:27:21.682Z"
53
53
  },
54
54
  {
55
55
  "id": "artifact-demo-perf-opt-src-charts-index-ts",
56
56
  "name": "src/charts/index.ts",
57
57
  "type": "file",
58
58
  "task_id": "perf-t2",
59
- "created_at": "2026-03-18T01:38:47.256Z"
59
+ "created_at": "2026-03-18T16:27:21.682Z"
60
60
  },
61
61
  {
62
62
  "id": "artifact-demo-perf-opt-src-utils-image-loader-ts",
63
63
  "name": "src/utils/image-loader.ts",
64
64
  "type": "file",
65
65
  "task_id": "perf-t3",
66
- "created_at": "2026-03-18T01:38:47.256Z"
66
+ "created_at": "2026-03-18T16:27:21.682Z"
67
67
  }
68
68
  ],
69
69
  "has_more_events": false,
@@ -33,20 +33,15 @@ You are the Team Lead. The PRD below failed validation. Fix **every reported iss
33
33
  - Add the missing section with concrete, specific content — not placeholder text
34
34
  - If the section needs real data you cannot infer, write a reasonable default and mark with `<!-- TODO: verify -->`
35
35
 
36
- **Vague acceptance criteria**
37
- - Replace subjective language ("looks good", "feels responsive") with measurable conditions ("renders within 200ms", "meets WCAG 2.2 AA contrast ratio")
38
- - Replace modal verbs ("should", "might", "could") with definitive language ("must", "will")
39
-
40
- **Broad implementation scope**
41
- - Replace broad paths (`src/`, `the frontend`) with specific file names or subdirectory names
42
- - Remove glob patterns (`*`, `**`) from scope tables — use actual directory or file names
36
+ **Conflicting requirements**
37
+ - Resolve contradictions between sections pick the intent that best matches the feature goals
43
38
 
44
39
  **File partition conflicts**
45
40
  - If two parallel workstreams claim the same file, move one to a later phase with explicit dependency
46
41
  - Or split the file's responsibilities across the two workstreams so each touches distinct files
47
42
 
48
- **Missing dependency declarations**
49
- - Add `depends on: Phase N` to phases that require output from earlier phases
43
+ **Broad implementation scope**
44
+ - Replace excessively broad paths (`src/`, `the frontend`) with specific subdirectories or file names
50
45
 
51
46
  **Placeholder text**
52
47
  - Replace template filler ("2–3 sentences about…", "Description here") with real content derived from the feature description
@@ -205,6 +205,7 @@ When chain mode is detected:
205
205
  - **Only** generate tasks for the phases listed in the group scope. Do not include tasks from other phases.
206
206
  - Derive the convoy `name` from the group name (e.g. "Database Setup").
207
207
  - Derive the `branch` from the PRD's feature name (it will be overridden by the pipeline anyway).
208
+ - **Keep prompts concise** — write prompts that are complete and self-contained but avoid unnecessary verbosity. Focus on: what to do, which files to create/modify, key constraints, and acceptance criteria.
208
209
  - Keep all other conventions the same as for single-spec generation.
209
210
 
210
211
  ---
@@ -10,6 +10,8 @@ output: prd
10
10
 
11
11
  You are the Team Lead. Convert the feature request below into a structured Product Requirements Document (PRD). The PRD will be consumed by the `generate-convoy` step to produce an automated agent task spec, so every section must be **concrete**, **specific**, and **implementation-ready**.
12
12
 
13
+ > **⚠ QUALITY GATE:** This PRD goes through automated validation. Getting it right on the first attempt is critical — every fix cycle costs a full LLM round-trip. Follow ALL rules below precisely. The self-validation checklist at the end is mandatory.
14
+
13
15
  ## Feature Request
14
16
 
15
17
  {{goal}}
@@ -145,3 +147,30 @@ Measurable, binary checks that confirm the feature is shippable:
145
147
  - **[Open question]**: [What needs to be decided before implementation can start]
146
148
 
147
149
  If there are no risks or open questions, write "None identified."
150
+
151
+ ---
152
+
153
+ ## Self-Validation Checklist (MANDATORY)
154
+
155
+ Before outputting the PRD, verify **every item** below. The downstream validator will reject your PRD if any of the blocking checks fail — fix them now to avoid expensive retry cycles.
156
+
157
+ ### Structural Integrity
158
+
159
+ - [ ] **No conflicting requirements**: Technical Requirements, Non-Goals, Risks & Open Questions, and User Stories must not contradict each other.
160
+ - [ ] **No duplicate open questions**: If a question is already answered elsewhere, do not re-open it in Risks & Open Questions.
161
+ - [ ] **No circular dependencies**: Phase dependency graph is acyclic.
162
+ - [ ] **No placeholder text**: Every section has real content, not template filler ("2–3 sentences about…", "Description here").
163
+
164
+ ### Implementation Coherence
165
+
166
+ - [ ] **File completeness**: Every file mentioned in User Story acceptance criteria or Technical Requirements appears in the Implementation Scope table AND in the Task Breakdown file lists.
167
+ - [ ] **No file partition conflicts**: No two parallel workstreams (same phase) claim the same file.
168
+ - [ ] **Every workstream lists files**: Including verification-only workstreams — add "Files: none — verification only" if no artifacts are produced.
169
+ - [ ] **No orphan files**: Every file in the Implementation Scope table is assigned to exactly one workstream in Task Breakdown.
170
+ - [ ] **Scope specificity**: Implementation Scope uses specific subdirectory or file paths — not just `src/` or `the frontend`.
171
+
172
+ ### Language Quality
173
+
174
+ - [ ] **Testable acceptance criteria**: Every criterion is evaluable as deterministic pass/fail — no subjective language ("looks good", "feels responsive").
175
+ - [ ] **No optional modals in criteria**: Acceptance criteria do not use "should", "might", "could", "may" — use "must" or "will".
176
+ - [ ] **Domain acronyms expanded**: Non-standard acronyms are expanded on first use (standard ones like API, CLI, JSON, REST, etc. are fine).
@@ -10,9 +10,7 @@ output: validation
10
10
 
11
11
  You are a senior technical reviewer. Your job is to validate the PRD below against strict quality criteria before it is used to generate an automated convoy spec. A PRD that passes this gate will produce a clean, executable convoy spec. A PRD that fails will produce bad tasks.
12
12
 
13
- Be strict. Do not pass a PRD with vague language or missing sections just because it "looks mostly right."
14
-
15
- > **⚠ EXHAUSTIVENESS MANDATE**: You MUST report ALL issues in a single pass. Do NOT stop at the first few problems. Systematically evaluate every section against every check below. A second validation pass should find zero new issues — if it would, your first pass was incomplete.
13
+ Focus on **structural completeness** only the PRD generator already enforces language quality and style. Your job is to catch structural problems that would break convoy spec generation. **Pass the PRD if sections exist and the structure is internally consistent.** Do not fail for stylistic preferences, word choice, or minor phrasing.
16
14
 
17
15
  ## PRD to Validate
18
16
 
@@ -22,47 +20,26 @@ Be strict. Do not pass a PRD with vague language or missing sections just becaus
22
20
 
23
21
  ## Validation Checklist
24
22
 
25
- > If the PRD below contains the marker `<!-- validation-pass: N -->`, this is validation pass N. On pass 1, be maximally thorough — report every issue you can find. On pass 2+, verify that previous fixes were applied correctly and check for regressions, but do NOT invent new categories of issues not covered by the checks below.
26
-
27
- Evaluate **every item** below. If ALL items pass, respond `VALID`. If ANY item fails, respond `INVALID` with a specific, actionable issue list.
28
-
29
- ### Required Sections
30
-
31
- - [ ] `Overview` section is present and non-empty (at least 2 sentences)
32
- - [ ] `Goals` section is present with at least one numbered, specific goal
33
- - [ ] `Non-Goals` section is present (may say "None" but must not be missing)
34
- - [ ] `User Stories & Acceptance Criteria` section is present with at least one user story
35
- - [ ] Each user story has associated acceptance criteria (not just the story itself)
36
- - [ ] `Technical Requirements` section is present and non-empty
37
- - [ ] `Implementation Scope` section is present with a table or list of specific files/directories
38
- - [ ] `Task Breakdown` section is present with at least one phase and workstream
39
- - [ ] `Success Criteria` section is present with at least 3 measurable checks
40
- - [ ] `Risks & Open Questions` section is present (may say "None identified")
23
+ > If the PRD contains `<!-- validation-pass: N -->`, this is pass N. On pass 2+, only verify previous fixes were applied do NOT invent new issues.
41
24
 
42
- ### Acceptance Criteria Quality
25
+ Evaluate the checks below. If ALL pass, respond `VALID`. Only fail for checks marked BLOCKING.
43
26
 
44
- - [ ] All acceptance criteria can be evaluated as pass/fail (no subjective language like "looks good", "feels responsive", "is clean")
45
- - [ ] No criterion uses modal verbs that imply optionality ("should", "might", "could", "may")
46
- - [ ] No criterion references undefined external systems without explaining what they are
27
+ ### Required Sections (BLOCKING)
47
28
 
48
- ### Implementation Scope Quality
29
+ All of these sections must exist and contain real content (not just the heading):
30
+ `Overview`, `Goals`, `Non-Goals`, `User Stories & Acceptance Criteria`, `Technical Requirements`, `Implementation Scope`, `Task Breakdown`, `Success Criteria`, `Risks & Open Questions`.
49
31
 
50
- - [ ] Scope lists **specific** file names or subdirectory names — not broad paths like `src/` or `the frontend`
51
- - [ ] Scope table does not use glob patterns (`*`, `**`)
52
- - [ ] Every concern area has at least one specific file or directory
32
+ ### Structural Integrity (BLOCKING)
53
33
 
54
- ### Task Breakdown Quality
55
-
56
- - [ ] Each workstream lists the exact files it will modify
57
34
  - [ ] No two parallel workstreams (same phase) claim the same file
58
- - [ ] Phases have explicit dependency declarations (`depends on: Phase N`)
59
- - [ ] No circular dependencies
35
+ - [ ] No circular dependencies between phases
36
+ - [ ] No conflicting requirements across sections (e.g., a Non-Goal contradicts a Technical Requirement)
37
+ - [ ] Section content is not placeholder/template text (e.g., "2–3 sentences about…", "Description here")
60
38
 
61
- ### Language Quality
39
+ ### Implementation Coherence (BLOCKING)
62
40
 
63
- - [ ] No **domain-specific** acronyms or jargon used without explanation (standard software acronyms like API, CSS, HTML, CI/CD, CMS, SDK, CLI, URL, JSON, REST, SQL, SSR, SSG, CDN, DNS, TLS, JWT, OAuth, CRUD, DOM, UI, UX, HTTP, HTTPS, LTS, WCAG, RTL, MCP, PRD, E2E are considered universally understood and do not need expansion)
64
- - [ ] No conflicting requirements (e.g., "must be fast AND run full suite on every change")
65
- - [ ] Section content is not placeholder/template text (e.g., "2–3 sentences about…", "Description here")
41
+ - [ ] Implementation Scope lists specific files or subdirectories (not just `src/` or `the frontend`)
42
+ - [ ] Each workstream lists the files it will modify
66
43
 
67
44
  ---
68
45
 
@@ -76,7 +53,7 @@ Your entire response must be a single fenced JSON block — no text before or af
76
53
  }
77
54
  ```
78
55
 
79
- Or if any check fails:
56
+ Or if any **BLOCKING** check fails:
80
57
 
81
58
  ```json
82
59
  {