@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
@@ -34,7 +34,7 @@
34
34
  # ACCOUNT_DEFAULT_REPO fallback GitHub repo (optional)
35
35
  # PROMPT_LANG tr|en - controls maturity.summary language (default: tr)
36
36
 
37
- set -eu
37
+ set -euo pipefail
38
38
 
39
39
  INPUT="${1:-}"
40
40
  [ -z "$INPUT" ] && { echo '{"error":"input required"}'; exit 1; }
@@ -28,7 +28,7 @@
28
28
  # `bridge` writes agent-state.json v2.1.0 with projects[] populated - Phase 0
29
29
  # consumes this and skips its own picker steps.
30
30
 
31
- set -eu
31
+ set -euo pipefail
32
32
 
33
33
  CMD="${1:-}"
34
34
  STATE="${2:-}"
@@ -25,7 +25,7 @@
25
25
  # LOCAL_SCAN_ROOTS env can override the default root list.
26
26
  # LOCAL_SCAN_MAXDEPTH env (default 4) bounds traversal cost.
27
27
 
28
- set -eu
28
+ set -euo pipefail
29
29
 
30
30
  PROVIDER="${1:-}"
31
31
  SCOPE="${2:-}"
@@ -24,7 +24,7 @@
24
24
  # ]
25
25
  #
26
26
 
27
- set -eu
27
+ set -euo pipefail
28
28
 
29
29
  MODE="local"
30
30
  TARGET="${1:-}"
@@ -14,7 +14,7 @@ First step of every `multi-agent` flow **that touches a remote provider**.
14
14
  > repos, account-picker is bypassed and the state file's `accountId` is left
15
15
  > `null` with `tokens={}`. Phases 6/7 read these as "local-only" signals.
16
16
 
17
- > **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - `AskUserQuestion.label` and `header` stay English (UI button + chip contract); `question` and `description` follow `outputLanguage`. Commit/PR/Jira payloads: subject + branch names + code identifiers stay English; body text follows `outputLanguage`.
17
+ > **Language**: see `picker-contract.md` + `rules.md` Language Application matrix.
18
18
 
19
19
  ## Steps
20
20
 
@@ -6,7 +6,7 @@ description: "Internal - dev context (extra repos) picker for multi-agent."
6
6
 
7
7
  Selects extra repos the pipeline may touch beyond the primary repo(s) - typically submodules (e.g. SDKs vendored inside an app repo) or sibling libraries. Each candidate is enriched with a `canPush` flag so the picker can pre-select repos that the active account is allowed to edit, and surface read-only ones as advisory context the pipeline will not modify.
8
8
 
9
- > **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - `AskUserQuestion.label` and `header` stay English (UI button + chip contract); `question` and `description` follow `outputLanguage`. Commit/PR/Jira/Wiki payloads: subject + branch names + code identifiers stay English; body text follows `outputLanguage`.
9
+ > **Language**: see `picker-contract.md` + `rules.md` Language Application matrix.
10
10
 
11
11
  ## Steps
12
12
 
@@ -6,7 +6,7 @@ description: "Internal - multi-select repo picker for multi-agent."
6
6
 
7
7
  Used by `picker-issue`, `picker-jira`, `gh-num`, and `freetext` flows.
8
8
 
9
- > **Language**: Per `$HOME/.claude/multi-agent-refs/rules.md` Language Application matrix - `AskUserQuestion.label` and `header` stay English (UI button + chip contract); `question` and `description` follow `outputLanguage`. Commit/PR/Jira/Wiki payloads: subject + branch names + code identifiers stay English; body text follows `outputLanguage`.
9
+ > **Language**: see `picker-contract.md` + `rules.md` Language Application matrix.
10
10
 
11
11
  ## Steps
12
12
 
@@ -84,7 +84,7 @@ Phase 4 reviewer-skipping is **not** Phase 3's concern - Phase 4 decides based
84
84
 
85
85
  ## Cross-CLI behaviour (intentional divergence)
86
86
 
87
- Component dispatch is **no longer byte-identical across CLIs** and that is by design (see `cross-cli-contract.md` §1.1):
87
+ Component dispatch is **no longer byte-identical across CLIs** and that is by design (see `cross-cli-contract.md` section 1.1):
88
88
 
89
89
  - **Claude Code**: dispatches to the enabled `ai-<platform>-engineering-toolkit` marketplace plugin via the Skill tool (this doc).
90
90
  - **Copilot CLI**: has no plugin loader; it continues to use its standalone `~/.copilot/skills/figma-*` skill copies (frozen fallback). Copilot's resolution + progress lines follow those local skills.
