@mmerterden/multi-agent-pipeline 12.6.0 → 12.7.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 (271) hide show
  1. package/CHANGELOG.md +83 -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 +5 -11
  19. package/install/_copilot-instructions.mjs +2 -2
  20. package/install/_dev-only-files.mjs +1 -1
  21. package/install/_platform-filter.mjs +1 -1
  22. package/install/_telemetry.mjs +1 -1
  23. package/install/claude.mjs +10 -9
  24. package/install/copilot.mjs +10 -19
  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 +13 -10
  29. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  30. package/pipeline/commands/multi-agent/analysis/SKILL.md +1 -1
  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/eval/run-metrics-fixture.json +60 -13
  72. package/pipeline/lib/account-resolver.sh +1 -1
  73. package/pipeline/lib/channels-multi-repo.sh +1 -1
  74. package/pipeline/lib/context-link-extractor.sh +1 -1
  75. package/pipeline/lib/credential-store.sh +1 -1
  76. package/pipeline/lib/fetch-confluence.sh +1 -1
  77. package/pipeline/lib/fetch-crashlytics.sh +1 -1
  78. package/pipeline/lib/fetch-fortify.sh +1 -1
  79. package/pipeline/lib/fetch-graylog.sh +1 -1
  80. package/pipeline/lib/fetch-swagger.sh +1 -1
  81. package/pipeline/lib/issue-fetcher.sh +1 -1
  82. package/pipeline/lib/multi-repo-pipeline.sh +1 -1
  83. package/pipeline/lib/repo-cache.sh +1 -1
  84. package/pipeline/lib/submodule-detector.sh +1 -1
  85. package/pipeline/multi-agent-refs/component-dispatch.md +1 -1
  86. package/pipeline/multi-agent-refs/component-generation.md +121 -0
  87. package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
  88. package/pipeline/multi-agent-refs/features/model-fallback.md +2 -2
  89. package/pipeline/multi-agent-refs/phases/phase-4-review.md +1 -1
  90. package/pipeline/preferences-template.json +5 -11
  91. package/pipeline/schemas/agent-state.schema.json +39 -9
  92. package/pipeline/schemas/analysis-output.schema.json +18 -4
  93. package/pipeline/schemas/analysis-spec.schema.json +120 -32
  94. package/pipeline/schemas/clarify-output.schema.json +15 -5
  95. package/pipeline/schemas/design-check-config.schema.json +32 -11
  96. package/pipeline/schemas/dev-critic-output.schema.json +20 -5
  97. package/pipeline/schemas/figma-project-config.schema.json +42 -10
  98. package/pipeline/schemas/learnings-ledger.schema.json +10 -2
  99. package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +1 -4
  100. package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +24 -7
  101. package/pipeline/schemas/plan-todos.schema.json +6 -3
  102. package/pipeline/schemas/planning-output.schema.json +5 -1
  103. package/pipeline/schemas/prefs.schema.json +91 -229
  104. package/pipeline/schemas/test-gap.schema.json +5 -5
  105. package/pipeline/schemas/token-budget.json +8 -8
  106. package/pipeline/schemas/triage-corpus.schema.json +1 -1
  107. package/pipeline/scripts/aggregate-metrics.mjs +18 -6
  108. package/pipeline/scripts/build-skills-index.mjs +6 -2
  109. package/pipeline/scripts/build-stack-plugins.mjs +142 -39
  110. package/pipeline/scripts/check-derived-drift.mjs +196 -0
  111. package/pipeline/scripts/check-md-links.mjs +6 -2
  112. package/pipeline/scripts/classify-plan-safety.mjs +20 -7
  113. package/pipeline/scripts/cost-budget-check.mjs +2 -1
  114. package/pipeline/scripts/cost-table.json +1 -1
  115. package/pipeline/scripts/diff-explain.mjs +7 -3
  116. package/pipeline/scripts/diff-risk-score.mjs +13 -3
  117. package/pipeline/scripts/eval-golden-tasks-live.mjs +8 -3
  118. package/pipeline/scripts/eval-golden-tasks.mjs +21 -9
  119. package/pipeline/scripts/eval-intent.mjs +8 -4
  120. package/pipeline/scripts/eval-mine-corpus.mjs +14 -4
  121. package/pipeline/scripts/evidence-gate.mjs +7 -2
  122. package/pipeline/scripts/fixtures/install-layout.tsv +3 -3
  123. package/pipeline/scripts/gen-mode-dispatch.mjs +38 -21
  124. package/pipeline/scripts/gen-skills-index.mjs +18 -3
  125. package/pipeline/scripts/learning-curve.mjs +13 -3
  126. package/pipeline/scripts/learnings-ledger.mjs +103 -36
  127. package/pipeline/scripts/lint-mcp-refs.mjs +13 -2
  128. package/pipeline/scripts/lint-skills.mjs +20 -9
  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/run-smokes.mjs +57 -3
  139. package/pipeline/scripts/scorecard.mjs +258 -0
  140. package/pipeline/scripts/smoke-context-budget.sh +72 -0
  141. package/pipeline/scripts/smoke-model-fallback.sh +1 -1
  142. package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +86 -7
  143. package/pipeline/scripts/smoke-own-punctuation.sh +103 -0
  144. package/pipeline/scripts/smoke-workflow-audit.sh +43 -11
  145. package/pipeline/scripts/smoke-write-state.sh +49 -5
  146. package/pipeline/scripts/test-gap-rules/android.json +11 -11
  147. package/pipeline/scripts/test-gap-rules/ios.json +16 -11
  148. package/pipeline/scripts/test-gap-rules/node.json +19 -7
  149. package/pipeline/scripts/test-gap-rules/python.json +10 -4
  150. package/pipeline/scripts/test-gap-scan.mjs +44 -12
  151. package/pipeline/scripts/test-integrity-gate.mjs +5 -1
  152. package/pipeline/scripts/token-budget-report.mjs +44 -21
  153. package/pipeline/scripts/triage-memory.mjs +126 -34
  154. package/pipeline/scripts/uninstall.mjs +74 -30
  155. package/pipeline/scripts/validate-analysis-doc.mjs +15 -5
  156. package/pipeline/scripts/validate-diff-risk.mjs +32 -18
  157. package/pipeline/scripts/validate-test-gap.mjs +17 -7
  158. package/pipeline/scripts/validate-triage.mjs +17 -5
  159. package/pipeline/scripts/write-state.mjs +32 -9
  160. package/pipeline/skills/.skills-index.json +91 -91
  161. package/pipeline/skills/shared/README.md +57 -57
  162. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
  163. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +1 -1
  164. package/pipeline/skills/shared/core/multi-agent/SKILL.md +26 -279
  165. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +1 -1
  166. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
  167. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +1 -1
  168. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  169. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
  170. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
  171. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
  172. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
  173. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
  174. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
  175. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +1 -1
  176. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  177. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +1 -1
  178. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +1 -1
  179. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  180. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +1 -1
  181. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +1 -1
  182. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +1 -1
  183. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
  184. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
  185. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +1 -1
  186. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +1 -1
  187. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +1 -1
  188. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +1 -1
  189. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +1 -1
  190. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +16 -8
  191. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +1 -1
  192. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +1 -1
  193. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +1 -1
  194. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +1 -1
  195. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +1 -1
  196. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +1 -1
  197. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +1 -1
  198. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +1 -1
  199. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
  200. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +3 -3
  201. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +1 -1
  202. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +1 -1
  203. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +1 -1
  204. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +1 -1
  205. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
  206. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +1 -1
  207. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -4
  208. package/pipeline/skills/shared/external/agentflow/SKILL.md +1 -1
  209. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +1 -1
  210. package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +1 -1
  211. package/pipeline/skills/shared/external/api-patterns/SKILL.md +1 -1
  212. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +1 -1
  213. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +1 -1
  214. package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
  215. package/pipeline/skills/shared/external/backlog/SKILL.md +12 -12
  216. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -1
  217. package/pipeline/skills/shared/external/context-compression/SKILL.md +1 -1
  218. package/pipeline/skills/shared/external/council/SKILL.md +3 -3
  219. package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -1
  220. package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -1
  221. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +1 -1
  222. package/pipeline/skills/shared/external/docker-expert/SKILL.md +1 -1
  223. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +1 -1
  224. package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
  225. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +1 -1
  226. package/pipeline/skills/shared/external/help-skills/SKILL.md +1 -1
  227. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +1 -1
  228. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +1 -1
  229. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +1 -1
  230. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +1 -1
  231. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +1 -1
  232. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +1 -1
  233. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +1 -1
  234. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +1 -1
  235. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +1 -1
  236. package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -1
  237. package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -1
  238. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +1 -1
  239. package/pipeline/skills/shared/external/ios-developer/SKILL.md +1 -1
  240. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +1 -1
  241. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +1 -1
  242. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +1 -1
  243. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +1 -1
  244. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -1
  245. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +1 -1
  246. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +1 -1
  247. package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -1
  248. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -1
  249. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -1
  250. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -2
  251. package/pipeline/skills/shared/external/skill-creator/SKILL.md +12 -12
  252. package/pipeline/skills/shared/external/skill-creator/audit.md +21 -21
  253. package/pipeline/skills/shared/external/skill-creator/checklist.md +3 -3
  254. package/pipeline/skills/shared/external/skill-creator/examples.md +10 -10
  255. package/pipeline/skills/shared/external/skill-creator/label-check.md +17 -17
  256. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +86 -50
  257. package/pipeline/skills/shared/external/skill-creator/template.md +9 -9
  258. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +1 -1
  259. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +1 -1
  260. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
  261. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +1 -1
  262. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -1
  263. package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -1
  264. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -1
  265. package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -1
  266. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -1
  267. package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -1
  268. package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -1
  269. package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +9 -49
  270. package/pipeline/skills/skills-index.md +57 -57
  271. package/pipeline/scripts/smoke-plugin-validate.sh +0 -64
