@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,23 +0,0 @@
1
- {
2
- "accepted": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/tests/setup.ts",
6
- "line": 5,
7
- "issue": "Test setup uses Math.random() without a fixed seed causing flaky results",
8
- "fix": "Replace Math.random() with a seeded PRNG for reproducible test data",
9
- "reviewer": "sonnet"
10
- },
11
- {
12
- "severity": "blocking",
13
- "file": "src/tests/setup.ts",
14
- "line": 12,
15
- "issue": "Tests fail intermittently in CI due to non-deterministic ordering",
16
- "fix": "Fixing the unseeded Math.random() in setup.ts (accepted[0]) should resolve this symptom",
17
- "reviewer": "opus"
18
- }
19
- ],
20
- "deferred": [],
21
- "rejected": [],
22
- "approved": false
23
- }
@@ -1,22 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "blocking",
5
- "file": "src/tests/setup.ts",
6
- "line": 12,
7
- "issue": "Tests fail intermittently in CI due to non-deterministic ordering",
8
- "fix": "Ensure deterministic test execution by fixing random seed initialization",
9
- "reviewer": "opus"
10
- },
11
- {
12
- "severity": "blocking",
13
- "file": "src/tests/setup.ts",
14
- "line": 5,
15
- "issue": "Test setup uses Math.random() without a fixed seed causing flaky results",
16
- "fix": "Replace Math.random() with a seeded PRNG for reproducible test data",
17
- "reviewer": "sonnet"
18
- }
19
- ],
20
- "scope": "Stabilize test infrastructure to eliminate flaky CI runs.",
21
- "diffSummary": "src/tests/setup.ts: +8 -2, src/tests/helpers.ts: +4 -1"
22
- }
@@ -1,9 +0,0 @@
1
- # Case 09 - Cascading finding (symptom + root cause)
2
-
3
- Two findings describe the same underlying problem at different levels: (a) the symptom ("tests fail intermittently") and (b) the root cause ("Math.random() without a fixed seed").
4
-
5
- Triage must accept BOTH but order them upstream-first: the root cause (b) comes before the symptom (a) in the accepted array. The fix text for (a) references (b) to document the cascade - fixing the seed should resolve the intermittent failures.
6
-
7
- Guards against: treating symptom and root cause as independent issues. The cascade relationship must be explicit in the fix text so the developer addresses root cause first.
8
-
9
- Validator exit code: 0 (both accepted with blocking severity, approved:false is consistent).
@@ -1,18 +0,0 @@
1
- {
2
- "accepted": [],
3
- "deferred": [
4
- {
5
- "finding": {
6
- "severity": "important",
7
- "file": "src/payments/refund.ts",
8
- "line": 55,
9
- "issue": "Refund flow doesn't emit audit event for compliance tracking",
10
- "fix": "Add an audit event emission after successful refund processing",
11
- "reviewer": "opus"
12
- },
13
- "reason": "out of scope for current task (checkout session creation); HOWEVER this should be addressed before PROJ-5678 (next sprint refund work) because that task assumes audit events exist for refund operations."
14
- }
15
- ],
16
- "rejected": [],
17
- "approved": true
18
- }
@@ -1,14 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "important",
5
- "file": "src/payments/refund.ts",
6
- "line": 55,
7
- "issue": "Refund flow doesn't emit audit event for compliance tracking",
8
- "fix": "Add an audit event emission after successful refund processing",
9
- "reviewer": "opus"
10
- }
11
- ],
12
- "scope": "Implement checkout session creation endpoint. Touches src/checkout/ only.",
13
- "diffSummary": "src/checkout/session.ts: +45 -0, src/checkout/types.ts: +12 -0"
14
- }
@@ -1,9 +0,0 @@
1
- # Case 10 - Deferred with cross-reference
2
-
3
- A real issue (missing audit event in refund flow) that is out of scope for the current task (checkout session creation). However, the next planned task (PROJ-5678, refund work) assumes audit events already exist.
4
-
5
- Triage must defer - not reject - because the issue is real. The reason must capture the cross-task dependency: deferring is correct, but the reason needs to surface that PROJ-5678 will be affected.
6
-
7
- Guards against: losing inter-task dependencies when deferring. A bare "out of scope" reason is insufficient; the cross-reference to the downstream task ensures Phase 7 captures this for backlog prioritization.
8
-
9
- Validator exit code: 0 (deferred + approved:true is consistent because no blocking items in accepted).
@@ -1,27 +0,0 @@
1
- {
2
- "accepted": [
3
- {
4
- "severity": "blocking",
5
- "file": "scripts/deploy.sh",
6
- "line": 14,
7
- "issue": "Script invokes `vercel deploy --token=$VERCEL_TOKEN`. On retry the Vercel CLI prints failed argv verbatim - the token leaks into the conversation transcript and CI logs. Same shape as the v7.9.1 incident that forced a token rotation.",
8
- "fix": "Replace with the safe wrapper: `bash $HOME/.claude/scripts/vercel-deploy.sh deploy --prod`. The wrapper refuses --token argv, reads VERCEL_TOKEN from env, and pipes stdout/stderr through a redact filter that scrubs vcp_... patterns.",
9
- "reviewer": "opus"
10
- }
11
- ],
12
- "deferred": [],
13
- "rejected": [
14
- {
15
- "finding": {
16
- "severity": "important",
17
- "file": "scripts/deploy.sh",
18
- "line": 14,
19
- "issue": "Token passed as positional argument allows shell history (zsh, bash) to capture it across sessions.",
20
- "fix": "Use env var; never argv.",
21
- "reviewer": "sonnet"
22
- },
23
- "reason": "duplicate - same root cause as the accepted blocking finding; merging would dilute the actionable line"
24
- }
25
- ],
26
- "approved": false
27
- }
@@ -1,22 +0,0 @@
1
- {
2
- "rawFindings": [
3
- {
4
- "severity": "blocking",
5
- "file": "scripts/deploy.sh",
6
- "line": 14,
7
- "issue": "Script invokes `vercel deploy --token=$VERCEL_TOKEN`. On retry the Vercel CLI prints failed argv verbatim - the token leaks into the conversation transcript and CI logs. Same shape as the v7.9.1 incident that forced a token rotation.",
8
- "fix": "Replace with the safe wrapper: `bash $HOME/.claude/scripts/vercel-deploy.sh deploy --prod`. The wrapper refuses --token argv, reads VERCEL_TOKEN from env, and pipes stdout/stderr through a redact filter that scrubs vcp_... patterns.",
9
- "reviewer": "opus"
10
- },
11
- {
12
- "severity": "important",
13
- "file": "scripts/deploy.sh",
14
- "line": 14,
15
- "issue": "Token passed as positional argument allows shell history (zsh, bash) to capture it across sessions.",
16
- "fix": "Use env var; never argv.",
17
- "reviewer": "sonnet"
18
- }
19
- ],
20
- "scope": "Add a one-shot deploy script that wraps `vercel deploy` for the marketing site.",
21
- "diffSummary": "1 file changed, 28 insertions, 0 deletions"
22
- }
@@ -1,14 +0,0 @@
1
- # Case 11 - Vercel token-leak as a blocker (v8.0.0)
2
-
3
- Two reviewers flag the same `vercel deploy --token=$VERCEL_TOKEN` call. Triage MUST:
4
-
5
- 1. **Accept** the Opus finding - it's a real production-affecting blocker, identical in shape to the v7.9.1 incident that forced a token rotation.
6
- 2. **Reject** the Sonnet finding as a duplicate - same root cause (token in argv), additional reviewer would dilute the actionable line. The fix is the same code change either way.
7
- 3. Set `approved: false` because at least one accepted blocking remains.
8
-
9
- Guards against:
10
- - Future regressions where token-leak findings get classified as `suggestion` or `style` (they are blocking - secret leaks reach production logs and force rotation).
11
- - Triage adding both reviewers' findings to `accepted` and producing two redundant "fix this" lines for the same line of code.
12
- - Approving the diff while a blocker is open.
13
-
14
- Validator exit code: 0 (clean - no contradictions).
@@ -1,54 +0,0 @@
1
- # Triage Eval Suite
2
-
3
- Semantic regression detection for Phase 4 triage. Each fixture pair (`input.json` + `expected.json`) tests a specific behavior the triage agent must preserve when its prompt or model changes.
4
-
5
- ## How it works
6
-
7
- Each test case lives in its own subdirectory:
8
-
9
- ```
10
- pipeline/eval/triage/
11
- ├── README.md
12
- ├── 01-empty-findings/
13
- │ ├── input.json - what reviewers returned (raw findings, scope, diff)
14
- │ ├── expected.json - what the triage step MUST produce, normalized
15
- │ └── notes.md - why this case matters
16
- ├── 02-real-blocker/
17
- ├── 03-out-of-scope-defer/
18
- ├── 04-false-positive-reject/
19
- ├── ...
20
- ```
21
-
22
- Run all cases:
23
-
24
- ```bash
25
- node pipeline/scripts/eval-triage.mjs
26
- ```
27
-
28
- Filter to one case:
29
-
30
- ```bash
31
- node pipeline/scripts/eval-triage.mjs --case 03-out-of-scope-defer
32
- ```
33
-
34
- `--json` produces machine-readable output for CI consumption.
35
-
36
- ## Pass criteria
37
-
38
- For each case the runner:
39
-
40
- 1. Validates `expected.json` against `triage-output.schema.json` (smoke-level sanity).
41
- 2. Runs `validate-triage.mjs` against `expected.json` and asserts the documented exit code.
42
- 3. Compares classification membership: each finding in `input.json.rawFindings` must appear in exactly one of `accepted | deferred | rejected` in `expected.json` (no leaks, no inventions).
43
-
44
- This is **not** a model-quality check (we don't run a real triage agent in CI - that requires API keys and is non-deterministic). It's a **contract regression check**: the fixtures encode "for input X, the spec says triage MUST produce Y", and any prompt/spec change that breaks the mapping fails CI.
45
-
46
- ## Adding new cases
47
-
48
- When a new triage edge case is discovered in production:
49
-
50
- 1. Capture the actual reviewer findings + diff context into a new `pipeline/eval/triage/<NN>-<short-name>/input.json`.
51
- 2. Hand-curate `expected.json` (or paste a known-good triage output and verify by hand).
52
- 3. Add `notes.md` explaining the failure mode this case guards against.
53
- 4. Run the suite locally; `eval-triage.mjs` should pass with your new case.
54
- 5. Commit. CI will keep it green going forward.
@@ -1,128 +0,0 @@
1
- #!/usr/bin/env bash
2
- # benchmark-phase-0.sh - measures Phase 0 latency (single-repo + multi-repo)
3
- # and writes a baseline / comparison row to benchmarks/v3.7-phase-0.jsonl.
4
- #
5
- # Usage:
6
- # benchmark-phase-0.sh # run once, append result
7
- # benchmark-phase-0.sh --runs 5 # run N times, report median
8
- # benchmark-phase-0.sh --label baseline # tag the row (e.g. "baseline" / "post-refactor")
9
- # benchmark-phase-0.sh --multi-repo # exercise the multi-repo path
10
- #
11
- # What it measures (proxy - actual Phase 0 needs a live task):
12
- # 1. Preferences load (read + JSON parse)
13
- # 2. Schema validation (validate prefs against prefs.schema.json - node + ajv if present)
14
- # 3. Project scan ($HOME maxdepth 2 with marker globs - same as Phase 0 Step 2)
15
- # 4. Branch listing (no remote - uses local $HOME repo if available)
16
- # 5. Recents read + TTL prune simulation
17
- #
18
- # Best-effort: missing tools (node, jq) cause the section to skip rather than fail.
19
-
20
- set -uo pipefail
21
-
22
- RUNS=1
23
- LABEL="adhoc"
24
- MULTI=false
25
- while [ "$#" -gt 0 ]; do
26
- case "$1" in
27
- --runs) RUNS="$2"; shift 2 ;;
28
- --label) LABEL="$2"; shift 2 ;;
29
- --multi-repo) MULTI=true; shift ;;
30
- *) shift ;;
31
- esac
32
- done
33
-
34
- PREFS="$HOME/.claude/multi-agent-preferences.json"
35
- SCHEMA="$HOME/.claude/schemas/prefs.schema.json"
36
- OUT_DIR="$HOME/.claude/benchmarks"
37
- OUT="$OUT_DIR/v3.7-phase-0.jsonl"
38
- mkdir -p "$OUT_DIR"
39
-
40
- # Portable nanosecond timer using python (date -u +%N is GNU-only)
41
- now_ms() {
42
- python3 -c 'import time; print(int(time.time()*1000))' 2>/dev/null \
43
- || echo "$(($(date +%s) * 1000))"
44
- }
45
-
46
- bench_one() {
47
- local total_start=$(now_ms)
48
-
49
- # 1. prefs load
50
- local t1=$(now_ms)
51
- if [ -f "$PREFS" ]; then
52
- cat "$PREFS" >/dev/null 2>&1
53
- local prefs_load_ms=$(( $(now_ms) - t1 ))
54
- else
55
- local prefs_load_ms=0
56
- fi
57
-
58
- # 2. schema validate (best-effort)
59
- local schema_ms=0
60
- if [ -f "$PREFS" ] && [ -f "$SCHEMA" ] && command -v node >/dev/null 2>&1; then
61
- local t2=$(now_ms)
62
- node -e "JSON.parse(require('fs').readFileSync('$PREFS','utf8'))" 2>/dev/null
63
- schema_ms=$(( $(now_ms) - t2 ))
64
- fi
65
-
66
- # 3. project scan
67
- local t3=$(now_ms)
68
- find "$HOME" -maxdepth 2 -type f \( \
69
- -name "Package.swift" -o -name "package.json" -o -name "build.gradle" \
70
- -o -name "Cargo.toml" -o -name "go.mod" -o -name "pom.xml" \
71
- \) 2>/dev/null | head -50 >/dev/null
72
- local scan_ms=$(( $(now_ms) - t3 ))
73
-
74
- # 4. branch listing (use first git repo found in $HOME, if any)
75
- local branch_ms=0
76
- local repo=""
77
- repo=$(find "$HOME" -maxdepth 3 -type d -name ".git" 2>/dev/null | head -1 | xargs -I {} dirname {})
78
- if [ -n "$repo" ]; then
79
- local t4=$(now_ms)
80
- git -C "$repo" branch -r 2>/dev/null | head -50 >/dev/null
81
- branch_ms=$(( $(now_ms) - t4 ))
82
- fi
83
-
84
- # 5. recents read + TTL prune sim
85
- local t5=$(now_ms)
86
- if [ -f "$PREFS" ] && command -v node >/dev/null 2>&1; then
87
- node -e "
88
- const p = JSON.parse(require('fs').readFileSync('$PREFS','utf8'));
89
- const cutoff = Date.now() - 15*86400*1000;
90
- const rb = p.global?.recentBranches || {};
91
- let kept = 0, pruned = 0;
92
- for (const proj of Object.keys(rb)) {
93
- const arr = rb[proj] || [];
94
- for (const b of arr) {
95
- if (b && b.lastUsed && Date.parse(b.lastUsed) >= cutoff) kept++;
96
- else pruned++;
97
- }
98
- }
99
- " 2>/dev/null
100
- fi
101
- local recents_ms=$(( $(now_ms) - t5 ))
102
-
103
- local total_ms=$(( $(now_ms) - total_start ))
104
- local mode="single"; [ "$MULTI" = true ] && mode="multi"
105
- printf '{"ts":"%s","label":"%s","mode":"%s","prefs_load_ms":%d,"schema_ms":%d,"project_scan_ms":%d,"branch_list_ms":%d,"recents_ms":%d,"total_ms":%d}\n' \
106
- "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" "$LABEL" "$mode" \
107
- "$prefs_load_ms" "$schema_ms" "$scan_ms" "$branch_ms" "$recents_ms" "$total_ms"
108
- }
109
-
110
- echo "Running $RUNS bench iteration(s) - label=$LABEL mode=$([ "$MULTI" = true ] && echo multi || echo single)"
111
- TOTALS=()
112
- for i in $(seq 1 "$RUNS"); do
113
- ROW=$(bench_one)
114
- echo " $ROW"
115
- echo "$ROW" >> "$OUT"
116
- TOTAL=$(echo "$ROW" | grep -oE '"total_ms":[0-9]+' | grep -oE '[0-9]+')
117
- TOTALS+=("$TOTAL")
118
- done
119
-
120
- # Median across runs
121
- if [ "${#TOTALS[@]}" -gt 1 ]; then
122
- SORTED=$(printf '%s\n' "${TOTALS[@]}" | sort -n)
123
- MEDIAN=$(echo "$SORTED" | awk -v n="${#TOTALS[@]}" 'NR == int((n+1)/2)')
124
- echo ""
125
- echo "median total_ms: $MEDIAN (across $RUNS runs)"
126
- fi
127
-
128
- echo "Wrote to: $OUT"
@@ -1,88 +0,0 @@
1
- #!/usr/bin/env node
2
- // Internal markdown link checker for the user-facing docs surface and the
3
- // pipeline instruction tree.
4
- //
5
- // Scope: root *.md + docs/**/*.md + examples/**/*.md + pipeline/**/*.md.
6
- // Verifies that every relative link target ([text](./path) or
7
- // [text](path#anchor)) resolves to an existing file or directory. Skipped:
8
- // external (http/https/mailto) links, pure #anchors, template links whose
9
- // path contains a {placeholder} variable, and links through shell
10
- // variables ($HOME, ...) - except $HOME/.claude/multi-agent-refs/, which
11
- // is checked against its repo source (pipeline/multi-agent-refs/) so a
12
- // ref rename cannot leave stale runtime links behind. This is a drift
13
- // gate for file moves/renames, not a network crawler.
14
- //
15
- // Excluded trees: pipeline/skills/shared/external/ is vendored community
16
- // skill content - several packs (the Apple HIG set) index upstream
17
- // references/ companion files that are deliberately not vendored here.
18
-
19
- import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
20
- import { dirname, join, resolve } from "node:path";
21
- import { fileURLToPath } from "node:url";
22
-
23
- const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
24
-
25
- function mdFiles(dir, acc = []) {
26
- for (const entry of readdirSync(dir)) {
27
- if (entry === "node_modules" || entry.startsWith(".")) continue;
28
- const full = join(dir, entry);
29
- if (statSync(full).isDirectory()) mdFiles(full, acc);
30
- else if (entry.endsWith(".md")) acc.push(full);
31
- }
32
- return acc;
33
- }
34
-
35
- const targets = [
36
- ...readdirSync(repoRoot)
37
- .filter((f) => f.endsWith(".md"))
38
- .map((f) => join(repoRoot, f)),
39
- ...["docs", "examples", "pipeline"]
40
- .filter((d) => existsSync(join(repoRoot, d)))
41
- .flatMap((d) => mdFiles(join(repoRoot, d))),
42
- // CHANGELOG-archive.md is frozen history - it legitimately references docs
43
- // that were deleted in later releases.
44
- ]
45
- .filter((f) => !f.endsWith("CHANGELOG-archive.md"))
46
- // Vendored community skill packs (see header note).
47
- .filter((f) => !f.includes(join("pipeline", "skills", "shared", "external") + "/"));
48
-
49
- const LINK_RE = /\[[^\]]*\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
50
- const errors = [];
51
-
52
- for (const file of targets) {
53
- // Drop fenced blocks and inline code spans - links inside code are
54
- // illustrative placeholders, not navigation.
55
- const text = readFileSync(file, "utf-8")
56
- .replace(/```[\s\S]*?```/g, "")
57
- .replace(/`[^`\n]*`/g, "");
58
- for (const match of text.matchAll(LINK_RE)) {
59
- const raw = match[1];
60
- if (/^(https?:|mailto:|#)/.test(raw)) continue;
61
- // Template placeholders ({fileKey}, {slug}, ...) resolve at runtime,
62
- // never on disk - skip them.
63
- if (raw.includes("{") || raw.includes("}")) continue;
64
- const target = raw.split("#")[0];
65
- if (target === "") continue;
66
- let resolved;
67
- const refsPrefix = "$HOME/.claude/multi-agent-refs/";
68
- if (target.startsWith(refsPrefix)) {
69
- // Runtime install path with a repo source - check the source tree.
70
- resolved = join(repoRoot, "pipeline", "multi-agent-refs", target.slice(refsPrefix.length));
71
- } else if (target.includes("$") || target.startsWith("~")) {
72
- // Other shell-variable / home paths resolve at runtime only.
73
- continue;
74
- } else {
75
- resolved = resolve(dirname(file), decodeURIComponent(target));
76
- }
77
- if (!existsSync(resolved)) {
78
- errors.push(`${file.slice(repoRoot.length + 1)}: broken link -> ${raw}`);
79
- }
80
- }
81
- }
82
-
83
- if (errors.length > 0) {
84
- console.error(`check-md-links: ${errors.length} broken internal link(s)`);
85
- for (const e of errors) console.error(" " + e);
86
- process.exit(1);
87
- }
88
- console.log(`check-md-links: ${targets.length} files OK`);