@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,67 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-validator-contradiction.sh - verify bidirectional approved↔blocking auto-correction.
3
- # Tests both directions of the triage validator's contradiction detection.
4
-
5
- set -uo pipefail
6
-
7
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
8
- VALIDATOR="$SCRIPT_DIR/validate-triage.mjs"
9
-
10
- PASS=0
11
- FAIL=0
12
-
13
- pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
14
- fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
15
-
16
- echo "→ 1. approved=false but no blocking items → auto-correct to true (exit 3)"
17
- RESULT=$(echo '{"accepted":[{"severity":"suggestion","file":"x.ts","line":1,"issue":"naming convention","fix":"rename to camelCase","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":false}' | node "$VALIDATOR" -)
18
- CODE=$?
19
- if [ "$CODE" -eq 3 ]; then pass "exit code 3 (contradiction corrected)"; else fail "expected exit 3, got $CODE"; fi
20
- CORRECTED=$(echo "$RESULT" | jq -r '.corrected.approved')
21
- if [ "$CORRECTED" = "true" ]; then pass "corrected.approved == true"; else fail "corrected.approved = $CORRECTED, expected true"; fi
22
-
23
- echo ""
24
- echo "→ 2. approved=true but has blocking item → auto-correct to false (exit 3)"
25
- RESULT=$(echo '{"accepted":[{"severity":"blocking","file":"auth.ts","line":42,"issue":"SQL injection vulnerability","fix":"use parameterized query","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
26
- CODE=$?
27
- if [ "$CODE" -eq 3 ]; then pass "exit code 3 (contradiction corrected)"; else fail "expected exit 3, got $CODE"; fi
28
- CORRECTED=$(echo "$RESULT" | jq -r '.corrected.approved')
29
- if [ "$CORRECTED" = "false" ]; then pass "corrected.approved == false"; else fail "corrected.approved = $CORRECTED, expected false"; fi
30
-
31
- echo ""
32
- echo "→ 3. approved=true with no blocking → valid (exit 0)"
33
- RESULT=$(echo '{"accepted":[{"severity":"important","file":"x.ts","line":1,"issue":"missing null check","fix":"add guard clause","reviewer":"sonnet"}],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
34
- CODE=$?
35
- if [ "$CODE" -eq 0 ]; then pass "exit code 0 (valid, no contradiction)"; else fail "expected exit 0, got $CODE"; fi
36
- OK=$(echo "$RESULT" | jq -r '.ok')
37
- if [ "$OK" = "true" ]; then pass "ok == true"; else fail "ok = $OK, expected true"; fi
38
-
39
- echo ""
40
- echo "→ 4. approved=false with blocking → valid (exit 0)"
41
- RESULT=$(echo '{"accepted":[{"severity":"blocking","file":"x.ts","line":1,"issue":"memory leak in closure","fix":"add [weak self]","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":false}' | node "$VALIDATOR" -)
42
- CODE=$?
43
- if [ "$CODE" -eq 0 ]; then pass "exit code 0 (valid, correct state)"; else fail "expected exit 0, got $CODE"; fi
44
- OK=$(echo "$RESULT" | jq -r '.ok')
45
- if [ "$OK" = "true" ]; then pass "ok == true"; else fail "ok = $OK, expected true"; fi
46
-
47
- echo ""
48
- echo "→ 5. empty accepted + approved=true → valid (exit 0)"
49
- RESULT=$(echo '{"accepted":[],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
50
- CODE=$?
51
- if [ "$CODE" -eq 0 ]; then pass "exit code 0 (empty, approved=true is correct)"; else fail "expected exit 0, got $CODE"; fi
52
-
53
- echo ""
54
- echo "→ 6. all suggestions + approved=false → auto-correct (exit 3)"
55
- RESULT=$(echo '{"accepted":[{"severity":"suggestion","file":"a.ts","line":1,"issue":"test name convention","fix":"rename test","reviewer":"sonnet"},{"severity":"suggestion","file":"b.ts","line":2,"issue":"unused import","fix":"remove import","reviewer":"opus"}],"deferred":[],"rejected":[],"approved":false}' | node "$VALIDATOR" -)
56
- CODE=$?
57
- if [ "$CODE" -eq 3 ]; then pass "exit code 3 (no blockers, corrected to true)"; else fail "expected exit 3, got $CODE"; fi
58
-
59
- echo ""
60
- echo "→ 7. mixed blocking+suggestion + approved=true → auto-correct to false (exit 3)"
61
- RESULT=$(echo '{"accepted":[{"severity":"blocking","file":"a.ts","line":1,"issue":"auth bypass","fix":"add auth check","reviewer":"opus"},{"severity":"suggestion","file":"b.ts","line":2,"issue":"naming","fix":"rename","reviewer":"sonnet"}],"deferred":[],"rejected":[],"approved":true}' | node "$VALIDATOR" -)
62
- CODE=$?
63
- if [ "$CODE" -eq 3 ]; then pass "exit code 3 (has blocker, corrected to false)"; else fail "expected exit 3, got $CODE"; fi
64
-
65
- echo ""
66
- echo "══ validator-contradiction smoke: $PASS passed, $FAIL failed ══"
67
- [ "$FAIL" -eq 0 ]
@@ -1,164 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-validator-gates.sh - v9.11.0
3
- #
4
- # Validates that the orchestrator phase docs wire the structured-output
5
- # validators (validate-analysis / validate-planning / validate-reviewer /
6
- # validate-triage) as deterministic gates, not just npm-test fixtures.
7
- #
8
- # Without this, a malformed analysis spec, plan, reviewer verdict, or triage
9
- # verdict flows downstream unchecked - the validators existed but only ran
10
- # in `npm test`, never in the live pipeline.
11
- #
12
- # What this enforces:
13
- # 1. Each validator accepts a FILE argument (the gate invocation form) and
14
- # exits 0 on a valid artifact / 1 on a malformed one.
15
- # 2. phase-1-analysis.md gates the analysis object via validate-analysis.mjs.
16
- # 3. phase-2-planning.md gates the plan object via validate-planning.mjs.
17
- # 4. phase-4-review.md gates reviewer outputs via validate-reviewer.mjs AND
18
- # the triage verdict via validate-triage.mjs.
19
- # 5. Every gate block documents the failure protocol: emit stderr, ONE
20
- # self-correction rework, re-run, then HALT with a recovery hint.
21
- #
22
- # What this does NOT enforce:
23
- # - Runtime - that the agent actually invokes the gate. This smoke catches
24
- # the prompt-side gap, same as smoke-tracker-contract.sh.
25
-
26
- set -euo pipefail
27
-
28
- REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
29
- SCRIPTS_DIR="$REPO_ROOT/pipeline/scripts"
30
- PHASES_DIR="$REPO_ROOT/pipeline/multi-agent-refs/phases"
31
-
32
- PASS=0
33
- FAIL=0
34
- pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
35
- fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
36
-
37
- command -v node >/dev/null 2>&1 || { echo "error: node required" >&2; exit 127; }
38
-
39
- TMP="$(mktemp -d)"
40
- trap 'rm -rf "$TMP"' EXIT
41
-
42
- # ──────────────────────────────────────────────────────────────────────────
43
- echo "→ 1. Validators exist and accept a file argument (gate invocation form)"
44
-
45
- printf '%s' '{"stack":{"primary":"ios"},"touchedAreas":[{"path":"Sources/App/Login.swift","why":"target of the change"}],"risks":[],"summary":"Valid analysis fixture used by the validator-gates smoke."}' > "$TMP/analysis.json"
46
- printf '%s' '{"approved":true,"tasks":[{"id":"T1","title":"Add validator gate","type":"code","files":["Sources/App/Login.swift"]}]}' > "$TMP/plan.json"
47
- printf '%s' '{"findings":[],"approved":true}' > "$TMP/reviewer.json"
48
- printf '%s' '{"accepted":[],"deferred":[],"rejected":[],"approved":true}' > "$TMP/triage.json"
49
-
50
- declare -a CHECKS=(
51
- "validate-analysis.mjs|$TMP/analysis.json"
52
- "validate-planning.mjs|$TMP/plan.json"
53
- "validate-reviewer.mjs|$TMP/reviewer.json"
54
- "validate-triage.mjs|$TMP/triage.json"
55
- )
56
- for entry in "${CHECKS[@]}"; do
57
- validator="${entry%%|*}"
58
- fixture="${entry##*|}"
59
- if [ ! -f "$SCRIPTS_DIR/$validator" ]; then
60
- fail "$validator missing under pipeline/scripts/"
61
- continue
62
- fi
63
- if node "$SCRIPTS_DIR/$validator" "$fixture" >/dev/null 2>&1; then
64
- pass "$validator accepts a file argument (exit 0 on valid fixture)"
65
- else
66
- fail "$validator rejected a valid fixture via file argument"
67
- fi
68
- done
69
-
70
- rc=0
71
- printf '%s' '{}' > "$TMP/malformed.json"
72
- node "$SCRIPTS_DIR/validate-analysis.mjs" "$TMP/malformed.json" >/dev/null 2>&1 || rc=$?
73
- if [ "$rc" -eq 1 ]; then
74
- pass "validate-analysis.mjs fails CLOSED on a malformed file (exit 1)"
75
- else
76
- fail "validate-analysis.mjs malformed-file exit wrong (got $rc, expected 1)"
77
- fi
78
-
79
- # ──────────────────────────────────────────────────────────────────────────
80
- echo "→ 2. Phase docs carry the file-based gate invocation marker"
81
-
82
- declare -a GATES=(
83
- "phase-1-analysis.md|validate-analysis.mjs \"\$ANALYSIS_FILE\""
84
- "phase-2-planning.md|validate-planning.mjs \"\$PLAN_FILE\""
85
- "phase-4-review.md|validate-reviewer.mjs \"\$REVIEWER_FILE\""
86
- "phase-4-review.md|validate-triage.mjs \"\$TRIAGE_FILE\""
87
- )
88
- for entry in "${GATES[@]}"; do
89
- doc="${entry%%|*}"
90
- marker="${entry##*|}"
91
- if [ ! -f "$PHASES_DIR/$doc" ]; then
92
- fail "$doc missing"
93
- continue
94
- fi
95
- if grep -qF "$marker" "$PHASES_DIR/$doc"; then
96
- pass "$doc invokes $marker"
97
- else
98
- fail "$doc missing gate invocation marker: $marker"
99
- fi
100
- done
101
-
102
- # ──────────────────────────────────────────────────────────────────────────
103
- echo "→ 3. Gate invocations use the installed-scripts path (\$HOME/.claude/scripts)"
104
-
105
- declare -a INSTALLED=(
106
- "phase-1-analysis.md|validate-analysis.mjs"
107
- "phase-2-planning.md|validate-planning.mjs"
108
- "phase-4-review.md|validate-reviewer.mjs"
109
- "phase-4-review.md|validate-triage.mjs"
110
- )
111
- for entry in "${INSTALLED[@]}"; do
112
- doc="${entry%%|*}"
113
- validator="${entry##*|}"
114
- if grep -qF "\$HOME/.claude/scripts/$validator" "$PHASES_DIR/$doc" 2>/dev/null; then
115
- pass "$doc invokes \$HOME/.claude/scripts/$validator"
116
- else
117
- fail "$doc missing \$HOME/.claude/scripts/$validator invocation"
118
- fi
119
- done
120
-
121
- # ──────────────────────────────────────────────────────────────────────────
122
- echo "→ 4. Every gate block documents the failure protocol (rework once, then halt)"
123
-
124
- declare -a PROTOCOL_DOCS=(
125
- "phase-1-analysis.md"
126
- "phase-2-planning.md"
127
- "phase-4-review.md"
128
- )
129
- for doc in "${PROTOCOL_DOCS[@]}"; do
130
- full="$PHASES_DIR/$doc"
131
- [ -f "$full" ] || { fail "$doc missing"; continue; }
132
- if grep -qi "ONE self-correction rework" "$full"; then
133
- pass "$doc documents the single self-correction rework"
134
- else
135
- fail "$doc missing the self-correction rework step"
136
- fi
137
- if grep -q "HALT the phase" "$full"; then
138
- pass "$doc halts the phase on second validator failure"
139
- else
140
- fail "$doc missing the halt-on-second-failure rule"
141
- fi
142
- done
143
-
144
- # Recovery hints name the validator and the schema to inspect.
145
- declare -a HINTS=(
146
- "phase-1-analysis.md|failed validate-analysis.mjs twice"
147
- "phase-2-planning.md|failed validate-planning.mjs twice"
148
- "phase-4-review.md|failed validate-reviewer.mjs twice"
149
- "phase-4-review.md|failed validate-triage.mjs twice"
150
- )
151
- for entry in "${HINTS[@]}"; do
152
- doc="${entry%%|*}"
153
- hint="${entry##*|}"
154
- if grep -qF "$hint" "$PHASES_DIR/$doc" 2>/dev/null; then
155
- pass "$doc carries recovery hint: $hint"
156
- else
157
- fail "$doc missing recovery hint: $hint"
158
- fi
159
- done
160
-
161
- # ──────────────────────────────────────────────────────────────────────────
162
- echo ""
163
- echo "══ validator-gates smoke: $PASS passed, $FAIL failed ══"
164
- [ "$FAIL" -eq 0 ]
@@ -1,129 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # smoke-vercel-deploy-redact.sh - verify pipeline/lib/vercel-deploy.sh
4
- # scrubs every known token-leak shape from CLI output.
5
- #
6
- # Background: v7.9.1 production deploy failed with the Vercel CLI
7
- # printing `vercel deploy --token=vcp_...` in the retry hint. The token leaked
8
- # into the conversation transcript and required rotation. v8.0.0 added
9
- # vercel-deploy.sh as the safe wrapper. This smoke is the regression gate -
10
- # any future change to the redact filter must keep these patterns covered.
11
- #
12
- # Patterns under test:
13
- # - --token=vcp_<hex> (the original 7.9.1 leak shape)
14
- # - --token vcp_<hex> (space-separated argv)
15
- # - vcp_<bare> (token-only mention)
16
- # - Bearer <jwt-ish> (HTTP auth header)
17
- # - "token":"<val>" (JSON body)
18
- # - "VERCEL_TOKEN":"<val>" (env-dump JSON)
19
- #
20
- # Exit codes: 0=pass, 1=at least one pattern survived redaction
21
- set -euo pipefail
22
-
23
- REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
24
- WRAPPER="$REPO_ROOT/pipeline/lib/vercel-deploy.sh"
25
-
26
- [ -x "$WRAPPER" ] || chmod +x "$WRAPPER" 2>/dev/null || true
27
- [ -f "$WRAPPER" ] || { echo "FAIL: vercel-deploy.sh missing"; exit 2; }
28
-
29
- PASS=0
30
- FAIL=0
31
- pass() { echo " ✓ $*"; PASS=$((PASS + 1)); }
32
- fail() { echo " ✗ $*"; FAIL=$((FAIL + 1)); }
33
-
34
- assert_redacts() {
35
- local label="$1"
36
- local input="$2"
37
- local must_not_contain="$3"
38
- local out
39
- out=$(printf '%s' "$input" | bash "$WRAPPER" redact)
40
- if echo "$out" | grep -qE "$must_not_contain"; then
41
- fail "$label - leak survived: $(echo "$out" | grep -oE "$must_not_contain" | head -1)"
42
- else
43
- pass "$label"
44
- fi
45
- }
46
-
47
- # --- Pattern 1: --token=vcp_... (original v7.9.1 leak) ---
48
- assert_redacts "--token=vcp_... argv form scrubbed" \
49
- 'Run `vercel deploy --token=vcp_AbCdEf123456789abcdef --prod` to retry' \
50
- 'vcp_AbCdEf123456789abcdef'
51
-
52
- # --- Pattern 2: --token <space> vcp_... ---
53
- assert_redacts "--token <space> argv form scrubbed" \
54
- 'next.command: vercel deploy --token vcp_QwertyUiopASDFghj1234' \
55
- 'vcp_QwertyUiopASDFghj1234'
56
-
57
- # --- Pattern 3: bare vcp_... token mention ---
58
- assert_redacts "bare vcp_... token mention scrubbed" \
59
- 'Authentication failed for token vcp_BareLeak987654321xyz on retry.' \
60
- 'vcp_BareLeak987654321xyz'
61
-
62
- # --- Pattern 4: Bearer <jwt-ish> auth header ---
63
- assert_redacts "Bearer <jwt> auth header scrubbed" \
64
- 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0In0.signature' \
65
- 'eyJhbGciOiJIUzI1NiJ9'
66
-
67
- # --- Pattern 5: "token":"<val>" JSON body ---
68
- assert_redacts '"token":"<val>" JSON body scrubbed' \
69
- '{"token":"vcp_JsonBodyLeak555","scope":"deploy"}' \
70
- 'vcp_JsonBodyLeak555'
71
-
72
- # --- Pattern 6: "VERCEL_TOKEN":"<val>" env-dump JSON ---
73
- assert_redacts '"VERCEL_TOKEN":"<val>" env-dump scrubbed' \
74
- 'env: { "VERCEL_TOKEN":"vcp_EnvDumpLeak777", "NODE_ENV":"production" }' \
75
- 'vcp_EnvDumpLeak777'
76
-
77
- # --- Pattern 7: multi-line CLI failure dump (real-world shape from v7.9.1) ---
78
- multiline=$'Error: failed to deploy\n next.command: vercel deploy --token=vcp_RealDumpLeak888 --prod\n retry: yes'
79
- assert_redacts "multi-line CLI failure dump scrubbed" \
80
- "$multiline" \
81
- 'vcp_RealDumpLeak888'
82
-
83
- # --- Negative: non-token text passes through unchanged ---
84
- echo ""
85
- echo "→ Negative cases - non-token text MUST pass through verbatim"
86
- sample='Deployment URL: https://example.vercel.app/page (200 OK)'
87
- roundtrip=$(printf '%s' "$sample" | bash "$WRAPPER" redact)
88
- if [ "$roundtrip" = "$sample" ]; then
89
- pass "innocuous output unchanged"
90
- else
91
- fail "redactor mangled innocuous output: '$roundtrip' != '$sample'"
92
- fi
93
-
94
- # --- Wrapper guard: refuses --token argv ---
95
- echo ""
96
- echo "→ Wrapper guard - refuses to deploy with --token argv"
97
- guard_out=$(VERCEL_TOKEN=vcp_GuardCheck111 bash "$WRAPPER" deploy --token=vcp_BadArg 2>&1 || true)
98
- if echo "$guard_out" | grep -q "refused to deploy with --token argv"; then
99
- pass "wrapper rejects --token argv with explicit error"
100
- else
101
- fail "wrapper did not reject --token argv (output: $guard_out)"
102
- fi
103
- # Verify the refusal message itself doesn't leak the bad token
104
- if echo "$guard_out" | grep -q "vcp_BadArg"; then
105
- fail "refusal message leaked the bad token (vcp_BadArg)"
106
- else
107
- pass "refusal message does not echo the offending token"
108
- fi
109
-
110
- # --- Doctor mode runs without VERCEL_TOKEN crashing ---
111
- echo ""
112
- echo "→ doctor subcommand"
113
- doctor_out=$(VERCEL_TOKEN= bash "$WRAPPER" doctor 2>&1 || true)
114
- if echo "$doctor_out" | grep -q "VERCEL_TOKEN: unset"; then
115
- pass "doctor reports unset token clearly"
116
- else
117
- fail "doctor did not handle unset VERCEL_TOKEN gracefully"
118
- fi
119
-
120
- doctor_set_out=$(VERCEL_TOKEN=vcp_DoctorTokenABCDEF12345 bash "$WRAPPER" doctor 2>&1 || true)
121
- if echo "$doctor_set_out" | grep -q "vcp_DoctorTokenABCDEF12345"; then
122
- fail "doctor leaked the token in set-mode output"
123
- else
124
- pass "doctor masks the token in set-mode output"
125
- fi
126
-
127
- echo ""
128
- echo "══ smoke-vercel-deploy-redact: $PASS passed, $FAIL failed ══"
129
- [ "$FAIL" -gt 0 ] && exit 1 || exit 0
@@ -1,148 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-verify-by-test.sh
3
- #
4
- # Verifies the Phase 4 Step 3.7 verify-by-test contract:
5
- # 1. phase-4-review.md documents Step 3.7 with evidence-gate invocation + feature-doc pointer
6
- # 2. refs/features/verify-by-test.md exists and covers the verdict table + red-test handoff
7
- # 3. prefs.schema.json exposes global.verifyByTest.{enabled,maxFindings,model,stepTimeoutSec}
8
- # 4. verifyByTest.enabled defaults to false (opt-in, no surprise cost)
9
- # 5. triage-output.schema.json is v3.2.0 with the $defs.verification result enum
10
- # 6. validate-triage.mjs accepts a valid `confirmed` verification and rejects bad ones
11
- # 7. phase-3-dev.md documents the redTests rework re-entry
12
- #
13
- # Exit 0 = all pass, 1 = any failure.
14
-
15
- set -euo pipefail
16
-
17
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
18
- PHASE4_DOC="$ROOT/pipeline/multi-agent-refs/phases/phase-4-review.md"
19
- PHASE3_DOC="$ROOT/pipeline/multi-agent-refs/phases/phase-3-dev.md"
20
- FEATURE_DOC="$ROOT/pipeline/multi-agent-refs/features/verify-by-test.md"
21
- PREFS_SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
22
- TRIAGE_SCHEMA="$ROOT/pipeline/schemas/triage-output.schema.json"
23
- VALIDATOR="$ROOT/pipeline/scripts/validate-triage.mjs"
24
-
25
- pass=0
26
- fail=0
27
- failures=()
28
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
29
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
30
-
31
- printf '→ smoke-verify-by-test: Phase 4 Step 3.7 contract\n'
32
-
33
- # 1. Phase 4 doc documents Step 3.7
34
- if [ ! -f "$PHASE4_DOC" ]; then
35
- record_fail "phase-4-review.md missing"
36
- else
37
- if grep -qF "3.7 Verify-by-test" "$PHASE4_DOC"; then
38
- record_pass "phase-4-review.md documents Step 3.7"
39
- else
40
- record_fail "phase-4-review.md missing Step 3.7 section"
41
- fi
42
- if grep -qF "evidence-gate.mjs --claim test --status passed" "$PHASE4_DOC"; then
43
- record_pass "Step 3.7 downgrade is evidence-gated"
44
- else
45
- record_fail "Step 3.7 must gate downgrades via evidence-gate.mjs --claim test --status passed"
46
- fi
47
- if grep -qF "refs/features/verify-by-test.md" "$PHASE4_DOC"; then
48
- record_pass "phase-4-review.md points to the feature doc"
49
- else
50
- record_fail "phase-4-review.md must reference refs/features/verify-by-test.md"
51
- fi
52
- if grep -qF "review.verify_by_test" "$PHASE4_DOC"; then
53
- record_pass "Step 3.7 emits review.verify_by_test telemetry"
54
- else
55
- record_fail "Step 3.7 must document the review.verify_by_test metric"
56
- fi
57
- fi
58
-
59
- # 2. Feature doc exists with verdict + handoff coverage
60
- if [ ! -f "$FEATURE_DOC" ]; then
61
- record_fail "refs/features/verify-by-test.md missing"
62
- else
63
- for token in "not-reproduced" "inconclusive" "redTests" "Off by default"; do
64
- if grep -qF "$token" "$FEATURE_DOC"; then
65
- record_pass "feature doc covers '$token'"
66
- else
67
- record_fail "feature doc missing '$token'"
68
- fi
69
- done
70
- fi
71
-
72
- # 3. Prefs schema exposes verifyByTest knobs
73
- for prop in enabled maxFindings model stepTimeoutSec; do
74
- if jq -e ".properties.global.properties.verifyByTest.properties.${prop}" "$PREFS_SCHEMA" >/dev/null 2>&1; then
75
- record_pass "prefs schema exposes verifyByTest.${prop}"
76
- else
77
- record_fail "prefs schema missing verifyByTest.${prop}"
78
- fi
79
- done
80
-
81
- # 4. Off by default - preserves existing-user baseline
82
- if jq -e '.properties.global.properties.verifyByTest.properties.enabled
83
- | has("default") and .default == false' "$PREFS_SCHEMA" >/dev/null 2>&1; then
84
- record_pass "verifyByTest.enabled defaults to false (opt-in)"
85
- else
86
- record_fail "verifyByTest.enabled must default to false"
87
- fi
88
-
89
- # 5. Triage schema version + verification enum
90
- schema_version=$(jq -r '.version // empty' "$TRIAGE_SCHEMA")
91
- if [ "$schema_version" = "3.2.0" ]; then
92
- record_pass "triage-output schema version is 3.2.0"
93
- else
94
- record_fail "triage-output schema version should be 3.2.0 (was: ${schema_version:-missing})"
95
- fi
96
- if jq -e '.["$defs"].verification.properties.result.enum
97
- | (index("confirmed") != null
98
- and index("not-reproduced") != null
99
- and index("inconclusive") != null)' "$TRIAGE_SCHEMA" >/dev/null 2>&1; then
100
- record_pass "schema verification.result enum complete"
101
- else
102
- record_fail "schema \$defs.verification.result enum must be confirmed/not-reproduced/inconclusive"
103
- fi
104
-
105
- # 6. Behavioral validator round-trips
106
- valid_fixture='{"accepted":[{"severity":"blocking","file":"Sources/Auth/Login.swift","line":42,"issue":"expired token accepted as valid","fix":"reject tokens past expiry in validateToken()","reviewer":"fable","verification":{"result":"confirmed","testRef":"AuthTests/LoginTests/testExpiredTokenRejected","evidencePath":".pipeline/verify-1.test.log"}}],"deferred":[],"rejected":[],"approved":false}'
107
- if printf '%s' "$valid_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
108
- record_pass "validator accepts confirmed verification with testRef+evidencePath"
109
- else
110
- record_fail "validator rejected a valid confirmed verification"
111
- fi
112
-
113
- bad_result_fixture='{"accepted":[{"severity":"blocking","file":"a.swift","line":1,"issue":"some issue here","fix":"do the fix","reviewer":"fable","verification":{"result":"maybe"}}],"deferred":[],"rejected":[],"approved":false}'
114
- if printf '%s' "$bad_result_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
115
- record_fail "validator must reject verification.result 'maybe'"
116
- else
117
- record_pass "validator rejects bad verification.result"
118
- fi
119
-
120
- missing_ref_fixture='{"accepted":[{"severity":"blocking","file":"a.swift","line":1,"issue":"some issue here","fix":"do the fix","reviewer":"fable","verification":{"result":"confirmed"}}],"deferred":[],"rejected":[],"approved":false}'
121
- if printf '%s' "$missing_ref_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
122
- record_fail "validator must reject confirmed verification without testRef/evidencePath"
123
- else
124
- record_pass "validator rejects confirmed verification lacking testRef/evidencePath"
125
- fi
126
-
127
- # Reviewer enum parity: fable (Claude Code default) and gpt (Copilot CLI) accepted
128
- fable_fixture='{"accepted":[{"severity":"important","file":"a.swift","line":1,"issue":"some issue here","fix":"do the fix","reviewer":"gpt"}],"deferred":[],"rejected":[],"approved":true}'
129
- if printf '%s' "$fable_fixture" | node "$VALIDATOR" - >/dev/null 2>&1; then
130
- record_pass "validator accepts schema-allowed reviewers (fable/gpt)"
131
- else
132
- record_fail "validator must accept reviewer values fable and gpt (schema v3.1.0 parity)"
133
- fi
134
-
135
- # 7. Phase 3 doc documents the red-test rework re-entry
136
- if grep -qF "verifyByTest.redTests" "$PHASE3_DOC"; then
137
- record_pass "phase-3-dev.md documents redTests rework re-entry"
138
- else
139
- record_fail "phase-3-dev.md must document verifyByTest.redTests re-entry"
140
- fi
141
-
142
- printf '\n══ verify-by-test smoke: %d passed, %d failed ══\n' "$pass" "$fail"
143
- if [ "$fail" -gt 0 ]; then
144
- printf '\nFailures:\n'
145
- for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
146
- exit 1
147
- fi
148
- exit 0
@@ -1,122 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-wiki-integration.sh - v5.7+ wiki channel adapter contract.
3
- #
4
- # Verifies:
5
- # 1. prefs.schema.json declares global.wikiScope (array of enum) + reportChannels.wiki (boolean).
6
- # 2. figma-project-config schema declares wiki.mode enum with 4 adapters.
7
- # 3. Wiki adapter surface (channels.md + wiki-capture.md) documents:
8
- # - Case A (preconditions met) scope multi-select
9
- # - Case B (preconditions missing) actionable menu
10
- # - taskType === "component" gate
11
- # - wiki.enabled gate
12
- # - 4 adapter modes (submodule / in-repo / github-wiki / separate-repo)
13
- # - Writing wiki progress line
14
- # 4. figma-component-wiki SKILL.md has dispatch contract + 4 adapters.
15
-
16
- set -euo pipefail
17
-
18
- HERE="$(cd "$(dirname "$0")" && pwd)"
19
- ROOT="$(cd "$HERE/../.." && pwd)"
20
- PREFS="$ROOT/pipeline/schemas/prefs.schema.json"
21
- FIGMA_SCHEMA="$ROOT/pipeline/schemas/figma-project-config.schema.json"
22
- CHANNELS="$ROOT/pipeline/commands/multi-agent/channels/SKILL.md"
23
- WIKI_REF="$ROOT/pipeline/multi-agent-refs/wiki-capture.md"
24
- PHASE7="$ROOT/pipeline/multi-agent-refs/phases/phase-7-report.md"
25
- MODES="$ROOT/pipeline/multi-agent-refs/phases/modes.md"
26
- # (figma-component-wiki skill now lives in the ai-ios-engineering-toolkit plugin, not this repo)
27
-
28
- PASS=0
29
- FAIL=0
30
- pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
31
- fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
32
-
33
- need() { command -v "$1" >/dev/null 2>&1 || { echo "error: $1 required" >&2; exit 127; }; }
34
- need jq
35
-
36
- for f in "$PREFS" "$FIGMA_SCHEMA" "$CHANNELS" "$WIKI_REF" "$PHASE7" "$MODES"; do
37
- [ -f "$f" ] || { echo "error: missing $f" >&2; exit 1; }
38
- done
39
-
40
- # Combined surface - channels.md + wiki-capture.md + phase-7-report.md + modes.md. Any may carry assertion.
41
- WIKI_SURFACE="$(mktemp)"
42
- trap 'rm -f "$WIKI_SURFACE"' EXIT
43
- cat "$CHANNELS" "$WIKI_REF" "$PHASE7" "$MODES" > "$WIKI_SURFACE"
44
-
45
- echo "→ 1. prefs schema declares wikiScope (array) + reportChannels.wiki (boolean)"
46
- SCOPE_TYPE=$(jq -r '.properties.global.properties.wikiScope.type // "missing"' "$PREFS")
47
- [ "$SCOPE_TYPE" = "array" ] && pass "wikiScope is array" || fail "wikiScope type = '$SCOPE_TYPE' (want array)"
48
- SCOPE_ENUM=$(jq -c '.properties.global.properties.wikiScope.items.enum // []' "$PREFS")
49
- EXPECTED_ENUM='["main","ios","screenshots","index"]'
50
- [ "$SCOPE_ENUM" = "$EXPECTED_ENUM" ] && pass "wikiScope enum = [main,ios,screenshots,index]" || fail "wikiScope enum mismatch: $SCOPE_ENUM"
51
-
52
- CHAN_WIKI_TYPE=$(jq -r '.properties.global.properties.reportChannels.properties.wiki.type // "missing"' "$PREFS")
53
- [ "$CHAN_WIKI_TYPE" = "boolean" ] && pass "reportChannels.wiki is boolean" || fail "reportChannels.wiki type = '$CHAN_WIKI_TYPE'"
54
-
55
- echo ""
56
- echo "→ 2. figma-project-config schema declares wiki.mode with 4 adapters"
57
- MODE_ENUM=$(jq -c '.properties.wiki.properties.mode.enum' "$FIGMA_SCHEMA")
58
- EXPECTED='["submodule","in-repo","github-wiki","separate-repo"]'
59
- [ "$MODE_ENUM" = "$EXPECTED" ] && pass "wiki.mode enum = 4 adapters" || fail "wiki.mode enum mismatch: $MODE_ENUM"
60
-
61
- echo ""
62
- echo "→ 3. Wiki adapter (channels.md + wiki-capture.md) has Case A + Case B"
63
- if grep -Fq "Case A" "$WIKI_REF" || grep -Fq "preconditions met" "$WIKI_REF"; then
64
- pass "Case A (preconditions met) documented"
65
- else
66
- fail "Case A not documented"
67
- fi
68
- if grep -Fq "Case B" "$WIKI_REF" || grep -Fq "preconditions missing" "$WIKI_REF"; then
69
- pass "Case B (preconditions missing) documented"
70
- else
71
- fail "Case B not documented"
72
- fi
73
-
74
- echo ""
75
- echo "→ 4. Wiki surface gates on taskType === component"
76
- if grep -Fq 'state.taskType === "component"' "$WIKI_SURFACE" || grep -Fq 'taskType=component' "$WIKI_SURFACE"; then
77
- pass "taskType gate documented"
78
- else
79
- fail "taskType gate missing"
80
- fi
81
-
82
- echo ""
83
- echo "→ 5. Wiki surface references wiki.enabled"
84
- if grep -Fq "wiki.enabled" "$WIKI_SURFACE"; then
85
- pass "wiki.enabled gate documented"
86
- else
87
- fail "wiki.enabled gate missing"
88
- fi
89
-
90
- echo ""
91
- echo "→ 6. Wiki surface lists all 4 adapter modes"
92
- MODES_HIT=0
93
- for mode in submodule in-repo github-wiki separate-repo; do
94
- if grep -Fq "\`$mode\`" "$WIKI_SURFACE"; then
95
- MODES_HIT=$((MODES_HIT+1))
96
- fi
97
- done
98
- [ "$MODES_HIT" -eq 4 ] && pass "all 4 modes listed" || fail "wiki surface lists $MODES_HIT/4 modes"
99
-
100
- echo ""
101
- echo "→ 7. Wiki surface emits wiki progress line"
102
- if grep -qE '→ writing wiki' "$WIKI_SURFACE"; then
103
- pass "progress line shape documented"
104
- else
105
- fail "missing progress line"
106
- fi
107
-
108
- echo ""
109
- echo "→ 8. Wiki surface documents autopilot always-pause behaviour"
110
- if grep -qiE 'autopilot.*pause|ALWAYS pauses|Phase 7 autopilot exception' "$WIKI_SURFACE"; then
111
- pass "autopilot always-pause documented"
112
- else
113
- fail "autopilot always-pause not documented"
114
- fi
115
-
116
- # (The figma-component-wiki SKILL.md and its dispatch-contract / 4-adapter / frontmatter
117
- # assertions moved with the skill into the ai-ios-engineering-toolkit marketplace plugin;
118
- # this pipeline smoke now only covers the wiki CHANNEL wiring on the pipeline side.)
119
-
120
- echo ""
121
- echo "══ wiki-integration smoke: $PASS passed, $FAIL failed ══"
122
- [ "$FAIL" -eq 0 ]