@@ -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.
@@ -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.
@@ -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."
@@ -128,8 +128,15 @@
128
128
  "url": { "type": "string", "format": "uri" },
129
129
  "fileKey": { "type": ["string", "null"] },
130
130
  "nodeId": { "type": ["string", "null"] },
131
- "screenshotUrl": { "type": ["string", "null"], "description": "Local PNG path or signed render URL for this node." },
132
- "tier": { "type": ["integer", "null"], "enum": [1, 2, 3, null], "description": "Figma access tier used to capture this record (mirrors state.figmaAccess.tier)." },
131
+ "screenshotUrl": {
132
+ "type": ["string", "null"],
133
+ "description": "Local PNG path or signed render URL for this node."
134
+ },
135
+ "tier": {
136
+ "type": ["integer", "null"],
137
+ "enum": [1, 2, 3, null],
138
+ "description": "Figma access tier used to capture this record (mirrors state.figmaAccess.tier)."
139
+ },
133
140
  "frames": {
134
141
  "type": "array",
135
142
  "items": {
@@ -202,14 +209,23 @@
202
209
  "properties": {
203
210
  "nodeId": { "type": "string" },
204
211
  "name": { "type": ["string", "null"] },
205
- "designText": { "type": ["string", "null"], "description": "The visible-layer text at this node (often a placeholder)." },
206
- "raw": { "type": ["string", "null"], "description": "The raw annotation label/labelMarkdown before parsing." },
212
+ "designText": {
213
+ "type": ["string", "null"],
214
+ "description": "The visible-layer text at this node (often a placeholder)."
215
+ },
216
+ "raw": {
217
+ "type": ["string", "null"],
218
+ "description": "The raw annotation label/labelMarkdown before parsing."
219
+ },
207
220
  "parsed": {
208
221
  "type": "object",
209
222
  "description": "Parsed copy keyed by language code (lowercased), e.g. { tr, en }.",
210
223
  "additionalProperties": { "type": "string" }
211
224
  },
212
- "mode": { "type": "string", "enum": ["prefixed", "two-line", "single", "empty"] }
225
+ "mode": {
226
+ "type": "string",
227
+ "enum": ["prefixed", "two-line", "single", "empty"]
228
+ }
213
229
  }
214
230
  }
215
231
  }
