@mmerterden/multi-agent-pipeline 12.7.0 → 12.9.0

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 (247) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/install/_common.mjs +48 -0
  3. package/install/_dev-only-files.mjs +125 -5
  4. package/install/claude.mjs +14 -8
  5. package/install/copilot.mjs +5 -8
  6. package/package.json +17 -2
  7. package/pipeline/commands/multi-agent/analysis/SKILL.md +1 -1
  8. package/pipeline/lib/credential-store.sh +20 -0
  9. package/pipeline/multi-agent-refs/_account-picker.md +1 -1
  10. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  11. package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
  12. package/pipeline/multi-agent-refs/features/review-multi-repo.md +65 -0
  13. package/pipeline/multi-agent-refs/features/url-enrichment.md +93 -0
  14. package/pipeline/multi-agent-refs/phases/operations.md +28 -0
  15. package/pipeline/multi-agent-refs/phases/phase-0-init.md +3 -83
  16. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
  17. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
  18. package/pipeline/multi-agent-refs/phases/phase-4-review.md +50 -62
  19. package/pipeline/schemas/prefs.schema.json +6 -0
  20. package/pipeline/scripts/_smoke-root.sh +61 -0
  21. package/pipeline/scripts/agent-guard.py +57 -3
  22. package/pipeline/scripts/audit-log.sh +25 -0
  23. package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
  24. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
  25. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
  26. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
  27. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
  28. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
  29. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
  30. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
  31. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
  32. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
  33. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
  34. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
  35. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
  36. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
  37. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
  38. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
  39. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
  40. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
  41. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
  42. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
  43. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
  44. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
  45. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
  46. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
  47. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
  48. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
  49. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
  50. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
  51. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
  52. package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
  53. package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
  54. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
  55. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
  56. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
  57. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
  58. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
  59. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
  60. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
  61. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
  62. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
  63. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
  64. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
  65. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
  66. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
  67. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
  68. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
  69. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
  70. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
  71. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
  72. package/pipeline/eval/golden-tasks/README.md +0 -65
  73. package/pipeline/eval/intent-cases.json +0 -40
  74. package/pipeline/eval/run-metrics-fixture.json +0 -93
  75. package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
  76. package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
  77. package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
  78. package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
  79. package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
  80. package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
  81. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
  82. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
  83. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
  84. package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
  85. package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
  86. package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
  87. package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
  88. package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
  89. package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
  90. package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
  91. package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
  92. package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
  93. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
  94. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
  95. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
  96. package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
  97. package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
  98. package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
  99. package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
  100. package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
  101. package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
  102. package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
  103. package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
  104. package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
  105. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
  106. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
  107. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
  108. package/pipeline/eval/triage/README.md +0 -54
  109. package/pipeline/scripts/benchmark-phase-0.sh +0 -128
  110. package/pipeline/scripts/check-md-links.mjs +0 -88
  111. package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -302
  112. package/pipeline/scripts/eval-golden-tasks.mjs +0 -224
  113. package/pipeline/scripts/eval-intent.mjs +0 -107
  114. package/pipeline/scripts/eval-mine-corpus.mjs +0 -211
  115. package/pipeline/scripts/eval-triage.mjs +0 -171
  116. package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
  117. package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
  118. package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
  119. package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
  120. package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
  121. package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
  122. package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
  123. package/pipeline/scripts/lint-mcp-refs.mjs +0 -218
  124. package/pipeline/scripts/lint-skills.mjs +0 -154
  125. package/pipeline/scripts/run-smokes.mjs +0 -130
  126. package/pipeline/scripts/scorecard.mjs +0 -258
  127. package/pipeline/scripts/smoke-add-detail.sh +0 -137
  128. package/pipeline/scripts/smoke-agent-guard.sh +0 -74
  129. package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
  130. package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
  131. package/pipeline/scripts/smoke-ask-choice.sh +0 -42
  132. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
  133. package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
  134. package/pipeline/scripts/smoke-changelog-version.sh +0 -47
  135. package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
  136. package/pipeline/scripts/smoke-channels-flow.sh +0 -130
  137. package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
  138. package/pipeline/scripts/smoke-clarify.sh +0 -148
  139. package/pipeline/scripts/smoke-command-inventory.sh +0 -81
  140. package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
  141. package/pipeline/scripts/smoke-community-gates.sh +0 -75
  142. package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
  143. package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
  144. package/pipeline/scripts/smoke-context-budget.sh +0 -72
  145. package/pipeline/scripts/smoke-cost-budget.sh +0 -70
  146. package/pipeline/scripts/smoke-cost-summary.sh +0 -139
  147. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
  148. package/pipeline/scripts/smoke-description-tr.sh +0 -82
  149. package/pipeline/scripts/smoke-dev-critic.sh +0 -144
  150. package/pipeline/scripts/smoke-diff-explain.sh +0 -147
  151. package/pipeline/scripts/smoke-diff-risk.sh +0 -190
  152. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
  153. package/pipeline/scripts/smoke-eval-live.sh +0 -136
  154. package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
  155. package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
  156. package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
  157. package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
  158. package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
  159. package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
  160. package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
  161. package/pipeline/scripts/smoke-generate-issue.sh +0 -120
  162. package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
  163. package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
  164. package/pipeline/scripts/smoke-install-layout.sh +0 -248
  165. package/pipeline/scripts/smoke-intent-guard.sh +0 -86
  166. package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
  167. package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
  168. package/pipeline/scripts/smoke-keychain.sh +0 -158
  169. package/pipeline/scripts/smoke-language-axis.sh +0 -109
  170. package/pipeline/scripts/smoke-learning-curve.sh +0 -61
  171. package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
  172. package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
  173. package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
  174. package/pipeline/scripts/smoke-md-links.sh +0 -8
  175. package/pipeline/scripts/smoke-md2confluence.sh +0 -126
  176. package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
  177. package/pipeline/scripts/smoke-migrate-state.sh +0 -102
  178. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
  179. package/pipeline/scripts/smoke-model-fallback.sh +0 -89
  180. package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
  181. package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
  182. package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -194
  183. package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
  184. package/pipeline/scripts/smoke-own-punctuation.sh +0 -103
  185. package/pipeline/scripts/smoke-pack-contents.sh +0 -140
  186. package/pipeline/scripts/smoke-pat-audit.sh +0 -128
  187. package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
  188. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
  189. package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
  190. package/pipeline/scripts/smoke-phase-banner.sh +0 -101
  191. package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
  192. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
  193. package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
  194. package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
  195. package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
  196. package/pipeline/scripts/smoke-plan-safety.sh +0 -139
  197. package/pipeline/scripts/smoke-plan-todos.sh +0 -196
  198. package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
  199. package/pipeline/scripts/smoke-pre-commit.sh +0 -170
  200. package/pipeline/scripts/smoke-pref-migration.sh +0 -226
  201. package/pipeline/scripts/smoke-prefs-language.sh +0 -134
  202. package/pipeline/scripts/smoke-progress-contract.sh +0 -127
  203. package/pipeline/scripts/smoke-prune-logs.sh +0 -137
  204. package/pipeline/scripts/smoke-purge.sh +0 -138
  205. package/pipeline/scripts/smoke-push-retry.sh +0 -75
  206. package/pipeline/scripts/smoke-repo-map.sh +0 -300
  207. package/pipeline/scripts/smoke-review-readiness.sh +0 -92
  208. package/pipeline/scripts/smoke-review-watch.sh +0 -146
  209. package/pipeline/scripts/smoke-routines.sh +0 -84
  210. package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
  211. package/pipeline/scripts/smoke-run-metrics.sh +0 -50
  212. package/pipeline/scripts/smoke-search.sh +0 -187
  213. package/pipeline/scripts/smoke-shadow-git.sh +0 -224
  214. package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
  215. package/pipeline/scripts/smoke-skill-language.sh +0 -83
  216. package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
  217. package/pipeline/scripts/smoke-skill-scan.sh +0 -198
  218. package/pipeline/scripts/smoke-source-parity.sh +0 -85
  219. package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
  220. package/pipeline/scripts/smoke-sync-parity.sh +0 -92
  221. package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
  222. package/pipeline/scripts/smoke-telemetry.sh +0 -147
  223. package/pipeline/scripts/smoke-test-gap.sh +0 -183
  224. package/pipeline/scripts/smoke-token-budget.sh +0 -67
  225. package/pipeline/scripts/smoke-token-preflight.sh +0 -82
  226. package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
  227. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
  228. package/pipeline/scripts/smoke-triage-memory.sh +0 -174
  229. package/pipeline/scripts/smoke-update-check.sh +0 -135
  230. package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
  231. package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
  232. package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
  233. package/pipeline/scripts/smoke-validator-gates.sh +0 -164
  234. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
  235. package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
  236. package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
  237. package/pipeline/scripts/smoke-work-summary.sh +0 -163
  238. package/pipeline/scripts/smoke-workflow-audit.sh +0 -101
  239. package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
  240. package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
  241. package/pipeline/scripts/smoke-write-state.sh +0 -159
  242. package/pipeline/scripts/sync-parity-check.sh +0 -135
  243. package/pipeline/scripts/test-gap-rules/android.json +0 -25
  244. package/pipeline/scripts/test-gap-rules/ios.json +0 -34
  245. package/pipeline/scripts/test-gap-rules/node.json +0 -29
  246. package/pipeline/scripts/test-gap-rules/python.json +0 -25
  247. package/pipeline/scripts/validate-schemas.mjs +0 -88
