@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
@@ -25,7 +25,7 @@ Use the single-writer rule whenever multiple sessions are active: if two session
25
25
 
26
26
  ## Classify before acting <!-- cx:prio=1 -->
27
27
 
28
- Before any non-trivial request, CALL the code-backed orchestration policy via the `orchestration_policy` MCP tool with the request text and your `fileCount` / `moduleCount` / `introducesContract` estimate. Do not classify from memory. Honor the returned `track` and `specialists`. When `track` is `orchestrated` you may not author the deliverable yourself: emit the task-packet, dispatch the chain, return in Construct's voice after verdicts. Visual deliverables (wireframes, diagrams, decks) use real visual tools, not bullet prose.
28
+ Before any non-trivial request, CALL the code-backed orchestration policy via the `orchestration_policy` MCP tool with the request text and your `fileCount` / `moduleCount` / `introducesContract` estimate. Do not classify from memory. Honor the returned `track` and `specialists`. When `track` is orchestrated, dispatch the chain do not author the deliverable yourself.
29
29
 
30
30
  Tracks: immediate (act directly), focused (one bounded specialist), orchestrated (plan → challenge → build → validate, tracker-backed). cx-devil-advocate is mandatory whenever `riskFlags` include architecture, security, dataIntegrity, or ai.
31
31
 
@@ -36,7 +36,7 @@ Orchestrated dispatches emit a task-packet with `goal`, `intent`, `workCategory`
36
36
  `orchestration_policy` returns three artifacts; honor all three:
37
37
 
38
38
  1. **Gates**. `framingChallenge`, `externalResearch`, `docAuthoring`
39
- 2. **Contract chain**. typed handoffs from `specialists/contracts.json`. Call `agent_contract` MCP tool at handoff.
39
+ 2. **Contract chain**. typed handoffs from `specialists/contracts.json`. Call `agent_contract` with `handoffPacket` from `orchestration_policy`.
40
40
  3. **Specialist sequence**. dispatch plan with ordering/parallel markers.
41
41
 
42
42
  Before DONE: postconditions met · sources cited · framing logged · ADRs have Rejected alternatives.
@@ -165,6 +165,30 @@
165
165
  "id": "post:edit:comment-lint",
166
166
  "description": "Block edits that violate comment policy (banned patterns, missing required header). No bypass — repair the policy if it fires wrong."
167
167
  },