@@ -231,7 +247,10 @@
231
247
  "additionalProperties": false,
232
248
  "required": ["method", "path"],
233
249
  "properties": {
234
- "method": { "type": "string", "enum": ["GET", "POST", "PUT", "PATCH", "DELETE"] },
250
+ "method": {
251
+ "type": "string",
252
+ "enum": ["GET", "POST", "PUT", "PATCH", "DELETE"]
253
+ },
235
254
  "path": { "type": "string" },
236
255
  "summary": { "type": ["string", "null"] },
237
256
  "auth": { "type": ["string", "null"] },
@@ -363,7 +382,10 @@
363
382
  "enum": ["names", "schema", "console"],
364
383
  "description": "Sub-type: names (comma list), schema (local JSON), console (reference-only URL)."
365
384
  },
366
- "source": { "type": ["string", "null"], "description": "Original input string (path, URL, or comma list)." },
385
+ "source": {
386
+ "type": ["string", "null"],
387
+ "description": "Original input string (path, URL, or comma list)."
388
+ },
367
389
  "events": {
368
390
  "type": "array",
369
391
  "items": {
@@ -387,7 +409,10 @@
387
409
  },
388
410
  "platformsEmitting": {
389
411
  "type": "array",
390
- "items": { "type": "string", "enum": ["ios", "android", "backend", "frontend"] }
412
+ "items": {
413
+ "type": "string",
414
+ "enum": ["ios", "android", "backend", "frontend"]
415
+ }
391
416
  },
392
417
  "citation": { "type": ["string", "null"] }
393
418
  }
