@geraldmaron/construct 1.1.1 → 1.2.1

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 (426) hide show
  1. package/README.md +30 -19
  2. package/bin/construct +487 -87
  3. package/bin/construct-postinstall.mjs +30 -2
  4. package/examples/distribution/README.md +42 -0
  5. package/examples/distribution/manifest.json +53 -0
  6. package/examples/distribution/sources/adr.md +84 -0
  7. package/examples/distribution/sources/deck-one-pager.md +65 -0
  8. package/examples/distribution/sources/prd-platform.md +161 -0
  9. package/examples/distribution/sources/research-brief.md +80 -0
  10. package/examples/distribution/sources/rfc-platform.md +82 -0
  11. package/examples/distribution/sources/runbook.md +103 -0
  12. package/examples/distribution/sources/strategy.md +88 -0
  13. package/lib/adapters-sync.mjs +67 -0
  14. package/lib/artifact-gate-notice.mjs +38 -0
  15. package/lib/artifact-manifest.mjs +258 -0
  16. package/lib/artifact-release-gate.mjs +171 -0
  17. package/lib/artifact-reviewers.mjs +68 -0
  18. package/lib/artifact-type-from-path.mjs +79 -0
  19. package/lib/artifact-workflow.mjs +252 -0
  20. package/lib/audit-skills.mjs +4 -0
  21. package/lib/audit-specialists.mjs +285 -0
  22. package/lib/audit-trail.mjs +1 -1
  23. package/lib/auto-docs.mjs +90 -19
  24. package/lib/beads/drift.mjs +27 -6
  25. package/lib/beads-client.mjs +49 -121
  26. package/lib/beads-optimistic.mjs +5 -12
  27. package/lib/brand-fonts.mjs +93 -0
  28. package/lib/brand-prose.mjs +214 -0
  29. package/lib/brand-tokens.mjs +92 -0
  30. package/lib/bridges/copilot-proxy.mjs +13 -26
  31. package/lib/capability-ledger.mjs +156 -0
  32. package/lib/certification/artifact-fixtures.mjs +132 -0
  33. package/lib/certification/artifact-gates.mjs +63 -0
  34. package/lib/certification/artifact-provenance.mjs +97 -0
  35. package/lib/certification/canonical-scenarios.mjs +78 -0
  36. package/lib/certification/cli.mjs +191 -0
  37. package/lib/certification/dashboard-api.mjs +71 -0
  38. package/lib/certification/demo-parity.mjs +116 -0
  39. package/lib/certification/document-io-fixtures.mjs +246 -0
  40. package/lib/certification/document-workflow.mjs +97 -0
  41. package/lib/certification/eval-bridge.mjs +77 -0
  42. package/lib/certification/model-routing.mjs +149 -0
  43. package/lib/certification/prompt-budget.mjs +119 -0
  44. package/lib/certification/rc-gate.mjs +206 -0
  45. package/lib/certification/real-llm-scenarios.mjs +303 -0
  46. package/lib/certification/role-cards.mjs +113 -0
  47. package/lib/certification/role-overlays.mjs +117 -0
  48. package/lib/certification/run.mjs +122 -0
  49. package/lib/certification/runner.mjs +323 -0
  50. package/lib/certification/scenarios.mjs +51 -0
  51. package/lib/certification/skill-inventory.mjs +289 -0
  52. package/lib/certification/skill-scenarios.mjs +147 -0
  53. package/lib/certification/specialist-contracts.mjs +85 -0
  54. package/lib/certification/specialist-scenarios.mjs +175 -0
  55. package/lib/certification/stale-impact.mjs +146 -0
  56. package/lib/certification/status.mjs +252 -0
  57. package/lib/certification/store.mjs +77 -0
  58. package/lib/chat/cli.mjs +333 -0
  59. package/lib/chat/command-suggest.mjs +161 -0
  60. package/lib/chat/commands.mjs +215 -0
  61. package/lib/chat/config.mjs +142 -0
  62. package/lib/chat/context-compactor.mjs +250 -0
  63. package/lib/chat/context-continuation.mjs +253 -0
  64. package/lib/chat/continuation-source.mjs +58 -0
  65. package/lib/chat/demo-guide.mjs +61 -0
  66. package/lib/chat/design-tokens.mjs +91 -0
  67. package/lib/chat/desktop-binary.mjs +79 -0
  68. package/lib/chat/desktop-build.mjs +130 -0
  69. package/lib/chat/desktop-launcher.mjs +133 -0
  70. package/lib/chat/evidence.mjs +145 -0
  71. package/lib/chat/export.mjs +74 -0
  72. package/lib/chat/harness/driver.mjs +91 -0
  73. package/lib/chat/list-picker.mjs +112 -0
  74. package/lib/chat/model-picker.mjs +356 -0
  75. package/lib/chat/openrouter-fallback.mjs +151 -0
  76. package/lib/chat/permission-prompt.mjs +33 -0
  77. package/lib/chat/picker-catalog.mjs +45 -0
  78. package/lib/chat/policy-telemetry.mjs +34 -0
  79. package/lib/chat/present.mjs +246 -0
  80. package/lib/chat/session-context.mjs +39 -0
  81. package/lib/chat/session-persist.mjs +73 -0
  82. package/lib/chat/session-restore.mjs +71 -0
  83. package/lib/chat/session-settings.mjs +53 -0
  84. package/lib/chat/system-prompt.mjs +52 -0
  85. package/lib/chat/transparency.mjs +93 -0
  86. package/lib/chat/tui/color-scheme.mjs +42 -0
  87. package/lib/chat/tui/markdown.mjs +123 -0
  88. package/lib/chat/tui/presentation.mjs +100 -0
  89. package/lib/chat/tui/render.mjs +500 -0
  90. package/lib/chat/tui/turn-block.mjs +284 -0
  91. package/lib/chat/tui/turn-present.mjs +18 -0
  92. package/lib/chat/tui/turn-state.mjs +88 -0
  93. package/lib/chat/tui/usage.mjs +122 -0
  94. package/lib/chat/web-commands.mjs +146 -0
  95. package/lib/chat/web-launcher.mjs +63 -0
  96. package/lib/chat/web-picker-keys.mjs +46 -0
  97. package/lib/chat/web-session.mjs +159 -0
  98. package/lib/cli-commands.mjs +146 -15
  99. package/lib/cli-service-inventory.mjs +42 -0
  100. package/lib/comment-lint.mjs +6 -4
  101. package/lib/config/intake-policy.mjs +209 -0
  102. package/lib/config/project-config.mjs +11 -2
  103. package/lib/config/schema.mjs +86 -6
  104. package/lib/config/source-targets.mjs +311 -0
  105. package/lib/contract-schemas/decision.json +50 -0
  106. package/lib/contract-schemas/implementation.json +51 -0
  107. package/lib/contract-schemas/review-report.json +32 -0
  108. package/lib/contract-schemas/test-report.json +43 -0
  109. package/lib/contracts/construct-handoff.mjs +60 -0
  110. package/lib/contracts/validate.mjs +32 -3
  111. package/lib/contracts/violation-log.mjs +58 -5
  112. package/lib/dashboard-demo.mjs +71 -0
  113. package/lib/dashboard-static.mjs +19 -5
  114. package/lib/decisions/registry.mjs +5 -3
  115. package/lib/deck-export-pptx.mjs +1152 -0
  116. package/lib/demo-recording.mjs +142 -0
  117. package/lib/demo-script.mjs +114 -0
  118. package/lib/demo-surface.mjs +249 -0
  119. package/lib/demo.mjs +598 -140
  120. package/lib/diagram-export.mjs +192 -0
  121. package/lib/diagram.mjs +13 -11
  122. package/lib/docs-verify.mjs +25 -7
  123. package/lib/doctor/index.mjs +3 -1
  124. package/lib/doctor/project-adapters.mjs +44 -0
  125. package/lib/doctor/source-checkout.mjs +16 -0
  126. package/lib/doctor/watchers/cx-budget.mjs +98 -0
  127. package/lib/doctor/watchers/graph-staleness.mjs +52 -0
  128. package/lib/doctor/watchers/process-pressure.mjs +4 -3
  129. package/lib/document-export.mjs +384 -38
  130. package/lib/document-extract.mjs +44 -4
  131. package/lib/document-ingest.mjs +29 -20
  132. package/lib/embed/auto-sources.mjs +44 -0
  133. package/lib/embed/cli.mjs +4 -3
  134. package/lib/embed/daemon.mjs +18 -46
  135. package/lib/embed/demand-fetch.mjs +50 -19
  136. package/lib/embed/inbox.mjs +6 -10
  137. package/lib/embed/worker.mjs +4 -3
  138. package/lib/embedded-contract/index.mjs +11 -0
  139. package/lib/embedded-contract/model-resolve.mjs +10 -9
  140. package/lib/env-config.mjs +26 -0
  141. package/lib/evals/dataset.mjs +137 -0
  142. package/lib/evals/gates.mjs +175 -0
  143. package/lib/export-branding.mjs +32 -0
  144. package/lib/graph/build-co-change.mjs +54 -0
  145. package/lib/graph/build-from-registry.mjs +136 -0
  146. package/lib/graph/build-import-graph.mjs +153 -0
  147. package/lib/graph/cli.mjs +110 -0
  148. package/lib/graph/impact-cli.mjs +89 -0
  149. package/lib/graph/impact.mjs +108 -0
  150. package/lib/graph/staleness.mjs +44 -0
  151. package/lib/graph/store.mjs +172 -0
  152. package/lib/health-check.mjs +90 -76
  153. package/lib/hooks/artifact-release-gate.mjs +43 -0
  154. package/lib/hooks/brand-prose-lint.mjs +38 -0
  155. package/lib/hooks/graph-impact-advisory.mjs +62 -0
  156. package/lib/hooks/session-optimize.mjs +84 -207
  157. package/lib/hooks/session-start.mjs +18 -16
  158. package/lib/host-disposition.mjs +7 -0
  159. package/lib/improvement/cli.mjs +189 -0
  160. package/lib/improvement/controller.mjs +137 -0
  161. package/lib/improvement/proposal.mjs +120 -0
  162. package/lib/improvement/specialist-loop.mjs +192 -0
  163. package/lib/improvement/store.mjs +89 -0
  164. package/lib/improvement/surface.mjs +219 -0
  165. package/lib/ingest-tooling.mjs +97 -0
  166. package/lib/init/doc-lanes.mjs +165 -0
  167. package/lib/init-docs.mjs +31 -178
  168. package/lib/init-unified.mjs +50 -119
  169. package/lib/init-update-guide.mjs +102 -0
  170. package/lib/init-update.mjs +32 -1
  171. package/lib/init.mjs +8 -0
  172. package/lib/install/desktop-binary-download.mjs +85 -0
  173. package/lib/install/legacy-global-cleanup.mjs +189 -0
  174. package/lib/intake/constants.mjs +29 -0
  175. package/lib/intake/daemon.mjs +2 -0
  176. package/lib/intake/git-queue.mjs +9 -8
  177. package/lib/intake/intake-config.mjs +52 -105
  178. package/lib/intake/legacy-paths.mjs +5 -0
  179. package/lib/intake/queue.mjs +2 -1
  180. package/lib/intake/session-prelude.mjs +90 -1
  181. package/lib/libreoffice-export.mjs +97 -0
  182. package/lib/logging/rotate.mjs +9 -0
  183. package/lib/maintenance/docker-reclaim.mjs +206 -0
  184. package/lib/mcp/external-schema-cost.mjs +74 -0
  185. package/lib/mcp/server.mjs +103 -10
  186. package/lib/mcp/stdio-mcp-probe.mjs +188 -0
  187. package/lib/mcp/tool-budget.mjs +55 -4
  188. package/lib/mcp/tools/document.mjs +18 -4
  189. package/lib/mcp/tools/embedded-contract.mjs +14 -0
  190. package/lib/mcp/tools/skills.mjs +32 -3
  191. package/lib/mcp/tools/workflow.mjs +13 -1
  192. package/lib/model-free-selector.mjs +18 -0
  193. package/lib/model-registry.mjs +13 -229
  194. package/lib/model-router.mjs +373 -92
  195. package/lib/models/behavior-matrix.mjs +289 -0
  196. package/lib/models/catalog.mjs +209 -0
  197. package/lib/models/execution-capability-profile.mjs +196 -0
  198. package/lib/models/execution-policy.mjs +307 -0
  199. package/lib/models/provider-poll.mjs +383 -0
  200. package/lib/npm-spawn-env.mjs +17 -0
  201. package/lib/ollama/installed-models.mjs +129 -0
  202. package/lib/oracle/actions.mjs +187 -0
  203. package/lib/oracle/artifact-gate.mjs +99 -0
  204. package/lib/oracle/cli.mjs +204 -0
  205. package/lib/oracle/daemon-entry.mjs +14 -0
  206. package/lib/oracle/dispatch.mjs +81 -0
  207. package/lib/oracle/execute.mjs +143 -0
  208. package/lib/oracle/gaps.mjs +76 -0
  209. package/lib/oracle/index.mjs +84 -0
  210. package/lib/oracle/issues.mjs +164 -0
  211. package/lib/oracle/org-graph.mjs +170 -0
  212. package/lib/oracle/policy.mjs +80 -0
  213. package/lib/oracle/read-model.mjs +398 -0
  214. package/lib/oracle/reconcile.mjs +191 -0
  215. package/lib/oracle/routing.mjs +89 -0
  216. package/lib/oracle/synthesize.mjs +384 -0
  217. package/lib/oracle/verdicts.mjs +51 -0
  218. package/lib/orchestration/worker.mjs +88 -27
  219. package/lib/orchestration-policy.mjs +50 -0
  220. package/lib/parity.mjs +96 -2
  221. package/lib/playwright-demo.mjs +254 -0
  222. package/lib/project-init-shared.mjs +4 -1
  223. package/lib/prompt-composer.js +7 -3
  224. package/lib/prompt-validation-contract.mjs +24 -0
  225. package/lib/provider-capabilities.js +57 -11
  226. package/lib/providers/contract/adapters/confluence/index.mjs +181 -0
  227. package/lib/providers/contract/adapters/git/index.mjs +115 -0
  228. package/lib/providers/contract/adapters/github/index.mjs +166 -0
  229. package/lib/providers/contract/adapters/jira/index.mjs +187 -0
  230. package/lib/providers/contract/adapters/slack/index.mjs +175 -0
  231. package/lib/providers/contract/contract-tests.mjs +57 -0
  232. package/lib/providers/contract/errors.mjs +48 -0
  233. package/lib/providers/contract/interface.mjs +50 -0
  234. package/lib/providers/contract/registry.mjs +102 -0
  235. package/lib/providers/copilot-auth.mjs +297 -0
  236. package/lib/providers/credential-bootstrap.mjs +178 -0
  237. package/lib/providers/credential-catalog.mjs +46 -0
  238. package/lib/providers/credential-sources.mjs +63 -0
  239. package/lib/providers/creds.mjs +5 -2
  240. package/lib/providers/op-run.mjs +59 -0
  241. package/lib/providers/secret-resolver.mjs +159 -0
  242. package/lib/publish-template.mjs +163 -0
  243. package/lib/publish-tooling.mjs +119 -0
  244. package/lib/publish.mjs +305 -0
  245. package/lib/registry/cli.mjs +82 -0
  246. package/lib/registry/consolidation.mjs +147 -0
  247. package/lib/registry/generate-docs.mjs +75 -0
  248. package/lib/registry/skill-verification.mjs +57 -0
  249. package/lib/registry/surface-map.mjs +76 -0
  250. package/lib/registry/validate.mjs +135 -0
  251. package/lib/resources/budget.mjs +82 -0
  252. package/lib/resources/process-budget.mjs +45 -0
  253. package/lib/rules-delivery.mjs +9 -2
  254. package/lib/rules-read.mjs +26 -0
  255. package/lib/runtime-env.mjs +23 -0
  256. package/lib/runtime-pressure.mjs +51 -7
  257. package/lib/schema-infer.mjs +13 -2
  258. package/lib/server/chat-loop.mjs +622 -0
  259. package/lib/server/demo-preview.mjs +63 -0
  260. package/lib/server/index.mjs +259 -9
  261. package/lib/server/rate-limit.mjs +5 -3
  262. package/lib/server/webhook.mjs +3 -2
  263. package/lib/service-manager.mjs +60 -8
  264. package/lib/setup.mjs +70 -7
  265. package/lib/specialists/prompt-schema.mjs +19 -10
  266. package/lib/specialists/roster.mjs +43 -0
  267. package/lib/specialists/scaffold.mjs +56 -0
  268. package/lib/storage/backend.mjs +6 -6
  269. package/lib/storage/hybrid-query.mjs +7 -4
  270. package/lib/storage/state-source.mjs +5 -5
  271. package/lib/storage/sync.mjs +2 -3
  272. package/lib/telemetry/rule-calls.mjs +52 -0
  273. package/lib/template-registry.mjs +2 -2
  274. package/lib/templates/visual-requirements.mjs +27 -51
  275. package/lib/test-corpus-inventory.mjs +313 -0
  276. package/lib/uninstall/uninstall.mjs +19 -7
  277. package/lib/update.mjs +12 -0
  278. package/lib/upgrade.mjs +14 -0
  279. package/lib/wireframe.mjs +20 -14
  280. package/lib/worker/run.mjs +17 -4
  281. package/lib/worker/trace.mjs +11 -3
  282. package/package.json +28 -14
  283. package/personas/construct.md +2 -2
  284. package/platforms/claude/settings.template.json +36 -0
  285. package/rules/common/patterns.md +1 -1
  286. package/rules/common/release-gates.md +4 -3
  287. package/scripts/sync-specialists.mjs +41 -28
  288. package/skills/devops/data-engineering.md +1 -1
  289. package/skills/docs/adr-workflow.md +1 -0
  290. package/skills/docs/backlog-proposal-workflow.md +1 -0
  291. package/skills/docs/codebase-research-workflow.md +40 -0
  292. package/skills/docs/customer-profile-workflow.md +1 -0
  293. package/skills/docs/document-ingest-workflow.md +1 -0
  294. package/skills/docs/evidence-ingest-workflow.md +1 -0
  295. package/skills/docs/init-docs.md +2 -2
  296. package/skills/docs/init-project.md +7 -2
  297. package/skills/docs/prd-workflow.md +24 -1
  298. package/skills/docs/prfaq-workflow.md +1 -0
  299. package/skills/docs/product-intelligence-workflow.md +1 -0
  300. package/skills/docs/product-signal-workflow.md +1 -0
  301. package/skills/docs/research-workflow.md +54 -37
  302. package/skills/docs/runbook-workflow.md +1 -0
  303. package/skills/docs/strategy-workflow.md +1 -0
  304. package/skills/docs/user-research-workflow.md +40 -0
  305. package/skills/operating/orchestration-reference.md +1 -1
  306. package/skills/roles/architect.md +5 -0
  307. package/skills/roles/operator.docs.md +4 -0
  308. package/skills/routing.md +4 -2
  309. package/specialists/artifact-manifest.json +489 -0
  310. package/specialists/artifact-manifest.schema.json +83 -0
  311. package/specialists/audit-enrichments.json +454 -0
  312. package/specialists/contracts.json +37 -25
  313. package/specialists/prompts/_shared/validation-contract.md +26 -0
  314. package/specialists/prompts/cx-accessibility.md +21 -2
  315. package/specialists/prompts/cx-ai-engineer.md +24 -1
  316. package/specialists/prompts/cx-architect.md +4 -1
  317. package/specialists/prompts/cx-business-strategist.md +23 -2
  318. package/specialists/prompts/cx-data-analyst.md +22 -1
  319. package/specialists/prompts/cx-data-engineer.md +23 -2
  320. package/specialists/prompts/cx-debugger.md +21 -2
  321. package/specialists/prompts/cx-designer.md +26 -3
  322. package/specialists/prompts/cx-devil-advocate.md +19 -2
  323. package/specialists/prompts/cx-docs-keeper.md +28 -1
  324. package/specialists/prompts/cx-engineer.md +22 -1
  325. package/specialists/prompts/cx-evaluator.md +18 -1
  326. package/specialists/prompts/cx-explorer.md +21 -2
  327. package/specialists/prompts/cx-legal-compliance.md +21 -2
  328. package/specialists/prompts/cx-operations.md +21 -2
  329. package/specialists/prompts/cx-oracle.md +94 -0
  330. package/specialists/prompts/cx-orchestrator.md +20 -1
  331. package/specialists/prompts/cx-platform-engineer.md +25 -2
  332. package/specialists/prompts/cx-product-manager.md +32 -1
  333. package/specialists/prompts/cx-qa.md +24 -2
  334. package/specialists/prompts/cx-rd-lead.md +23 -2
  335. package/specialists/prompts/cx-release-manager.md +23 -2
  336. package/specialists/prompts/cx-researcher.md +22 -2
  337. package/specialists/prompts/cx-reviewer.md +18 -1
  338. package/specialists/prompts/cx-security.md +22 -2
  339. package/specialists/prompts/cx-sre.md +30 -3
  340. package/specialists/prompts/cx-test-automation.md +7 -1
  341. package/specialists/prompts/cx-trace-reviewer.md +22 -3
  342. package/specialists/prompts/cx-ux-researcher.md +21 -2
  343. package/specialists/registry.json +52 -173
  344. package/specialists/tone-profiles.json +42 -0
  345. package/templates/demos/playwright/demo-recording.config.mjs +47 -0
  346. package/templates/demos/recordings/agentic-platforms-prd.json +19 -0
  347. package/templates/demos/scripts/agentic-platforms-prd.json +44 -0
  348. package/templates/demos/specs/_helpers/scroll-artifact.ts +89 -0
  349. package/templates/demos/tapes/agentic-platforms-prd.tape +49 -0
  350. package/templates/demos/tapes/resource-guard-rails.tape +49 -0
  351. package/templates/demos/vhs/construct-cockpit.json +24 -0
  352. package/templates/distribution/construct-brand.typ +446 -0
  353. package/templates/distribution/construct-decision.typ +38 -0
  354. package/templates/distribution/construct-deck.html +95 -0
  355. package/templates/distribution/construct-pdf.typ +38 -0
  356. package/templates/distribution/construct-prd.typ +38 -0
  357. package/templates/distribution/construct-reference.docx +0 -0
  358. package/templates/distribution/construct-research.typ +38 -0
  359. package/templates/distribution/construct-web.html +92 -0
  360. package/templates/distribution/fonts/Geist-Bold.ttf +0 -0
  361. package/templates/distribution/fonts/Geist-Medium.ttf +0 -0
  362. package/templates/distribution/fonts/Geist-Regular.ttf +0 -0
  363. package/templates/distribution/fonts/Geist-SemiBold.ttf +0 -0
  364. package/templates/distribution/fonts/GeistMono-Medium.ttf +0 -0
  365. package/templates/distribution/fonts/GeistMono-Regular.ttf +0 -0
  366. package/templates/distribution/fonts/GeistMono-SemiBold.ttf +0 -0
  367. package/templates/distribution/fonts/IBMPlexMono-Regular.otf +0 -0
  368. package/templates/distribution/fonts/JetBrainsMono-Medium.ttf +0 -0
  369. package/templates/distribution/fonts/JetBrainsMono-Regular.ttf +0 -0
  370. package/templates/distribution/fonts/JetBrainsMono-SemiBold.ttf +0 -0
  371. package/templates/distribution/fonts/PlusJakartaSans-Bold.ttf +0 -0
  372. package/templates/distribution/fonts/PlusJakartaSans-Medium.ttf +0 -0
  373. package/templates/distribution/fonts/PlusJakartaSans-Regular.ttf +0 -0
  374. package/templates/distribution/fonts/PlusJakartaSans-SemiBold.ttf +0 -0
  375. package/templates/distribution/fonts/README.md +36 -0
  376. package/templates/distribution/fonts/SpaceGrotesk-Variable.ttf +0 -0
  377. package/templates/distribution/fonts/handwritten/Caveat.ttf +0 -0
  378. package/templates/distribution/fonts/legacy/IBMPlexMono-Regular.otf +0 -0
  379. package/templates/distribution/fonts/legacy/Inter-Medium.otf +0 -0
  380. package/templates/distribution/fonts/legacy/Inter-Regular.otf +0 -0
  381. package/templates/distribution/fonts/legacy/Inter-SemiBold.otf +0 -0
  382. package/templates/distribution/fonts/legacy/InterDisplay-SemiBold.otf +0 -0
  383. package/templates/distribution/fonts/legacy/SourceSerif4-Regular.otf +0 -0
  384. package/templates/distribution/fonts/legacy/SourceSerif4-Semibold.otf +0 -0
  385. package/templates/distribution/icons/activity.svg +15 -0
  386. package/templates/distribution/icons/alert-triangle.svg +17 -0
  387. package/templates/distribution/icons/book-open.svg +16 -0
  388. package/templates/distribution/icons/bot.svg +20 -0
  389. package/templates/distribution/icons/brain.svg +22 -0
  390. package/templates/distribution/icons/circle-check.svg +16 -0
  391. package/templates/distribution/icons/clipboard-check.svg +17 -0
  392. package/templates/distribution/icons/cpu.svg +28 -0
  393. package/templates/distribution/icons/database.svg +17 -0
  394. package/templates/distribution/icons/eye.svg +16 -0
  395. package/templates/distribution/icons/file-text.svg +19 -0
  396. package/templates/distribution/icons/gauge.svg +16 -0
  397. package/templates/distribution/icons/git-branch.svg +17 -0
  398. package/templates/distribution/icons/key.svg +17 -0
  399. package/templates/distribution/icons/layers.svg +17 -0
  400. package/templates/distribution/icons/list-checks.svg +19 -0
  401. package/templates/distribution/icons/lock.svg +16 -0
  402. package/templates/distribution/icons/message-square.svg +15 -0
  403. package/templates/distribution/icons/network.svg +19 -0
  404. package/templates/distribution/icons/route.svg +17 -0
  405. package/templates/distribution/icons/scale.svg +19 -0
  406. package/templates/distribution/icons/search.svg +16 -0
  407. package/templates/distribution/icons/send.svg +16 -0
  408. package/templates/distribution/icons/server.svg +18 -0
  409. package/templates/distribution/icons/shield-check.svg +16 -0
  410. package/templates/distribution/icons/users.svg +18 -0
  411. package/templates/distribution/icons/webhook.svg +17 -0
  412. package/templates/distribution/icons/workflow.svg +17 -0
  413. package/templates/distribution/icons/wrench.svg +15 -0
  414. package/templates/distribution/run.mjs +18 -1
  415. package/templates/docs/adr.md +7 -0
  416. package/templates/docs/construct_guide.md +8 -8
  417. package/templates/docs/customer-profile.md +4 -0
  418. package/templates/docs/one-pager.md +4 -0
  419. package/templates/docs/postmortem.md +31 -0
  420. package/templates/docs/prd-platform.md +19 -0
  421. package/templates/docs/prd.md +15 -0
  422. package/templates/docs/prfaq.md +7 -0
  423. package/templates/docs/qa-strategy.md +103 -0
  424. package/templates/docs/research-brief.md +8 -0
  425. package/templates/docs/rfc-platform.md +12 -0
  426. package/templates/docs/test-plan.md +7 -0
