@mmerterden/multi-agent-pipeline 12.6.0 → 12.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +18 -18
  3. package/docs/FIGMA_PIPELINE.md +34 -34
  4. package/docs/adr/0001-three-model-triage.md +12 -12
  5. package/docs/adr/0002-instruction-driven-flag.md +5 -5
  6. package/docs/adr/0003-unified-shared-skills.md +5 -5
  7. package/docs/adr/0004-zero-dependency-philosophy.md +5 -5
  8. package/docs/adr/0005-lazy-phase-docs.md +2 -2
  9. package/docs/adr/0006-skills-core-external-split.md +6 -6
  10. package/docs/adr/0007-multi-tool-adapter-framework.md +19 -19
  11. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +19 -19
  12. package/docs/adr/README.md +1 -1
  13. package/docs/best-practices.md +3 -3
  14. package/docs/features.md +28 -28
  15. package/docs/performance.md +16 -16
  16. package/docs/recovery-guide.md +39 -39
  17. package/index.js +4 -4
  18. package/install/_common.mjs +53 -11
  19. package/install/_copilot-instructions.mjs +2 -2
  20. package/install/_dev-only-files.mjs +126 -6
  21. package/install/_platform-filter.mjs +1 -1
  22. package/install/_telemetry.mjs +1 -1
  23. package/install/claude.mjs +20 -13
  24. package/install/copilot.mjs +11 -23
  25. package/install/index.mjs +7 -15
  26. package/install/templates/copilot-instructions.md +54 -54
  27. package/install.js +1 -1
  28. package/package.json +29 -11
  29. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  30. package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
  31. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +1 -1
  32. package/pipeline/commands/multi-agent/autopilot/SKILL.md +1 -1
  33. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +1 -1
  34. package/pipeline/commands/multi-agent/create-jira/SKILL.md +1 -1
  35. package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
  36. package/pipeline/commands/multi-agent/dev/SKILL.md +1 -1
  37. package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +1 -1
  38. package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
  39. package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +1 -1
  40. package/pipeline/commands/multi-agent/diff-explain/SKILL.md +1 -1
  41. package/pipeline/commands/multi-agent/finish/SKILL.md +6 -6
  42. package/pipeline/commands/multi-agent/forget/SKILL.md +1 -1
  43. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
  44. package/pipeline/commands/multi-agent/help/SKILL.md +3 -3
  45. package/pipeline/commands/multi-agent/issue/SKILL.md +1 -1
  46. package/pipeline/commands/multi-agent/jira/SKILL.md +1 -1
  47. package/pipeline/commands/multi-agent/kill/SKILL.md +1 -1
  48. package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
  49. package/pipeline/commands/multi-agent/local/SKILL.md +1 -1
  50. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
  51. package/pipeline/commands/multi-agent/log/SKILL.md +1 -1
  52. package/pipeline/commands/multi-agent/manual-test/SKILL.md +1 -1
  53. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +1 -1
  54. package/pipeline/commands/multi-agent/purge/SKILL.md +1 -1
  55. package/pipeline/commands/multi-agent/refactor/SKILL.md +16 -8
  56. package/pipeline/commands/multi-agent/resume/SKILL.md +2 -2
  57. package/pipeline/commands/multi-agent/review/SKILL.md +1 -1
  58. package/pipeline/commands/multi-agent/review-issue/SKILL.md +1 -1
  59. package/pipeline/commands/multi-agent/review-jira/SKILL.md +1 -1
  60. package/pipeline/commands/multi-agent/routines/SKILL.md +1 -1
  61. package/pipeline/commands/multi-agent/save/SKILL.md +1 -1
  62. package/pipeline/commands/multi-agent/scan/SKILL.md +1 -1
  63. package/pipeline/commands/multi-agent/search/SKILL.md +1 -1
  64. package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
  65. package/pipeline/commands/multi-agent/stack/SKILL.md +3 -3
  66. package/pipeline/commands/multi-agent/status/SKILL.md +1 -1
  67. package/pipeline/commands/multi-agent/sync/SKILL.md +5 -5
  68. package/pipeline/commands/multi-agent/test/SKILL.md +1 -1
  69. package/pipeline/commands/multi-agent/uninstall/SKILL.md +1 -1
  70. package/pipeline/commands/multi-agent/update/SKILL.md +3 -3
  71. package/pipeline/lib/account-resolver.sh +1 -1
  72. package/pipeline/lib/channels-multi-repo.sh +1 -1
  73. package/pipeline/lib/context-link-extractor.sh +1 -1
  74. package/pipeline/lib/credential-store.sh +21 -1
  75. package/pipeline/lib/fetch-confluence.sh +1 -1
  76. package/pipeline/lib/fetch-crashlytics.sh +1 -1
  77. package/pipeline/lib/fetch-fortify.sh +1 -1
  78. package/pipeline/lib/fetch-graylog.sh +1 -1
  79. package/pipeline/lib/fetch-swagger.sh +1 -1
  80. package/pipeline/lib/issue-fetcher.sh +1 -1
  81. package/pipeline/lib/multi-repo-pipeline.sh +1 -1
  82. package/pipeline/lib/repo-cache.sh +1 -1
  83. package/pipeline/lib/submodule-detector.sh +1 -1
  84. package/pipeline/multi-agent-refs/_account-picker.md +1 -1
  85. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  86. package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
  87. package/pipeline/multi-agent-refs/component-dispatch.md +1 -1
  88. package/pipeline/multi-agent-refs/component-generation.md +121 -0
  89. package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
  90. package/pipeline/multi-agent-refs/features/model-fallback.md +2 -2
  91. package/pipeline/multi-agent-refs/phases/operations.md +28 -0
  92. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -0
  93. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
  94. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
  95. package/pipeline/multi-agent-refs/phases/phase-4-review.md +50 -5
  96. package/pipeline/preferences-template.json +5 -11
  97. package/pipeline/schemas/agent-state.schema.json +39 -9
  98. package/pipeline/schemas/analysis-output.schema.json +18 -4
  99. package/pipeline/schemas/analysis-spec.schema.json +120 -32
  100. package/pipeline/schemas/clarify-output.schema.json +15 -5
  101. package/pipeline/schemas/design-check-config.schema.json +32 -11
  102. package/pipeline/schemas/dev-critic-output.schema.json +20 -5
  103. package/pipeline/schemas/figma-project-config.schema.json +42 -10
  104. package/pipeline/schemas/learnings-ledger.schema.json +10 -2
  105. package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +1 -4
  106. package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +24 -7
  107. package/pipeline/schemas/plan-todos.schema.json +6 -3
  108. package/pipeline/schemas/planning-output.schema.json +5 -1
  109. package/pipeline/schemas/prefs.schema.json +97 -229
  110. package/pipeline/schemas/test-gap.schema.json +5 -5
  111. package/pipeline/schemas/token-budget.json +8 -8
  112. package/pipeline/schemas/triage-corpus.schema.json +1 -1
  113. package/pipeline/scripts/_smoke-root.sh +61 -0
  114. package/pipeline/scripts/aggregate-metrics.mjs +18 -6
  115. package/pipeline/scripts/audit-log.sh +25 -0
  116. package/pipeline/scripts/build-skills-index.mjs +6 -2
  117. package/pipeline/scripts/build-stack-plugins.mjs +142 -39
  118. package/pipeline/scripts/check-derived-drift.mjs +196 -0
  119. package/pipeline/scripts/classify-plan-safety.mjs +20 -7
  120. package/pipeline/scripts/cost-budget-check.mjs +2 -1
  121. package/pipeline/scripts/cost-table.json +1 -1
  122. package/pipeline/scripts/diff-explain.mjs +7 -3
  123. package/pipeline/scripts/diff-risk-score.mjs +13 -3
  124. package/pipeline/scripts/evidence-gate.mjs +7 -2
  125. package/pipeline/scripts/gen-mode-dispatch.mjs +38 -21
  126. package/pipeline/scripts/gen-skills-index.mjs +18 -3
  127. package/pipeline/scripts/learning-curve.mjs +13 -3
  128. package/pipeline/scripts/learnings-ledger.mjs +103 -36
  129. package/pipeline/scripts/localize-commands.mjs +6 -1
  130. package/pipeline/scripts/match-skills.mjs +15 -4
  131. package/pipeline/scripts/migrate-prefs.mjs +33 -16
  132. package/pipeline/scripts/phase-tracker.sh +3 -1
  133. package/pipeline/scripts/repo-map.mjs +110 -64
  134. package/pipeline/scripts/review-scope.mjs +7 -1
  135. package/pipeline/scripts/routine-registry.mjs +4 -9
  136. package/pipeline/scripts/run-aggregator.mjs +11 -5
  137. package/pipeline/scripts/run-metrics.mjs +13 -8
  138. package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
  139. package/pipeline/scripts/test-gap-scan.mjs +44 -12
  140. package/pipeline/scripts/test-integrity-gate.mjs +5 -1
  141. package/pipeline/scripts/token-budget-report.mjs +44 -21
  142. package/pipeline/scripts/triage-memory.mjs +126 -34
  143. package/pipeline/scripts/uninstall.mjs +74 -30
  144. package/pipeline/scripts/validate-analysis-doc.mjs +15 -5
  145. package/pipeline/scripts/validate-diff-risk.mjs +32 -18
  146. package/pipeline/scripts/validate-test-gap.mjs +17 -7
  147. package/pipeline/scripts/validate-triage.mjs +17 -5
  148. package/pipeline/scripts/write-state.mjs +32 -9
  149. package/pipeline/skills/.skills-index.json +91 -91
  150. package/pipeline/skills/shared/README.md +57 -57
  151. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
  152. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +1 -1
  153. package/pipeline/skills/shared/core/multi-agent/SKILL.md +26 -279
  154. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +1 -1
  155. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
  156. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +1 -1
  157. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  158. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
  159. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
  160. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
  161. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
  162. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
  163. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
  164. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +1 -1
  165. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  166. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +1 -1
  167. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +1 -1
  168. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  169. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +1 -1
  170. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +1 -1
  171. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +1 -1
  172. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
  173. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
  174. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +1 -1
  175. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +1 -1
  176. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +1 -1
  177. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +1 -1
  178. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +1 -1
  179. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +16 -8
  180. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +1 -1
  181. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +1 -1
  182. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +1 -1
  183. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +1 -1
  184. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +1 -1
  185. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +1 -1
  186. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +1 -1
  187. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +1 -1
  188. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
  189. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +3 -3
  190. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +1 -1
  191. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +1 -1
  192. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +1 -1
  193. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +1 -1
  194. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
  195. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +1 -1
  196. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -4
  197. package/pipeline/skills/shared/external/agentflow/SKILL.md +1 -1
  198. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +1 -1
  199. package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +1 -1
  200. package/pipeline/skills/shared/external/api-patterns/SKILL.md +1 -1
  201. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +1 -1
  202. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +1 -1
  203. package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
  204. package/pipeline/skills/shared/external/backlog/SKILL.md +12 -12
  205. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -1
  206. package/pipeline/skills/shared/external/context-compression/SKILL.md +1 -1
  207. package/pipeline/skills/shared/external/council/SKILL.md +3 -3
  208. package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -1
  209. package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -1
  210. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +1 -1
  211. package/pipeline/skills/shared/external/docker-expert/SKILL.md +1 -1
  212. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +1 -1
  213. package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
  214. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +1 -1
  215. package/pipeline/skills/shared/external/help-skills/SKILL.md +1 -1
  216. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +1 -1
  217. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +1 -1
  218. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +1 -1
  219. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +1 -1
  220. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +1 -1
  221. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +1 -1
  222. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +1 -1
  223. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +1 -1
  224. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +1 -1
  225. package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -1
  226. package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -1
  227. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +1 -1
  228. package/pipeline/skills/shared/external/ios-developer/SKILL.md +1 -1
  229. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +1 -1
  230. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +1 -1
  231. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +1 -1
  232. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +1 -1
  233. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -1
  234. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +1 -1
  235. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +1 -1
  236. package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -1
  237. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -1
  238. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -1
  239. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -2
  240. package/pipeline/skills/shared/external/skill-creator/SKILL.md +12 -12
  241. package/pipeline/skills/shared/external/skill-creator/audit.md +21 -21
  242. package/pipeline/skills/shared/external/skill-creator/checklist.md +3 -3
  243. package/pipeline/skills/shared/external/skill-creator/examples.md +10 -10
  244. package/pipeline/skills/shared/external/skill-creator/label-check.md +17 -17
  245. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +86 -50
  246. package/pipeline/skills/shared/external/skill-creator/template.md +9 -9
  247. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +1 -1
  248. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +1 -1
  249. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
  250. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +1 -1
  251. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -1
  252. package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -1
  253. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -1
  254. package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -1
  255. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -1
  256. package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -1
  257. package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -1
  258. package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +9 -49
  259. package/pipeline/skills/skills-index.md +57 -57
  260. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
  261. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
  262. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
  263. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
  264. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
  265. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
  266. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
  267. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
  268. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
  269. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
  270. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
  271. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
  272. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
  273. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
  274. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
  275. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
  276. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
  277. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
  278. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
  279. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
  280. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
  281. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
  282. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
  283. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
  284. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
  285. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
  286. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
  287. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
  288. package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
  289. package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
  290. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
  291. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
  292. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
  293. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
  294. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
  295. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
  296. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
  297. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
  298. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
  299. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
  300. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
  301. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
  302. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
  303. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
  304. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
  305. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
  306. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
  307. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
  308. package/pipeline/eval/golden-tasks/README.md +0 -65
  309. package/pipeline/eval/intent-cases.json +0 -40
  310. package/pipeline/eval/run-metrics-fixture.json +0 -46
  311. package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
  312. package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
  313. package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
  314. package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
  315. package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
  316. package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
  317. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
  318. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
  319. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
  320. package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
  321. package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
  322. package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
  323. package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
  324. package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
  325. package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
  326. package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
  327. package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
  328. package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
  329. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
  330. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
  331. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
  332. package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
  333. package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
  334. package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
  335. package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
  336. package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
  337. package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
  338. package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
  339. package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
  340. package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
  341. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
  342. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
  343. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
  344. package/pipeline/eval/triage/README.md +0 -54
  345. package/pipeline/scripts/benchmark-phase-0.sh +0 -128
  346. package/pipeline/scripts/check-md-links.mjs +0 -84
  347. package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -297
  348. package/pipeline/scripts/eval-golden-tasks.mjs +0 -212
  349. package/pipeline/scripts/eval-intent.mjs +0 -103
  350. package/pipeline/scripts/eval-mine-corpus.mjs +0 -201
  351. package/pipeline/scripts/eval-triage.mjs +0 -171
  352. package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
  353. package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
  354. package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
  355. package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
  356. package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
  357. package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
  358. package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
  359. package/pipeline/scripts/lint-mcp-refs.mjs +0 -207
  360. package/pipeline/scripts/lint-skills.mjs +0 -143
  361. package/pipeline/scripts/run-smokes.mjs +0 -76
  362. package/pipeline/scripts/smoke-add-detail.sh +0 -137
  363. package/pipeline/scripts/smoke-agent-guard.sh +0 -74
  364. package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
  365. package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
  366. package/pipeline/scripts/smoke-ask-choice.sh +0 -42
  367. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
  368. package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
  369. package/pipeline/scripts/smoke-changelog-version.sh +0 -47
  370. package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
  371. package/pipeline/scripts/smoke-channels-flow.sh +0 -130
  372. package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
  373. package/pipeline/scripts/smoke-clarify.sh +0 -148
  374. package/pipeline/scripts/smoke-command-inventory.sh +0 -81
  375. package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
  376. package/pipeline/scripts/smoke-community-gates.sh +0 -75
  377. package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
  378. package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
  379. package/pipeline/scripts/smoke-cost-budget.sh +0 -70
  380. package/pipeline/scripts/smoke-cost-summary.sh +0 -139
  381. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
  382. package/pipeline/scripts/smoke-description-tr.sh +0 -82
  383. package/pipeline/scripts/smoke-dev-critic.sh +0 -144
  384. package/pipeline/scripts/smoke-diff-explain.sh +0 -147
  385. package/pipeline/scripts/smoke-diff-risk.sh +0 -190
  386. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
  387. package/pipeline/scripts/smoke-eval-live.sh +0 -136
  388. package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
  389. package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
  390. package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
  391. package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
  392. package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
  393. package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
  394. package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
  395. package/pipeline/scripts/smoke-generate-issue.sh +0 -120
  396. package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
  397. package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
  398. package/pipeline/scripts/smoke-install-layout.sh +0 -248
  399. package/pipeline/scripts/smoke-intent-guard.sh +0 -86
  400. package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
  401. package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
  402. package/pipeline/scripts/smoke-keychain.sh +0 -158
  403. package/pipeline/scripts/smoke-language-axis.sh +0 -109
  404. package/pipeline/scripts/smoke-learning-curve.sh +0 -61
  405. package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
  406. package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
  407. package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
  408. package/pipeline/scripts/smoke-md-links.sh +0 -8
  409. package/pipeline/scripts/smoke-md2confluence.sh +0 -126
  410. package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
  411. package/pipeline/scripts/smoke-migrate-state.sh +0 -102
  412. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
  413. package/pipeline/scripts/smoke-model-fallback.sh +0 -89
  414. package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
  415. package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
  416. package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -115
  417. package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
  418. package/pipeline/scripts/smoke-pack-contents.sh +0 -140
  419. package/pipeline/scripts/smoke-pat-audit.sh +0 -128
  420. package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
  421. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
  422. package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
  423. package/pipeline/scripts/smoke-phase-banner.sh +0 -101
  424. package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
  425. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
  426. package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
  427. package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
  428. package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
  429. package/pipeline/scripts/smoke-plan-safety.sh +0 -139
  430. package/pipeline/scripts/smoke-plan-todos.sh +0 -196
  431. package/pipeline/scripts/smoke-plugin-validate.sh +0 -64
  432. package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
  433. package/pipeline/scripts/smoke-pre-commit.sh +0 -170
  434. package/pipeline/scripts/smoke-pref-migration.sh +0 -226
  435. package/pipeline/scripts/smoke-prefs-language.sh +0 -134
  436. package/pipeline/scripts/smoke-progress-contract.sh +0 -127
  437. package/pipeline/scripts/smoke-prune-logs.sh +0 -137
  438. package/pipeline/scripts/smoke-purge.sh +0 -138
  439. package/pipeline/scripts/smoke-push-retry.sh +0 -75
  440. package/pipeline/scripts/smoke-repo-map.sh +0 -300
  441. package/pipeline/scripts/smoke-review-readiness.sh +0 -92
  442. package/pipeline/scripts/smoke-review-watch.sh +0 -146
  443. package/pipeline/scripts/smoke-routines.sh +0 -84
  444. package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
  445. package/pipeline/scripts/smoke-run-metrics.sh +0 -50
  446. package/pipeline/scripts/smoke-search.sh +0 -187
  447. package/pipeline/scripts/smoke-shadow-git.sh +0 -224
  448. package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
  449. package/pipeline/scripts/smoke-skill-language.sh +0 -83
  450. package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
  451. package/pipeline/scripts/smoke-skill-scan.sh +0 -198
  452. package/pipeline/scripts/smoke-source-parity.sh +0 -85
  453. package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
  454. package/pipeline/scripts/smoke-sync-parity.sh +0 -92
  455. package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
  456. package/pipeline/scripts/smoke-telemetry.sh +0 -147
  457. package/pipeline/scripts/smoke-test-gap.sh +0 -183
  458. package/pipeline/scripts/smoke-token-budget.sh +0 -67
  459. package/pipeline/scripts/smoke-token-preflight.sh +0 -82
  460. package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
  461. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
  462. package/pipeline/scripts/smoke-triage-memory.sh +0 -174
  463. package/pipeline/scripts/smoke-update-check.sh +0 -135
  464. package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
  465. package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
  466. package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
  467. package/pipeline/scripts/smoke-validator-gates.sh +0 -164
  468. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
  469. package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
  470. package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
  471. package/pipeline/scripts/smoke-work-summary.sh +0 -163
  472. package/pipeline/scripts/smoke-workflow-audit.sh +0 -69
  473. package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
  474. package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
  475. package/pipeline/scripts/smoke-write-state.sh +0 -115
  476. package/pipeline/scripts/sync-parity-check.sh +0 -135
  477. package/pipeline/scripts/test-gap-rules/android.json +0 -25
  478. package/pipeline/scripts/test-gap-rules/ios.json +0 -29
  479. package/pipeline/scripts/test-gap-rules/node.json +0 -17
  480. package/pipeline/scripts/test-gap-rules/python.json +0 -19
  481. package/pipeline/scripts/validate-schemas.mjs +0 -88
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # smoke-tracker-tokens-invocation.sh
4
- #
5
- # Asserts every LLM-heavy phase doc invokes `phase-tracker.sh tokens <N> <in> <out>`
6
- # at least once, so the per-phase + cumulative token counter in the tracker's
7
- # render output stays accurate for every run. Without this gate, phase docs
8
- # tend to drop the token call as they get edited and the user loses cost
9
- # visibility - exactly Defect 5 from the GH1241 review.
10
- #
11
- # Phase 3 (Dev) and Phase 4 (Review) are the LLM-intensive ones. Phase 1+2
12
- # also do LLM work. Phase 0/5/6/7 are mostly orchestration.
13
-
14
- set -euo pipefail
15
-
16
- SELF_DIR=$(cd "$(dirname "$0")" && pwd)
17
- PIPELINE_ROOT=$(cd "$SELF_DIR/.." && pwd)
18
-
19
- cd "$PIPELINE_ROOT"
20
-
21
- FAIL=0
22
-
23
- # Every phase doc that runs LLM calls MUST mention `phase-tracker.sh tokens`
24
- # at least once (either in a code fence or inline).
25
- declare -a LLM_PHASES=(
26
- "multi-agent-refs/phases/phase-1-analysis.md:1"
27
- "multi-agent-refs/phases/phase-2-planning.md:2"
28
- "multi-agent-refs/phases/phase-3-dev.md:3"
29
- "multi-agent-refs/phases/phase-4-review.md:4"
30
- )
31
-
32
- for entry in "${LLM_PHASES[@]}"; do
33
- doc="${entry%:*}"
34
- phase_id="${entry##*:}"
35
- full="$doc"
36
- if [ ! -f "$full" ]; then
37
- echo "FAIL [smoke-tracker-tokens-invocation]: $doc missing"
38
- FAIL=$((FAIL + 1))
39
- continue
40
- fi
41
- if ! grep -qE "phase-tracker\.sh tokens" "$full"; then
42
- echo "FAIL [smoke-tracker-tokens-invocation]: $doc must invoke 'phase-tracker.sh tokens $phase_id <in> <out>' after every LLM call"
43
- FAIL=$((FAIL + 1))
44
- fi
45
- done
46
-
47
- # tracker-contract.md is the canonical location for the tokens API. Make sure
48
- # it documents the invocation pattern with both args.
49
- CONTRACT="multi-agent-refs/tracker-contract.md"
50
- if [ ! -f "$CONTRACT" ]; then
51
- echo "FAIL [smoke-tracker-tokens-invocation]: $CONTRACT missing"
52
- FAIL=$((FAIL + 1))
53
- elif ! grep -qE "phase-tracker\.sh tokens .*<in>.*<out>|phase-tracker\.sh tokens .*<input.*<output" "$CONTRACT"; then
54
- echo "FAIL [smoke-tracker-tokens-invocation]: $CONTRACT must document the tokens <N> <in> <out> signature"
55
- FAIL=$((FAIL + 1))
56
- fi
57
-
58
- # v9.10.2: the contract must also mandate the per-phase completion narration
59
- # line - the TaskList widget shows duration only, so without the chat line the
60
- # user never sees live per-phase tokens.
61
- if ! grep -q "per-phase token narration on completion" "$CONTRACT"; then
62
- echo "FAIL [smoke-tracker-tokens-invocation]: $CONTRACT must mandate the per-phase token narration line on completion"
63
- FAIL=$((FAIL + 1))
64
- fi
65
-
66
- if [ "$FAIL" -gt 0 ]; then
67
- echo ""
68
- echo "smoke-tracker-tokens-invocation: $FAIL violation(s)."
69
- echo "Defect 5: phase docs must invoke 'phase-tracker.sh tokens <N> <in> <out>' after every LLM call so the tracker render shows live cost."
70
- exit 1
71
- fi
72
-
73
- echo "smoke-tracker-tokens-invocation: ok"
@@ -1,174 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-triage-memory.sh - v8.3.0
3
- #
4
- # Verifies the triage-memory persistence layer:
5
- # 1. ingest writes JSONL rows for accepted/deferred/rejected and tags
6
- # task_id, classification, severity, file, issue, reason
7
- # 2. ingest is idempotent - re-running with the same input writes 0 rows
8
- # 3. stats reports correct row counts grouped by classification
9
- # 4. query ranks rows by token overlap, returns top-N hits
10
- # 5. query --file-glob filters by path
11
- # 6. path subcommand resolves to <slug>/triage-corpus.jsonl under HOME
12
- # 7. empty corpus query returns total=0 + exit 2
13
- # 8. validate-schemas accepts triage-corpus.schema.json
14
- # 9. phase-7-report.md ref doc declares the ingest call
15
- # 10. phase-4-review.md ref doc declares prior-art lookup
16
- # 11. prefs.schema.json exposes priorArtEnrichment toggle
17
- #
18
- # Uses HOME override so we never touch the user's real ~/.claude/memory.
19
- #
20
- # Exit 0 = all pass, 1 = any failure.
21
-
22
- set -uo pipefail
23
-
24
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
25
- TM="$ROOT/pipeline/scripts/triage-memory.mjs"
26
- PHASE7="$ROOT/pipeline/multi-agent-refs/phases/phase-7-report.md"
27
- PHASE4="$ROOT/pipeline/multi-agent-refs/phases/phase-4-review.md"
28
- PREFS="$ROOT/pipeline/schemas/prefs.schema.json"
29
- SCHEMA="$ROOT/pipeline/schemas/triage-corpus.schema.json"
30
-
31
- pass=0
32
- fail=0
33
- failures=()
34
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
35
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
36
-
37
- printf '→ smoke-triage-memory (v8.3.0): semantic memory contract\n'
38
-
39
- [ -f "$SCHEMA" ] || { record_fail "schema missing: $SCHEMA"; exit 1; }
40
-
41
- TMP_HOME=$(mktemp -d)
42
- trap 'rm -rf "$TMP_HOME"' EXIT
43
- export HOME="$TMP_HOME"
44
- export MULTI_AGENT_REPO_SLUG="smoke-corpus"
45
-
46
- # Build a fixture triage JSON
47
- TRIAGE_FIXTURE="$TMP_HOME/triage.json"
48
- cat > "$TRIAGE_FIXTURE" <<'JSON'
49
- {
50
- "accepted": [
51
- {"severity":"blocking","file":"Auth/KeychainStore.swift","line":42,"issue":"Force-unwrap on optional token","fix":"Use guard let","reviewer":"opus"},
52
- {"severity":"important","file":"Networking/ApiClient.swift","line":11,"issue":"Missing timeout configuration","fix":"Set request timeout","reviewer":"sonnet"}
53
- ],
54
- "deferred": [
55
- {"finding":{"severity":"suggestion","file":"Views/SettingsView.swift","line":50,"issue":"Could extract subview","fix":"refactor"},"reason":"out of scope"}
56
- ],
57
- "rejected": [
58
- {"finding":{"severity":"important","file":"Auth/KeychainStore.swift","line":99,"issue":"Use Sendable annotation","fix":"add Sendable"},"reason":"requires Swift 6 migration"}
59
- ],
60
- "approved": false
61
- }
62
- JSON
63
-
64
- # --- 1: first ingest writes rows ---
65
- out1=$(node "$TM" ingest --triage "$TRIAGE_FIXTURE" --task-id PROJ-100 --task-title "Auth refactor" --stack ios 2>/dev/null)
66
- ingested=$(echo "$out1" | jq -r '.ingested')
67
- if [ "$ingested" = "4" ]; then
68
- record_pass "ingest writes 4 rows (2 accepted + 1 deferred + 1 rejected)"
69
- else
70
- record_fail "ingest expected 4, got $ingested"
71
- fi
72
-
73
- # --- 2: idempotent re-ingest writes 0 rows ---
74
- out2=$(node "$TM" ingest --triage "$TRIAGE_FIXTURE" --task-id PROJ-100 --task-title "Auth refactor" --stack ios 2>/dev/null; echo "EC=$?")
75
- ingested2=$(echo "$out2" | grep -v EC= | jq -r '.ingested')
76
- ec2=$(echo "$out2" | grep "EC=" | sed 's/.*EC=//')
77
- if [ "$ingested2" = "0" ] && [ "$ec2" = "2" ]; then
78
- record_pass "re-ingest is idempotent (0 rows + exit 2)"
79
- else
80
- record_fail "re-ingest should write 0 rows + exit 2, got rows=$ingested2 ec=$ec2"
81
- fi
82
-
83
- # --- 3: stats counts ---
84
- stats=$(node "$TM" stats 2>/dev/null)
85
- acc=$(echo "$stats" | jq -r '.counts.accepted')
86
- def=$(echo "$stats" | jq -r '.counts.deferred')
87
- rej=$(echo "$stats" | jq -r '.counts.rejected')
88
- if [ "$acc" = "2" ] && [ "$def" = "1" ] && [ "$rej" = "1" ]; then
89
- record_pass "stats reports accepted=2 deferred=1 rejected=1"
90
- else
91
- record_fail "stats wrong: accepted=$acc deferred=$def rejected=$rej"
92
- fi
93
-
94
- # --- 4: query ranks by token overlap ---
95
- q1=$(node "$TM" query --issue "force unwrap optional" --top 2 2>/dev/null)
96
- top1=$(echo "$q1" | jq -r '.hits[0].file')
97
- top1_issue=$(echo "$q1" | jq -r '.hits[0].issue')
98
- if [[ "$top1" == *"KeychainStore.swift" ]] && [[ "$top1_issue" == *"Force-unwrap"* ]]; then
99
- record_pass "query: 'force unwrap optional' top hit = KeychainStore force-unwrap finding"
100
- else
101
- record_fail "query top hit wrong: $top1 / $top1_issue"
102
- fi
103
-
104
- # --- 5: file-glob filter ---
105
- q2=$(node "$TM" query --issue "timeout" --file-glob "Networking/*" 2>/dev/null)
106
- n2=$(echo "$q2" | jq -r '.hits | length')
107
- top2=$(echo "$q2" | jq -r '.hits[0].file' 2>/dev/null || echo "")
108
- if [ "$n2" = "1" ] && [[ "$top2" == "Networking/ApiClient.swift" ]]; then
109
- record_pass "query: --file-glob narrows to Networking/* path"
110
- else
111
- record_fail "file-glob narrow wrong: hits=$n2 top=$top2"
112
- fi
113
-
114
- # --- 6: path subcommand ---
115
- p=$(node "$TM" path 2>/dev/null)
116
- expected="$TMP_HOME/.claude/memory/multi-agent/smoke-corpus/triage-corpus.jsonl"
117
- if [ "$p" = "$expected" ]; then
118
- record_pass "path resolves to <HOME>/.claude/memory/multi-agent/<slug>/triage-corpus.jsonl"
119
- else
120
- record_fail "path wrong: $p (expected $expected)"
121
- fi
122
-
123
- # --- 7: empty-corpus query exits 2 with empty hits ---
124
- export MULTI_AGENT_REPO_SLUG="empty-corpus"
125
- set +e
126
- empty_out=$(node "$TM" query --issue "anything" 2>/dev/null)
127
- ec=$?
128
- set -e
129
- hits=$(echo "$empty_out" | jq -r '.hits | length')
130
- total=$(echo "$empty_out" | jq -r '.total')
131
- if [ "$ec" = "2" ] && [ "$hits" = "0" ] && [ "$total" = "0" ]; then
132
- record_pass "empty-corpus query: exit 2, hits=[], total=0"
133
- else
134
- record_fail "empty-corpus wrong: ec=$ec hits=$hits total=$total"
135
- fi
136
- export MULTI_AGENT_REPO_SLUG="smoke-corpus"
137
-
138
- # --- 8: schema present + valid JSON ---
139
- if jq -e '.title and .properties.classification' "$SCHEMA" >/dev/null 2>&1; then
140
- record_pass "triage-corpus schema present and well-formed"
141
- else
142
- record_fail "triage-corpus schema malformed"
143
- fi
144
-
145
- # --- 9: phase-7-report.md declares ingest ---
146
- if grep -q 'triage-memory.mjs' "$PHASE7"; then
147
- record_pass "phase-7-report.md references triage-memory.mjs"
148
- else
149
- record_fail "phase-7-report.md missing triage-memory.mjs reference"
150
- fi
151
-
152
- # --- 10: phase-4-review.md declares prior-art lookup ---
153
- if grep -qE 'prior.art|triage-memory' "$PHASE4"; then
154
- record_pass "phase-4-review.md declares prior-art lookup"
155
- else
156
- record_fail "phase-4-review.md missing prior-art lookup"
157
- fi
158
-
159
- # --- 11: prefs schema exposes priorArtEnrichment ---
160
- if jq -e '.properties.global.properties.priorArtEnrichment' "$PREFS" >/dev/null 2>&1; then
161
- record_pass "prefs schema exposes priorArtEnrichment toggle"
162
- else
163
- record_fail "prefs.schema.json missing global.priorArtEnrichment"
164
- fi
165
-
166
- # --- Summary ---
167
- total=$((pass + fail))
168
- printf '\n→ smoke-triage-memory: %d/%d passed\n' "$pass" "$total"
169
- if [ "$fail" -ne 0 ]; then
170
- printf '\nFailures:\n'
171
- for f in "${failures[@]}"; do printf ' - %s\n' "$f"; done
172
- exit 1
173
- fi
174
- exit 0
@@ -1,135 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-update-check.sh
3
- #
4
- # Verifies the Phase 0 Step 0.6 advisory update-check contract:
5
- # 1. update-check.sh exists, parses (bash -n), and honors the advisory contract
6
- # offline: exit 0 + empty stdout when the registry is unreachable
7
- # 2. Cached path: fresh cache short-circuits without a network call
8
- # 3. Newer latest -> "<local>|<latest>"; same or older latest -> silent
9
- # 4. prefs.schema.json exposes updateCheck.{enabled,ttlHours,autoUpdate}
10
- # with the documented defaults (enabled=true, autoUpdate=false)
11
- # 5. phase-0-init.md documents Step 0.6 with the autopilot log-only rule
12
- #
13
- # Exit 0 = all pass, 1 = any failure.
14
-
15
- set -euo pipefail
16
-
17
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
18
- SCRIPT="$ROOT/pipeline/scripts/update-check.sh"
19
- PREFS_SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
20
- PHASE0_DOC="$ROOT/pipeline/multi-agent-refs/phases/phase-0-init.md"
21
-
22
- pass=0
23
- fail=0
24
- failures=()
25
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
26
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
27
-
28
- printf '→ smoke-update-check: Phase 0 Step 0.6 advisory contract\n'
29
-
30
- tmpdir=$(mktemp -d)
31
- trap 'rm -rf "$tmpdir"' EXIT
32
- CACHE="$tmpdir/update-check-cache"
33
-
34
- # 1. Script parses
35
- if bash -n "$SCRIPT" 2>/dev/null; then
36
- record_pass "update-check.sh parses (bash -n)"
37
- else
38
- record_fail "update-check.sh has syntax errors"
39
- fi
40
-
41
- now=$(date +%s)
42
-
43
- # 2. Fresh cache with newer latest -> reports, no network needed
44
- printf '%s|99.0.0\n' "$now" > "$CACHE"
45
- out=$(UPDATE_CHECK_CACHE="$CACHE" bash "$SCRIPT" --local 10.0.0 2>/dev/null); rc=$?
46
- if [ "$rc" -eq 0 ] && [ "$out" = "10.0.0|99.0.0" ]; then
47
- record_pass "newer cached latest -> '<local>|<latest>' (exit 0)"
48
- else
49
- record_fail "newer cached latest should print '10.0.0|99.0.0' (got '$out', rc=$rc)"
50
- fi
51
-
52
- # 3. Same version -> silent
53
- printf '%s|10.0.0\n' "$now" > "$CACHE"
54
- out=$(UPDATE_CHECK_CACHE="$CACHE" bash "$SCRIPT" --local 10.0.0 2>/dev/null); rc=$?
55
- if [ "$rc" -eq 0 ] && [ -z "$out" ]; then
56
- record_pass "same version -> silent"
57
- else
58
- record_fail "same version should be silent (got '$out', rc=$rc)"
59
- fi
60
-
61
- # 3b. Local ahead of registry (dev machine) -> silent
62
- printf '%s|10.0.0\n' "$now" > "$CACHE"
63
- out=$(UPDATE_CHECK_CACHE="$CACHE" bash "$SCRIPT" --local 10.1.0 2>/dev/null); rc=$?
64
- if [ "$rc" -eq 0 ] && [ -z "$out" ]; then
65
- record_pass "local ahead of registry -> silent (no downgrade prompt)"
66
- else
67
- record_fail "local-ahead should be silent (got '$out', rc=$rc)"
68
- fi
69
-
70
- # 3b2. No --local, no repo clone -> falls back to the install-time version
71
- # marker (npx-only installs have no clone to read a version from)
72
- marker_home="$tmpdir/marker-home"
73
- mkdir -p "$marker_home/.claude"
74
- printf '10.0.0\n' > "$marker_home/.claude/.pipeline-version"
75
- printf '%s|99.0.0\n' "$now" > "$CACHE"
76
- out=$(HOME="$marker_home" UPDATE_CHECK_CACHE="$CACHE" bash "$SCRIPT" 2>/dev/null); rc=$?
77
- if [ "$rc" -eq 0 ] && [ "$out" = "10.0.0|99.0.0" ]; then
78
- record_pass "no clone -> .pipeline-version marker fallback works"
79
- else
80
- record_fail "marker fallback should print '10.0.0|99.0.0' (got '$out', rc=$rc)"
81
- fi
82
-
83
- # 3c. Offline + stale cache -> silent exit 0 (advisory: never blocks)
84
- printf '0|10.0.0\n' > "$CACHE"
85
- out=$(UPDATE_CHECK_CACHE="$CACHE" http_proxy="http://127.0.0.1:1" https_proxy="http://127.0.0.1:1" \
86
- bash "$SCRIPT" --local 10.0.0 2>/dev/null); rc=$?
87
- if [ "$rc" -eq 0 ] && [ -z "$out" ]; then
88
- record_pass "offline + stale cache -> silent exit 0"
89
- else
90
- record_fail "offline should be a silent no-op (got '$out', rc=$rc)"
91
- fi
92
-
93
- # 4. Prefs schema knobs + defaults
94
- for prop in enabled ttlHours autoUpdate; do
95
- if jq -e ".properties.global.properties.updateCheck.properties.${prop}" "$PREFS_SCHEMA" >/dev/null 2>&1; then
96
- record_pass "prefs schema exposes updateCheck.${prop}"
97
- else
98
- record_fail "prefs schema missing updateCheck.${prop}"
99
- fi
100
- done
101
- if jq -e '.properties.global.properties.updateCheck.properties.enabled.default == true' "$PREFS_SCHEMA" >/dev/null 2>&1; then
102
- record_pass "updateCheck.enabled defaults to true (notify-only, bounded cost)"
103
- else
104
- record_fail "updateCheck.enabled must default to true"
105
- fi
106
- if jq -e '.properties.global.properties.updateCheck.properties.autoUpdate | has("default") and .default == false' "$PREFS_SCHEMA" >/dev/null 2>&1; then
107
- record_pass "updateCheck.autoUpdate defaults to false (no silent self-modify)"
108
- else
109
- record_fail "updateCheck.autoUpdate must default to false"
110
- fi
111
-
112
- # 5. Phase 0 doc wiring
113
- if grep -qF "Step 0.6 - Update check" "$PHASE0_DOC"; then
114
- record_pass "phase-0-init.md documents Step 0.6"
115
- else
116
- record_fail "phase-0-init.md missing Step 0.6"
117
- fi
118
- if grep -qF "update-check.sh" "$PHASE0_DOC"; then
119
- record_pass "phase-0-init.md invokes update-check.sh"
120
- else
121
- record_fail "phase-0-init.md must invoke update-check.sh"
122
- fi
123
- if grep -qF "log-only" "$PHASE0_DOC" && grep -qF "never ask (zero-interaction contract)" "$PHASE0_DOC"; then
124
- record_pass "phase-0-init.md states the autopilot log-only rule"
125
- else
126
- record_fail "phase-0-init.md must state autopilot never asks (log-only)"
127
- fi
128
-
129
- printf '\n══ update-check smoke: %d passed, %d failed ══\n' "$pass" "$fail"
130
- if [ "$fail" -gt 0 ]; then
131
- printf '\nFailures:\n'
132
- for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
133
- exit 1
134
- fi
135
- exit 0
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Smoke: Phase 0 Step 1b URL enrichment - Crashlytics + Fortify
3
- # Verifies that:
4
- # 1. phase-0-init.md documents Step 1b with both URL patterns
5
- # 2. state.crashContext and state.fortifyFinding shapes are specified
6
- # 3. prefs.schema.json has hosts.fortify
7
- # 4. setup.md Step 3.5 prompts for fortify host (and skips firebase)
8
- # 5. Token Save Flow routing includes fortify
9
-
10
- set -u
11
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
12
- PASS=0
13
- FAIL=0
14
-
15
- check() {
16
- local label="$1" cmd="$2"
17
- if eval "$cmd" > /dev/null 2>&1; then
18
- printf " ✓ %s\n" "$label"
19
- PASS=$((PASS+1))
20
- else
21
- printf " ✗ %s\n" "$label"
22
- FAIL=$((FAIL+1))
23
- fi
24
- }
25
-
26
- PHASE0="$ROOT/pipeline/multi-agent-refs/phases/phase-0-init.md"
27
- SETUP="$ROOT/pipeline/commands/multi-agent/setup/SKILL.md"
28
- SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
29
-
30
- echo "→ 1. phase-0-init.md documents Step 1b URL Enrichment"
31
- check "Step 1b section present" "grep -Fq 'Step 1b - URL Enrichment' '$PHASE0'"
32
- check "Crashlytics pattern block present" "grep -Fq 'console.firebase.google.com' '$PHASE0'"
33
- check "Fortify pattern block present" "grep -Eq 'hosts\.fortify.*ssc/html|ssc/html.*version' '$PHASE0'"
34
-
35
- echo
36
- echo "→ 2. state enrichment shapes specified"
37
- check "state.crashContext documented" "grep -Fq 'state.crashContext' '$PHASE0'"
38
- check "state.fortifyFinding documented" "grep -Fq 'state.fortifyFinding' '$PHASE0'"
39
- check "Phase 1 prepend mention for crash" "grep -Fq 'Known Crash Context' '$PHASE0'"
40
- check "Phase 2 inject mention for fortify" "grep -Fq 'Known Security Finding' '$PHASE0'"
41
-
42
- echo
43
- echo "→ 3. Progress contract line documented"
44
- check "URL context log line shape" "grep -Fq 'URL deep fetch: crashlytics=' '$PHASE0'"
45
-
46
- echo
47
- echo "→ 4. prefs.schema.json has hosts.fortify"
48
- check "hosts.fortify field exists" "grep -Fq '\"fortify\":' '$SCHEMA' && grep -Fq 'Fortify SSC host' '$SCHEMA'"
49
- check "FORTIFY_HOST placeholder referenced" "grep -Fq '{FORTIFY_HOST}' '$SCHEMA'"
50
-
51
- echo
52
- echo "→ 5. Firebase description = 'Firebase JSON' (not 'SA JSON')"
53
- check "schema firebase (servicePatMap) renamed" "! grep -F 'Firebase Service Account JSON' '$SCHEMA'"
54
- check "schema firebase (keychainMapping) renamed" "grep -c '\"Firebase JSON' '$SCHEMA' | grep -q '[2-9]'"
55
-
56
- echo
57
- echo "→ 6. setup.md Step 3.5 routes fortify (not firebase)"
58
- check "Step 3.5 lists fortify" "grep -Eq 'jira.*confluence.*bitbucket.*fortify|fortify.*host' '$SETUP'"
59
- check "firebase skip note in Step 3.5" "grep -Fiq 'firebase is skipped' '$SETUP' || grep -Fiq 'Firebase tokens skip' '$SETUP'"
60
- check "Resulting shape has fortify host" "grep -Fq '\"fortify\":' '$SETUP'"
61
- check "FORTIFY_HOST placeholder listed" "grep -Fq '{FORTIFY_HOST}' '$SETUP'"
62
-
63
- echo
64
- echo "→ 7. Token Source Mapping shows 'Firebase JSON' label"
65
- check "setup.md Token Source Mapping renamed" "grep -Fq 'Firebase JSON (base64)' '$SETUP'"
66
- check "multi-agent-setup SKILL.md renamed" "grep -Fq 'Firebase JSON (base64)' '$ROOT/pipeline/skills/shared/core/multi-agent-setup/SKILL.md'"
67
-
68
- echo
69
- echo "══ url-enrichment smoke: $PASS passed, $FAIL failed ══"
70
- [ "$FAIL" -eq 0 ]
@@ -1,161 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-validate-analysis-doc.sh - contract for validate-analysis-doc.mjs,
3
- # the deterministic gate over an emitted /multi-agent:analysis document.
4
-
5
- set -uo pipefail
6
-
7
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
8
- V="$SCRIPT_DIR/validate-analysis-doc.mjs"
9
-
10
- PASS=0
11
- FAIL=0
12
- record_pass() { PASS=$((PASS + 1)); printf ' \342\234\223 %s\n' "$1"; }
13
- record_fail() { FAIL=$((FAIL + 1)); printf ' \342\234\227 %s\n' "$1"; }
14
-
15
- printf '\342\206\222 smoke-validate-analysis-doc: emitted-doc gate\n'
16
-
17
- tmp=$(mktemp -d "${TMPDIR:-/tmp}/vdoc.XXXXXX")
18
- trap 'rm -rf "$tmp"' EXIT
19
-
20
- # A well-formed Full-mode doc (neutral UserProfile domain, BR referenced downstream).
21
- cat > "$tmp/good.md" <<'MD'
22
- ---
23
- feature: UserProfile
24
- platform: ios
25
- language: tr
26
- mode: full
27
- template_version: v3
28
- ---
29
- ## 1. Özet
30
- Profile screen.
31
- ## 2. Hedefler ve Karşı Hedefler
32
- goals.
33
- ## 4. Kullanıcı Hikayeleri
34
- ### 4.4 İş Kuralları
35
- | BR-profile-01 | rule | source | Given/When/Then |
36
- ## 9. API Kontratları
37
- api.
38
- ## 13. Mimari Plan
39
- arch.
40
- ## 14. Eklenecek Dosyalar
41
- files.
42
- ## 15. Test Planı
43
- BR-profile-01 happy path.
44
- ## 20. Riskler ve Açık Sorular
45
- risk.
46
- ## 21. Referanslar
47
- refs.
48
- MD
49
-
50
- if node "$V" "$tmp/good.md" >/dev/null 2>&1; then
51
- record_pass "well-formed Full doc passes (exit 0)"
52
- else
53
- record_fail "well-formed doc should pass"
54
- fi
55
-
56
- # Lite doc without Section 15 must still pass (Locked 31 mode-aware).
57
- cat > "$tmp/lite.md" <<'MD'
58
- ---
59
- feature: UserProfile
60
- platform: ios
61
- language: en
62
- mode: lite
63
- template_version: v3
64
- ---
65
- ## 1. Summary
66
- s
67
- ## 2. Goals and Non-Goals
68
- g
69
- ## 4. User Stories
70
- ### 4.4 Business Rules
71
- | BR-profile-01 | rule | source | Given/When/Then |
72
- ## 9. API Contracts
73
- a
74
- ## 13. Architecture
75
- x
76
- ## 14. Files to Add
77
- f
78
- ## 20. Risks and Open Questions
79
- r
80
- ## 21. References
81
- ref
82
- MD
83
- if node "$V" "$tmp/lite.md" >/dev/null 2>&1; then
84
- record_pass "Lite doc (no Section 15) passes - mode-aware Locked 31"
85
- else
86
- record_fail "Lite doc without Section 15 must pass"
87
- fi
88
-
89
- # Missing front-matter -> ERROR.
90
- printf '## 1. Summary\nno front matter\n' > "$tmp/nofm.md"
91
- node "$V" "$tmp/nofm.md" >/dev/null 2>&1
92
- [ "$?" -eq 1 ] && record_pass "missing front-matter fails (exit 1)" || record_fail "missing front-matter should fail"
93
-
94
- # Banned punctuation (em-dash) -> ERROR.
95
- cp "$tmp/good.md" "$tmp/emdash.md"
96
- printf 'A line with an em-dash \342\200\224 here.\n' >> "$tmp/emdash.md"
97
- # Capture first (pipefail + node's nonzero exit would poison a direct pipe).
98
- emdash_out=$(node "$V" "$tmp/emdash.md" 2>&1 || true)
99
- if printf '%s' "$emdash_out" | grep -q "em-dash"; then
100
- record_pass "em-dash flagged (Locked 7)"
101
- else
102
- record_fail "em-dash should be flagged"
103
- fi
104
-
105
- # Missing a never-omitted section (References) -> ERROR.
106
- grep -v "Referanslar\|References" "$tmp/good.md" > "$tmp/noref.md"
107
- node "$V" "$tmp/noref.md" >/dev/null 2>&1
108
- [ "$?" -eq 1 ] && record_pass "missing References section fails" || record_fail "missing References should fail"
109
-
110
- # Define-only BR under --strict -> fail (WARN promoted).
111
- cat > "$tmp/orphan.md" <<'MD'
112
- ---
113
- feature: UserProfile
114
- platform: ios
115
- language: en
116
- mode: full
117
- template_version: v3
118
- ---
119
- ## 1. Summary
120
- s
121
- ## 2. Goals
122
- g
123
- ## 4. User Stories
124
- ### 4.4 Business Rules
125
- | BR-profile-42 | rule | source | Given/When/Then |
126
- ## 9. API Contracts
127
- a
128
- ## 13. Architecture
129
- x
130
- ## 14. Files to Add
131
- f
132
- ## 15. Test Plan
133
- no BR reference here
134
- ## 20. Risks
135
- r
136
- ## 21. References
137
- ref
138
- MD
139
- node "$V" "$tmp/orphan.md" >/dev/null 2>&1
140
- [ "$?" -eq 0 ] && record_pass "define-only BR is WARN, not error (default)" || record_fail "orphan BR should not hard-fail by default"
141
- node "$V" "$tmp/orphan.md" --strict >/dev/null 2>&1
142
- [ "$?" -eq 1 ] && record_pass "define-only BR fails under --strict" || record_fail "orphan BR should fail under --strict"
143
-
144
- # ui_tests: true but no Section 15.6 -> ERROR.
145
- sed 's/^mode: full/mode: full\nui_tests: true\na11y_depth: basic/' "$tmp/good.md" > "$tmp/uimiss.md"
146
- node "$V" "$tmp/uimiss.md" >/dev/null 2>&1
147
- [ "$?" -eq 1 ] && record_pass "ui_tests:true without Section 15.6 fails" || record_fail "ui_tests:true must require 15.6"
148
-
149
- # ui_tests: true WITH a Section 15.6 heading -> passes.
150
- cp "$tmp/uimiss.md" "$tmp/uiok.md"
151
- printf '## 15.6 UI test senaryolari\nUI-profile-01 flow.\n' >> "$tmp/uiok.md"
152
- node "$V" "$tmp/uiok.md" >/dev/null 2>&1
153
- [ "$?" -eq 0 ] && record_pass "ui_tests:true with Section 15.6 passes" || record_fail "ui_tests:true + 15.6 should pass"
154
-
155
- # a11y_depth: full but no Section 16.2 walkthrough -> ERROR.
156
- sed 's/^mode: full/mode: full\nui_tests: false\na11y_depth: full/' "$tmp/good.md" > "$tmp/a11ymiss.md"
157
- node "$V" "$tmp/a11ymiss.md" >/dev/null 2>&1
158
- [ "$?" -eq 1 ] && record_pass "a11y_depth:full without Section 16.2 fails" || record_fail "a11y_depth:full must require 16.2"
159
-
160
- printf '\n\342\225\220\342\225\220 smoke-validate-analysis-doc: %d passed, %d failed \342\225\220\342\225\220\n' "$PASS" "$FAIL"
161
- [ "$FAIL" -eq 0 ]