@@ -415,7 +440,10 @@
415
440
  "name": { "type": "string" },
416
441
  "file": { "type": "string" },
417
442
  "line": { "type": ["integer", "null"] },
418
- "tag": { "type": "string", "enum": ["direct-match", "same-domain", "cross-cutting"] }
443
+ "tag": {
444
+ "type": "string",
445
+ "enum": ["direct-match", "same-domain", "cross-cutting"]
446
+ }
419
447
  }
420
448
  }
421
449
  }
@@ -493,29 +521,89 @@
493
521
  "additionalProperties": false,
494
522
  "description": "v3 template - 23 main sections + 3 footer. Each section is either filled (object) or omitted (null). Omitted sections do not appear in the output document. Sections 1, 2, 4, 9, 13, 14, 20, 21 are never omitted (Locked 2).",
495
523
  "properties": {
496
- "summary": { "type": ["object", "null"], "description": "Section 1 - Geliştirme Özeti / Summary. Never null." },
497
- "goalsAndNonGoals": { "type": ["object", "null"], "description": "Section 2 - Hedefler ve Karşı Hedefler. Never null. Both columns mandatory (Locked 13)." },
498
- "flowChart": { "type": ["object", "null"], "description": "Section 3 - Akış Diyagramı. Mermaid blocks." },
499
- "userStories": { "type": ["object", "null"], "description": "Section 4 - Kullanıcı Hikayeleri. Gherkin format (Locked 12). Never null." },
500
- "designReference": { "type": ["object", "null"], "description": "Section 5 - Tasarım Referansı. All Figma variants drilled (Locked 18). Screenshots embedded (Locked 17)." },
501
- "componentInventory": { "type": ["object", "null"], "description": "Section 6 - Bileşen Envanteri." },
502
- "designTokens": { "type": ["object", "null"], "description": "Section 7 - Tasarım Token'ları." },
503
- "assetInventory": { "type": ["object", "null"], "description": "Section 8 - Asset Envanteri. SVG default for new assets (Locked 15)." },
504
- "apiContracts": { "type": ["object", "null"], "description": "Section 9 - API Kontratları. All response variants enumerated (Locked 17)." },
505
- "localization": { "type": ["object", "null"], "description": "Section 10 - Lokalizasyon. 8-locale full coverage for new keys (Locked 20)." },
506
- "analytics": { "type": ["object", "null"], "description": "Section 11 - Analytics." },
507
- "deeplinkPush": { "type": ["object", "null"], "description": "Section 12 - Deeplink ve Push Notification. Conditional." },
508
- "architecturePlan": { "type": ["object", "null"], "description": "Section 13 - Mimari Plan. Never null. Concept table filled by Pass B (Locked 22 + 24)." },
509
- "filesToAdd": { "type": ["object", "null"], "description": "Section 14 - Eklenecek Dosyalar. Never null. Every row carries Reuse / Add new / Modify tag (Locked 16)." },
510
- "testPlan": { "type": ["object", "null"], "description": "Section 15 - Test Planı." },
511
- "accessibility": { "type": ["object", "null"], "description": "Section 16 - Erişilebilirlik." },
512
- "securityAndPrivacy": { "type": ["object", "null"], "description": "Section 17 - Güvenlik ve Gizlilik." },
513
- "rolloutPlan": { "type": ["object", "null"], "description": "Section 18 - Yayılım Planı." },
514
- "alternativesConsidered":{ "type": ["object", "null"], "description": "Section 19 - Değerlendirilen Alternatifler. ADR format." },
515
- "risksAndOpenQuestions":{ "type": ["object", "null"], "description": "Section 20 - Riskler ve Açık Sorular. Never null. Auto-populated from conventionRisks + reuse competitors." },
516
- "references": { "type": ["object", "null"], "description": "Section 21 - Referanslar. Never null. User-supplied input table at the bottom (Locked 21)." },
517
- "glossary": { "type": ["object", "null"], "description": "Section 22 - Sözlük (footer). Optional in Lite mode." },
518
- "changelog": { "type": ["object", "null"], "description": "Section 23 - Değişiklik Geçmişi (footer)." }
524
+ "summary": {
525
+ "type": ["object", "null"],
526
+ "description": "Section 1 - Geliştirme Özeti / Summary. Never null."
527
+ },
528
+ "goalsAndNonGoals": {
529
+ "type": ["object", "null"],
530
+ "description": "Section 2 - Hedefler ve Karşı Hedefler. Never null. Both columns mandatory (Locked 13)."
531
+ },
532
+ "flowChart": {
533
+ "type": ["object", "null"],
534
+ "description": "Section 3 - Akış Diyagramı. Mermaid blocks."
535
+ },
536
+ "userStories": {
537
+ "type": ["object", "null"],
538
+ "description": "Section 4 - Kullanıcı Hikayeleri. Gherkin format (Locked 12). Never null."
539
+ },
540
+ "designReference": {
541
+ "type": ["object", "null"],
542
+ "description": "Section 5 - Tasarım Referansı. All Figma variants drilled (Locked 18). Screenshots embedded (Locked 17)."
543
+ },
544
+ "componentInventory": {
545
+ "type": ["object", "null"],
546
+ "description": "Section 6 - Bileşen Envanteri."
547
+ },
548
+ "designTokens": {
549
+ "type": ["object", "null"],
550
+ "description": "Section 7 - Tasarım Token'ları."
551
+ },
552
+ "assetInventory": {
553
+ "type": ["object", "null"],
554
+ "description": "Section 8 - Asset Envanteri. SVG default for new assets (Locked 15)."
555
+ },
556
+ "apiContracts": {
557
+ "type": ["object", "null"],
558
+ "description": "Section 9 - API Kontratları. All response variants enumerated (Locked 17)."
559
+ },
560
+ "localization": {
561
+ "type": ["object", "null"],
562
+ "description": "Section 10 - Lokalizasyon. 8-locale full coverage for new keys (Locked 20)."
563
+ },
564
+ "analytics": { "type": ["object", "null"], "description": "Section 11 - Analytics." },
565
+ "deeplinkPush": {
566
+ "type": ["object", "null"],
567
+ "description": "Section 12 - Deeplink ve Push Notification. Conditional."
568
+ },
569
+ "architecturePlan": {
570
+ "type": ["object", "null"],
571
+ "description": "Section 13 - Mimari Plan. Never null. Concept table filled by Pass B (Locked 22 + 24)."
572
+ },
573
+ "filesToAdd": {
574
+ "type": ["object", "null"],
575
+ "description": "Section 14 - Eklenecek Dosyalar. Never null. Every row carries Reuse / Add new / Modify tag (Locked 16)."
576
+ },
577
+ "testPlan": { "type": ["object", "null"], "description": "Section 15 - Test Planı." },
578
+ "accessibility": {
579
+ "type": ["object", "null"],
580
+ "description": "Section 16 - Erişilebilirlik."
581
+ },
582
+ "securityAndPrivacy": {
583
+ "type": ["object", "null"],
584
+ "description": "Section 17 - Güvenlik ve Gizlilik."
585
+ },
586
+ "rolloutPlan": { "type": ["object", "null"], "description": "Section 18 - Yayılım Planı." },
587
+ "alternativesConsidered": {
588
+ "type": ["object", "null"],
589
+ "description": "Section 19 - Değerlendirilen Alternatifler. ADR format."
590
+ },
591
+ "risksAndOpenQuestions": {
592
+ "type": ["object", "null"],
593
+ "description": "Section 20 - Riskler ve Açık Sorular. Never null. Auto-populated from conventionRisks + reuse competitors."
594
+ },
595
+ "references": {
596
+ "type": ["object", "null"],
597
+ "description": "Section 21 - Referanslar. Never null. User-supplied input table at the bottom (Locked 21)."
598
+ },
599
+ "glossary": {
600
+ "type": ["object", "null"],
601
+ "description": "Section 22 - Sözlük (footer). Optional in Lite mode."
602
+ },
603
+ "changelog": {
604
+ "type": ["object", "null"],
605
+ "description": "Section 23 - Değişiklik Geçmişi (footer)."
606
+ }
519
607
  },