@@ -0,0 +1,18 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-server"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <rect width="20" height="8" x="2" y="2" rx="2" ry="2" />
15
+ <rect width="20" height="8" x="2" y="14" rx="2" ry="2" />
16
+ <line x1="6" x2="6.01" y1="6" y2="6" />
17
+ <line x1="6" x2="6.01" y1="18" y2="18" />
18
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-shield-check"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
15
+ <path d="m9 12 2 2 4-4" />
16
+ </svg>
@@ -0,0 +1,18 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-users"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
15
+ <path d="M16 3.128a4 4 0 0 1 0 7.744" />
16
+ <path d="M22 21v-2a4 4 0 0 0-3-3.87" />
17
+ <circle cx="9" cy="7" r="4" />
18
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-webhook"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2" />
15
+ <path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06" />
16
+ <path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8" />
17
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-workflow"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <rect width="8" height="8" x="3" y="3" rx="2" />
15
+ <path d="M7 11v4a2 2 0 0 0 2 2h4" />
16
+ <rect width="8" height="8" x="13" y="13" rx="2" />
17
+ </svg>
@@ -0,0 +1,15 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-wrench"
4
+ xmlns="http://www.w3.org/2000/svg"
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 24 24"
8
+ fill="none"
9
+ stroke="#0a0c10"
10
+ stroke-width="2"
11
+ stroke-linecap="round"
12
+ stroke-linejoin="round"
13
+ >
14
+ <path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z" />
15
+ </svg>
@@ -58,6 +58,19 @@ import { dirname, join, resolve } from 'node:path';
58
58
  import { fileURLToPath } from 'node:url';
