@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.
- package/CHANGELOG.md +207 -0
- package/install/_common.mjs +48 -0
- package/install/_dev-only-files.mjs +125 -5
- package/install/claude.mjs +14 -8
- package/install/copilot.mjs +5 -8
- package/package.json +17 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +1 -1
- package/pipeline/lib/credential-store.sh +20 -0
- package/pipeline/multi-agent-refs/_account-picker.md +1 -1
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
- package/pipeline/multi-agent-refs/features/review-multi-repo.md +65 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +93 -0
- package/pipeline/multi-agent-refs/phases/operations.md +28 -0
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +3 -83
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +50 -62
- package/pipeline/schemas/prefs.schema.json +6 -0
- package/pipeline/scripts/_smoke-root.sh +61 -0
- package/pipeline/scripts/agent-guard.py +57 -3
- package/pipeline/scripts/audit-log.sh +25 -0
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
- package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
- package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
- package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
- package/pipeline/eval/golden-tasks/README.md +0 -65
- package/pipeline/eval/intent-cases.json +0 -40
- package/pipeline/eval/run-metrics-fixture.json +0 -93
- package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
- package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
- package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
- package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
- package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
- package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
- package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
- package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
- package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
- package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
- package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
- package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
- package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
- package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
- package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
- package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
- package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
- package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
- package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
- package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
- package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
- package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
- package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
- package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
- package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
- package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
- package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
- package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
- package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
- package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
- package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
- package/pipeline/eval/triage/README.md +0 -54
- package/pipeline/scripts/benchmark-phase-0.sh +0 -128
- package/pipeline/scripts/check-md-links.mjs +0 -88
- package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -302
- package/pipeline/scripts/eval-golden-tasks.mjs +0 -224
- package/pipeline/scripts/eval-intent.mjs +0 -107
- package/pipeline/scripts/eval-mine-corpus.mjs +0 -211
- package/pipeline/scripts/eval-triage.mjs +0 -171
- package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
- package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
- package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
- package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
- package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
- package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
- package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
- package/pipeline/scripts/lint-mcp-refs.mjs +0 -218
- package/pipeline/scripts/lint-skills.mjs +0 -154
- package/pipeline/scripts/run-smokes.mjs +0 -130
- package/pipeline/scripts/scorecard.mjs +0 -258
- package/pipeline/scripts/smoke-add-detail.sh +0 -137
- package/pipeline/scripts/smoke-agent-guard.sh +0 -74
- package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
- package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
- package/pipeline/scripts/smoke-ask-choice.sh +0 -42
- package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
- package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
- package/pipeline/scripts/smoke-changelog-version.sh +0 -47
- package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
- package/pipeline/scripts/smoke-channels-flow.sh +0 -130
- package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
- package/pipeline/scripts/smoke-clarify.sh +0 -148
- package/pipeline/scripts/smoke-command-inventory.sh +0 -81
- package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
- package/pipeline/scripts/smoke-community-gates.sh +0 -75
- package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
- package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
- package/pipeline/scripts/smoke-context-budget.sh +0 -72
- package/pipeline/scripts/smoke-cost-budget.sh +0 -70
- package/pipeline/scripts/smoke-cost-summary.sh +0 -139
- package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
- package/pipeline/scripts/smoke-description-tr.sh +0 -82
- package/pipeline/scripts/smoke-dev-critic.sh +0 -144
- package/pipeline/scripts/smoke-diff-explain.sh +0 -147
- package/pipeline/scripts/smoke-diff-risk.sh +0 -190
- package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
- package/pipeline/scripts/smoke-eval-live.sh +0 -136
- package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
- package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
- package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
- package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
- package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
- package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
- package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
- package/pipeline/scripts/smoke-generate-issue.sh +0 -120
- package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
- package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
- package/pipeline/scripts/smoke-install-layout.sh +0 -248
- package/pipeline/scripts/smoke-intent-guard.sh +0 -86
- package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
- package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
- package/pipeline/scripts/smoke-keychain.sh +0 -158
- package/pipeline/scripts/smoke-language-axis.sh +0 -109
- package/pipeline/scripts/smoke-learning-curve.sh +0 -61
- package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
- package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
- package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
- package/pipeline/scripts/smoke-md-links.sh +0 -8
- package/pipeline/scripts/smoke-md2confluence.sh +0 -126
- package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
- package/pipeline/scripts/smoke-migrate-state.sh +0 -102
- package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
- package/pipeline/scripts/smoke-model-fallback.sh +0 -89
- package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
- package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
- package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -194
- package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
- package/pipeline/scripts/smoke-own-punctuation.sh +0 -103
- package/pipeline/scripts/smoke-pack-contents.sh +0 -140
- package/pipeline/scripts/smoke-pat-audit.sh +0 -128
- package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
- package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
- package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
- package/pipeline/scripts/smoke-phase-banner.sh +0 -101
- package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
- package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
- package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
- package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
- package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
- package/pipeline/scripts/smoke-plan-safety.sh +0 -139
- package/pipeline/scripts/smoke-plan-todos.sh +0 -196
- package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
- package/pipeline/scripts/smoke-pre-commit.sh +0 -170
- package/pipeline/scripts/smoke-pref-migration.sh +0 -226
- package/pipeline/scripts/smoke-prefs-language.sh +0 -134
- package/pipeline/scripts/smoke-progress-contract.sh +0 -127
- package/pipeline/scripts/smoke-prune-logs.sh +0 -137
- package/pipeline/scripts/smoke-purge.sh +0 -138
- package/pipeline/scripts/smoke-push-retry.sh +0 -75
- package/pipeline/scripts/smoke-repo-map.sh +0 -300
- package/pipeline/scripts/smoke-review-readiness.sh +0 -92
- package/pipeline/scripts/smoke-review-watch.sh +0 -146
- package/pipeline/scripts/smoke-routines.sh +0 -84
- package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
- package/pipeline/scripts/smoke-run-metrics.sh +0 -50
- package/pipeline/scripts/smoke-search.sh +0 -187
- package/pipeline/scripts/smoke-shadow-git.sh +0 -224
- package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
- package/pipeline/scripts/smoke-skill-language.sh +0 -83
- package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
- package/pipeline/scripts/smoke-skill-scan.sh +0 -198
- package/pipeline/scripts/smoke-source-parity.sh +0 -85
- package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
- package/pipeline/scripts/smoke-sync-parity.sh +0 -92
- package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
- package/pipeline/scripts/smoke-telemetry.sh +0 -147
- package/pipeline/scripts/smoke-test-gap.sh +0 -183
- package/pipeline/scripts/smoke-token-budget.sh +0 -67
- package/pipeline/scripts/smoke-token-preflight.sh +0 -82
- package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
- package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
- package/pipeline/scripts/smoke-triage-memory.sh +0 -174
- package/pipeline/scripts/smoke-update-check.sh +0 -135
- package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
- package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
- package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
- package/pipeline/scripts/smoke-validator-gates.sh +0 -164
- package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
- package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
- package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
- package/pipeline/scripts/smoke-work-summary.sh +0 -163
- package/pipeline/scripts/smoke-workflow-audit.sh +0 -101
- package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
- package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
- package/pipeline/scripts/smoke-write-state.sh +0 -159
- package/pipeline/scripts/sync-parity-check.sh +0 -135
- package/pipeline/scripts/test-gap-rules/android.json +0 -25
- package/pipeline/scripts/test-gap-rules/ios.json +0 -34
- package/pipeline/scripts/test-gap-rules/node.json +0 -29
- package/pipeline/scripts/test-gap-rules/python.json +0 -25
- 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`);
|