@@ -1,14 +0,0 @@
1
- {
2
- "focus": "Consensus surfacing (schema v3.1.0). Both reviewers APPROVE on a security/auth surface, so triage has zero accepted/deferred/rejected - but the agreement is flagged `unverified` (same-base-model approval on a judgment-heavy surface is not treated as proof) and a disagreement note is surfaced. Verifies the consensus block passes validation with approved=true + verdict=unverified.",
3
- "exercises": [
4
- "Phase 4 both reviewers approve (no findings) on a biometric/Keychain change",
5
- "Triage short-circuits to empty buckets, approved=true",
6
- "Triage attaches consensus { reviewerCount: 2, verdict: unverified, disagreements: [...] }",
7
- "validate-triage accepts the consensus block and its cross-checks pass (unverified + approved=true is valid)"
8
- ],
9
- "regressionsCaught": [
10
- "If validate-triage stops accepting a consensus block, this fixture fails",
11
- "If the consensus cross-check wrongly rejects unverified+approved=true, this fixture fails",
12
- "If a unanimous-pass were emitted on a security surface (instead of unverified), the intent of consensus surfacing is lost - the metadata documents the expected verdict"
13
- ]
14
- }
@@ -1,12 +0,0 @@
1
- {
2
- "title": "Add a biometric gate before reading the Keychain auth token",
3
- "description": "Require a Face ID / Touch ID check (LAContext) before TokenStore returns the auth token, so a stolen unlocked device can't silently reuse the session. Keep the existing TokenStore API.",
4
- "inputType": "free-text",
5
- "expectedStack": "ios",
6
- "expectedLanguage": "Swift",
7
- "expectedFramework": "SwiftUI",
8
- "expectedBlockers": 0,
9
- "expectedDeferrals": 0,
10
- "baseBranch": "develop",
11
- "taskBranch": "feature/biometric-token-gate"
12
- }
@@ -1,65 +0,0 @@
1
- # Golden tasks - regression fixtures for the full pipeline (v6.2.F+)
2
-
3
- ## Purpose
4
-
5
- Each subdirectory here captures one **complete pipeline run as a reference trace**. A golden task fixture answers: *"If the pipeline ran on this input, what shape of outputs should Phase 1-4 produce?"*
6
-
7
- The runner (`pipeline/scripts/eval-golden-tasks.mjs`) does **not** invoke a real model - that would require API keys, add non-determinism, and make CI flaky. Instead it validates each fixture against the pipeline's schemas and checks internal consistency (Phase 2 todos reference Phase 1 files, Phase 4 findings reference files that exist in the diff, etc.).
8
-
9
- This is a **contract regression test**, same category as `eval-triage.mjs`. A live-model evaluation harness is a separate (and expensive) artifact, deferred to a future release.
10
-
11
- ## Fixture shape
12
-
13
- ```
14
- NN-short-kebab-name/
15
- task.json - input (task description, expected stack, target repo metadata)
16
- expected/
17
- phase-1-analysis.json - must conform to analysis-output.schema.json
18
- phase-2-plan.json - must conform to planning-output.schema.json
19
- phase-4-review.json - must conform to reviewer-output.schema.json (one entry per reviewer)
20
- phase-4-triage.json - must conform to triage-output.schema.json
21
- metadata.json - fixture-level notes (why this task is interesting, which phase it exercises most)
22
- ```
23
-
24
- `expected/` files are hand-curated reference outputs. They are not literal outputs of a past run - they are what a correct pipeline **should** produce on this input. When the spec changes (e.g. a new field added to analysis-output.schema.json), fixtures are updated to match.
25
-
26
- ## When to add a new fixture
27
-
28
- Add one when you discover a class of task that the pipeline should handle but no existing fixture covers. Examples:
29
- - A different primary stack (add Python / Node.js / Go fixtures once the runner supports them)
30
- - A task shape that historically caused regressions (e.g. multi-repo, figma-only, compliance-heavy)
31
- - An edge case in Phase 4 (e.g. a task where all reviewers approve but triage downgrades)
32
-
33
- Do **not** add fixtures just to inflate the count. The runner walks every fixture on `npm test` - each one adds seconds to CI. Quality > quantity.
34
-
35
- ## Running
36
-
37
- ```bash
38
- node pipeline/scripts/eval-golden-tasks.mjs # all fixtures
39
- node pipeline/scripts/eval-golden-tasks.mjs --case 01-... # one fixture
40
- node pipeline/scripts/eval-golden-tasks.mjs --json # CI-friendly output
41
- ```
42
-
43
- Exit codes: `0` all pass · `1` one or more fail · `2` usage / setup error.
44
-
45
- ## What the runner asserts (v6.2.F scaffolding)
46
-
47
- 1. **Schema conformance**: each `expected/phase-*.json` validates against its paired schema via the existing `validate-*.mjs` scripts.
48
- 2. **Internal consistency**: Phase 2 `todos[].touchedFiles[]` is a subset of Phase 1 `touchedAreas[].path`. Phase 4 `findings[].file` is a subset of Phase 2 planned files OR the current diff's files.
49
- 3. **Stack match**: `phase-1-analysis.json.stack.primary` equals `task.json.expectedStack`.
50
- 4. **No invention**: Phase 4 `findings[]` either (a) match Phase 2 planned files, or (b) surface via the `triage.rejected[]` bucket with a reason.
51
-
52
- ## What the runner does NOT do (yet)
53
-
54
- - Invoke a real Claude/Copilot agent. That's a separate multi-model eval, future work.
55
- - Score output "quality" - no rubric, no judge. Only contract checks.
56
- - Replay timing / token budgets. Tracker and budget smokes cover that orthogonally.
57
-
58
- ---
59
-
60
- ### Seed fixtures shipped with v6.2.F
61
-
62
- | # | Name | Focus |
63
- |---|------|-------|
64
- | 01 | `01-ios-bugfix-darkmode` | SwiftUI bugfix path - single repo, 2 files touched, 1 blocker finding caught, 0 deferrals |
65
- | 02 | `02-android-feature-compose` | Kotlin/Compose feature path - 3 files, 1 blocker, 1 deferred out-of-scope finding |
@@ -1,40 +0,0 @@
1
- {
2
- "_readme": "Labeled cases for the Phase 0 conceptual-vs-edit intent guard (pipeline/lib/classify-intent.sh). eval-intent.mjs runs each input through the classifier and reports accuracy. The DANGEROUS error is a real task read as 'question' (work silently skipped) or a clear question read as 'task' (a worktree spun up for nothing); 'ambiguous' is the safe middle and is accepted for genuinely vague input. Add real misclassifications here as they are found - this is the regression set.",
3
- "cases": [
4
- { "input": "fix the login crash on launch", "expected": "task" },
5
- { "input": "refactor the cache layer", "expected": "task" },
6
- { "input": "add a retry to the network client", "expected": "task" },
7
- { "input": "LoginView dark mode fix", "expected": "task" },
8
- { "input": "implement biometric unlock for the keychain", "expected": "task" },
9
- { "input": "remove the deprecated analytics call", "expected": "task" },
10
- { "input": "can you split this file into two", "expected": "task" },
11
- { "input": "could you rename TokenStore to SessionStore", "expected": "task" },
12
- { "input": "please add a loading spinner to the list", "expected": "task" },
13
- { "input": "login ekranina retry ekle", "expected": "task" },
14
- { "input": "cache katmanini yeniden duzenle", "expected": "task" },
15
- { "input": "su crash'i duzelt", "expected": "task" },
16
- { "input": "how does the login flow work", "expected": "question" },
17
- { "input": "what does this function return", "expected": "question" },
18
- { "input": "why is the navigation so slow", "expected": "question" },
19
- { "input": "should we use Keychain or UserDefaults", "expected": "question" },
20
- { "input": "does it support offline mode", "expected": "question" },
21
- { "input": "should we enable caching here", "expected": "question" },
22
- { "input": "which architecture is better for this screen", "expected": "question" },
23
- { "input": "explain the auth module", "expected": "question" },
24
- { "input": "compare MVVM and TCA for this", "expected": "question" },
25
- { "input": "is this thread-safe", "expected": "question" },
26
- { "input": "nasil calisiyor bu akis", "expected": "question" },
27
- { "input": "neden bu kadar yavas", "expected": "question" },
28
- { "input": "Keychain mi UserDefaults mi kullanmaliyim", "expected": "question" },
29
- { "input": "bu thread-safe mi", "expected": "question" },
30
-
31
- { "input": "fix the bug?", "expected": "task" },
32
- { "input": "add retry logic, ok?", "expected": "task" },
33
- { "input": "can you explain how to add a retry", "expected": "question" },
34
- { "input": "could you tell me which file to update", "expected": "question" },
35
- { "input": "would you say we should refactor this", "expected": "question" },
36
- { "input": "what happens if I remove this", "expected": "question" },
37
- { "input": "bu fonksiyonu nasil refactor ederim", "expected": "question" },
38
- { "input": "hangi mimariyi kullanmaliyim", "expected": "question" }
39
- ]
40
- }
@@ -1,93 +0,0 @@
1
- {
2
- "taskId": "PROJ-101",
3
- "status": "complete",
4
- "currentPhase": 7,
5
- "projects": [{ "project": "my-ios-app", "buildStatus": { "ok": true, "attempts": 1 } }],
6
- "reviewIterations": [
7
- {
8
- "reviewers": [
9
- {
10
- "reviewer": "opus",
11
- "findings": [
12
- {
13
- "severity": "blocking",
14
- "file": "Auth/Session.swift",
15
- "line": 54,
16
- "issue": "token logged in plaintext",
17
- "fix": "redact"
18
- },
19
- {
20
- "severity": "suggestion",
21
- "file": "Auth/Session.swift",
22
- "line": 12,
23
- "issue": "rename helper",
24
- "fix": "rename"
25
- }
26
- ],
27
- "approved": false
28
- },
29
- {
30
- "reviewer": "sonnet",
31
- "findings": [
32
- {
33
- "severity": "important",
34
- "file": "Auth/Session.swift",
35
- "line": 70,
36
- "issue": "no migration for legacy token",
37
- "fix": "add migration"
38
- }
39
- ],
40
- "approved": false
41
- }
42
- ],
43
- "triage": {
44
- "accepted": [
45
- {
46
- "severity": "blocking",
47
- "file": "Auth/Session.swift",
48
- "line": 54,
49
- "issue": "token logged in plaintext",
50
- "fix": "redact the token in the log",
51
- "reviewer": "opus"
52
- }
53
- ],
54
- "deferred": [
55
- {
56
- "finding": {
57
- "severity": "important",
58
- "file": "Auth/Session.swift",
59
- "line": 70,
60
- "issue": "no migration for legacy token"
61
- },
62
- "reason": "follow-up PR"
63
- }
64
- ],
65
- "rejected": [
66
- {
67
- "finding": {
68
- "severity": "suggestion",
69
- "file": "Auth/Session.swift",
70
- "line": 12,
71
- "issue": "rename helper"
72
- },
73
- "reason": "style only"
74
- }
75
- ],
76
- "approved": false
77
- }
78
- },
79
- {
80
- "reviewers": [
81
- { "reviewer": "opus", "findings": [], "approved": true },
82
- { "reviewer": "sonnet", "findings": [], "approved": true }
83
- ],
84
- "triage": {
85
- "accepted": [],
86
- "deferred": [],
87
- "rejected": [],
88
- "approved": true,
89
- "consensus": { "reviewerCount": 2, "verdict": "unanimous-pass" }
90
- }
91
- }
92
- ]
93
- }
@@ -1,6 +0,0 @@
1
- {
2
- "accepted": [],
3
- "deferred": [],
4
- "rejected": [],
5
- "approved": true
6
- }
@@ -1,5 +0,0 @@
1
- {
2
- "rawFindings": [],
3
- "scope": "Add a Cancel button to the OrderConfirmation screen.",
4
- "diffSummary": "1 file changed, 12 insertions, 0 deletions"
5
- }
@@ -1,7 +0,0 @@
1
- # Case 01 - Empty findings short-circuit
2
-
3
- Both reviewers returned zero findings. Triage MUST short-circuit and emit `{approved: true}` directly, no agent call.
4
-
5
- Guards against: a future change that incorrectly invokes the triage agent on empty input (wasted Opus call + nondeterministic empty-result variation).
6
-
7
- Validator exit code: 0 (clean).
@@ -1,15 +0,0 @@
1
- {
2
- "accepted": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/api/auth.ts",
6
- "line": 87,
7
- "issue": "Password comparison uses string equality, vulnerable to timing attacks",
8
- "fix": "Use a constant-time comparison (crypto.timingSafeEqual)",
9
- "reviewer": "opus"
10
- }
11
- ],
12
- "deferred": [],
13
- "rejected": [],
14
- "approved": false
15
- }
@@ -1,14 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/api/auth.ts",
6
- "line": 87,
7
- "issue": "Password comparison uses string equality, vulnerable to timing attacks",
8
- "fix": "Use a constant-time comparison (crypto.timingSafeEqual)",
9
- "reviewer": "opus"
10
- }
11
- ],
12
- "scope": "Implement password-based login endpoint POST /api/auth/login.",
13
- "diffSummary": "src/api/auth.ts: +43 -2"
14
- }
@@ -1,7 +0,0 @@
1
- # Case 02 - In-scope blocker accepted
2
-
3
- A real security issue (timing-attack-vulnerable password comparison) lands in the auth module being modified. Triage MUST accept it as blocking; `approved: false` so Phase 5/6 are gated.
4
-
5
- Guards against: triage incorrectly deferring or rejecting a clearly in-scope security blocker because the reviewer's `severity` looked over-strict.
6
-
7
- Validator exit code: 0 (clean - accepted + approved:false is consistent because there IS a blocker).
@@ -1,18 +0,0 @@
1
- {
2
- "accepted": [],
3
- "deferred": [
4
- {
5
- "finding": {
6
- "severity": "important",
7
- "file": "src/api/payments.ts",
8
- "line": 220,
9
- "issue": "Refund flow doesn't log the user-id of the actor, breaking audit trail",
10
- "fix": "Add userId to the refund-log entry",
11
- "reviewer": "sonnet"
12
- },
13
- "reason": "out of scope: task is OrderConfirmation Cancel button; payments module is explicitly out of scope per Phase 2 plan. Real issue, surfaced in Phase 7 follow-ups."
14
- }
15
- ],
16
- "rejected": [],
17
- "approved": true
18
- }
@@ -1,14 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "important",
5
- "file": "src/api/payments.ts",
6
- "line": 220,
7
- "issue": "Refund flow doesn't log the user-id of the actor, breaking audit trail",
8
- "fix": "Add userId to the refund-log entry",
9
- "reviewer": "sonnet"
10
- }
11
- ],
12
- "scope": "Add a Cancel button to the OrderConfirmation screen. Touches src/screens/OrderConfirmation.tsx only. Payments module is out of scope.",
13
- "diffSummary": "src/screens/OrderConfirmation.tsx: +12 -0"
14
- }
@@ -1,10 +0,0 @@
1
- # Case 03 - Real issue, out of scope → defer
2
-
3
- A reviewer correctly flagged a real audit-logging gap, but it's in a module the current task doesn't touch. Triage MUST defer (NOT accept, NOT reject) so it surfaces in Phase 7 follow-ups without blocking this task.
4
-
5
- Guards against:
6
-
7
- - triage accepting it and dragging unrelated work into Phase 3 rework
8
- - triage rejecting it and silently losing a real issue
9
-
10
- `approved: true` because no accepted blocker remains.
@@ -1,18 +0,0 @@
1
- {
2
- "accepted": [],
3
- "deferred": [],
4
- "rejected": [
5
- {
6
- "finding": {
7
- "severity": "blocking",
8
- "file": "src/utils/parseDate.ts",
9
- "line": 14,
10
- "issue": "Function may receive null input causing TypeError",
11
- "fix": "Add a null check at the top of parseDate",
12
- "reviewer": "sonnet"
13
- },
14
- "reason": "false positive: Phase 1 analysis confirmed all callers validate non-null before calling parseDate. Adding an internal null check would be defensive duplication and obscure intent."
15
- }
16
- ],
17
- "approved": true
18
- }
@@ -1,14 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/utils/parseDate.ts",
6
- "line": 14,
7
- "issue": "Function may receive null input causing TypeError",
8
- "fix": "Add a null check at the top of parseDate",
9
- "reviewer": "sonnet"
10
- }
11
- ],
12
- "scope": "Refactor parseDate to support ISO 8601 with timezone. Existing callers already validate non-null at the call sites (verified in Phase 1 analysis).",
13
- "diffSummary": "src/utils/parseDate.ts: +18 -6"
14
- }
@@ -1,10 +0,0 @@
1
- # Case 04 - False positive → reject
2
-
3
- A reviewer flagged a "blocking" null-safety issue, but Phase 1 analysis already proved all callers validate input. Adding an internal null check would be defensive duplication that hides intent. Triage MUST reject with a clear reason.
4
-
5
- Guards against:
6
-
7
- - triage blindly accepting any "blocking" tag without scope check (the v2.2.0 evaluation specifically called this out as a risk)
8
- - triage deferring a non-issue (would clutter Phase 7 follow-ups with noise)
9
-
10
- Also exercises the over-rejection guard: 1/1 = 100% rejected, but `total < 5` so the guard does NOT trip (validator exits 0, not 2).
@@ -1,43 +0,0 @@
1
- {
2
- "accepted": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/api/checkout.ts",
6
- "line": 102,
7
- "issue": "Race condition: order total computed twice without lock, can produce inconsistent invoice",
8
- "fix": "Compute total once inside the existing transaction block",
9
- "reviewer": "opus"
10
- },
11
- {
12
- "severity": "important",
13
- "file": "src/api/checkout.ts",
14
- "line": 145,
15
- "issue": "Hard-coded currency 'USD' won't work for non-US tenants",
16
- "fix": "Read currency from tenant config",
17
- "reviewer": "sonnet"
18
- },
19
- {
20
- "severity": "suggestion",
21
- "file": "src/api/checkout.ts",
22
- "line": 200,
23
- "issue": "Magic number 60 in retry backoff",
24
- "fix": "Extract to RETRY_BACKOFF_SECONDS constant",
25
- "reviewer": "sonnet"
26
- }
27
- ],
28
- "deferred": [
29
- {
30
- "finding": {
31
- "severity": "important",
32
- "file": "src/notifications/email.ts",
33
- "line": 33,
34
- "issue": "Email template missing for refund-success path",
35
- "fix": "Add refund_success.html and wire it up",
36
- "reviewer": "sonnet"
37
- },
38
- "reason": "out of scope: notifications module is owned by another team per Phase 0 scope. Real issue, surfaced in Phase 7 follow-ups."
39
- }
40
- ],
41
- "rejected": [],
42
- "approved": false
43
- }
@@ -1,38 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/api/checkout.ts",
6
- "line": 102,
7
- "issue": "Race condition: order total computed twice without lock, can produce inconsistent invoice",
8
- "fix": "Compute total once inside the existing transaction block",
9
- "reviewer": "opus"
10
- },
11
- {
12
- "severity": "important",
13
- "file": "src/api/checkout.ts",
14
- "line": 145,
15
- "issue": "Hard-coded currency 'USD' won't work for non-US tenants",
16
- "fix": "Read currency from tenant config",
17
- "reviewer": "sonnet"
18
- },
19
- {
20
- "severity": "important",
21
- "file": "src/notifications/email.ts",
22
- "line": 33,
23
- "issue": "Email template missing for refund-success path",
24
- "fix": "Add refund_success.html and wire it up",
25
- "reviewer": "sonnet"
26
- },
27
- {
28
- "severity": "suggestion",
29
- "file": "src/api/checkout.ts",
30
- "line": 200,
31
- "issue": "Magic number 60 in retry backoff",
32
- "fix": "Extract to RETRY_BACKOFF_SECONDS constant",
33
- "reviewer": "sonnet"
34
- }
35
- ],
36
- "scope": "Add tenant-aware checkout flow. Touches src/api/checkout.ts and tenant config. Notifications module is owned by another team.",
37
- "diffSummary": "src/api/checkout.ts: +180 -45, src/config/tenants.ts: +12 -0"
38
- }
@@ -1,17 +0,0 @@
1
- # Case 05 - Mixed classification (the realistic case)
2
-
3
- 4 raw findings spanning all 3 outcomes:
4
-
5
- - 1 blocking + 1 important + 1 suggestion in the in-scope checkout module → **accepted**
6
- - 1 important in the out-of-scope notifications module → **deferred**
7
- - 0 rejected (no false positives in this fixture)
8
-
9
- `approved: false` because there's an accepted blocker.
10
-
11
- Guards against:
12
-
13
- - triage forgetting to classify some findings (every raw finding must end up in exactly one bucket)
14
- - triage merging suggestions into deferred (suggestions in scope still go to accepted, just at lower priority)
15
- - triage hallucinating new findings not in raw input (validator strips these - case has 4 in, 4 out across all buckets)
16
-
17
- This is the case most likely to catch a regression in the triage prompt structure.
@@ -1,15 +0,0 @@
1
- {
2
- "accepted": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/api/auth.ts",
6
- "line": 120,
7
- "issue": "Fallback to admin role when token validation fails",
8
- "fix": "Return 401 instead of falling back to admin role",
9
- "reviewer": "sonnet"
10
- }
11
- ],
12
- "deferred": [],
13
- "rejected": [],
14
- "approved": false
15
- }
@@ -1,14 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "suggestion",
5
- "file": "src/api/auth.ts",
6
- "line": 120,
7
- "issue": "Fallback to admin role when token validation fails",
8
- "fix": "Return 401 instead of falling back to admin role",
9
- "reviewer": "sonnet"
10
- }
11
- ],
12
- "scope": "Add JWT token validation to the auth middleware.",
13
- "diffSummary": "src/api/auth.ts: +28 -3"
14
- }
@@ -1,9 +0,0 @@
1
- # Case 06 - Severity mismatch (suggestion → blocking)
2
-
3
- Reviewer tagged a real security issue as `severity: "suggestion"` - falling back to the admin role when token validation fails is a privilege-escalation vector, not a cosmetic nit.
4
-
5
- Triage MUST recognize the actual severity from the issue description and bump it to `blocking`. `approved: false` because the accepted finding is now blocking.
6
-
7
- Guards against: blind trust of reviewer severity tags. The triage agent must evaluate the described behavior, not just echo the label.
8
-
9
- Validator exit code: 0 (accepted + approved:false is consistent because there IS a blocker).
@@ -1,27 +0,0 @@
1
- {
2
- "accepted": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/checkout.ts",
6
- "line": 88,
7
- "issue": "Missing transaction wrapper around multi-table writes in checkout",
8
- "fix": "Wrap the checkout persistence logic in a database transaction",
9
- "reviewer": "opus"
10
- }
11
- ],
12
- "deferred": [],
13
- "rejected": [
14
- {
15
- "finding": {
16
- "severity": "blocking",
17
- "file": "src/checkout.ts",
18
- "line": 88,
19
- "issue": "Checkout writes to orders and inventory tables without a transaction boundary",
20
- "fix": "Use a single transaction for all database writes in the checkout flow",
21
- "reviewer": "sonnet"
22
- },
23
- "reason": "duplicate of accepted[0]: same file, same line, same root issue (missing transaction wrapper). Opus version retained by convention."
24
- }
25
- ],
26
- "approved": false
27
- }
@@ -1,22 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/checkout.ts",
6
- "line": 88,
7
- "issue": "Missing transaction wrapper around multi-table writes in checkout",
8
- "fix": "Wrap the checkout persistence logic in a database transaction",
9
- "reviewer": "opus"
10
- },
11
- {
12
- "severity": "blocking",
13
- "file": "src/checkout.ts",
14
- "line": 88,
15
- "issue": "Checkout writes to orders and inventory tables without a transaction boundary",
16
- "fix": "Use a single transaction for all database writes in the checkout flow",
17
- "reviewer": "sonnet"
18
- }
19
- ],
20
- "scope": "Implement checkout flow with order creation and inventory update.",
21
- "diffSummary": "src/checkout.ts: +95 -10"
22
- }
@@ -1,9 +0,0 @@
1
- # Case 07 - Duplicate findings from two reviewers
2
-
3
- Both Opus and Sonnet flagged the same issue (same file, same line, same root cause) but with slightly different wording. Triage must deduplicate, not double-count.
4
-
5
- Convention: when two reviewers agree, keep the Opus finding in `accepted` and move the Sonnet duplicate to `rejected` with a reason linking it to the accepted entry.
6
-
7
- Guards against: double-classification when reviewers agree. Without dedup, the developer would see the same fix twice and the finding count would overstate the real issue count.
8
-
9
- Validator exit code: 0 (1/2 rejected is under the 80% over-rejection threshold).
@@ -1,18 +0,0 @@
1
- {
2
- "accepted": [],
3
- "deferred": [],
4
- "rejected": [
5
- {
6
- "finding": {
7
- "severity": "blocking",
8
- "file": "src/utils/format.ts",
9
- "line": 14,
10
- "issue": "Function name `fmt` is too short, should be `formatCurrency`",
11
- "fix": "Rename fmt to formatCurrency for readability",
12
- "reviewer": "sonnet"
13
- },
14
- "reason": "stylistic preference, not a correctness issue. Reviewer over-tagged severity. Naming was reviewed in PR #234 and approved by team."
15
- }
16
- ],
17
- "approved": true
18
- }
@@ -1,14 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/utils/format.ts",
6
- "line": 14,
7
- "issue": "Function name `fmt` is too short, should be `formatCurrency`",
8
- "fix": "Rename fmt to formatCurrency for readability",
9
- "reviewer": "sonnet"
10
- }
11
- ],
12
- "scope": "Add currency formatting utility for multi-locale support.",
13
- "diffSummary": "src/utils/format.ts: +22 -0"
14
- }
@@ -1,9 +0,0 @@
1
- # Case 08 - Stylistic blocker misclassification
2
-
3
- Reviewer tagged a naming preference as `severity: "blocking"`. Renaming `fmt` to `formatCurrency` is a style opinion, not a correctness or security issue.
4
-
5
- Triage MUST reject this: the blocking severity does not match the nature of the finding. The reason should cite that it is stylistic and that the reviewer over-tagged.
6
-
7
- Guards against: accepting a stylistic nitpick because it has a "blocking" tag. Severity must be evaluated by substance, not blindly trusted.
8
-
9
- Validator exit code: 0 (1/1 = 100% rejected but total < 5 findings, so over-rejection guard does not trip).