@geraldmaron/construct 1.1.0 → 1.2.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 (425) hide show
  1. package/README.md +30 -18
  2. package/bin/construct +392 -91
  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 +112 -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/audit-skills.mjs +4 -0
  20. package/lib/audit-specialists.mjs +285 -0
  21. package/lib/audit-trail.mjs +77 -10
  22. package/lib/auto-docs.mjs +87 -18
  23. package/lib/beads/drift.mjs +27 -6
  24. package/lib/beads-client.mjs +49 -121
  25. package/lib/beads-optimistic.mjs +5 -12
  26. package/lib/brand-fonts.mjs +93 -0
  27. package/lib/brand-prose.mjs +214 -0
  28. package/lib/brand-tokens.mjs +92 -0
  29. package/lib/bridges/copilot-proxy.mjs +13 -26
  30. package/lib/capability-ledger.mjs +156 -0
  31. package/lib/certification/artifact-fixtures.mjs +132 -0
  32. package/lib/certification/artifact-gates.mjs +63 -0
  33. package/lib/certification/artifact-provenance.mjs +97 -0
  34. package/lib/certification/canonical-scenarios.mjs +78 -0
  35. package/lib/certification/cli.mjs +191 -0
  36. package/lib/certification/dashboard-api.mjs +71 -0
  37. package/lib/certification/demo-parity.mjs +116 -0
  38. package/lib/certification/document-io-fixtures.mjs +246 -0
  39. package/lib/certification/document-workflow.mjs +97 -0
  40. package/lib/certification/eval-bridge.mjs +77 -0
  41. package/lib/certification/model-routing.mjs +149 -0
  42. package/lib/certification/prompt-budget.mjs +119 -0
  43. package/lib/certification/rc-gate.mjs +206 -0
  44. package/lib/certification/real-llm-scenarios.mjs +303 -0
  45. package/lib/certification/role-cards.mjs +113 -0
  46. package/lib/certification/role-overlays.mjs +117 -0
  47. package/lib/certification/run.mjs +122 -0
  48. package/lib/certification/runner.mjs +323 -0
  49. package/lib/certification/scenarios.mjs +51 -0
  50. package/lib/certification/skill-inventory.mjs +289 -0
  51. package/lib/certification/skill-scenarios.mjs +147 -0
  52. package/lib/certification/specialist-contracts.mjs +85 -0
  53. package/lib/certification/specialist-scenarios.mjs +175 -0
  54. package/lib/certification/stale-impact.mjs +146 -0
  55. package/lib/certification/status.mjs +252 -0
  56. package/lib/certification/store.mjs +77 -0
  57. package/lib/chat/cli.mjs +333 -0
  58. package/lib/chat/command-suggest.mjs +161 -0
  59. package/lib/chat/commands.mjs +215 -0
  60. package/lib/chat/config.mjs +142 -0
  61. package/lib/chat/context-compactor.mjs +250 -0
  62. package/lib/chat/context-continuation.mjs +253 -0
  63. package/lib/chat/continuation-source.mjs +58 -0
  64. package/lib/chat/demo-guide.mjs +61 -0
  65. package/lib/chat/design-tokens.mjs +91 -0
  66. package/lib/chat/desktop-binary.mjs +79 -0
  67. package/lib/chat/desktop-build.mjs +130 -0
  68. package/lib/chat/desktop-launcher.mjs +133 -0
  69. package/lib/chat/evidence.mjs +145 -0
  70. package/lib/chat/export.mjs +74 -0
  71. package/lib/chat/harness/driver.mjs +91 -0
  72. package/lib/chat/list-picker.mjs +112 -0
  73. package/lib/chat/model-picker.mjs +356 -0
  74. package/lib/chat/openrouter-fallback.mjs +151 -0
  75. package/lib/chat/permission-prompt.mjs +33 -0
  76. package/lib/chat/picker-catalog.mjs +45 -0
  77. package/lib/chat/policy-telemetry.mjs +34 -0
  78. package/lib/chat/present.mjs +245 -0
  79. package/lib/chat/session-context.mjs +39 -0
  80. package/lib/chat/session-persist.mjs +73 -0
  81. package/lib/chat/session-restore.mjs +71 -0
  82. package/lib/chat/session-settings.mjs +53 -0
  83. package/lib/chat/system-prompt.mjs +52 -0
  84. package/lib/chat/transparency.mjs +93 -0
  85. package/lib/chat/tui/color-scheme.mjs +42 -0
  86. package/lib/chat/tui/markdown.mjs +123 -0
  87. package/lib/chat/tui/presentation.mjs +100 -0
  88. package/lib/chat/tui/render.mjs +500 -0
  89. package/lib/chat/tui/turn-block.mjs +284 -0
  90. package/lib/chat/tui/turn-present.mjs +18 -0
  91. package/lib/chat/tui/turn-state.mjs +88 -0
  92. package/lib/chat/tui/usage.mjs +122 -0
  93. package/lib/chat/web-commands.mjs +146 -0
  94. package/lib/chat/web-launcher.mjs +63 -0
  95. package/lib/chat/web-picker-keys.mjs +46 -0
  96. package/lib/chat/web-session.mjs +159 -0
  97. package/lib/cli-commands.mjs +232 -11
  98. package/lib/comment-lint.mjs +6 -4
  99. package/lib/config/schema.mjs +36 -5
  100. package/lib/contract-schemas/decision.json +50 -0
  101. package/lib/contract-schemas/implementation.json +51 -0
  102. package/lib/contract-schemas/review-report.json +32 -0
  103. package/lib/contract-schemas/test-report.json +43 -0
  104. package/lib/contracts/construct-handoff.mjs +60 -0
  105. package/lib/contracts/validate.mjs +32 -3
  106. package/lib/contracts/violation-log.mjs +58 -5
  107. package/lib/dashboard-demo.mjs +71 -0
  108. package/lib/dashboard-static.mjs +19 -5
  109. package/lib/decisions/registry.mjs +5 -3
  110. package/lib/deck-export-pptx.mjs +1152 -0
  111. package/lib/demo-recording.mjs +142 -0
  112. package/lib/demo-script.mjs +114 -0
  113. package/lib/demo-surface.mjs +249 -0
  114. package/lib/demo.mjs +703 -0
  115. package/lib/diagram-export.mjs +192 -0
  116. package/lib/diagram.mjs +302 -0
  117. package/lib/docs-verify.mjs +25 -7
  118. package/lib/doctor/index.mjs +4 -2
  119. package/lib/doctor/project-adapters.mjs +44 -0
  120. package/lib/doctor/watchers/cx-budget.mjs +98 -0
  121. package/lib/doctor/watchers/graph-staleness.mjs +52 -0
  122. package/lib/doctor/watchers/process-pressure.mjs +4 -3
  123. package/lib/doctor/watchers/service-health.mjs +1 -1
  124. package/lib/document-export.mjs +360 -36
  125. package/lib/document-extract.mjs +88 -0
  126. package/lib/document-ingest.mjs +32 -18
  127. package/lib/embed/cli.mjs +2 -2
  128. package/lib/embed/daemon.mjs +18 -46
  129. package/lib/embed/semantic.mjs +5 -2
  130. package/lib/embed/worker.mjs +2 -2
  131. package/lib/embedded-contract/model-resolve.mjs +10 -9
  132. package/lib/env-config.mjs +26 -0
  133. package/lib/evals/dataset.mjs +137 -0
  134. package/lib/evals/gates.mjs +175 -0
  135. package/lib/graph/build-co-change.mjs +54 -0
  136. package/lib/graph/build-from-registry.mjs +136 -0
  137. package/lib/graph/build-import-graph.mjs +153 -0
  138. package/lib/graph/cli.mjs +110 -0
  139. package/lib/graph/impact-cli.mjs +89 -0
  140. package/lib/graph/impact.mjs +108 -0
  141. package/lib/graph/staleness.mjs +44 -0
  142. package/lib/graph/store.mjs +172 -0
  143. package/lib/handoffs/cleanup.mjs +1 -1
  144. package/lib/health-check.mjs +90 -76
  145. package/lib/hooks/artifact-release-gate.mjs +43 -0
  146. package/lib/hooks/audit-trail.mjs +14 -28
  147. package/lib/hooks/brand-prose-lint.mjs +38 -0
  148. package/lib/hooks/graph-impact-advisory.mjs +62 -0
  149. package/lib/hooks/session-optimize.mjs +84 -207
  150. package/lib/hooks/session-start.mjs +4 -5
  151. package/lib/host-disposition.mjs +7 -0
  152. package/lib/improvement/cli.mjs +189 -0
  153. package/lib/improvement/controller.mjs +137 -0
  154. package/lib/improvement/proposal.mjs +120 -0
  155. package/lib/improvement/specialist-loop.mjs +192 -0
  156. package/lib/improvement/store.mjs +89 -0
  157. package/lib/improvement/surface.mjs +219 -0
  158. package/lib/ingest-tooling.mjs +97 -0
  159. package/lib/init/doc-lanes.mjs +165 -0
  160. package/lib/init-docs.mjs +31 -178
  161. package/lib/init-unified.mjs +27 -97
  162. package/lib/init-update-guide.mjs +102 -0
  163. package/lib/init-update.mjs +32 -1
  164. package/lib/init.mjs +8 -0
  165. package/lib/install/desktop-binary-download.mjs +85 -0
  166. package/lib/install/legacy-global-cleanup.mjs +189 -0
  167. package/lib/intake/daemon.mjs +2 -0
  168. package/lib/intake/git-queue.mjs +9 -8
  169. package/lib/intake/queue.mjs +2 -1
  170. package/lib/intake/session-prelude.mjs +90 -1
  171. package/lib/libreoffice-export.mjs +97 -0
  172. package/lib/logging/rotate.mjs +9 -0
  173. package/lib/maintenance/docker-reclaim.mjs +206 -0
  174. package/lib/mcp/external-schema-cost.mjs +74 -0
  175. package/lib/mcp/server.mjs +84 -9
  176. package/lib/mcp/stdio-mcp-probe.mjs +188 -0
  177. package/lib/mcp/tool-budget.mjs +55 -4
  178. package/lib/mcp/tools/document.mjs +18 -4
  179. package/lib/mcp/tools/skills.mjs +32 -3
  180. package/lib/mcp/tools/workflow.mjs +13 -1
  181. package/lib/model-free-selector.mjs +18 -0
  182. package/lib/model-registry.mjs +13 -229
  183. package/lib/model-router.mjs +425 -93
  184. package/lib/models/behavior-matrix.mjs +289 -0
  185. package/lib/models/catalog.mjs +209 -0
  186. package/lib/models/execution-capability-profile.mjs +196 -0
  187. package/lib/models/execution-policy.mjs +307 -0
  188. package/lib/models/provider-poll.mjs +383 -0
  189. package/lib/npm-spawn-env.mjs +17 -0
  190. package/lib/ollama/installed-models.mjs +129 -0
  191. package/lib/oracle/actions.mjs +187 -0
  192. package/lib/oracle/artifact-gate.mjs +99 -0
  193. package/lib/oracle/cli.mjs +204 -0
  194. package/lib/oracle/daemon-entry.mjs +14 -0
  195. package/lib/oracle/dispatch.mjs +81 -0
  196. package/lib/oracle/execute.mjs +143 -0
  197. package/lib/oracle/gaps.mjs +76 -0
  198. package/lib/oracle/index.mjs +84 -0
  199. package/lib/oracle/issues.mjs +164 -0
  200. package/lib/oracle/org-graph.mjs +170 -0
  201. package/lib/oracle/policy.mjs +80 -0
  202. package/lib/oracle/read-model.mjs +398 -0
  203. package/lib/oracle/reconcile.mjs +191 -0
  204. package/lib/oracle/routing.mjs +89 -0
  205. package/lib/oracle/synthesize.mjs +384 -0
  206. package/lib/oracle/verdicts.mjs +51 -0
  207. package/lib/orchestration/worker.mjs +88 -27
  208. package/lib/orchestration-policy.mjs +50 -0
  209. package/lib/parity.mjs +96 -2
  210. package/lib/persona-sections.mjs +66 -0
  211. package/lib/playwright-demo.mjs +252 -0
  212. package/lib/project-init-shared.mjs +4 -1
  213. package/lib/prompt-composer.js +9 -4
  214. package/lib/prompt-validation-contract.mjs +24 -0
  215. package/lib/provider-capabilities.js +57 -11
  216. package/lib/providers/contract/adapters/confluence/index.mjs +181 -0
  217. package/lib/providers/contract/adapters/git/index.mjs +115 -0
  218. package/lib/providers/contract/adapters/github/index.mjs +166 -0
  219. package/lib/providers/contract/adapters/jira/index.mjs +187 -0
  220. package/lib/providers/contract/adapters/slack/index.mjs +175 -0
  221. package/lib/providers/contract/contract-tests.mjs +57 -0
  222. package/lib/providers/contract/errors.mjs +48 -0
  223. package/lib/providers/contract/interface.mjs +50 -0
  224. package/lib/providers/contract/registry.mjs +102 -0
  225. package/lib/providers/copilot-auth.mjs +297 -0
  226. package/lib/providers/credential-bootstrap.mjs +178 -0
  227. package/lib/providers/credential-catalog.mjs +46 -0
  228. package/lib/providers/credential-sources.mjs +63 -0
  229. package/lib/providers/creds.mjs +5 -2
  230. package/lib/providers/op-run.mjs +59 -0
  231. package/lib/providers/secret-resolver.mjs +159 -0
  232. package/lib/publish-template.mjs +163 -0
  233. package/lib/publish-tooling.mjs +119 -0
  234. package/lib/publish.mjs +305 -0
  235. package/lib/registry/cli.mjs +82 -0
  236. package/lib/registry/consolidation.mjs +147 -0
  237. package/lib/registry/generate-docs.mjs +75 -0
  238. package/lib/registry/skill-verification.mjs +57 -0
  239. package/lib/registry/surface-map.mjs +76 -0
  240. package/lib/registry/validate.mjs +135 -0
  241. package/lib/resources/budget.mjs +82 -0
  242. package/lib/resources/process-budget.mjs +45 -0
  243. package/lib/rules-delivery.mjs +9 -2
  244. package/lib/rules-read.mjs +26 -0
  245. package/lib/runtime-env.mjs +23 -0
  246. package/lib/runtime-pressure.mjs +51 -7
  247. package/lib/schema-infer.mjs +13 -2
  248. package/lib/server/chat-loop.mjs +622 -0
  249. package/lib/server/demo-preview.mjs +63 -0
  250. package/lib/server/index.mjs +229 -8
  251. package/lib/server/langfuse-login.mjs +3 -3
  252. package/lib/service-manager.mjs +61 -9
  253. package/lib/session-store.mjs +1 -1
  254. package/lib/setup.mjs +102 -2
  255. package/lib/specialists/prompt-schema.mjs +19 -10
  256. package/lib/specialists/roster.mjs +43 -0
  257. package/lib/specialists/scaffold.mjs +56 -0
  258. package/lib/storage/backend.mjs +6 -6
  259. package/lib/storage/embeddings-local.mjs +6 -3
  260. package/lib/storage/file-lock.mjs +18 -11
  261. package/lib/storage/hybrid-query.mjs +7 -4
  262. package/lib/storage/state-source.mjs +5 -5
  263. package/lib/storage/sync.mjs +2 -3
  264. package/lib/telemetry/rule-calls.mjs +52 -0
  265. package/lib/template-registry.mjs +2 -2
  266. package/lib/templates/visual-requirements.mjs +27 -51
  267. package/lib/test-corpus-inventory.mjs +313 -0
  268. package/lib/uninstall/uninstall.mjs +19 -7
  269. package/lib/update.mjs +12 -0
  270. package/lib/upgrade.mjs +14 -0
  271. package/lib/wireframe.mjs +20 -14
  272. package/lib/worker/run.mjs +17 -4
  273. package/lib/worker/trace.mjs +11 -3
  274. package/package.json +29 -13
  275. package/personas/construct.md +13 -13
  276. package/platforms/claude/settings.template.json +36 -0
  277. package/rules/common/patterns.md +1 -1
  278. package/rules/common/release-gates.md +4 -3
  279. package/scripts/sync-specialists.mjs +187 -60
  280. package/skills/devops/data-engineering.md +1 -1
  281. package/skills/docs/adr-workflow.md +1 -0
  282. package/skills/docs/backlog-proposal-workflow.md +1 -0
  283. package/skills/docs/codebase-research-workflow.md +40 -0
  284. package/skills/docs/customer-profile-workflow.md +1 -0
  285. package/skills/docs/document-ingest-workflow.md +1 -0
  286. package/skills/docs/evidence-ingest-workflow.md +1 -0
  287. package/skills/docs/init-docs.md +2 -2
  288. package/skills/docs/init-project.md +8 -3
  289. package/skills/docs/prd-workflow.md +24 -1
  290. package/skills/docs/prfaq-workflow.md +1 -0
  291. package/skills/docs/product-intelligence-workflow.md +1 -0
  292. package/skills/docs/product-signal-workflow.md +1 -0
  293. package/skills/docs/research-workflow.md +54 -37
  294. package/skills/docs/runbook-workflow.md +1 -0
  295. package/skills/docs/strategy-workflow.md +1 -0
  296. package/skills/docs/user-research-workflow.md +40 -0
  297. package/skills/operating/orchestration-reference.md +1 -1
  298. package/skills/roles/architect.md +5 -0
  299. package/skills/roles/operator.docs.md +4 -0
  300. package/skills/routing.md +4 -2
  301. package/specialists/artifact-manifest.json +480 -0
  302. package/specialists/artifact-manifest.schema.json +53 -0
  303. package/specialists/audit-enrichments.json +454 -0
  304. package/specialists/contracts.json +37 -25
  305. package/specialists/prompts/_shared/validation-contract.md +26 -0
  306. package/specialists/prompts/cx-accessibility.md +21 -2
  307. package/specialists/prompts/cx-ai-engineer.md +24 -1
  308. package/specialists/prompts/cx-architect.md +4 -1
  309. package/specialists/prompts/cx-business-strategist.md +23 -2
  310. package/specialists/prompts/cx-data-analyst.md +22 -1
  311. package/specialists/prompts/cx-data-engineer.md +23 -2
  312. package/specialists/prompts/cx-debugger.md +21 -2
  313. package/specialists/prompts/cx-designer.md +26 -3
  314. package/specialists/prompts/cx-devil-advocate.md +19 -2
  315. package/specialists/prompts/cx-docs-keeper.md +28 -1
  316. package/specialists/prompts/cx-engineer.md +22 -1
  317. package/specialists/prompts/cx-evaluator.md +18 -1
  318. package/specialists/prompts/cx-explorer.md +21 -2
  319. package/specialists/prompts/cx-legal-compliance.md +21 -2
  320. package/specialists/prompts/cx-operations.md +21 -2
  321. package/specialists/prompts/cx-oracle.md +94 -0
  322. package/specialists/prompts/cx-orchestrator.md +20 -1
  323. package/specialists/prompts/cx-platform-engineer.md +25 -2
  324. package/specialists/prompts/cx-product-manager.md +32 -1
  325. package/specialists/prompts/cx-qa.md +24 -2
  326. package/specialists/prompts/cx-rd-lead.md +23 -2
  327. package/specialists/prompts/cx-release-manager.md +23 -2
  328. package/specialists/prompts/cx-researcher.md +22 -2
  329. package/specialists/prompts/cx-reviewer.md +18 -1
  330. package/specialists/prompts/cx-security.md +22 -2
  331. package/specialists/prompts/cx-sre.md +30 -3
  332. package/specialists/prompts/cx-test-automation.md +7 -1
  333. package/specialists/prompts/cx-trace-reviewer.md +22 -3
  334. package/specialists/prompts/cx-ux-researcher.md +21 -2
  335. package/specialists/registry.json +52 -173
  336. package/specialists/tone-profiles.json +42 -0
  337. package/templates/demos/playwright/demo-recording.config.mjs +47 -0
  338. package/templates/demos/recordings/agentic-platforms-prd.json +19 -0
  339. package/templates/demos/scripts/agentic-platforms-prd.json +44 -0
  340. package/templates/demos/specs/_helpers/scroll-artifact.ts +89 -0
  341. package/templates/demos/tapes/agentic-platforms-prd.tape +49 -0
  342. package/templates/demos/tapes/resource-guard-rails.tape +49 -0
  343. package/templates/demos/vhs/construct-cockpit.json +24 -0
  344. package/templates/distribution/construct-brand.typ +446 -0
  345. package/templates/distribution/construct-decision.typ +38 -0
  346. package/templates/distribution/construct-deck.html +95 -0
  347. package/templates/distribution/construct-pdf.typ +38 -0
  348. package/templates/distribution/construct-prd.typ +38 -0
  349. package/templates/distribution/construct-research.typ +38 -0
  350. package/templates/distribution/construct-web.html +92 -0
  351. package/templates/distribution/fonts/Geist-Bold.ttf +0 -0
  352. package/templates/distribution/fonts/Geist-Medium.ttf +0 -0
  353. package/templates/distribution/fonts/Geist-Regular.ttf +0 -0
  354. package/templates/distribution/fonts/Geist-SemiBold.ttf +0 -0
  355. package/templates/distribution/fonts/GeistMono-Medium.ttf +0 -0
  356. package/templates/distribution/fonts/GeistMono-Regular.ttf +0 -0
  357. package/templates/distribution/fonts/GeistMono-SemiBold.ttf +0 -0
  358. package/templates/distribution/fonts/IBMPlexMono-Regular.otf +0 -0
  359. package/templates/distribution/fonts/JetBrainsMono-Medium.ttf +0 -0
  360. package/templates/distribution/fonts/JetBrainsMono-Regular.ttf +0 -0
  361. package/templates/distribution/fonts/JetBrainsMono-SemiBold.ttf +0 -0
  362. package/templates/distribution/fonts/PlusJakartaSans-Bold.ttf +0 -0
  363. package/templates/distribution/fonts/PlusJakartaSans-Medium.ttf +0 -0
  364. package/templates/distribution/fonts/PlusJakartaSans-Regular.ttf +0 -0
  365. package/templates/distribution/fonts/PlusJakartaSans-SemiBold.ttf +0 -0
  366. package/templates/distribution/fonts/README.md +36 -0
  367. package/templates/distribution/fonts/SpaceGrotesk-Variable.ttf +0 -0
  368. package/templates/distribution/fonts/handwritten/Caveat.ttf +0 -0
  369. package/templates/distribution/fonts/legacy/IBMPlexMono-Regular.otf +0 -0
  370. package/templates/distribution/fonts/legacy/Inter-Medium.otf +0 -0
  371. package/templates/distribution/fonts/legacy/Inter-Regular.otf +0 -0
  372. package/templates/distribution/fonts/legacy/Inter-SemiBold.otf +0 -0
  373. package/templates/distribution/fonts/legacy/InterDisplay-SemiBold.otf +0 -0
  374. package/templates/distribution/fonts/legacy/SourceSerif4-Regular.otf +0 -0
  375. package/templates/distribution/fonts/legacy/SourceSerif4-Semibold.otf +0 -0
  376. package/templates/distribution/icons/activity.svg +15 -0
  377. package/templates/distribution/icons/alert-triangle.svg +17 -0
  378. package/templates/distribution/icons/book-open.svg +16 -0
  379. package/templates/distribution/icons/bot.svg +20 -0
  380. package/templates/distribution/icons/brain.svg +22 -0
  381. package/templates/distribution/icons/circle-check.svg +16 -0
  382. package/templates/distribution/icons/clipboard-check.svg +17 -0
  383. package/templates/distribution/icons/cpu.svg +28 -0
  384. package/templates/distribution/icons/database.svg +17 -0
  385. package/templates/distribution/icons/eye.svg +16 -0
  386. package/templates/distribution/icons/file-text.svg +19 -0
  387. package/templates/distribution/icons/gauge.svg +16 -0
  388. package/templates/distribution/icons/git-branch.svg +17 -0
  389. package/templates/distribution/icons/key.svg +17 -0
  390. package/templates/distribution/icons/layers.svg +17 -0
  391. package/templates/distribution/icons/list-checks.svg +19 -0
  392. package/templates/distribution/icons/lock.svg +16 -0
  393. package/templates/distribution/icons/message-square.svg +15 -0
  394. package/templates/distribution/icons/network.svg +19 -0
  395. package/templates/distribution/icons/route.svg +17 -0
  396. package/templates/distribution/icons/scale.svg +19 -0
  397. package/templates/distribution/icons/search.svg +16 -0
  398. package/templates/distribution/icons/send.svg +16 -0
  399. package/templates/distribution/icons/server.svg +18 -0
  400. package/templates/distribution/icons/shield-check.svg +16 -0
  401. package/templates/distribution/icons/users.svg +18 -0
  402. package/templates/distribution/icons/webhook.svg +17 -0
  403. package/templates/distribution/icons/workflow.svg +17 -0
  404. package/templates/distribution/icons/wrench.svg +15 -0
  405. package/templates/distribution/run.mjs +18 -1
  406. package/templates/docs/adr.md +7 -0
  407. package/templates/docs/construct_guide.md +10 -10
  408. package/templates/docs/customer-profile.md +4 -0
  409. package/templates/docs/one-pager.md +4 -0
  410. package/templates/docs/postmortem.md +31 -0
  411. package/templates/docs/prd-platform.md +19 -0
  412. package/templates/docs/prd.md +15 -0
  413. package/templates/docs/prfaq.md +7 -0
  414. package/templates/docs/qa-strategy.md +103 -0
  415. package/templates/docs/research-brief.md +8 -0
  416. package/templates/docs/rfc-platform.md +12 -0
  417. package/templates/docs/test-plan.md +7 -0
  418. package/lib/ingest/chunker.mjs +0 -94
  419. package/lib/ingest/pipeline.mjs +0 -53
  420. package/lib/ingest/store.mjs +0 -82
  421. package/lib/mode-commands.mjs +0 -122
  422. package/lib/policy/unified-gates.mjs +0 -96
  423. package/lib/profiles/validate-custom.mjs +0 -114
  424. package/lib/services/telemetry-backend.mjs +0 -177
  425. package/lib/storage/fusion.mjs +0 -95
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-git-branch"
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="M15 6a9 9 0 0 0-9 9V3" />
15
+ <circle cx="18" cy="6" r="3" />
16
+ <circle cx="6" cy="18" r="3" />
17
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-key"
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="m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" />
15
+ <path d="m21 2-9.6 9.6" />
16
+ <circle cx="7.5" cy="15.5" r="5.5" />
17
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-layers"
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="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z" />
15
+ <path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12" />
16
+ <path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17" />
17
+ </svg>
@@ -0,0 +1,19 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-list-checks"
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="M13 5h8" />
15
+ <path d="M13 12h8" />
16
+ <path d="M13 19h8" />
17
+ <path d="m3 17 2 2 4-4" />
18
+ <path d="m3 7 2 2 4-4" />
19
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-lock"
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="18" height="11" x="3" y="11" rx="2" ry="2" />
15
+ <path d="M7 11V7a5 5 0 0 1 10 0v4" />
16
+ </svg>
@@ -0,0 +1,15 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-message-square"
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="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z" />
15
+ </svg>
@@ -0,0 +1,19 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-network"
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 x="16" y="16" width="6" height="6" rx="1" />
15
+ <rect x="2" y="16" width="6" height="6" rx="1" />
16
+ <rect x="9" y="2" width="6" height="6" rx="1" />
17
+ <path d="M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3" />
18
+ <path d="M12 12V8" />
19
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-route"
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
+ <circle cx="6" cy="19" r="3" />
15
+ <path d="M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15" />
16
+ <circle cx="18" cy="5" r="3" />
17
+ </svg>
@@ -0,0 +1,19 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-scale"
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="M12 3v18" />
15
+ <path d="m19 8 3 8a5 5 0 0 1-6 0zV7" />
16
+ <path d="M3 7h1a17 17 0 0 0 8-2 17 17 0 0 0 8 2h1" />
17
+ <path d="m5 8 3 8a5 5 0 0 1-6 0zV7" />
18
+ <path d="M7 21h10" />
19
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-search"
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="m21 21-4.34-4.34" />
15
+ <circle cx="11" cy="11" r="8" />
16
+ </svg>
@@ -0,0 +1,16 @@
1
+ <!-- @license lucide-static v1.21.0 - ISC -->
2
+ <svg
3
+ class="lucide lucide-send"
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.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z" />
15
+ <path d="m21.854 2.147-10.94 10.939" />
16
+ </svg>
@@ -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:
@@ -109,15 +109,15 @@ All ports bind to `127.0.0.1` only; nothing is reachable from other machines on
109
109
  | `construct config [mode <m>]` | Show active deployment mode (solo / team / enterprise) or set a new one |
110
110
  | `construct doctor` | Health check across config, services, agents, hooks |
111
111
  | `construct sync` | Regenerate platform adapters (Claude Code, OpenCode, Codex, Cursor) |
112
- | `construct up` / `construct down` | Start / stop local services |
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
 
@@ -131,16 +131,16 @@ That refreshes the agents, hooks, and slash commands in `.claude/` and `.constru
131
131
 
132
132
  ```bash
133
133
  construct doctor # most issues surface here with a fix hint
134
- construct down && construct up # restart local services
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. -->