@@ -0,0 +1,121 @@
1
+ # Component Generation Guide (generic)
2
+
3
+ > Lifted out of `core/multi-agent/SKILL.md`, where it was loaded on every
4
+ > run of every mode. It applies only to a task that generates a UI
5
+ > component from a design, so it now loads when that path is taken.
6
+ > Component dispatch itself is in `component-dispatch.md`.
7
+
8
+ When the task involves creating a SwiftUI component (any project, not just figma), follow this architecture:
9
+
10
+ ### Component Architecture: Configuration / View / Modifiers
11
+
12
+ Every component produces up to 5 files:
13
+
14
+ | File | When | Content |
15
+ |------|------|---------|
16
+ | `{Name}Configuration.swift` | Complex (>3 props) | Pure value type, all declarative properties |
17
+ | `{Name}View.swift` | Always | SwiftUI view, renders Configuration |
18
+ | `{Name}+Modifiers.swift` | Complex | Fluent modifier API chain |
19
+ | `{Name}Preview.swift` | Always | All meaningful variant previews |
20
+ | `{Name}Tests.swift` | Always | ViewInspector + Unit tests |
21
+
22
+ ### Configuration Purity Rule
23
+
24
+ Configuration structs hold ONLY declarative, value-type properties:
25
+
26
+ ```swift
27
+ // ✅ CORRECT - pure value type
28
+ struct ButtonConfiguration {
29
+ var title: String = ""
30
+ var style: ButtonStyle = .primary
31
+ var isEnabled: Bool = true
32
+ var icon: Image? = nil
33
+ }
34
+
35
+ // ❌ WRONG - these do NOT belong in Configuration
36
+ // Closures → View property
37
+ // @Binding → View property
38
+ // @State → View property
39
+ // AnyView / @ViewBuilder → View generic parameter
40
+ ```
41
+
42
+ ### View Implementation
43
+
44
+ ```swift
45
+ struct ButtonView: View {
46
+ let configuration: ButtonConfiguration
47
+ private var action: (() -> Void)? // closure lives in View, not Config
48
+
49
+ var body: some View {
50
+ Button(action: { action?() }) {
51
+ HStack(spacing: .Spacing.spacing8) {
52
+ if let icon = configuration.icon { icon }
53
+ Text(configuration.title)
54
+ .typographyStyle(.body1)
55
+ }
56
+ }
57
+ .disabled(!configuration.isEnabled)
58
+ }
59
+ }
60
+ ```
61
+
62
+ ### Modifier Pattern
63
+
64
+ ```swift
65
+ extension ButtonView {
66
+ func title(_ value: String) -> ButtonView {
67
+ var config = configuration
68
+ config.title = value
69
+ return ButtonView(configuration: config)
70
+ }
71
+ func style(_ value: ButtonStyle) -> ButtonView {
72
+ var config = configuration
73
+ config.style = value
74
+ return ButtonView(configuration: config)
75
+ }
76
+ func onTap(_ action: @escaping () -> Void) -> ButtonView {
77
+ var view = self
78
+ view.action = action
79
+ return view
80
+ }
81
+ }
82
+ ```
83
+
84
+ ### Simple vs Complex Decision
85
+
86
+ | Criteria | Simple | Complex |
87
+ |----------|--------|---------|
88
+ | Properties | ≤3 | >3 |
89
+ | Configuration file | No - props in View directly | Yes - separate struct |
90
+ | +Modifiers file | No | Yes |
91
+ | View file | All-in-one | Renders Configuration |
92
+
93
+ ### 3-Layer Test Strategy
94
+
95
+ | Layer | Tool | What It Validates |
96
+ |-------|------|-------------------|
97
+ | Structural | ViewInspector | Hierarchy, subview existence, applied modifiers |
98
+ | Visual | Snapshot Tests | Pixel-correct render: light/dark, RTL/LTR |
99
+ | Behavioral | Unit Tests | State changes, closures, configuration mutations |
100
+
101
+ ### Component Checklist (Before Commit)
102
+
103
+ 1. No magic numbers - all values are design tokens or named constants
104
+ 2. Configuration purity - no side-effects or view logic in Config
105
+ 3. Modifier correctness - fluent API valid, paired modifiers live in the View
106
+ 4. Accessibility - accessibility label/trait on every interactive element
107
+ 5. Preview - all meaningful variants in the preview
108
+ 6. Test - structural + unit tests written
109
+ 7. Dark mode - renders correctly in both color schemes
110
+ 8. Dynamic Type - text scales at large sizes without breaking the layout
111
+
112
+ ### When a Figma URL Is Provided
113
+
114
+ If the user provides a Figma URL:
115
+ 1. Fetch the design data with Figma MCP tools (get_design_context, get_screenshot)
116
+ 2. Map the design's colors, spacing, and typography onto the project's token system
117
+ 3. Apply the Configuration/View/Modifiers pattern above
118
+ 4. Use the screenshot as a reference, do not copy it - adapt to the project's existing components
119
+
120
+ ---
121
+
@@ -50,7 +50,7 @@ Both skills are wired to 4 consumers: `/multi-agent:test "store-ready"` (primary
50
50
 
51
51
  ### 1.3 Figma-skill routing from multi-agent (superseded)
52
52
 
53
- Superseded by §1.1: Claude Code resolves component dispatch to the marketplace plugin (dual-name `create-component`/`create-ui-component`; full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`); Copilot CLI uses its local `~/.copilot/skills/figma-*` copies. No shared filesystem-path routing table or figma-skill frontmatter/inventory parity remains under enforcement.
53
+ Superseded by section 1.1: Claude Code resolves component dispatch to the marketplace plugin (dual-name `create-component`/`create-ui-component`; full contract in `$HOME/.claude/multi-agent-refs/component-dispatch.md`); Copilot CLI uses its local `~/.copilot/skills/figma-*` copies. No shared filesystem-path routing table or figma-skill frontmatter/inventory parity remains under enforcement.
54
54
 
55
55
  ---
56
56
 
@@ -9,7 +9,7 @@ without ever editing persona files at runtime.
9
9
 
10
10
  > **Fable 5 available again (2026-07).** `claude-fable-5` is the top tier once
11
11
  > more. Architect (`ios/android/backend-architect`), Reviewer-1 (`code-reviewer`),
12
- > and triage personas declare `preferredModel: fable` the deepest-reasoning
12
+ > and triage personas declare `preferredModel: fable` - the deepest-reasoning
13
13
  > roles. **If Fable 5 is unavailable, the first fallback is opus (`claude-opus-4-8`).**
14
14
  > Security and other `preferredModel: opus` personas keep opus as their top tier.
15
15
  > The `premiumTierUntil` date gate stays in the contract as a generic mechanism
@@ -98,6 +98,6 @@ per-phase `model` field already carries the override).
98
98
  - No edits to `pipeline/agents/*.md` at runtime; frontmatter is install-time
99
99
  configuration only.
100
100
  - Copilot CLI reviewer set is out of scope: Copilot CLI pins its own three
101
- reviewer models (GPT-5.4 + Opus + Sonnet Fable 5 is not offered there) and
101
+ reviewer models (GPT-5.4 + Opus + Sonnet - Fable 5 is not offered there) and
102
102
  does not use this persona ladder. Only Claude Code dispatches Reviewer-1 on
103
103
  Fable.
@@ -67,6 +67,34 @@ Run phases sequentially. Log every step to `agent-log.md`.
67
67
  If any phase fails, mark task as `paused` and stop - user can `resume` later.
68
68
  Update `agent-state.json` at EVERY phase transition.
69
69
 
70
+ ### Writing `agent-state.json` (required mechanism)
71
+
72
+ Every state update goes through `write-state.mjs`. Never write the file with a
73
+ plain read-modify-write (`jq ... > tmp && mv`, an editor tool, `cat >`):
74
+
75
+ ```bash
76
+ # Merge a patch into the current state (the normal case).
77
+ echo '{"currentPhase":4,"phases":{"4":{"status":"running"}}}' \
78
+ | node $HOME/.claude/scripts/write-state.mjs "$STATE_FILE"
79
+
80
+ # Full replacement, only when rewriting the document wholesale.
81
+ printf '%s' "$NEW_STATE" | node $HOME/.claude/scripts/write-state.mjs --replace "$STATE_FILE"
82
+ ```
83
+
84
+ Why the indirection is required: multi-repo mode and concurrent worktrees share
85
+ one `agent-state.json` per task id, so two writers using read-then-write lose one
86
+ of the two updates - the second write is computed from a snapshot taken before
87
+ the first landed. `write-state.mjs` does tmpfile + rename (atomic on POSIX) under
88
+ an advisory `.lock`, reclaims a lock whose holder PID is dead, and releases the
89
+ lock on every error path.
90
+
91
+ Exit codes the caller must handle: `0` written, `1` invalid JSON on stdin, `2`
92
+ lock timeout (another writer held it past the acquire window - retry once, then
93
+ halt per the halt-visibility rule), `3` I/O error.
94
+
95
+ Reads need no wrapper; the rename makes any read see either the old or the new
96
+ document, never a truncated one.
97
+
70
98
  **Halt visibility (required, autopilot included).** A halt is never silent. Whenever a phase halts on a hard error (validator failed twice, no subagent returned, dispatch error past fallback, lock irrecoverable), in addition to the `agent-log.md` line: (a) write `state.status = "paused"` and `state.haltReason = "<phase>:<cause>"`; (b) record the cause on the tracker via `phase-tracker.sh meta <phase> halt "<cause>"` and `phase-tracker.sh update <phase> failed`; (c) emit one `>&2` alert line `HALT phase <N>: <cause> - resume with /multi-agent:resume #<id>`. Autopilot suppresses *confirmations*, not *halts* - the user must always be able to see why an unattended run stopped without reading the log.
71
99
 
72
100
  ### Pipeline Best Practices
@@ -487,6 +487,7 @@ done
487
487
 
488
488
  State file in multi-repo mode:
489
489
  - Single shared `agent-state.json` lives at `$HOME/.claude/logs/multi-agent/{first-project}/{task-id}/agent-state.json` (anchored on the first repo for back-compat with `multi-agent log`/`status` commands)
490
+ - **One shared file + per-repo writers is exactly the race `write-state.mjs` exists for.** Every update to it (here and in every later phase) goes through `node $HOME/.claude/scripts/write-state.mjs` per the required mechanism in `operations.md` "Writing `agent-state.json`". A read-modify-write from two repos in the same loop drops one repo's `projects[]` entry.
490
491
  - `state.projects[]` holds per-repo `{name, root, worktreePath, branch, baseBranch, identity, platform, baseFetchStatus, commit, pr, pushAttempts, buildStatus}` - see `agent-state.schema.json`
491
492
  - Scalar fields (`project`, `projectRoot`, `worktreePath`, `branch`, `baseBranch`, `identity`) mirror `projects[0]` so legacy phases that read scalars keep working
492
493
  - Atomicity: if any repo's worktree creation fails (collision aborted, fetch aborted, disk full), roll back already-created worktrees: `git -C $proj worktree remove --force $WT_PATH; git -C $proj branch -D $BRANCH`. Never leave a partial multi-repo state.
@@ -13,7 +13,7 @@ Phase 2 Planning consumes the analysis document. MCP forbidden.
13
13
  - Abort with `ERR: analysis doc missing. Run /multi-agent:analysis "<feature>" first.`
14
14
 
15
15
  2. **Parse YAML front-matter**: `feature`, `platform`, `language`, `mode`, `evidence_digest`, `template_version`. Persist into `state.analysis.frontMatter`.
16
- - **Soft-skip (v9.1.0+, Locked 30)**: when `template_version == v2` AND (`prefs.global.legacyV2AnalysisAllowed == true` OR env `MULTI_AGENT_LEGACY_V2_ANALYSIS=allow`), emit `WARN: legacy v2 analysis doc detected; v3 expected. Continuing in degraded mode.` Step 3 section coverage check skips v3-specific sections (10 Localization, 11 Analytics, 12 Deeplink/Push, 13.6 SwiftUI Preview, 21 References). Phase 4 reviewer flags missing v3 sections rather than blocking. Escape hatch removed in v9.2.0; users must regenerate v3 docs by then.
16
+ - **`template_version` < `v3` aborts**: `ERR: analysis doc is template v<n>; v3 required. Re-run /multi-agent:analysis to regenerate.` No degraded mode.
17
17
 
18
18
  3. **Section coverage check**: verify these sections are non-empty (template v3 required sections per Locked 2):
19
19
  - Section 1 Summary, Section 2 Goals + Non-Goals, Section 4 User Stories, Section 9 API Contracts, Section 13 Architecture Plan, Section 14 Files to Add, Section 20 Risks, Section 21 References
@@ -16,8 +16,7 @@ Pre-flight steps (run in order, abort on failure):
16
16
  2. **Parse YAML front-matter** (the doc has a `template_version: v3` header):
17
17
  - `feature`, `platform`, `language`, `mode (full | lite)`, `evidence_digest`
18
18
  - Persist into `state.analysis.frontMatter`
19
- - **Abort condition (v9.0.x strict)**: `template_version` < `v3` -> exit with `ERR: analysis doc is template v<n>; v9 requires v3. Re-run analysis to regenerate.`
20
- - **Soft-skip (v9.1.0+, Locked 30)**: when `prefs.global.legacyV2AnalysisAllowed == true` OR env `MULTI_AGENT_LEGACY_V2_ANALYSIS=allow` is set AND `template_version == v2`, emit `WARN: legacy v2 analysis doc detected; v3 expected. Continuing with reduced binding strength.` and persist `state.dev.legacyAnalysisMode = true`. Step 4 (Code Connect lookup) and Step 6 (conventions handoff) still run, but Step 5 (standards binding) and Pass B footnote enforcement degrade to warning level (Phase 4 reviewer flags missing citations rather than blocking). Escape hatch removed in v9.2.0.
19
+ - **Abort condition**: `template_version` < `v3` -> exit with `ERR: analysis doc is template v<n>; v3 required. Re-run /multi-agent:analysis to regenerate.` No degraded mode.
21
20
 
22
21
  3. **Evidence digest match (cache validation)**: if `state.run.lastAnalysisDigest` is present AND matches `frontMatter.evidence_digest`, mark as fresh; otherwise WARN that analysis is stale (continue but flag).
23
22
 
@@ -1,6 +1,6 @@
1
1
  ### Phase 4: Review (deterministic gates + parallel + triage)
2
2
 
3
- > **TLDR** - Three-stage review. Stage 1: deterministic gates (build + lint + test + secret scan) that MUST pass. Stage 2: AI models in parallel - reviewer set is **CLI-aware**: Claude Code dispatches 2 reviewers (Fable + Sonnet); Copilot CLI dispatches 3 reviewers (GPT-5.4 + Opus + Sonnet Fable 5 is not offered on Copilot CLI). Stage 3: Fable triage (Opus on Copilot CLI) - evaluates raw findings, filters false-positives/out-of-scope, keeps only actionable items. Only triage-accepted blocking items loop back to Phase 3.
3
+ > **TLDR** - Three-stage review. Stage 1: deterministic gates (build + lint + test + secret scan) that MUST pass. Stage 2: AI models in parallel - reviewer set is **CLI-aware**: Claude Code dispatches 2 reviewers (Fable + Sonnet); Copilot CLI dispatches 3 reviewers (GPT-5.4 + Opus + Sonnet - Fable 5 is not offered on Copilot CLI). Stage 3: Fable triage (Opus on Copilot CLI) - evaluates raw findings, filters false-positives/out-of-scope, keeps only actionable items. Only triage-accepted blocking items loop back to Phase 3.
4
4
 
5
5
  <!-- progress-contract: applied -->
6
6
  Progress emission per `$HOME/.claude/multi-agent-refs/progress-contract.md` - lines for each gate, each reviewer dispatch + finish, triage start, triage verdict, fix dispatch.
@@ -112,11 +112,16 @@ Cost ledger: `phase-4.repo_map_emitted bytes=N budget=B cache_hit=true|false` -
112
112
 
113
113
  Before dispatching reviewers, run the deterministic diff risk scorer and inject the top-N files into each reviewer's prompt as a priority hint. **Advisory only - never gates the pipeline.** Heuristic, zero LLM, runs in well under a second.
114
114
 
115
+ Score the diff **once, in full** (no `--top`): Steps 1.76/1.77 need every scored file (a shrinking test file ranked 20th; whether ANY file is high-stakes). The top-N hint is derived from that report, not a second git walk.
116
+
115
117
  ```bash
116
- RISK_JSON=$(node pipeline/scripts/diff-risk-score.mjs \
118
+ RISK_FULL=$(node pipeline/scripts/diff-risk-score.mjs \
117
119
  --base "$BASE_BRANCH" --head HEAD \
118
- --task-id "$TASK_ID" --top 5 2>/dev/null)
119
- echo "$RISK_JSON" | node pipeline/scripts/validate-diff-risk.mjs - >/dev/null 2>&1 || RISK_JSON=""
120
+ --task-id "$TASK_ID" 2>/dev/null)
121
+ echo "$RISK_FULL" | node pipeline/scripts/validate-diff-risk.mjs - >/dev/null 2>&1 || RISK_FULL=""
122
+
123
+ # Priority hint for the reviewer prompts: top 5 of the full report.
124
+ RISK_JSON=$([ -n "$RISK_FULL" ] && jq -c '.files |= (sort_by(-.score) | .[:5])' <<< "$RISK_FULL" || echo "")
120
125
  ```
121
126
 
122
127
  **Signals & weights** (see `pipeline/schemas/diff-risk.schema.json`):
@@ -151,6 +156,35 @@ pipeline/scripts/log-metric.sh "$TASK_ID" 4 review.diff_risk \
151
156
 
152
157
  **Opt-out**: `prefs.global.diffRiskAdvisory = false` skips this step entirely (no script invocation, no priority block injection). Default `true` because the cost is bounded and the signal-to-noise has been measured against the golden-task fixture set.
153
158
 
159
+ #### Step 1.76 - Test-integrity gate (produces BLOCKING findings)
160
+
161
+ Step 1.75 uses `test_lines_removed` as an advisory hint only - too weak for what it detects: a suite made green by deleting tests instead of fixing code. This turns the signal into blocking findings triage must adjudicate. Pure function of the full report, no git, no LLM.
162
+
163
+ ```bash
164
+ TEST_INTEGRITY_JSON=$(printf '%s' "$RISK_FULL" | node pipeline/scripts/test-integrity-gate.mjs 2>/dev/null || echo "")
165
+ TI_COUNT=$(jq -r '.count // 0' <<< "${TEST_INTEGRITY_JSON:-{\}}" 2>/dev/null || echo 0)
166
+ [ "$TI_COUNT" -gt 0 ] && pipeline/scripts/log-metric.sh "$TASK_ID" 4 review.test_integrity findings="$TI_COUNT"
167
+ ```
168
+
169
+ `findings[]` are reviewer-shaped (`test_integrity`, `blocking`), so they merge into the reviewer findings at Step 3.0 and need no triage-prompt or `validate-triage.mjs` change. Triage keeps each blocking unless the removal is justified per the immutable-test rule (spec changed AND commit body names the test) → `deferred[]`.
170
+
171
+ The gate never blocks the phase; it *emits* blocking findings. Empty or unreadable input yields zero findings and the phase continues. Feed it the FULL report - `--top` hides a shrinking test file below the cut. **No opt-out**: a run that can switch off its own anti-reward-hacking control cannot be trusted to report a pass.
172
+
173
+ #### Step 1.77 - Reviewer scope (cost gate)
174
+
175
+ On a trivial diff every reviewer agrees and the extra models plus triage are paid for nothing. Reviewer count comes from the same report, no LLM.
176
+
177
+ ```bash
178
+ SCOPE_JSON=$(printf '%s' "$RISK_FULL" | node pipeline/scripts/review-scope.mjs 2>/dev/null \
179
+ || echo '{"scope":"full","reason":"no risk report - failing safe"}')
180
+ REVIEW_SCOPE=$(jq -r '.scope // "full"' <<< "$SCOPE_JSON")
181
+ pipeline/scripts/log-metric.sh "$TASK_ID" 4 review.scope scope="$REVIEW_SCOPE"
182
+ ```
183
+
184
+ `single` (Reviewer 1 only) requires **all** of: churn <= 20 lines, `totals.max_score` < 3.0, and no `security_path` / `migration` / `public_api` / `no_test_change` / `test_lines_removed` on any file. Anything else → `full`.
185
+
186
+ Fails safe in one direction only: empty report, parse failure or validator rejection all resolve to `full`, because skipping a reviewer trades coverage for cost. `consensus.reviewerCount` records what actually ran, so a single-reviewer run never reads as cross-model agreement. Opt-out: `prefs.global.reviewScopeGate = false` forces `full`.
187
+
154
188
  #### Step 1.8 - Figma visual-fidelity context (when task carries a Figma reference)
155
189
 
156
190
  When `state.evidence.figma[]` is non-empty, the reviewer subagents MUST receive the captured screenshot URLs / paths and the canonical-component name (from `state.evidence.figma[i].screenshotUrl` and `state.evidence.figma[i].codeConnectSnippets[0].componentName` when present) so they can compare visual fidelity. Pass them inline in each reviewer prompt under a `## Figma evidence` block, one row per frame.
@@ -182,6 +216,8 @@ Phase 4 sends the same diff to every reviewer and then to triage, so the diff is
182
216
 
183
217
  Launch Agent instances **in parallel** using the shared `code-reviewer` subagent definition (`~/.claude/agents/code-reviewer.md`). The reviewer set is determined by the host CLI - GPT-5.4 is only available on Copilot CLI, so Claude Code skips that reviewer and runs a 2-model parallel review; Copilot CLI runs all three.
184
218
 
219
+ **Scope from Step 1.77.** `$REVIEW_SCOPE == "single"` → dispatch **Reviewer 1 only**, and skip Step 2.5 + 3.6 (both no-ops with one reviewer). `"full"` (default + fail-safe) → the whole set below. Either way record the count in `consensus.reviewerCount`.
220
+
185
221
  | Reviewer | subagent_type | Model | Focus | Skills Referenced | Where it runs |
186
222
  | ---------- | ----------------- | ------------------- | --------------------------------- | --------------------------------------------- | -------------------- |
187
223
  | Reviewer 1 | `code-reviewer` | `claude-fable-5` (Claude Code) / `claude-opus-4-8` (Copilot CLI) | Deep security + architecture | `api-security-best-practices`, `architecture` | Both CLIs |
@@ -259,9 +295,18 @@ Exit 0 = valid. Exit 2 = contradiction (approved=true with blocking findings) -
259
295
 
260
296
  Opt-in empirical layer: when `prefs.global.verifyByTest.enabled` is `true`, accepted blocking findings additionally go through Step 3.7 (verify-by-test), which tries to reproduce each one with a minimal failing test before the Phase 3 rework loop fires. Full wiring: `$HOME/.claude/multi-agent-refs/features/verify-by-test.md`.
261
297
 
298
+ ##### 3.0 Merge the deterministic findings in
299
+
300
+ Append the Step 1.76 test-integrity findings to the reviewer findings before counting, so they are adjudicated like any reviewer finding rather than resolved by triage never seeing them:
301
+
302
+ ```bash
303
+ MERGED=$(jq -s '.[0] + (.[1].findings // [])' \
304
+ <(printf '%s' "$REVIEWER_FINDINGS_JSON") <(printf '%s' "${TEST_INTEGRITY_JSON:-{\}}"))
305
+ ```
306
+
262
307
  ##### 3.1 Short-circuit: no findings
263
308
 
264
- If merged findings `length === 0`, **skip triage**: write empty result `{"accepted": [], "deferred": [], "rejected": [], "approved": true}`, log, proceed to Phase 5.
309
+ If **merged** findings `length === 0`, **skip triage**: write empty result `{"accepted": [], "deferred": [], "rejected": [], "approved": true}`, log, proceed to Phase 5. Note this is the merged count from 3.0: a run with zero reviewer findings but a non-empty test-integrity set must NOT short-circuit.
265
310
 
266
311
  ##### 3.2 Launch triage agent
267
312
 
@@ -45,12 +45,7 @@
45
45
  "autoDiff": false,
46
46
  "manualNote": false
47
47
  },
48
- "wikiScope": [
49
- "main",
50
- "ios",
51
- "screenshots",
52
- "index"
53
- ],
48
+ "wikiScope": ["main", "ios", "screenshots", "index"],
54
49
  "autopilotReportTimeoutSeconds": 1800,
55
50
  "promptLanguage": "en",
56
51
  "outputLanguage": "en",
@@ -162,17 +157,16 @@
162
157
  }
163
158
  },
164
159
  "_derivedSkillSourcesTemplate": {
165
- "_comment": "Optional. Populate global.derivedSkillSources[] to let /multi-agent:refactor check whether skills you derived from an upstream marketplace plugin have been updated. Kept in your LOCAL prefs only (never synced), so it may reference private sources. Copy an entry like the one below.",
160
+ "_comment": "Optional. Populate global.derivedSkillSources[] to let /multi-agent:refactor check whether skills you derived from an upstream marketplace plugin have been updated. Kept in your LOCAL prefs only (never synced), so it may reference private sources. Copy an entry like the one below. Set upstreamLocalClone when you have a working copy: the installed plugin cache is only as fresh as your last marketplace update, and a stale cache makes the drift check answer 'up to date' when it is four releases behind.",
166
161
  "_example": {
167
162
  "label": "Component toolkit skills",
168
163
  "localPath": "plugins/<my-plugin>/skills/workflow",
169
164
  "upstreamMarketplace": "<installed-marketplace-name>",
170
165
  "upstreamPlugin": "<upstream-plugin-name>",
171
- "upstreamSkills": [
172
- "<skill-a>",
173
- "<skill-b>"
174
- ],
166
+ "upstreamSkills": ["<skill-a>", "<skill-b>"],
175
167
  "derivedFromVersion": "0.0.0",
168
+ "upstreamVersionSource": "marketplace.json",
169
+ "upstreamLocalClone": "$HOME/<upstream-repo-working-copy>",
176
170
  "upstreamRepoUrl": "https://github.com/<org>/<repo>"
177
171
  }
178
172
  },
@@ -97,8 +97,16 @@
97
97
  "type": "object",
98
98
  "required": ["tool", "phase"],
99
99
  "properties": {
100
- "tool": { "type": "string", "description": "MCP tool name, e.g. mcp__claude_ai_Figma__get_design_context." },
101
- "phase": { "type": "integer", "minimum": 0, "maximum": 7, "description": "Pipeline phase the call ran in. Only 0 (init) and 1 (analysis) are permitted." },
100
+ "tool": {
101
+ "type": "string",
102
+ "description": "MCP tool name, e.g. mcp__claude_ai_Figma__get_design_context."
103
+ },
104
+ "phase": {
105
+ "type": "integer",
106
+ "minimum": 0,
107
+ "maximum": 7,
108
+ "description": "Pipeline phase the call ran in. Only 0 (init) and 1 (analysis) are permitted."
109
+ },
102
110
  "timestamp": { "type": "string", "description": "ISO-8601 time of the call." }
103
111
  }
104
112
  }
@@ -154,7 +162,10 @@
154
162
  "items": { "type": "object", "additionalProperties": true },
155
163
  "description": "{ id, kind, label, screen, driver, evidence } per state driver (launch-arg / scenario-case / code-scenario / fixture / deep-link)."
156
164
  },
157
- "groups": { "type": "array", "items": { "type": "object", "additionalProperties": true } },
165
+ "groups": {
166
+ "type": "array",
167
+ "items": { "type": "object", "additionalProperties": true }
168
+ },
158
169
  "byKind": { "type": "object", "additionalProperties": true },
159
170
  "truncated": { "type": "boolean" }
160
171
  }
@@ -164,9 +175,15 @@
164
175
  "additionalProperties": true,
165
176
  "description": "Resolved run scope: the inventory targets this run must audit. The coverage gate applies to this set, not to the whole inventory - a scoped run is not penalised for out-of-scope targets.",
166
177
  "properties": {
167
- "argument": { "type": ["string", "null"], "description": "Raw $ARGUMENTS as given (empty = whole module, '--resume' = remainder of the last run)." },
178
+ "argument": {
179
+ "type": ["string", "null"],
180
+ "description": "Raw $ARGUMENTS as given (empty = whole module, '--resume' = remainder of the last run)."
181
+ },
168
182
  "targetIds": { "type": "array", "items": { "type": "string" } },
169
- "resumedFrom": { "type": ["string", "null"], "description": "Report dir of the run this scope resumes, when --resume was used." }
183
+ "resumedFrom": {
184
+ "type": ["string", "null"],
185
+ "description": "Report dir of the run this scope resumes, when --resume was used."
186
+ }
170
187
  }
171
188
  },
172
189
  "figmaUrl": { "type": ["string", "null"] },
@@ -208,7 +225,10 @@
208
225
  "unaccountedIds": { "type": "array", "items": { "type": "string" } }
209
226
  }
210
227
  },
211
- "reportDir": { "type": ["string", "null"], "description": "Output dir under ~/DesignChecks." }
228
+ "reportDir": {
229
+ "type": ["string", "null"],
230
+ "description": "Output dir under ~/DesignChecks."
231
+ }
212
232
  }
213
233
  },
214
234
  "identity": {
@@ -218,7 +238,10 @@
218
238
  "properties": {
219
239
  "name": { "type": "string" },
220
240
  "email": { "type": "string", "format": "email" },
221
- "username": { "type": "string", "description": "SCM username (GitHub/Bitbucket). Used to filter out PR author from reviewer list." }
241
+ "username": {
242
+ "type": "string",
243
+ "description": "SCM username (GitHub/Bitbucket). Used to filter out PR author from reviewer list."
244
+ }
222
245
  }
223
246
  },
224
247
  "phases": {
@@ -229,7 +252,10 @@
229
252
  "type": "object",
230
253
  "additionalProperties": false,
231
254
  "properties": {
232
- "status": { "type": "string", "enum": ["pending", "in_progress", "done", "skipped", "failed"] },
255
+ "status": {
256
+ "type": "string",
257
+ "enum": ["pending", "in_progress", "done", "skipped", "failed"]
258
+ },
233
259
  "startedAt": { "type": "string", "format": "date-time" },
234
260
  "finishedAt": { "type": "string", "format": "date-time" },
235
261
  "model": { "type": "string" },
@@ -312,7 +338,11 @@
312
338
  "properties": {
313
339
  "number": { "type": "integer", "minimum": 1 },
314
340
  "url": { "type": "string", "format": "uri" },
315
- "version": { "type": "integer", "minimum": 0, "description": "Bitbucket PR version - must increment by 1 per PUT." },
341
+ "version": {
342
+ "type": "integer",
343
+ "minimum": 0,
344
+ "description": "Bitbucket PR version - must increment by 1 per PUT."
345
+ },
316
346
  "draft": { "type": "boolean" },
317
347
  "reviewers": {
318
348
  "type": "array",
@@ -18,8 +18,14 @@
18
18
  "enum": ["ios", "android", "backend", "frontend", "mobile", "unknown"],
19
19
  "description": "Dominant stack inferred from project markers (.xcodeproj, build.gradle, package.json, etc.)."
20
20
  },
21
- "language": { "type": "string", "description": "E.g. 'Swift 6', 'Kotlin 2.1', 'Python 3.13', 'TypeScript 5'." },
22
- "framework": { "type": "string", "description": "E.g. 'SwiftUI', 'Jetpack Compose', 'FastAPI', 'Next.js 16'." }
21
+ "language": {
22
+ "type": "string",
23
+ "description": "E.g. 'Swift 6', 'Kotlin 2.1', 'Python 3.13', 'TypeScript 5'."
24
+ },
25
+ "framework": {
26
+ "type": "string",
27
+ "description": "E.g. 'SwiftUI', 'Jetpack Compose', 'FastAPI', 'Next.js 16'."
28
+ }
23
29
  }
24
30
  },
25
31
  "touchedAreas": {
@@ -30,8 +36,16 @@
30
36
  "additionalProperties": false,
31
37
  "required": ["path", "why"],
32
38
  "properties": {
33
- "path": { "type": "string", "minLength": 1, "description": "File or directory relative to repo root." },
34
- "why": { "type": "string", "minLength": 4, "description": "Why the task likely affects this area." }
39
+ "path": {
40
+ "type": "string",
41
+ "minLength": 1,
42
+ "description": "File or directory relative to repo root."
43
+ },
44
+ "why": {
45
+ "type": "string",
46
+ "minLength": 4,
47
+ "description": "Why the task likely affects this area."
48
+ }
35
49
  }
36
50
  },
37
51
  "description": "Files / modules the task is most likely to modify. Phase 2 uses this to scope tasks."