59
59
 
60
60
  const HERE = dirname(fileURLToPath(import.meta.url));
61
+
62
+ // npm 11.2+ warns on unknown npm_config_* keys. Cursor injects devdir for
63
+ // node-gyp cache routing; strip before npm spawns (inline — no repo imports).
64
+
65
+ function sanitizeNpmSpawnEnv(env = process.env) {
66
+ const next = { ...env };
67
+ for (const key of Object.keys(next)) {
68
+ if (/^npm_config_devdir$/i.test(key) || key === 'NPM_CONFIG_DEVDIR') {
69
+ delete next[key];
70
+ }
71
+ }
72
+ return next;
73
+ }
61
74
  const PROJECT_ROOT = resolve(HERE, '..');
62
75
  const VERSION_FILE = join(HERE, 'version');
63
76
  const CACHE_BIN_DIR = join(HERE, 'cache', 'bin');
@@ -138,7 +151,11 @@ function tryNpx(version) {
138
151
  // so that failure can never fall through to the global/cache/Docker resolvers below.
139
152
  // Confirm the spec resolves first; on a miss, defer instead of dead-ending the chain.
140
153
 
141
- const probe = spawnSync('npm', ['view', spec, 'version'], { stdio: 'ignore', timeout: 8000 });
154
+ const probe = spawnSync('npm', ['view', spec, 'version'], {
155
+ stdio: 'ignore',
156
+ timeout: 8000,
157
+ env: sanitizeNpmSpawnEnv(process.env),
158
+ });
142
159
  if (probe.status !== 0) return false;
143
160
  runForeground('npx', ['-p', spec, '--', 'construct', ...process.argv.slice(2)]);
144
161
  return true;
@@ -37,6 +37,13 @@ Should reference:
37
37
  ## Context
38
38
  <!-- Forces at play beyond the core problem. What else is true today that bounds the decision space? Prior ADRs, architectural constraints, external commitments. -->
39
39
 
40
+ ```mermaid
41
+ flowchart LR
42
+ A[Current state] --> B[Decision]
43
+ B --> C[Target state]
44
+ D[Rejected alt] -.-> B
45
+ ```
46
+
40
47
  ## Decision
41
48
  <!-- The position taken, in one or two sentences. State it as a commitment, not a proposal. -->
42
49
 
@@ -35,8 +35,8 @@ Generated tooling (`.construct/`, `.claude/`, `.cx/`, `plan.md`) is gitignored;
35
35
 
36
36
  Three intake paths, ordered by formality:
37
37
 
38
- 1. **`.cx/inbox/`** (drop a file here (URL, screenshot, paste, anything). The embed daemon watches the directory; when a file lands, it ingests it into the local knowledge base within a second or two and writes a triage packet to `.cx/intake/pending/` describing the new content, its R&D classification (intake type, stage, owner persona, recommended chain), its suggested docs lane, and existing docs that overlap. The agent surfaces pending intake at the next session start and you can ask it to process them) propose updates to existing PRDs/RFCs/ADRs or scaffold new ones: based on the prepared context.
39
- 2. **`docs/intake/`**: for proper intake batches (research notes, evidence from a meeting, raw source material). Has a template. Survives in git history.
38
+ 1. **`.cx/inbox/`** drop a file here (URL, screenshot, paste, anything). The embed daemon watches the directory; when a file lands, it ingests it into the local knowledge base within a second or two and writes a triage packet to `.cx/intake/pending/` describing the new content, its classification (intake type, stage, owner persona, recommended chain), its suggested docs lane, and existing docs that overlap. The agent surfaces pending items at the next session start and you can ask it to process them.
39
+ 2. **`docs/intake/`** for proper intake batches (research notes, evidence from a meeting, raw source material). Has a template. Survives in git history.
40
40
  3. **`AGENTS.md`**: for rules and conventions you want the agent to follow every time. "We prefer functional components. Don't introduce new dependencies without flagging." Read at session start.
41
41
 
42
42
  For URLs or quick notes, the easiest path is to drop a file into `~/Downloads` and run:
@@ -111,13 +111,13 @@ All ports bind to `127.0.0.1` only; nothing is reachable from other machines on
111
111
  | `construct sync` | Regenerate platform adapters (Claude Code, OpenCode, Codex, Cursor) |
112
112
  | `construct dev` / `construct stop` | Start / stop local services |
113
113
  | `construct status` | Live runtime status (services, providers, daemons) |
114
- | `construct intake list / show / done / skip / reopen` | Drive the R&D intake queue produced from `.cx/inbox/` |
114
+ | `construct intake list / show / done / skip / reopen` | Drive the active profile's intake queue (label varies run `construct intake --help`) |
115
115
  | `construct graph from-intake <id>` | Generate a task graph from a triaged intake packet |
116
116
  | `construct drop` | Ingest the most recent downloaded file |
117
117
  | `construct search "..."` | Hybrid file + SQL + semantic search over project state |
118
118
  | `construct uninstall` | Interactive teardown: never touches Docker or your code |
119
119
 
120
- Full reference: <https://geraldmaron.github.io/construct/docs/reference/cli>
120
+ Full reference: <https://geraldmaron.github.io/construct/reference/cli>
121
121
 
122
122
  ## Updating Construct
123
123
 
@@ -134,13 +134,13 @@ construct doctor # most issues surface here with a fix hint
134
134
  construct stop && construct dev # restart local services
135
135
  ```
136
136
 
137
- Troubleshooting guide: <https://geraldmaron.github.io/construct/docs/operations/troubleshooting>
137
+ Troubleshooting guide: <https://geraldmaron.github.io/construct/runbooks/>
138
138
 
139
139
  ## Next steps
140
140
 
141
- - [Connect your editor](https://geraldmaron.github.io/construct/docs/start/connect-your-editor) if you haven't already.
142
- - [Run your first task](https://geraldmaron.github.io/construct/docs/start/first-task) to feel the flow.
143
- - Skim [the architecture](https://geraldmaron.github.io/construct/docs/concepts/architecture) when you have 10 minutes: it'll save you hours later.
141
+ - [Connect your editor](https://geraldmaron.github.io/construct/start/connect-your-editor) if you haven't already.
142
+ - [Run your first task](https://geraldmaron.github.io/construct/start/first-task) to feel the flow.
143
+ - Skim [the architecture](https://geraldmaron.github.io/construct/concepts/architecture) when you have 10 minutes: it'll save you hours later.
144
144
 
145
145
  If you'd rather have a teammate walk you through it, the persona itself can:
146
146
 
@@ -21,6 +21,10 @@ asks for cleanup. Keep facts tied to source evidence.
21
21
  ## Open asks
22
22
  <!-- Table: ask, first raised, times mentioned, source, linked issue, status. -->
23
23
 
24
+ | Ask | First raised | Status |
25
+ |---|---|---|
26
+ | {customer ask} | {YYYY-MM-DD} | open / blocked / done |
27
+
24
28
  ## Key contacts
25
29
  <!-- Roles and responsibilities. Avoid unnecessary personal data. -->
26
30
 
@@ -17,6 +17,10 @@
17
17
  ## Success measure
18
18
  <!-- The single metric that tells us this worked. Numeric, time-bound. -->
19
19
 
20
+ | Measure | Baseline | Target | By when |
21
+ |---|---|---|---|
22
+ | {metric} | {today} | {goal} | {YYYY-MM-DD} |
23
+
20
24
  ## Cost
21
25
  <!-- People, time, money. Rough order of magnitude. -->
22
26
 
@@ -0,0 +1,31 @@
1
+ # Postmortem: {incident title}
2
+
3
+ - **Date**: {YYYY-MM-DD}
4
+ - **Owner**: {name or on-call rotation}
5
+ - **Severity**: SEV-1 | SEV-2 | SEV-3
6
+
7
+ <!-- Same structure as incident-report.md. Blameless tone required. -->
8
+
9
+ ## Summary
10
+
11
+ ## Severity rationale
12
+
13
+ ## Impact
14
+
15
+ ## Timeline
16
+
17
+ | Time (UTC) | Event |
18
+ |---|---|
19
+ | {HH:MM} | {what happened} |
20
+
21
+ ## Trigger
22
+
23
+ ## Root cause
24
+
25
+ ## Contributing factors
26
+
27
+ ## Action items
28
+
29
+ | Priority | Action | Owner | Due |
30
+ |---|---|---|---|
31
+ | P0 | {corrective action} | {name} | {date} |
@@ -25,6 +25,15 @@ operator. "Developer" is too broad.
25
25
  ## Goals and non-goals
26
26
  <!-- Goals: what success looks like for the consumers. Non-goals: explicitly scoped out. -->
27
27
 
28
+ ## Platform flow
29
+
30
+ ```mermaid
31
+ flowchart TD
32
+ A[Consumer] --> B[Platform API]
33
+ B --> C[Core service]
34
+ C --> D[Response / event]
35
+ ```
36
+
28
37
  ## API and interface contract
29
38
  <!-- The surface being defined: endpoints, schemas, SDK methods, event payloads, config shapes, permission models. Number each contract item (C-1, C-2, …). -->
30
39
 
@@ -49,6 +58,16 @@ operator. "Developer" is too broad.
49
58
  ## Success metrics
50
59
  <!-- How we know this worked: adoption, error rate, latency, support ticket reduction. Leading vs. lagging. -->
51
60
 
61
+ | Metric | Baseline | Target |
62
+ |---|---|---|
63
+ | {name} | {current} | {goal} |
64
+
65
+ ## Risks and mitigations
66
+
67
+ | Risk | Likelihood | Impact | Mitigation |
68
+ |---|---|---|---|
69
+ | {risk} | low / med / high | low / med / high | {mitigation} |
70
+
52
71
  ## Consumer impact
53
72
  <!-- What changes for existing consumers. What breaks, what degrades, what stays the same. Link to migration guide if needed. -->
54
73
 
@@ -75,6 +75,17 @@ A reader should be able to compare the current state (Background) to this
75
75
  section and see the delta in plain language.
76
76
  -->
77
77
 
78
+ ## User flow
79
+
80
+ ```mermaid
81
+ flowchart TD
82
+ A[User starts] --> B{Current friction?}
83
+ B -->|Yes| C[Proposed path]
84
+ B -->|No| D[Existing path]
85
+ C --> E[Success outcome]
86
+ D --> E
87
+ ```
88
+
78
89
  ## In scope and out of scope
79
90
 
80
91
  | | Description |
@@ -163,6 +174,10 @@ How we will know this worked in production over time, beyond the per-requirement
163
174
  acceptance criteria. Leading vs. lagging. Avoid vanity metrics.
164
175
  -->
165
176
 
177
+ | Metric | Baseline | Target |
178
+ |---|---|---|
179
+ | {name} | {current} | {goal} |
180
+
166
181
  ## Constraints
167
182
  <!--
168
183
  Budget, timeline, platform, team, legal, technical debt: anything that shapes
@@ -15,6 +15,13 @@ or directly from evidence, but it must not invent customer demand.
15
15
  ## Problem statement
16
16
  <!-- Two or three paragraphs grounded in evidence. Explain the customer problem, why now, and what is missing today. -->
17
17
 
18
+ ```mermaid
19
+ flowchart LR
20
+ A[Customer need] --> B[Current workaround]
21
+ B --> C[Proposed capability]
22
+ C --> D[Outcome after launch]
23
+ ```
24
+
18
25
  ## Press release
19
26
  <!-- Write as if the capability has shipped. Focus on customer outcome, not implementation. Include a spokesperson quote and a customer quote — mark a hypothetical quote as such; never invent an attributed one (rules/common/no-fabrication.md). -->
20
27
 
@@ -0,0 +1,103 @@
1
+ # QA Strategy: {feature or system name}
2
+
3
+ - **Date**: {YYYY-MM-DD}
4
+ - **Owner**: {name or role}
5
+ - **Status**: draft | in-review | approved | executed
6
+ - **Related**: {PRD / ADR paths or none}
7
+
8
+ <!--
9
+ Use this when a feature, migration, or system change needs a deliberate
10
+ verification strategy before it ships. The plan is the contract between
11
+ what was specified and what will be proven; every scenario below must
12
+ trace to a requirement or an observed risk, never to guesswork.
13
+
14
+ Before drafting, read rules/common/framing.md and rules/common/no-fabrication.md.
15
+ Acceptance criteria must be binary pass/fail. If a criterion cannot be
16
+ checked without asking the author, it is not done. Cite the requirement
17
+ (FR/NFR id, ADR decision, ticket) each scenario verifies.
18
+ -->
19
+
20
+ ## Scope
21
+ <!--
22
+ What is under test and what is explicitly not. Name the components, surfaces,
23
+ or behaviors covered. The out-of-scope list protects reviewer attention and
24
+ makes coverage gaps deliberate rather than accidental.
25
+ -->
26
+
27
+ | | Description |
28
+ |---|---|
29
+ | **In scope** | <what this plan verifies> |
30
+ | **Out of scope** | <related behavior deliberately not tested here, and why> |
31
+
32
+ ## Test strategy
33
+ <!--
34
+ The levels of testing applied and why each is justified. Map levels to risk:
35
+ unit for logic, integration for contracts and boundaries, end-to-end for
36
+ user-visible flows, manual/exploratory for what automation cannot reach.
37
+ State what each level is responsible for so coverage gaps are visible.
38
+ -->
39
+
40
+ | Level | What it covers | Why it lives at this level |
41
+ |---|---|---|
42
+ | Unit | <logic, pure functions, edge cases> | <reason> |
43
+ | Integration | <contracts, boundaries, data access> | <reason> |
44
+ | End-to-end | <user-visible flows> | <reason> |
45
+ | Manual / exploratory | <what automation cannot reach> | <reason> |
46
+
47
+ ## Coverage
48
+
49
+ | Scenario | Type | Priority |
50
+ |---|---|---|
51
+ | TC-1 | unit / integration / e2e | P0 / P1 / P2 |
52
+ | TC-2 | <...> | <...> |
53
+
54
+ ## Key scenarios
55
+ <!--
56
+ The scenarios that prove the change works. Each scenario names the requirement
57
+ it verifies, the setup, the action, and the binary acceptance criterion. A
58
+ reviewer must be able to run or read the scenario and decide pass/fail without
59
+ asking the author.
60
+ -->
61
+
62
+ | ID | Scenario | Verifies | Acceptance (binary pass/fail) |
63
+ |---|---|---|---|
64
+ | TC-1 | <setup, action, expected result> | <FR/NFR id or risk> | <observable condition> |
65
+ | TC-2 | <...> | <...> | <...> |
66
+
67
+ ## Risks and edge cases
68
+ <!--
69
+ The failure modes and boundary conditions worth explicit attention: empty
70
+ inputs, concurrency, partial failure, large data, permission boundaries,
71
+ rollback. For each, state how the plan covers it or why the residual risk
72
+ is accepted.
73
+ -->
74
+
75
+ | Risk / edge case | Likelihood | Impact | Coverage or accepted reason |
76
+ |---|---|---|---|
77
+ | <condition> | low / med / high | low / med / high | <how it is tested, or why accepted> |
78
+
79
+ ## Environments and data
80
+ <!--
81
+ Where tests run and what data they use. Name the environments, fixtures,
82
+ seed data, and any external dependencies (sandboxes, stubs, recorded
83
+ responses). Flag data that must be synthetic or anonymized.
84
+ -->
85
+
86
+ ## Entry and exit criteria
87
+ <!--
88
+ Entry: what must be true before testing starts (build available, environment
89
+ provisioned, dependencies stubbed). Exit: what must be true to call testing
90
+ done (all blocking scenarios pass, known issues triaged, coverage threshold
91
+ met). Both are checklists a reviewer can verify.
92
+ -->
93
+
94
+ **Entry criteria**
95
+
96
+ - <condition that must hold before execution begins>
97
+
98
+ **Exit criteria**
99
+
100
+ - <condition that must hold to declare the plan executed>
101
+
102
+ ## References
103
+ <!-- PRD, ADR, RFC, related test plans, prior incidents. -->
@@ -1,5 +1,13 @@
1
1
  # Research Brief: {title}
2
2
 
3
+ Optional publish frontmatter (for `construct publish --strict`):
4
+
5
+ ```yaml
6
+ publish:
7
+ demo: my-tape-name
8
+ dashboardDemo: cockpit-tour
9
+ ```
10
+
3
11
  - **Date**: {YYYY-MM-DD}
4
12
  - **Author**: {name}
5
13
  - **Domain**: {ai-tools | developer-tools | security | market | cloud-api | regulatory | academic | other}
@@ -26,6 +26,18 @@ Use rfc.md instead for proposals that do not touch external contracts.
26
26
  ## Proposed contract
27
27
  <!-- The new interface in full. Schemas, endpoint signatures, payload shapes, permission rules, config fields. Be precise enough that a consumer can write against this spec without asking questions. -->
28
28
 
29
+ ```mermaid
30
+ sequenceDiagram
31
+ participant Consumer
32
+ participant Platform
33
+ participant Backend
34
+ Consumer->>Platform: contract call
35
+ Platform->>Backend: validate and execute
36
+ Backend-->>Platform: result
37
+ Platform-->>Consumer: response
38
+ Note over Platform,Backend: error path — validation failure returns typed error
39
+ ```
40
+
29
41
  ## Backwards compatibility strategy
30
42
  <!-- How existing consumers are supported during transition. Options: versioning, dual-write, feature flags, shim layer, deprecation window. State which and why. -->
31
43
 
@@ -44,6 +44,13 @@ State what each level is responsible for so coverage gaps are visible.
44
44
  | End-to-end | <user-visible flows> | <reason> |
45
45
  | Manual / exploratory | <what automation cannot reach> | <reason> |
46
46
 
47
+ ## Coverage
48
+
49
+ | Scenario | Type | Priority |
50
+ |---|---|---|
51
+ | TC-1 | unit / integration / e2e | P0 / P1 / P2 |
52
+ | TC-2 | <...> | <...> |
53
+
47
54
  ## Key scenarios
48
55
  <!--
49
56
  The scenarios that prove the change works. Each scenario names the requirement