168
+ {
169
+ "matcher": "Write|Edit|MultiEdit",
170
+ "hooks": [
171
+ {
172
+ "type": "command",
173
+ "command": "node \"$HOME/.construct/lib/hooks/brand-prose-lint.mjs\"",
174
+ "timeout": 15
175
+ }
176
+ ],
177
+ "id": "post:edit:brand-prose-lint",
178
+ "description": "Block marketing voice, retired fonts, and Construct/cli naming drift in governed docs and templates."
179
+ },
180
+ {
181
+ "matcher": "Write|Edit|MultiEdit",
182
+ "hooks": [
183
+ {
184
+ "type": "command",
185
+ "command": "node \"$HOME/.construct/lib/hooks/artifact-release-gate.mjs\"",
186
+ "timeout": 15
187
+ }
188
+ ],
189
+ "id": "post:edit:artifact-release-gate",
190
+ "description": "Advisory: surface manifest structure/visual gaps on typed docs under docs/** and .cx/research/**"
191
+ },
168
192
  {
169
193
  "matcher": "Write|Edit|MultiEdit",
170
194
  "hooks": [
@@ -177,6 +201,18 @@
177
201
  "id": "post:edit:doc-coupling",
178
202
  "description": "Advisory: nudge when code edits accumulate without CHANGELOG/docs updates (pre-commit gate will block at commit time)"
179
203
  },
204
+ {
205
+ "matcher": "Write|Edit|MultiEdit",
206
+ "hooks": [
207
+ {
208
+ "type": "command",
209
+ "command": "node \"$HOME/.construct/lib/hooks/graph-impact-advisory.mjs\"",
210
+ "timeout": 10
211
+ }
212
+ ],
213
+ "id": "post:edit:graph-impact",
214
+ "description": "Advisory: surface affected tests from the dependency graph after code edits"
215
+ },
180
216
  {
181
217
  "matcher": "Write|Edit|MultiEdit",
182
218
  "hooks": [
@@ -6,7 +6,7 @@ description: reusable design patterns and skeleton project strategy.
6
6
  ## Skeleton Projects
7
7
 
8
8
  When implementing new functionality:
9
- 1. Search for battle-tested skeleton projects
9
+ 1. Search for proven skeleton projects
10
10
  2. Evaluate options for security, extensibility, and relevance
11
11
  3. Clone best match as foundation
12
12
  4. Iterate within proven structure
@@ -7,7 +7,7 @@ These are blocking gates. Every agent, persona, and harness session working in o
7
7
 
8
8
  The goal is simple: if a gate would fail in CI, it fails locally first. We never push and pray.
9
9
 
10
- ## The five local gates
10
+ ## The six local gates
11
11
 
12
12
  Run these before declaring work done. Pasting the output into the PR body or `bd note` is the standard evidence.
13
13
 
@@ -18,8 +18,9 @@ Run these before declaring work done. Pasting the output into the PR body or `bd
18
18
  | Doc verification | `node bin/construct docs:verify` | "All documentation checks passed": no warnings either |
19
19
  | AUTO doc drift | `node bin/construct docs:update --check` | "Docs are up to date" |
20
20
  | Template policy | `npm run lint:templates` | "Template policy: clean." |
21
+ | Certification RC gate | `node bin/construct certify gate` | Release-critical capabilities are not stale; hermetic certification scenarios pass; skipped live runs do not satisfy evidence |
21
22
 
22
- The shortcut for all five (plus dashboard sync) is:
23
+ The shortcut for all six (plus dashboard sync) is:
23
24
 
24
25
  ```bash
25
26
  npm run release:check
@@ -33,7 +34,7 @@ Commit subjects must match `type(scope): subject`: type from {feat, fix, refacto
33
34
 
34
35
  PR descriptions must keep all six headings (Summary, Beads issue, Doc updates included, Local gates, Test plan, Risks / rollback) with at least one checked box in both the "Doc updates" and "Local gates" sections. Empty templates fail.
35
36
 
36
- Forbidden in commit messages: `Co-Authored-By: Claude*` trailers (unless the user explicitly asks), `--no-verify`, `--no-gpg-sign`. Forbidden in PR bodies: deleting the required headings, leaving every gate box unchecked.
37
+ Forbidden in commit messages: any `Co-Authored-By:` trailer (including Cursor agent attribution) unless the user explicitly asks, `--no-verify`, `--no-gpg-sign`. Forbidden in PR bodies: deleting the required headings, leaving every gate box unchecked.
37
38
 
38
39
  ## The tracker contract
39
40
 
@@ -13,8 +13,8 @@
13
13
  * global so hooks fire in every Claude Code session.
14
14
  *
15
15
  * Project scope (`<project>/.claude/`, `<project>/.codex/`, `<project>/.github/`, …)
16
- * - `construct` + all 28 `cx-*` specialists, slash commands, skills, MCP
17
- * wiring. Files version with the repo and travel with teammates via git.
16
+ * - `construct` front door only (Single Front Door), slash commands, skills, MCP
17
+ * wiring. Specialists dispatch internally via orchestration MCP tools.
18
18
  *
19
19
  * Flags:
20
20
  * --dry-run Print a diff of what would change without writing anything.
@@ -56,6 +56,7 @@ import {
56
56
  } from "../lib/mcp-platform-config.mjs";
57
57
  import { loadConstructEnv } from "../lib/env-config.mjs";
58
58
  import { inlineRoleAntiPatterns, PROMPT_WORD_CAP } from "../lib/role-preload.mjs";
59
+ import { inlineValidationContract } from "../lib/prompt-validation-contract.mjs";
59
60
  import { loadManifest } from "../lib/roles/manifest.mjs";
60
61
  import { resolveActiveProfile } from "../lib/profiles/loader.mjs";
61
62
  import { resolveTiersForPrimary, resolveCapabilityTier, selectLocalEditorModel } from "../lib/model-router.mjs";
@@ -154,6 +155,16 @@ if (validationErrors.length > 0) {
154
155
  }
155
156
  }
156
157
 
158
+ {
159
+ const { validatePromptFiles } = await import("../lib/specialists/prompt-schema.mjs");
160
+ const promptResult = validatePromptFiles({ rootDir: root, registry });
161
+ if (promptResult.errors.length > 0) {
162
+ console.error("Specialist prompt validation failed:");
163
+ for (const err of promptResult.errors) console.error(` - ${err}`);
164
+ process.exit(1);
165
+ }
166
+ }
167
+
157
168
  // --- Dry-run + lockfile + two-phase write infrastructure ---
158
169
 
159
170
  const DRY_RUN = process.argv.includes("--dry-run");
@@ -518,10 +529,6 @@ function loadPersonaPrompt(persona) {
518
529
  return prompt;
519
530
  }
520
531
 
521
- export function buildAgentRoster(allEntries) {
522
- return allEntries.map((e) => `- ${adapterName(e)}: ${e.when_to_use || e.description}`).join("\n");
523
- }
524
-
525
532
  function buildModelGuidanceBlock(entry) {
526
533
  const merged = { ...globalModelGuidance, ...(entry.modelGuidance ?? {}) };
527
534
  const families = Object.keys(merged);
@@ -675,7 +682,7 @@ function buildPrompt(entry, allEntries, platform, { capabilityTier = 'full' } =
675
682
 
676
683
  if (capabilityTier && capabilityTier !== 'full' && entry.promptFile) {
677
684
  let slim = renderPersonaForTier(readPromptBody(entry.promptFile, root), capabilityTier);
678
- if (entry.injectAgentRoster && capabilities.hasNativeSubagents) {
685
+ if (entry.injectAgentRoster) {
679
686
  slim = `${ORCHESTRATION_MICRO_PROMPT}\n\n${slim}`;
680
687
  }
681
688
  return enforcePromptWordCap(slim, entry);
@@ -688,19 +695,17 @@ function buildPrompt(entry, allEntries, platform, { capabilityTier = 'full' } =
688
695
  }).prompt;
689
696
 
690
697
  prompt = inlineRoleAntiPatterns(prompt, root, entry.name, console.warn, { preload: entry.preloadRoleGuidance === true });
698
+ prompt = inlineValidationContract(prompt, root, entry.name);
691
699
 
692
- // Platform-Native Orchestration Alignment (ADR-0002). Hosts with native subagent
693
- // routing (OpenCode, VS Code, Cursor) do not get the static specialist roster
694
- // injected on a small-context local model the roster alone is ~3-4k tokens and,
695
- // combined with MCP tool schemas, overruns the model's real context window and
696
- // collapses output. Those hosts get a tool-bound micro-prompt instead and resolve
697
- // the chain at runtime via the orchestration_policy MCP tool. Hosts without native
698
- // routing (Claude Code, Codex) still need the roster to simulate handoffs in text.
699
-
700
- if (entry.injectAgentRoster && allEntries && !capabilities.hasNativeSubagents) {
701
- const roster = buildAgentRoster(allEntries);
702
- prompt = `Available specialist agents:\n${roster}\n\n${prompt}`;
703
- } else if (entry.injectAgentRoster && capabilities.hasNativeSubagents) {
700
+ // Platform-Native Orchestration Alignment (ADR-0002). All hosts receive the
701
+ // tool-bound micro-prompt when injectAgentRoster is set; the static 29-line
702
+ // roster was removed (construct-ymp5). Specialists resolve at runtime via
703
+ // orchestration_policy, which returns a lazy specialistCatalog.
704
+
705
+ // Single Front Door: all hosts resolve specialists at runtime via
706
+ // orchestration_policy / orchestration_run never inject the static roster.
707
+
708
+ if (entry.injectAgentRoster) {
704
709
  prompt = `${ORCHESTRATION_MICRO_PROMPT}\n\n${prompt}`;
705
710
  }
706
711
 
@@ -1432,12 +1437,10 @@ function syncCursor(targetDir = null, wants = true) {
1432
1437
 
1433
1438
  if (targetDir) {
1434
1439
  const rulesPath = path.join(targetDir, ".cursor", "rules", "construct.mdc");
1435
- if (!fs.existsSync(rulesPath)) {
1436
- const body = `---\ndescription: Construct front-door — invoke \`construct\` for orchestration\nalwaysApply: false\n---\n\nThis project uses Construct (\`@geraldmaron/construct\`) as the single agent\nentry point. Route work through the \`construct\` persona; specialists are\ninternal and dispatched by Construct itself.\n\nSee \`.claude/agents/\` for the registered agents in this project.\n`;
1437
- if (!DRY_RUN) {
1438
- mkdirp(path.dirname(rulesPath));
1439
- fs.writeFileSync(rulesPath, body);
1440
- }
1440
+ const body = `---\ndescription: Construct front-door — invoke \`construct\` for orchestration\nalwaysApply: false\n---\n\n<!-- Generated by construct sync — do not edit; re-run \`construct sync\` -->\n\nThis project uses Construct (\`@geraldmaron/construct\`) as the single agent\nentry point. Route work through the \`construct\` persona; specialists are\ninternal and dispatched via MCP \`orchestration_run\` (start \`construct dashboard\`).\n\nSkills load via MCP \`get_skill\`; see \`.claude/skills/\` for synced playbooks.\n`;
1441
+ if (!DRY_RUN) {
1442
+ mkdirp(path.dirname(rulesPath));
1443
+ fs.writeFileSync(rulesPath, body);
1441
1444
  }
1442
1445
 
1443
1446
  // Glob-scoped language rules land as managed per-rule .mdc files only when
@@ -1646,7 +1649,8 @@ function syncOpencode(entries, targetDir = null, wants = true) {
1646
1649
  }
1647
1650
  }
1648
1651
 
1649
- // Heavy external MCP servers serialize ~12k tokens of schema into EVERY
1652
+ // Heavy external MCP servers serialize a measured ~37k tokens of tool schema
1653
+ // into EVERY agent's request — github ~30k alone (fixtures 2026-06-22) —
1650
1654
  // agent's request — including the built-in Build/Plan agents the per-agent
1651
1655
  // permission prune cannot reach. OpenCode 1.15.4 has no per-session tool
1652
1656
  // filter (chat.params carries no tool list), so disabling the whole server in
@@ -1774,13 +1778,22 @@ function syncOpencode(entries, targetDir = null, wants = true) {
1774
1778
  config.construct.models = { ...resolvedModels };
1775
1779
 
1776
1780
  // Seed a cheap auxiliary model for titles and summaries when the user has not
1777
- // chosen one — a cost lever only. The primary `model` stays the user's choice
1778
- // and is never written. Global scope only; project configs inherit it.
1781
+ // chosen one — a cost lever only. Global scope only; project configs inherit it.
1779
1782
 
1780
1783
  if (!targetDir && config.small_model === undefined) {
1781
1784
  config.small_model = resolvedModels.fast || "anthropic/claude-haiku-4-5-20251001";
1782
1785
  }
1783
1786
 
1787
+ // Seed a text-capable primary model when the user has not pinned one, so chat
1788
+ // and routing never fall through to a host provider-default that happens to be
1789
+ // an image/non-text model. Seeds only when absent; an explicit user choice is
1790
+ // never overwritten. resolvedModels.standard is family-/registry-aware and
1791
+ // free-biased. Global scope only; project configs inherit it.
1792
+
1793
+ if (!targetDir && (config.model === undefined || config.model === null || config.model === "")) {
1794
+ config.model = resolvedModels.standard || resolvedModels.reasoning || resolvedModels.fast || "openrouter/qwen/qwen3-coder:free";
1795
+ }
1796
+
1784
1797
  writeOpenCodeConfig(config, configPath);
1785
1798
 
1786
1799
  const sourcePluginsDir = path.join(root, "platforms", "opencode", "plugins");
@@ -17,7 +17,7 @@ artifactType: data-pipeline
17
17
 
18
18
  ### ELT over ETL
19
19
 
20
- Modern data platforms (BigQuery, Snowflake, Redshift) are powerful enough to transform inside the warehouse. Prefer **ELT** (Extract → Load raw → Transform in warehouse):
20
+ Modern data platforms (BigQuery, Snowflake, Redshift) are capable enough to transform inside the warehouse. Prefer **ELT** (Extract → Load raw → Transform in warehouse):
21
21
 
22
22
  ```
23
23
  Source → Airbyte/Fivetran → Raw tables → dbt models → Mart/API
@@ -3,6 +3,7 @@ name: docs-adr-workflow
3
3
  description: "Use when: an architectural decision is made that affects the system structure, data model, API contracts, or technology choices."
4
4
  inputs: [decision-context]
5
5
  artifactType: adr
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # ADR Workflow
8
9
 
@@ -3,6 +3,7 @@ name: docs-backlog-proposal-workflow
3
3
  description: "Use when: product evidence should create or update Jira, Linear, GitHub Issues, or another tracker."
4
4
  inputs: [evidence-brief, prd, signal]
5
5
  artifactType: backlog-proposal
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Backlog Proposal Workflow
8
9
 
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: docs-codebase-research-workflow
3
+ description: "Use when: cx-explorer maps the repo — entry points, dependencies, hot paths, or unfamiliar subsystems."
4
+ inputs: [repository-path]
5
+ artifactType: research-brief
6
+ toneDefault: pedagogical
7
+ toneAllowed: [pedagogical, direct]
8
+ verificationBar: "Every claim cites file:line or command output; no assumed architecture."
9
+ ---
10
+ # Codebase Research Workflow
11
+
12
+ Use when: cx-explorer investigates **this repository** — structure, dependencies, behavior. Not for external vendor research or user interviews.
13
+
14
+ Call `get_skill("roles/researcher.explorer")` and `get_skill("exploration/repo-map")` before deep dives.
15
+
16
+ ## Steps
17
+
18
+ 1. **Clarify the map question**: what subsystem, entry point, or data flow must be understood?
19
+ 2. **Read before concluding**: grep, glob, read implicated files. No claims from memory.
20
+ 3. **Produce artifacts**:
21
+ - `.cx/codebase-map.md` for broad orientation (repo-map skill)
22
+ - `.cx/research/{slug}.md` for focused investigations using `get_template("research-brief")`
23
+ 4. **Source classes** (codebase-primary):
24
+
25
+ | Source | Class |
26
+ |---|---|
27
+ | Source file at commit | primary |
28
+ | Test asserting behavior | primary |
29
+ | Config / schema in repo | primary |
30
+ | Comment or doc in repo | secondary |
31
+ | External blog about the repo | tertiary — locate code, do not cite alone |
32
+
33
+ 5. **Cite as** `[source: path#Lnn]` or `[source: commit-sha]`.
34
+ 6. **Tone**: default `pedagogical` — teach the next reader the shape of the system.
35
+
36
+ ## Verification bar
37
+
38
+ - Every architectural claim traceable to file:line.
39
+ - Unknown paths marked `[unverified]` until read.
40
+ - cx-explorer must **not** answer product prioritization or user preference questions.
@@ -3,6 +3,7 @@ name: docs-customer-profile-workflow
3
3
  description: "Use when: customer evidence should update durable product memory."
4
4
  inputs: [signal, customer-profile]
5
5
  artifactType: customer-profile
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Customer Profile Workflow
8
9
 
@@ -3,6 +3,7 @@ name: docs-document-ingest-workflow
3
3
  description: "Use when: the user points at a PDF, Word doc, spreadsheet, slide deck, export, or mixed document folder and wants a markdown version that Construct can search efficiently later."
4
4
  inputs: [document]
5
5
  artifactType: ingested-markdown
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Document Ingest Workflow
8
9
 
@@ -3,6 +3,7 @@ name: docs-evidence-ingest-workflow
3
3
  description: "Use when: the user pastes customer notes, Slack threads, support tickets, sales notes, research snippets, RFCs, analytics summaries, or competitor signals."
4
4
  inputs: [signal, document]
5
5
  artifactType: evidence-brief
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Evidence Ingest Workflow
8
9
 
@@ -46,7 +46,7 @@ docs/
46
46
 
47
47
  ## Interactive UX (TTY)
48
48
 
49
- When run interactively, `construct init-docs` renders a keyboard-driven **full-screen checkbox picker**: all available lanes listed with the default set pre-checked and context-suggested lanes highlighted in the UI. No typing required.
49
+ When run interactively, `construct init --docs-preset=*` renders a keyboard-driven **full-screen checkbox picker**: all available lanes listed with the default set pre-checked and context-suggested lanes highlighted in the UI. No typing required.
50
50
 
51
51
  - **↑ / ↓**: move cursor (details shown in a dedicated panel)
52
52
  - **Space**: toggle lane on/off
@@ -54,7 +54,7 @@ When run interactively, `construct init-docs` renders a keyboard-driven **full-s
54
54
  - **Enter**: confirm and scaffold
55
55
  - Follow-up choices use the same menu pattern instead of free-text answers
56
56
 
57
- If the user selects the `intake` lane, `construct init-docs` should also create `.cx/inbox/`. Both `.cx/inbox/` and `docs/intake/` act as drop zones for ingestable files, while `docs/intake/` also serves as the durable paper trail lane.
57
+ If the user selects the `intake` lane, `construct init` should also create `.cx/inbox/`. Both `.cx/inbox/` and `docs/intake/` act as drop zones for ingestable files, while `docs/intake/` also serves as the durable paper trail lane.
58
58
 
59
59
  When run non-interactively (`--yes` or piped stdin), the lean default set is used unless `--docs=` is supplied. `--docs=lean|product|full` or `--docs=adrs,prds,rfcs` both work.
60
60
 
@@ -10,9 +10,14 @@ Use when: starting work on a new project or joining an existing one without doc
10
10
 
11
11
  ## Command
12
12
  ```bash
13
- construct init-docs [path] # defaults to current directory
13
+ construct init --docs-preset=lean [path] # defaults to current directory; presets: lean | product | full
14
+ # or lane-specific init:
15
+ construct init [path] [--docs-preset=lean|product|full] # unified bootstrap (preferred)
16
+ construct init --docs-preset=lean [path] # docs-only lean preset
14
17
  ```
15
18
 
19
+ `npm run docs:init` is deprecated — use `construct init --docs-preset=*` instead.
20
+
16
21
  ## What it creates
17
22
  ```
18
23
  .cx/ ← agent session memory and decisions
@@ -35,7 +40,7 @@ docs/ ← human-readable project documentation
35
40
  4. Run `construct dashboard` to see the project in the dashboard.
36
41
 
37
42
  ## For cx-docs-keeper
38
- At session start, check the core docs set. If missing, suggest running `construct init-docs`.
43
+ At session start, check the core docs set. If missing, suggest running `construct init --docs-preset=lean` (or `construct init --docs-preset=full` for the full lane set).
39
44
  At session end, update the affected core docs so the next LLM session inherits current project reality.
40
45
 
41
46
  ## For all LLMs working in the repo
@@ -3,6 +3,7 @@ name: docs-prd-workflow
3
3
  description: "Use when: the user asks to create a PRD, platform spec, business case, RFC, or requirements document."
4
4
  inputs: [research-question, evidence-brief]
5
5
  artifactType: prd
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # PRD Workflow
8
9
 
@@ -10,6 +11,8 @@ Use when: the user asks to create a PRD, platform spec, business case, RFC, or r
10
11
 
11
12
  Choose the document type before drafting:
12
13
 
14
+ Resolve tone from `specialists/tone-profiles.json` and optional `.cx/brand-voice.json` override for the selected template.
15
+
13
16
  | Template | Use when |
14
17
  |---|---|
15
18
  | `prd` | Customer-facing product capabilities, user workflows, end-user requirements |
@@ -36,7 +39,10 @@ Style constraint: do not produce a wall of bullets. Use paragraphs for reasoning
36
39
  | `meta-prd` | `docs/meta-prd/{YYYY-MM-DD}-{slug}.md` |
37
40
  | `rfc` | `docs/rfc/{YYYY-MM-DD}-{slug}.md` |
38
41
  | `rfc-platform` | `docs/rfc/{YYYY-MM-DD}-{slug}.md` |
39
- 5. **cx-docs-keeper** updates `.cx/context.md` with a link to the PRD
42
+ 5. **cx-devil-advocate** runs the FMEA challenge pass (`roles/reviewer.devil-advocate`) on the draft; highest-RPN failure modes need a mitigation or explicit accept-with-rationale before ship. Their specialist id must appear in `.cx/agent-log.jsonl` (manifest `releaseGate.requiredReviewers` for PRD-family types).
43
+ 6. **cx-docs-keeper** updates `.cx/context.md` with a link to the PRD
44
+
45
+ Run `construct artifact validate <path> --type=<type>` before marking the artifact approved.
40
46
 
41
47
  ## File naming
42
48
  - `docs/{template-type}/{YYYY-MM-DD}-{slug}.md`
@@ -54,3 +60,20 @@ Style constraint: do not produce a wall of bullets. Use paragraphs for reasoning
54
60
  ## After approval → beads
55
61
 
56
62
  Once the PRD is approved, run `/plan feature {feature-slug}` to produce a structured implementation plan and import it as workflow task packets (beads) into `.cx/workflow.json`. Link the resulting `.cx/plans/` file back in the PRD as the implementation reference.
63
+
64
+ ## Distribution (publish pipeline)
65
+
66
+ **`construct workflow invoke` returns a plan only** — it does not draft the PRD. Run the listed specialists (cx-product-manager, cx-researcher, cx-ux-researcher as needed) to author the artifact from the template. **Do not hand-write a stub and publish.**
67
+
68
+ Before distribution:
69
+
70
+ ```bash
71
+ node bin/construct artifact validate docs/prd-platform/<slug>.md --type=prd-platform
72
+ node bin/construct publish docs/prd-platform/<slug>.md --strict --figures
73
+ ```
74
+
75
+ `construct publish` runs the artifact release gate by default. Thin or unscaffolded docs **exit 2** with remediation hints. Do not use `--no-gate` or `--no-strict` in demos or ship paths.
76
+
77
+ **Presentation is part of done.** Published PDFs use type-specific Typst templates (`construct-prd.typ`, `construct-research.typ`, `construct-decision.typ`) with violet editorial branding and Inter body typography. Lead with an `::: executive-summary` narrative paragraph — not a bullet wall. Diagrams on the publish path use D2 `--sketch` and Mermaid `handDrawn` styling with Construct violet accent.
78
+
79
+ `--strict` means **toolchain and release gate** both pass. Invoke alone is not "done."
@@ -3,6 +3,7 @@ name: docs-prfaq-workflow
3
3
  description: "Use when: the user asks for a PRFAQ, working-backwards doc, launch narrative, or FAQ grounded in product evidence."
4
4
  inputs: [prd, evidence-brief]
5
5
  artifactType: prfaq
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # PRFAQ Workflow
8
9
 
@@ -3,6 +3,7 @@ name: docs-product-intelligence-workflow
3
3
  description: "Use when: the request involves customer evidence, PM synthesis, product requirements, PRDs, PRFAQs, customer profiles, product signals, or backlog proposals."
4
4
  inputs: [signal, evidence-brief]
5
5
  artifactType: prd
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Product Intelligence Workflow
8
9
 
@@ -3,6 +3,7 @@ name: docs-product-signal-workflow
3
3
  description: "Use when: the user asks what customers are asking for, what themes are emerging, whether evidence is strong enough, or what should become a PRD."
4
4
  inputs: [signal, evidence-brief]
5
5
  artifactType: signal-brief
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Product Signal Workflow
8
9
 
@@ -1,56 +1,73 @@
1
1
  ---
2
2
  name: docs-research-workflow
3
- description: "Use when: the user asks to research a topic, investigate a question, or gather evidence for a decision."
3
+ description: "Use when: cx-researcher must investigate external facts CVEs, APIs, market data, regulations, or vendor behavior."
4
4
  inputs: [research-question]
5
5
  artifactType: research-brief
6
+ toneDefault: direct
7
+ toneAllowed: [direct]
8
+ verificationBar: "Every load-bearing claim cites a verifiable primary source; label inference confidence; satisfy template structure requirements."
6
9
  ---
7
- # Research Workflow
10
+ # External Research Workflow
8
11
 
9
- Use when: the user asks to research a topic, investigate a question, or gather evidence for a decision.
12
+ Use when: cx-researcher investigates **external** facts not user interviews or codebase exploration. For user evidence use `docs/user-research-workflow`; for repo exploration use `docs/codebase-research-workflow`.
10
13
 
11
14
  Follow [rules/common/research.md](../../rules/common/research.md) as the default policy.
12
15
 
13
16
  ## Steps
14
17
 
15
18
  1. **Clarify the question**: one specific, falsifiable question the research must answer.
16
- 2. **Apply recency discipline**: always search from the most recent year backward. For fast-moving domains (AI tools, security, market data), treat anything older than 12 months as presumptively stale unless a newer source confirms it is still accurate.
17
- 3. **Check internal evidence first**: search `.cx/research/`, `.cx/knowledge/`, `docs/prd/`, `docs/meta-prd/`, ADRs, runbooks, and ingested artifacts before going external.
18
- 4. **Choose the research path and starting point** by domain:
19
+ 2. **Apply recency discipline**: search from the most recent year backward. For fast-moving domains, treat sources older than 12 months as presumptively stale unless confirmed.
20
+ 3. **Check internal evidence first**: `.cx/research/`, `.cx/knowledge/`, PRDs, ADRs, runbooks before going external.
21
+ 4. **Choose authoritative starting points** (external primary only):
19
22
 
20
- | Domain | Authoritative starting points |
23
+ | Domain | Starting points |
21
24
  |---|---|
22
- | AI tools / LLM behavior / multi-agent | arXiv (cs.AI, cs.SE, cs.CL), ACL Anthology, conference proceedings (NeurIPS, ICML, ICLR, HICSS) |
23
- | Developer tools / IDE / adoption | Stack Overflow Developer Survey, JetBrains Developer Ecosystem Report, GitHub blog, editor changelogs |
24
- | Security / CVEs / supply chain | NVD, GitHub Security Advisories, OWASP, vendor security blogs (Google Project Zero, Microsoft Security), ProjectDiscovery |
25
- | Market data / ARR / adoption | Primary company announcements, SEC filings, then TechCrunch/Bloomberg citing company sources |
26
- | Cloud / API / SDK / version | Official vendor docs for exact version, changelog, migration guide |
27
- | Regulatory / compliance / privacy | Primary regulation text, then official agency guidance |
28
-
29
- 5. **Use a source hierarchy**:
30
- - Primary: official docs, exact-version API references, standards, source code, peer-reviewed papers
31
- - Secondary: changelogs, migration guides, maintainer issue comments, release notes
32
- - Tertiary: blogs/forums/Q&A only to locate primaries: never cite tertiary alone for a load-bearing claim
33
- 6. **Verify every URL**: fetch each URL cited and confirm it resolves and matches the cited claim. Mark unconfirmed URLs as `[unverified]`.
34
- 7. **Structure findings** using the template from `get_template("research-brief")`: resolves `.cx/templates/docs/research-brief.md` (override) then `templates/docs/research-brief.md` (shipped)
35
- 8. **Write to `.cx/research/{topic-slug}.md`**: cx-docs-keeper owns this
36
- 9. **Reference the research doc** in the requesting agent's output (link by path)
25
+ | AI / LLM / multi-agent | arXiv, ACL Anthology, NeurIPS/ICML/ICLR proceedings |
26
+ | Security / CVEs | NVD, GitHub Security Advisories, OWASP, vendor security blogs |
27
+ | Market / adoption | SEC filings, company announcements, then analyst reports citing primaries |
28
+ | Cloud / API / SDK | Official vendor docs for exact version, changelog, migration guide |
29
+ | Regulatory | Primary regulation text, official agency guidance |
37
30
 
38
- ## Verification bar
31
+ 5. **Source hierarchy**: primary → secondary → tertiary (tertiary never alone for load-bearing claims).
32
+ 6. **Verify every URL** before citing. Mark unconfirmed as `[unverified]`.
33
+ 7. **Tone**: resolve from artifact manifest (`direct`). See `specialists/tone-profiles.json`.
34
+ 8. **Structure** with `get_template("research-brief")`; write to `.cx/research/{topic-slug}.md`.
35
+ 9. **Reference** the research doc in the requesting agent's output.
36
+
37
+ ## Distribution (publish pipeline)
38
+
39
+ After the brief is written, **validate then publish** — the release gate is enforced by default:
40
+
41
+ ```bash
42
+ node bin/construct artifact validate .cx/research/{topic-slug}.md --type=research-brief
43
+ node bin/construct tools detect --json
44
+ node bin/construct publish .cx/research/{topic-slug}.md --strict \
45
+ --demo=resource-guard-rails \
46
+ --dashboard-demo=cockpit-tour
47
+ ```
48
+
49
+ Do **not** publish without a passing validate. Do **not** use `--no-gate` in demos or ship paths.
39
50
 
40
- - Every load-bearing claim must cite a verified source path, URL, or document reference.
41
- - Record publication date, version, or access date for each source. If no date is available, state `[undated]` and treat confidence as `low`.
42
- - Fetch and confirm every URL before including it in a committed document.
43
- - Separate observation from inference: label each finding's confidence as `high`, `medium`, or `low`.
44
- - Name contradictions and unresolved gaps.
45
- - Prefer two independent sources per load-bearing claim unless one authoritative primary source is sufficient.
46
- - State the strongest counter-evidence when one exists.
51
+ Optional frontmatter in the brief:
47
52
 
48
- ## File naming
49
- - Topic slug: lowercase, hyphens, no spaces: e.g., `firebase-auth-v9-migration.md`
50
- - Date prefix for time-sensitive research: `2026-04-release-comparison.md`
53
+ ```yaml
54
+ publish:
55
+ demo: resource-guard-rails
56
+ dashboardDemo: cockpit-tour
57
+ ```
51
58
 
52
- ## When research feeds a decision
53
- → Also create `.cx/decisions/ADR-{NNN}-{slug}.md` referencing the research doc
59
+ **Community patterns (do not hand-roll):**
60
+
61
+ - **Figures in PDF**: fenced ` ```d2` / ` ```mermaid` blocks rendered at export time via vendored [pandoc-ext/diagram](https://github.com/pandoc-ext/diagram) (`construct export --figures` or `construct publish`).
62
+ - **Terminal demos**: shipped `.tape` files under `templates/demos/tapes/`; project overrides in `.cx/demos/tapes/`; regenerate with `construct demo record <name>` or CI `charmbracelet/vhs-action`.
63
+ - **Dashboard demos**: Playwright `e2e/demo/*.spec.ts` with `video: on` in `apps/dashboard`; run via `construct demo dashboard:<name>`.
64
+
65
+ Install toolchain once: `brew install d2 graphviz pandoc typst vhs` and `npm install -g @mermaid-js/mermaid-cli`. Playwright: `cd apps/dashboard && npm install && npx playwright install chromium`.
66
+
67
+ Do **not** claim PDF/demo done until `construct tools detect` reports ready or `--strict` publish succeeds.
68
+
69
+ ## Verification bar
54
70
 
55
- ## When research feeds a PRD
56
- Reference it in the PRD's References section
71
+ - Two independent sources per load-bearing claim unless one authoritative primary suffices.
72
+ - Admiralty grades on every source. Counter-evidence named when it exists.
73
+ - cx-researcher must **not** answer UX preference questions or infer codebase behavior without reading code.
@@ -3,6 +3,7 @@ name: docs-runbook-workflow
3
3
  description: "Use when: creating operational procedures for services, alerts, or recurring operations."
4
4
  inputs: [service, incident]
5
5
  artifactType: runbook
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Runbook Workflow
8
9
 
@@ -3,6 +3,7 @@ name: docs-strategy-workflow
3
3
  description: "Use when: the user asks about product direction, strategic bets, what to prioritize, whether a signal aligns with strategy, or wants to update the strategy."
4
4
  inputs: [signal, decision-context]
5
5
  artifactType: strategy
6
+ verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
6
7
  ---
7
8
  # Strategy Workflow
8
9