520
608
  "required": [
521
609
  "summary",
@@ -49,9 +49,19 @@
49
49
  "additionalProperties": false,
50
50
  "required": ["label"],
51
51
  "properties": {
52
- "label": { "type": "string", "description": "The choice text (≤ 60 chars; longer wraps awkwardly in AskUserQuestion)." },
53
- "recommended": { "type": "boolean", "default": false, "description": "True for the conventional default. At most one option per question carries this flag." },
54
- "reason": { "type": "string", "description": "One-line tradeoff hint - why this choice would or would not be the right pick." }
52
+ "label": {
53
+ "type": "string",
54
+ "description": "The choice text (≤ 60 chars; longer wraps awkwardly in AskUserQuestion)."
55
+ },
56
+ "recommended": {
57
+ "type": "boolean",
58
+ "default": false,
59
+ "description": "True for the conventional default. At most one option per question carries this flag."
60
+ },
61
+ "reason": {
62
+ "type": "string",
63
+ "description": "One-line tradeoff hint - why this choice would or would not be the right pick."
64
+ }
55
65
  }
56
66
  }
57
67
  },
@@ -67,8 +77,8 @@
67
77
  "description": "Filled in AFTER the orchestrator runs AskUserQuestion. Keys are question IDs (q1, q2, ...) and values are the selected label or free-text response. Empty during the agent's own emission.",
68
78
  "additionalProperties": { "type": "string" }
69
79
  },
70
- "tokens_in": { "type": "integer", "minimum": 0 },
71
- "tokens_out": { "type": "integer", "minimum": 0 },
80
+ "tokens_in": { "type": "integer", "minimum": 0 },
81
+ "tokens_out": { "type": "integer", "minimum": 0 },
72
82
  "duration_ms": { "type": "integer", "minimum": 0 }
73
83
  }
74
84
  }