@mmerterden/multi-agent-pipeline 12.7.0 → 12.8.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 (244) hide show
  1. package/CHANGELOG.md +126 -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/phases/operations.md +28 -0
  13. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -0
  14. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
  15. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
  16. package/pipeline/multi-agent-refs/phases/phase-4-review.md +49 -4
  17. package/pipeline/schemas/prefs.schema.json +6 -0
  18. package/pipeline/scripts/_smoke-root.sh +61 -0
  19. package/pipeline/scripts/audit-log.sh +25 -0
  20. package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
  21. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
  22. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
  23. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
  24. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
  25. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
  26. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
  27. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
  28. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
  29. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
  30. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
  31. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
  32. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
  33. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
  34. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
  35. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
  36. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
  37. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
  38. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
  39. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
  40. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
  41. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
  42. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
  43. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
  44. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
  45. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
  46. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
  47. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
  48. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
  49. package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
  50. package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
  51. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
  52. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
  53. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
  54. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
  55. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
  56. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
  57. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
  58. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
  59. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
  60. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
  61. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
  62. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
  63. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
  64. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
  65. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
  66. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
  67. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
  68. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
  69. package/pipeline/eval/golden-tasks/README.md +0 -65
  70. package/pipeline/eval/intent-cases.json +0 -40
  71. package/pipeline/eval/run-metrics-fixture.json +0 -93
  72. package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
  73. package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
  74. package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
  75. package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
  76. package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
  77. package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
  78. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
  79. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
  80. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
  81. package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
  82. package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
  83. package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
  84. package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
  85. package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
  86. package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
  87. package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
  88. package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
  89. package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
  90. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
  91. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
  92. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
  93. package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
  94. package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
  95. package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
  96. package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
  97. package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
  98. package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
  99. package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
  100. package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
  101. package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
  102. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
  103. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
  104. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
  105. package/pipeline/eval/triage/README.md +0 -54
  106. package/pipeline/scripts/benchmark-phase-0.sh +0 -128
  107. package/pipeline/scripts/check-md-links.mjs +0 -88
  108. package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -302
  109. package/pipeline/scripts/eval-golden-tasks.mjs +0 -224
  110. package/pipeline/scripts/eval-intent.mjs +0 -107
  111. package/pipeline/scripts/eval-mine-corpus.mjs +0 -211
  112. package/pipeline/scripts/eval-triage.mjs +0 -171
  113. package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
  114. package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
  115. package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
  116. package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
  117. package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
  118. package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
  119. package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
  120. package/pipeline/scripts/lint-mcp-refs.mjs +0 -218
  121. package/pipeline/scripts/lint-skills.mjs +0 -154
  122. package/pipeline/scripts/run-smokes.mjs +0 -130
  123. package/pipeline/scripts/scorecard.mjs +0 -258
  124. package/pipeline/scripts/smoke-add-detail.sh +0 -137
  125. package/pipeline/scripts/smoke-agent-guard.sh +0 -74
  126. package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
  127. package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
  128. package/pipeline/scripts/smoke-ask-choice.sh +0 -42
  129. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
  130. package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
  131. package/pipeline/scripts/smoke-changelog-version.sh +0 -47
  132. package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
  133. package/pipeline/scripts/smoke-channels-flow.sh +0 -130
  134. package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
  135. package/pipeline/scripts/smoke-clarify.sh +0 -148
  136. package/pipeline/scripts/smoke-command-inventory.sh +0 -81
  137. package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
  138. package/pipeline/scripts/smoke-community-gates.sh +0 -75
  139. package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
  140. package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
  141. package/pipeline/scripts/smoke-context-budget.sh +0 -72
  142. package/pipeline/scripts/smoke-cost-budget.sh +0 -70
  143. package/pipeline/scripts/smoke-cost-summary.sh +0 -139
  144. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
  145. package/pipeline/scripts/smoke-description-tr.sh +0 -82
  146. package/pipeline/scripts/smoke-dev-critic.sh +0 -144
  147. package/pipeline/scripts/smoke-diff-explain.sh +0 -147
  148. package/pipeline/scripts/smoke-diff-risk.sh +0 -190
  149. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
  150. package/pipeline/scripts/smoke-eval-live.sh +0 -136
  151. package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
  152. package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
  153. package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
  154. package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
  155. package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
  156. package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
  157. package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
  158. package/pipeline/scripts/smoke-generate-issue.sh +0 -120
  159. package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
  160. package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
  161. package/pipeline/scripts/smoke-install-layout.sh +0 -248
  162. package/pipeline/scripts/smoke-intent-guard.sh +0 -86
  163. package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
  164. package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
  165. package/pipeline/scripts/smoke-keychain.sh +0 -158
  166. package/pipeline/scripts/smoke-language-axis.sh +0 -109
  167. package/pipeline/scripts/smoke-learning-curve.sh +0 -61
  168. package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
  169. package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
  170. package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
  171. package/pipeline/scripts/smoke-md-links.sh +0 -8
  172. package/pipeline/scripts/smoke-md2confluence.sh +0 -126
  173. package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
  174. package/pipeline/scripts/smoke-migrate-state.sh +0 -102
  175. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
  176. package/pipeline/scripts/smoke-model-fallback.sh +0 -89
  177. package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
  178. package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
  179. package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -194
  180. package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
  181. package/pipeline/scripts/smoke-own-punctuation.sh +0 -103
  182. package/pipeline/scripts/smoke-pack-contents.sh +0 -140
  183. package/pipeline/scripts/smoke-pat-audit.sh +0 -128
  184. package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
  185. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
  186. package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
  187. package/pipeline/scripts/smoke-phase-banner.sh +0 -101
  188. package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
  189. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
  190. package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
  191. package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
  192. package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
  193. package/pipeline/scripts/smoke-plan-safety.sh +0 -139
  194. package/pipeline/scripts/smoke-plan-todos.sh +0 -196
  195. package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
  196. package/pipeline/scripts/smoke-pre-commit.sh +0 -170
  197. package/pipeline/scripts/smoke-pref-migration.sh +0 -226
  198. package/pipeline/scripts/smoke-prefs-language.sh +0 -134
  199. package/pipeline/scripts/smoke-progress-contract.sh +0 -127
  200. package/pipeline/scripts/smoke-prune-logs.sh +0 -137
  201. package/pipeline/scripts/smoke-purge.sh +0 -138
  202. package/pipeline/scripts/smoke-push-retry.sh +0 -75
  203. package/pipeline/scripts/smoke-repo-map.sh +0 -300
  204. package/pipeline/scripts/smoke-review-readiness.sh +0 -92
  205. package/pipeline/scripts/smoke-review-watch.sh +0 -146
  206. package/pipeline/scripts/smoke-routines.sh +0 -84
  207. package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
  208. package/pipeline/scripts/smoke-run-metrics.sh +0 -50
  209. package/pipeline/scripts/smoke-search.sh +0 -187
  210. package/pipeline/scripts/smoke-shadow-git.sh +0 -224
  211. package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
  212. package/pipeline/scripts/smoke-skill-language.sh +0 -83
  213. package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
  214. package/pipeline/scripts/smoke-skill-scan.sh +0 -198
  215. package/pipeline/scripts/smoke-source-parity.sh +0 -85
  216. package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
  217. package/pipeline/scripts/smoke-sync-parity.sh +0 -92
  218. package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
  219. package/pipeline/scripts/smoke-telemetry.sh +0 -147
  220. package/pipeline/scripts/smoke-test-gap.sh +0 -183
  221. package/pipeline/scripts/smoke-token-budget.sh +0 -67
  222. package/pipeline/scripts/smoke-token-preflight.sh +0 -82
  223. package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
  224. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
  225. package/pipeline/scripts/smoke-triage-memory.sh +0 -174
  226. package/pipeline/scripts/smoke-update-check.sh +0 -135
  227. package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
  228. package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
  229. package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
  230. package/pipeline/scripts/smoke-validator-gates.sh +0 -164
  231. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
  232. package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
  233. package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
  234. package/pipeline/scripts/smoke-work-summary.sh +0 -163
  235. package/pipeline/scripts/smoke-workflow-audit.sh +0 -101
  236. package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
  237. package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
  238. package/pipeline/scripts/smoke-write-state.sh +0 -159
  239. package/pipeline/scripts/sync-parity-check.sh +0 -135
  240. package/pipeline/scripts/test-gap-rules/android.json +0 -25
  241. package/pipeline/scripts/test-gap-rules/ios.json +0 -34
  242. package/pipeline/scripts/test-gap-rules/node.json +0 -29
  243. package/pipeline/scripts/test-gap-rules/python.json +0 -25
  244. package/pipeline/scripts/validate-schemas.mjs +0 -88
@@ -1,25 +0,0 @@
1
- {
2
- "stack": {
3
- "primary": "ios",
4
- "language": "Swift 6",
5
- "framework": "SwiftUI"
6
- },
7
- "touchedAreas": [
8
- {
9
- "path": "Sources/Auth/TokenStore.swift",
10
- "why": "Wrap the Keychain read in an LAContext biometric evaluation before returning the token"
11
- },
12
- {
13
- "path": "Sources/Auth/TokenStoreTests.swift",
14
- "why": "Cover the gated read: success after auth, failure/cancel returns no token"
15
- }
16
- ],
17
- "risks": [
18
- {
19
- "risk": "Biometric evaluation is async and can fail/cancel; a wrong fallback could either lock users out or defeat the gate",
20
- "severity": "medium",
21
- "mitigation": "Define explicit behavior for cancel / not-enrolled / lockout, and test each path"
22
- }
23
- ],
24
- "summary": "Add a biometric (LAContext) check in front of the existing Keychain-backed TokenStore read. Security-sensitive surface: the correctness hinges on the failure-path policy (cancel / not-enrolled / lockout), which is exactly the kind of judgment call where two same-family reviewers approving is not independent proof."
25
- }
@@ -1,31 +0,0 @@
1
- {
2
- "approach": "TDD-first. Add failing tests for the gated read: a successful biometric evaluation returns the token; a cancelled or failed evaluation returns no token and does not fall back to an ungated read (RED). Wrap the existing Keychain read in an LAContext evaluation, keeping the TokenStore API unchanged (GREEN). Define explicit behavior for cancel / not-enrolled / lockout (refactor).",
3
- "tasks": [
4
- {
5
- "id": "T1",
6
- "title": "Add failing biometric-gated read tests",
7
- "type": "test",
8
- "files": ["Sources/Auth/TokenStoreTests.swift"],
9
- "dependsOn": [],
10
- "acceptanceCriteria": [
11
- "success after auth returns the stored token",
12
- "cancelled / failed auth returns nil and never reads the Keychain ungated",
13
- "evaluation runs against an injectable LAContext double"
14
- ]
15
- },
16
- {
17
- "id": "T2",
18
- "title": "Gate the Keychain read behind LAContext",
19
- "type": "code",
20
- "files": ["Sources/Auth/TokenStore.swift"],
21
- "dependsOn": ["T1"],
22
- "acceptanceCriteria": [
23
- "TokenStore public API is unchanged",
24
- "Token is only returned after a successful biometric evaluation",
25
- "cancel / not-enrolled / lockout each have explicit, tested behavior"
26
- ]
27
- }
28
- ],
29
- "approved": true,
30
- "userFeedback": null
31
- }
@@ -1,12 +0,0 @@
1
- [
2
- {
3
- "reviewer": "opus",
4
- "findings": [],
5
- "approved": true
6
- },
7
- {
8
- "reviewer": "sonnet",
9
- "findings": [],
10
- "approved": true
11
- }
12
- ]
@@ -1,18 +0,0 @@
1
- {
2
- "accepted": [],
3
- "deferred": [],
4
- "rejected": [],
5
- "approved": true,
6
- "consensus": {
7
- "reviewerCount": 2,
8
- "verdict": "unverified",
9
- "disagreements": [
10
- {
11
- "file": "Sources/Auth/TokenStore.swift",
12
- "line": 0,
13
- "issue": "biometric failure-path policy (cancel / not-enrolled / lockout) on a Keychain-gated read",
14
- "note": "Both reviewers approved, but this is a security/auth judgment surface - the agreement is unverified. A human should confirm the cancel / not-enrolled / lockout behavior before trusting the pass."
15
- }
16
- ]
17
- }
18
- }
@@ -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).