@geraldmaron/construct 1.0.0 → 1.0.2

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 (471) hide show
  1. package/.env.example +9 -6
  2. package/LICENSE +201 -21
  3. package/README.md +132 -257
  4. package/agents/contracts.json +387 -0
  5. package/agents/prompts/cx-accessibility.md +8 -0
  6. package/agents/prompts/cx-ai-engineer.md +92 -0
  7. package/agents/prompts/cx-architect.md +10 -2
  8. package/agents/prompts/cx-business-strategist.md +13 -0
  9. package/agents/prompts/cx-data-analyst.md +80 -0
  10. package/agents/prompts/cx-data-engineer.md +4 -0
  11. package/agents/prompts/cx-debugger.md +8 -0
  12. package/agents/prompts/cx-designer.md +19 -0
  13. package/agents/prompts/cx-devil-advocate.md +4 -0
  14. package/agents/prompts/cx-docs-keeper.md +128 -0
  15. package/agents/prompts/cx-engineer.md +13 -0
  16. package/agents/prompts/cx-evaluator.md +4 -0
  17. package/agents/prompts/cx-explorer.md +12 -0
  18. package/agents/prompts/cx-legal-compliance.md +13 -0
  19. package/agents/prompts/cx-operations.md +13 -0
  20. package/agents/prompts/cx-orchestrator.md +107 -4
  21. package/agents/prompts/cx-platform-engineer.md +75 -0
  22. package/agents/prompts/cx-product-manager.md +8 -0
  23. package/agents/prompts/cx-qa.md +100 -0
  24. package/agents/prompts/cx-rd-lead.md +13 -0
  25. package/agents/prompts/cx-release-manager.md +8 -0
  26. package/agents/prompts/cx-researcher.md +21 -1
  27. package/agents/prompts/cx-reviewer.md +8 -0
  28. package/agents/prompts/cx-security.md +104 -0
  29. package/agents/prompts/cx-sre.md +104 -0
  30. package/agents/prompts/cx-test-automation.md +4 -0
  31. package/agents/prompts/cx-trace-reviewer.md +7 -3
  32. package/agents/prompts/cx-ux-researcher.md +4 -0
  33. package/agents/registry.json +365 -90
  34. package/agents/role-manifests.json +217 -0
  35. package/bin/construct +3345 -141
  36. package/bin/construct-postinstall.mjs +87 -0
  37. package/commands/build/feature.md +6 -6
  38. package/commands/plan/feature.md +6 -5
  39. package/commands/plan/requirements.md +1 -1
  40. package/commands/ship/status.md +1 -1
  41. package/commands/work/drive.md +3 -3
  42. package/commands/work/optimize-prompts.md +3 -3
  43. package/db/{migrations → schema}/001_init.sql +2 -0
  44. package/db/schema/002_pgvector.sql +182 -0
  45. package/db/schema/003_intake.sql +47 -0
  46. package/examples/README.md +85 -0
  47. package/examples/internal/roles/architect/bad/clever-plan-without-contracts.md +30 -0
  48. package/examples/internal/roles/architect/golden/explicit-tradeoff-before-plan.md +23 -0
  49. package/examples/internal/roles/engineer/bad/speculative-abstraction.md +30 -0
  50. package/examples/internal/roles/engineer/golden/read-before-write.md +28 -0
  51. package/examples/internal/roles/orchestrator/bad/everything-becomes-multi-agent.md +29 -0
  52. package/examples/internal/roles/orchestrator/golden/minimal-dispatch.md +22 -0
  53. package/examples/internal/roles/qa/bad/coverage-theater.md +30 -0
  54. package/examples/internal/roles/qa/golden/regression-gate.md +23 -0
  55. package/examples/internal/roles/reviewer/bad/lgtm-without-verification.md +29 -0
  56. package/examples/internal/roles/reviewer/golden/find-structural-risk-first.md +28 -0
  57. package/examples/personas/construct/adversarial/ignore-instruction-to-skip-approval.md +22 -0
  58. package/examples/personas/construct/bad/commit-without-approval.md +30 -0
  59. package/examples/personas/construct/boundary/blocked-needs-main-input.md +29 -0
  60. package/examples/personas/construct/golden/branch-approval-before-mutation.md +36 -0
  61. package/examples/personas/construct/golden/focused-direct-answer.md +28 -0
  62. package/examples/provider-plugin/README.md +34 -0
  63. package/examples/provider-plugin/index.mjs +74 -0
  64. package/examples/provider-plugin/package.json +15 -0
  65. package/examples/seed-observations/README.md +38 -0
  66. package/examples/seed-observations/anti-patterns.md +44 -0
  67. package/examples/seed-observations/decisions.md +36 -0
  68. package/examples/seed-observations/patterns.md +42 -0
  69. package/lib/agent-contracts-enforce.mjs +158 -0
  70. package/lib/agent-contracts.mjs +231 -0
  71. package/lib/agents/postconditions.mjs +126 -0
  72. package/lib/agents/schema.mjs +124 -0
  73. package/lib/artifact-capture.mjs +183 -0
  74. package/lib/audit-trail.mjs +149 -0
  75. package/lib/auto-docs.mjs +245 -65
  76. package/lib/beads/auto-close.mjs +126 -0
  77. package/lib/beads/drift.mjs +171 -0
  78. package/lib/beads-automation.mjs +542 -0
  79. package/lib/beads-client.mjs +518 -0
  80. package/lib/beads-lock.mjs +377 -0
  81. package/lib/beads-optimistic.mjs +365 -0
  82. package/lib/bootstrap/built-ins.mjs +136 -0
  83. package/lib/bootstrap/lazy-install.mjs +161 -0
  84. package/lib/bootstrap/resources.mjs +120 -0
  85. package/lib/bootstrap.mjs +105 -0
  86. package/lib/cache-governor.js +213 -0
  87. package/lib/cache-strategy-anthropic.js +62 -0
  88. package/lib/cache-strategy-google.js +79 -0
  89. package/lib/cache-strategy-none.js +30 -0
  90. package/lib/cache-strategy-openai.js +48 -0
  91. package/lib/cache-strategy.js +91 -0
  92. package/lib/claude-allow.mjs +149 -0
  93. package/lib/cli-commands.mjs +413 -258
  94. package/lib/codex-config.mjs +3 -1
  95. package/lib/comment-lint.mjs +55 -6
  96. package/lib/completions.mjs +21 -6
  97. package/lib/config/alias.mjs +56 -0
  98. package/lib/config/project-config.mjs +335 -0
  99. package/lib/config/schema.mjs +159 -0
  100. package/lib/context-router.mjs +308 -0
  101. package/lib/cost-ledger.mjs +177 -0
  102. package/lib/cost.mjs +171 -10
  103. package/lib/dashboard-static.mjs +158 -0
  104. package/lib/deployment-mode.mjs +86 -0
  105. package/lib/deprecate.mjs +49 -0
  106. package/lib/dispatch-batch.js +183 -0
  107. package/lib/distill.mjs +21 -8
  108. package/lib/doc-stamp.mjs +164 -0
  109. package/lib/doc-verify.mjs +119 -0
  110. package/lib/docs-routing.mjs +89 -0
  111. package/lib/docs-verify.mjs +417 -0
  112. package/lib/doctor/audit.mjs +71 -0
  113. package/lib/doctor/cli.mjs +99 -0
  114. package/lib/doctor/escalate.mjs +29 -0
  115. package/lib/doctor/index.mjs +140 -0
  116. package/lib/doctor/report.mjs +170 -0
  117. package/lib/doctor/watchers/bd-watch.mjs +117 -0
  118. package/lib/doctor/watchers/cost.mjs +130 -0
  119. package/lib/doctor/watchers/disk.mjs +122 -0
  120. package/lib/doctor/watchers/handoffs.mjs +33 -0
  121. package/lib/doctor/watchers/process-pressure.mjs +60 -0
  122. package/lib/doctor/watchers/service-health.mjs +188 -0
  123. package/lib/document-extract.mjs +288 -0
  124. package/lib/document-ingest.mjs +230 -0
  125. package/lib/drop.mjs +282 -0
  126. package/lib/embed/approval-queue.mjs +176 -0
  127. package/lib/embed/artifact.mjs +349 -0
  128. package/lib/embed/authority-guard.mjs +155 -0
  129. package/lib/embed/cli.mjs +408 -0
  130. package/lib/embed/config.mjs +355 -0
  131. package/lib/embed/conflict-detection.mjs +264 -0
  132. package/lib/embed/customer-profiles.mjs +480 -0
  133. package/lib/embed/daemon.mjs +1309 -0
  134. package/lib/embed/demand-fetch.mjs +449 -0
  135. package/lib/embed/docs-lifecycle.mjs +349 -0
  136. package/lib/embed/inbox-live-watcher.mjs +119 -0
  137. package/lib/embed/inbox.mjs +343 -0
  138. package/lib/embed/intake-metrics.mjs +190 -0
  139. package/lib/embed/jobs/vector-sync.mjs +198 -0
  140. package/lib/embed/notifications.mjs +75 -0
  141. package/lib/embed/output.mjs +79 -0
  142. package/lib/embed/providers/github.mjs +295 -0
  143. package/lib/embed/providers/jira.mjs +192 -0
  144. package/lib/embed/providers/linear.mjs +186 -0
  145. package/lib/embed/providers/registry.mjs +115 -0
  146. package/lib/embed/providers/slack.mjs +203 -0
  147. package/lib/embed/recommendation-store.mjs +378 -0
  148. package/lib/embed/roadmap.mjs +374 -0
  149. package/lib/embed/role-framing.mjs +110 -0
  150. package/lib/embed/scheduler.mjs +99 -0
  151. package/lib/embed/semantic.mjs +325 -0
  152. package/lib/embed/snapshot.mjs +191 -0
  153. package/lib/embed/supervision.mjs +235 -0
  154. package/lib/embed/target-resolver.mjs +186 -0
  155. package/lib/embed/worker.mjs +62 -0
  156. package/lib/embed/workspaces.mjs +297 -0
  157. package/lib/engine/chunker-headings.mjs +110 -0
  158. package/lib/engine/compressor-heuristic.mjs +100 -0
  159. package/lib/engine/consolidate.mjs +287 -0
  160. package/lib/engine/contracts.mjs +126 -0
  161. package/lib/engine/defaults.mjs +129 -0
  162. package/lib/engine/eval-retrieval.mjs +148 -0
  163. package/lib/engine/fuser-rrf.mjs +62 -0
  164. package/lib/engine/index.mjs +37 -0
  165. package/lib/engine/registry.mjs +146 -0
  166. package/lib/engine/reranker-mmr.mjs +90 -0
  167. package/lib/engine/tokens.mjs +77 -0
  168. package/lib/entity-store.mjs +280 -0
  169. package/lib/env-config.mjs +69 -4
  170. package/lib/evals/retrieval-bench.mjs +159 -0
  171. package/lib/evaluator-optimizer.mjs +317 -0
  172. package/lib/features.mjs +159 -29
  173. package/lib/gates-audit.mjs +236 -0
  174. package/lib/git-hooks/prepare-commit-msg +58 -0
  175. package/lib/handoffs/cleanup.mjs +159 -0
  176. package/lib/handoffs/contract.mjs +162 -0
  177. package/lib/handoffs/inventory.mjs +120 -0
  178. package/lib/headhunt.mjs +28 -47
  179. package/lib/health-check.mjs +399 -0
  180. package/lib/hook-health.mjs +442 -0
  181. package/lib/hooks/_lib/log.mjs +82 -0
  182. package/lib/hooks/adaptive-lint.mjs +26 -2
  183. package/lib/hooks/agent-tracker.mjs +171 -14
  184. package/lib/hooks/audit-reads.mjs +109 -0
  185. package/lib/hooks/audit-trail.mjs +153 -0
  186. package/lib/hooks/bash-output-logger.mjs +71 -0
  187. package/lib/hooks/block-no-verify.mjs +41 -0
  188. package/lib/hooks/ci-status-check.mjs +82 -0
  189. package/lib/hooks/comment-lint.mjs +29 -7
  190. package/lib/hooks/config-protection.mjs +39 -18
  191. package/lib/hooks/context-watch.mjs +137 -0
  192. package/lib/hooks/context-window-recovery.mjs +4 -20
  193. package/lib/hooks/dep-audit.mjs +16 -0
  194. package/lib/hooks/doc-coupling-check.mjs +80 -0
  195. package/lib/hooks/edit-accumulator.mjs +3 -0
  196. package/lib/hooks/edit-error-recovery.mjs +3 -0
  197. package/lib/hooks/edit-guard.mjs +45 -4
  198. package/lib/hooks/env-check.mjs +3 -0
  199. package/lib/hooks/guard-bash.mjs +58 -1
  200. package/lib/hooks/mcp-audit.mjs +18 -20
  201. package/lib/hooks/mcp-health-check.mjs +36 -0
  202. package/lib/hooks/model-fallback.mjs +42 -56
  203. package/lib/hooks/policy-engine.mjs +209 -0
  204. package/lib/hooks/post-merge-docs-check.mjs +63 -0
  205. package/lib/hooks/pre-compact.mjs +4 -24
  206. package/lib/hooks/pre-push-gate.mjs +200 -37
  207. package/lib/hooks/proactive-activation.mjs +284 -0
  208. package/lib/hooks/read-tracker.mjs +27 -4
  209. package/lib/hooks/readme-age-check.mjs +77 -0
  210. package/lib/hooks/registry-sync.mjs +12 -5
  211. package/lib/hooks/scan-secrets.mjs +50 -7
  212. package/lib/hooks/session-optimize.mjs +311 -0
  213. package/lib/hooks/session-start.mjs +287 -28
  214. package/lib/hooks/stop-notify.mjs +236 -96
  215. package/lib/hooks/stop-typecheck.mjs +13 -1
  216. package/lib/hooks/test-watch.mjs +68 -0
  217. package/lib/host-capabilities.mjs +31 -10
  218. package/lib/init-docs.mjs +731 -291
  219. package/lib/init-unified.mjs +1000 -0
  220. package/lib/init-update.mjs +168 -0
  221. package/lib/init.mjs +107 -0
  222. package/lib/install/first-invocation.mjs +119 -0
  223. package/lib/install/stage-project.mjs +69 -0
  224. package/lib/intake/classify.mjs +278 -0
  225. package/lib/intake/feedback.mjs +273 -0
  226. package/lib/intake/filesystem-queue.mjs +158 -0
  227. package/lib/intake/intake-config.mjs +132 -0
  228. package/lib/intake/postgres-queue.mjs +198 -0
  229. package/lib/intake/prepare.mjs +139 -0
  230. package/lib/intake/queue.mjs +83 -0
  231. package/lib/intake/session-prelude.mjs +50 -0
  232. package/lib/integrations/intake-integrations.mjs +740 -0
  233. package/lib/intent-classifier.mjs +253 -0
  234. package/lib/knowledge/layout.mjs +72 -0
  235. package/lib/knowledge/rag.mjs +331 -0
  236. package/lib/knowledge/search.mjs +315 -0
  237. package/lib/knowledge/trends.mjs +261 -0
  238. package/lib/logger.mjs +85 -0
  239. package/lib/mcp/broker.mjs +124 -0
  240. package/lib/mcp/server.mjs +554 -854
  241. package/lib/mcp/tools/document.mjs +132 -0
  242. package/lib/mcp/tools/memory.mjs +209 -0
  243. package/lib/mcp/tools/project.mjs +349 -0
  244. package/lib/mcp/tools/skills.mjs +409 -0
  245. package/lib/mcp/tools/storage.mjs +60 -0
  246. package/lib/mcp/tools/telemetry.mjs +315 -0
  247. package/lib/mcp/tools/workflow.mjs +112 -0
  248. package/lib/mcp-catalog.json +54 -3
  249. package/lib/mcp-manager.mjs +96 -48
  250. package/lib/mcp-platform-config.mjs +22 -22
  251. package/lib/memory-stats.mjs +121 -0
  252. package/lib/mode-commands.mjs +124 -0
  253. package/lib/model-free-selector.mjs +184 -0
  254. package/lib/model-pricing.mjs +152 -0
  255. package/lib/model-registry.mjs +226 -0
  256. package/lib/model-router.mjs +362 -386
  257. package/lib/observation-store.mjs +391 -0
  258. package/lib/ollama-manager.mjs +428 -0
  259. package/lib/opencode-config.mjs +13 -3
  260. package/lib/opencode-runtime-plugin.mjs +70 -38
  261. package/lib/opencode-telemetry.mjs +64 -6
  262. package/lib/orchestration-policy.mjs +509 -6
  263. package/lib/overrides/resolver.mjs +207 -0
  264. package/lib/parity.mjs +147 -0
  265. package/lib/paths.mjs +33 -0
  266. package/lib/performance/generate.mjs +212 -0
  267. package/lib/plugin-registry.mjs +268 -0
  268. package/lib/policy/engine.mjs +130 -0
  269. package/lib/policy/unified-gates.mjs +96 -0
  270. package/lib/project-detection.mjs +129 -0
  271. package/lib/project-init-shared.mjs +272 -0
  272. package/lib/project-profile.mjs +447 -0
  273. package/lib/prompt-composer.js +434 -0
  274. package/lib/prompt-metadata.mjs +1 -1
  275. package/lib/provider-capabilities-anthropic.js +44 -0
  276. package/lib/provider-capabilities-deepseek.js +37 -0
  277. package/lib/provider-capabilities-generic.js +26 -0
  278. package/lib/provider-capabilities-google.js +47 -0
  279. package/lib/provider-capabilities-openai.js +45 -0
  280. package/lib/provider-capabilities.js +142 -0
  281. package/lib/providers/atlassian-confluence/index.mjs +103 -0
  282. package/lib/providers/atlassian-jira/index.mjs +100 -0
  283. package/lib/providers/auth-manager.mjs +126 -0
  284. package/lib/providers/circuit-breaker.mjs +124 -0
  285. package/lib/providers/contract.mjs +93 -0
  286. package/lib/providers/github/index.mjs +126 -0
  287. package/lib/providers/registry.mjs +184 -0
  288. package/lib/providers/salesforce/index.mjs +100 -0
  289. package/lib/providers/slack/index.mjs +80 -0
  290. package/lib/reflect.mjs +137 -0
  291. package/lib/research-lint.mjs +164 -0
  292. package/lib/resources/budget.mjs +259 -0
  293. package/lib/role-preload.mjs +21 -6
  294. package/lib/roles/approval-surface.mjs +54 -0
  295. package/lib/roles/cli.mjs +118 -0
  296. package/lib/roles/event-bus.mjs +79 -0
  297. package/lib/roles/fence.mjs +84 -0
  298. package/lib/roles/gateway.mjs +260 -0
  299. package/lib/roles/hook-emit.mjs +37 -0
  300. package/lib/roles/manifest.mjs +48 -0
  301. package/lib/roles/router.mjs +27 -0
  302. package/lib/runtime-pressure.mjs +360 -0
  303. package/lib/schema-artifact.mjs +134 -0
  304. package/lib/schema-infer.mjs +551 -0
  305. package/lib/server/auth.mjs +168 -0
  306. package/lib/server/chat.mjs +336 -0
  307. package/lib/server/cors.mjs +77 -0
  308. package/lib/server/csrf.mjs +91 -0
  309. package/lib/server/index.mjs +1927 -78
  310. package/lib/server/insights.mjs +765 -0
  311. package/lib/server/rate-limit.mjs +91 -0
  312. package/lib/server/static/assets/index-ab25c707.js +70 -0
  313. package/lib/server/static/assets/index-f0c80a2b.css +1 -0
  314. package/lib/server/static/index.html +12 -817
  315. package/lib/server/telemetry-login.mjs +108 -0
  316. package/lib/server/webhook.mjs +510 -0
  317. package/lib/service-manager.mjs +522 -58
  318. package/lib/services/pattern-promotion-service.mjs +167 -0
  319. package/lib/services/telemetry-backend.mjs +178 -0
  320. package/lib/session-store.mjs +374 -0
  321. package/lib/setup-prompts.mjs +96 -0
  322. package/lib/setup.mjs +523 -36
  323. package/lib/skills-apply.mjs +280 -0
  324. package/lib/skills-scope.mjs +118 -0
  325. package/lib/status.mjs +261 -70
  326. package/lib/storage/admin.mjs +355 -0
  327. package/lib/storage/backend.mjs +2 -1
  328. package/lib/storage/backup.mjs +347 -0
  329. package/lib/storage/embeddings-engine.mjs +133 -0
  330. package/lib/storage/embeddings-legacy.mjs +85 -0
  331. package/lib/storage/embeddings-local.mjs +108 -0
  332. package/lib/storage/embeddings-ollama.mjs +78 -0
  333. package/lib/storage/embeddings-openai.mjs +85 -0
  334. package/lib/storage/embeddings.mjs +92 -33
  335. package/lib/storage/file-lock.mjs +130 -0
  336. package/lib/storage/fusion.mjs +95 -0
  337. package/lib/storage/hybrid-query.mjs +34 -27
  338. package/lib/storage/migrations.mjs +187 -0
  339. package/lib/storage/postgres-backup.mjs +124 -0
  340. package/lib/storage/sql-store.mjs +5 -15
  341. package/lib/storage/state-source.mjs +12 -13
  342. package/lib/storage/store-version.mjs +115 -0
  343. package/lib/storage/sync.mjs +144 -35
  344. package/lib/storage/unified-storage.mjs +550 -0
  345. package/lib/storage/vector-client.mjs +286 -0
  346. package/lib/storage/vector-store.mjs +71 -30
  347. package/lib/task-graph/generate.mjs +135 -0
  348. package/lib/task-graph/schema.mjs +81 -0
  349. package/lib/task-graph/store.mjs +71 -0
  350. package/lib/telemetry/backends/local.mjs +62 -0
  351. package/lib/telemetry/backends/{langfuse.mjs → remote.mjs} +27 -14
  352. package/lib/telemetry/backfill.mjs +180 -0
  353. package/lib/telemetry/eval-datasets.mjs +203 -0
  354. package/lib/telemetry/{langfuse-ingest.mjs → ingest.mjs} +26 -20
  355. package/lib/telemetry/intent-verifications.mjs +86 -0
  356. package/lib/telemetry/llm-judge.mjs +350 -0
  357. package/lib/telemetry/model-pricing-catalog.mjs +557 -0
  358. package/lib/telemetry/setup.mjs +151 -0
  359. package/lib/telemetry/skill-calls.mjs +78 -0
  360. package/lib/telemetry/team-rollup.mjs +4 -4
  361. package/lib/token-engine.js +117 -0
  362. package/lib/token-estimator-anthropic.js +15 -0
  363. package/lib/token-estimator-deepseek.js +13 -0
  364. package/lib/token-estimator-default.js +13 -0
  365. package/lib/token-estimator-google.js +13 -0
  366. package/lib/token-estimator-openai.js +13 -0
  367. package/lib/toolkit-env.mjs +1 -1
  368. package/lib/tty-prompts.mjs +211 -0
  369. package/lib/uninstall/uninstall.mjs +423 -0
  370. package/lib/update.mjs +115 -0
  371. package/lib/upgrade.mjs +141 -0
  372. package/lib/validator.mjs +51 -2
  373. package/lib/validators/skills.mjs +142 -0
  374. package/lib/wireframe.mjs +422 -0
  375. package/lib/worker/entrypoint.mjs +241 -0
  376. package/lib/worker/evidence.mjs +107 -0
  377. package/lib/worker/run.mjs +154 -0
  378. package/lib/worker/trace.mjs +182 -0
  379. package/lib/workflow-state.mjs +14 -18
  380. package/package.json +21 -8
  381. package/personas/construct.md +53 -51
  382. package/platforms/claude/CLAUDE.md +1 -1
  383. package/platforms/claude/settings.template.json +115 -68
  384. package/platforms/opencode/config.template.json +3 -7
  385. package/rules/common/agents.md +11 -38
  386. package/rules/common/beads-hygiene.md +75 -0
  387. package/rules/common/code-review.md +11 -100
  388. package/rules/common/coding-style.md +5 -3
  389. package/rules/common/comments.md +30 -111
  390. package/rules/common/commit-approval.md +53 -0
  391. package/rules/common/cx-agent-routing.md +1 -0
  392. package/rules/common/development-workflow.md +23 -41
  393. package/rules/common/doc-ownership.md +54 -0
  394. package/rules/common/efficiency.md +57 -0
  395. package/rules/common/framing.md +76 -0
  396. package/rules/common/git-workflow.md +2 -4
  397. package/rules/common/patterns.md +3 -7
  398. package/rules/common/performance.md +15 -31
  399. package/rules/common/release-gates.md +69 -0
  400. package/rules/common/research.md +107 -0
  401. package/rules/common/security.md +6 -6
  402. package/rules/common/skill-composition.md +67 -0
  403. package/rules/common/testing.md +15 -27
  404. package/rules/golang/hooks.md +0 -4
  405. package/rules/policy/bootstrap.yaml +11 -0
  406. package/rules/policy/drive.yaml +8 -0
  407. package/rules/policy/task.yaml +9 -0
  408. package/rules/policy/workflow.yaml +9 -0
  409. package/rules/python/hooks.md +0 -4
  410. package/rules/swift/hooks.md +0 -4
  411. package/rules/typescript/hooks.md +0 -4
  412. package/rules/web/hooks.md +0 -2
  413. package/{sync-agents.mjs → scripts/sync-agents.mjs} +306 -61
  414. package/skills/ai/prompt-optimizer.md +7 -7
  415. package/skills/compliance/ai-disclosure.md +58 -0
  416. package/skills/compliance/data-privacy.md +46 -0
  417. package/skills/compliance/license-audit.md +40 -0
  418. package/skills/compliance/regulatory-review.md +61 -0
  419. package/skills/docs/document-ingest-workflow.md +52 -0
  420. package/skills/docs/evidence-ingest-workflow.md +9 -0
  421. package/skills/docs/init-docs.md +51 -18
  422. package/skills/docs/product-intelligence-workflow.md +12 -0
  423. package/skills/docs/product-signal-workflow.md +4 -0
  424. package/skills/docs/research-workflow.md +23 -8
  425. package/skills/docs/runbook-workflow.md +1 -1
  426. package/skills/operating/orchestration-reference.md +151 -0
  427. package/skills/roles/architect.md +5 -0
  428. package/skills/roles/engineer.md +32 -0
  429. package/skills/roles/operator.md +12 -0
  430. package/skills/roles/reviewer.md +23 -0
  431. package/skills/routing.md +1 -1
  432. package/templates/devcontainer/Dockerfile.devcontainer +38 -0
  433. package/templates/devcontainer/devcontainer.json +31 -0
  434. package/templates/distribution/bootstrap.ps1 +142 -0
  435. package/templates/distribution/bootstrap.sh +196 -0
  436. package/templates/distribution/run.mjs +187 -0
  437. package/templates/docs/adr.md +44 -8
  438. package/templates/docs/changelog-entry.md +43 -0
  439. package/templates/docs/construct_guide.md +149 -0
  440. package/templates/docs/evidence-brief.md +2 -2
  441. package/templates/docs/meta-prd.md +140 -19
  442. package/templates/docs/onboarding.md +57 -0
  443. package/templates/docs/prd.md +159 -15
  444. package/templates/docs/research-brief.md +4 -4
  445. package/templates/homebrew/construct.rb +67 -0
  446. package/langfuse/docker-compose.yml +0 -82
  447. package/lib/eval-harness.mjs +0 -59
  448. package/lib/hooks/bootstrap-guard.mjs +0 -90
  449. package/lib/hooks/console-warn.mjs +0 -43
  450. package/lib/hooks/continuation-enforcer.mjs +0 -72
  451. package/lib/hooks/drive-guard.mjs +0 -89
  452. package/lib/hooks/mcp-task-scope.mjs +0 -47
  453. package/lib/hooks/task-completed-guard.mjs +0 -43
  454. package/lib/hooks/teammate-idle-guard.mjs +0 -54
  455. package/lib/hooks/workflow-guard.mjs +0 -62
  456. package/lib/prompt-composer.mjs +0 -196
  457. package/lib/review.mjs +0 -429
  458. package/lib/server/static/app.js +0 -841
  459. package/lib/telemetry/langfuse-model-sync.mjs +0 -270
  460. package/rules/common/hooks.md +0 -35
  461. package/rules/zh/README.md +0 -113
  462. package/rules/zh/agents.md +0 -55
  463. package/rules/zh/code-review.md +0 -129
  464. package/rules/zh/coding-style.md +0 -53
  465. package/rules/zh/development-workflow.md +0 -49
  466. package/rules/zh/git-workflow.md +0 -29
  467. package/rules/zh/hooks.md +0 -35
  468. package/rules/zh/patterns.md +0 -36
  469. package/rules/zh/performance.md +0 -60
  470. package/rules/zh/security.md +0 -34
  471. package/rules/zh/testing.md +0 -34
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bin/construct-postinstall.mjs — npm postinstall hook for consumer projects.
4
+ *
5
+ * When a downstream project pins `@geraldmaron/construct` as a (dev)Dependency
6
+ * and runs `npm install`, npm fetches Construct into the project's
7
+ * `node_modules/` and then runs this script. Its job: regenerate the project's
8
+ * `.claude/agents/` and `.claude/settings.json` from the bundled registry so
9
+ * the project clone is fully runnable without a manual `construct setup`.
10
+ *
11
+ * The script is a no-op in three cases:
12
+ *
13
+ * 1. The install is happening inside the Construct repo itself.
14
+ * 2. CONSTRUCT_SKIP_POSTINSTALL=1 is set.
15
+ * 3. The install target has no package.json (monorepo nested installs).
16
+ *
17
+ * Staging itself lives in `lib/install/stage-project.mjs` so `construct init`
18
+ * can call the same code path for opt-in adoption after a clone.
19
+ */
20
+
21
+ import { spawnSync } from 'node:child_process';
22
+ import { existsSync, statSync, readFileSync } from 'node:fs';
23
+ import path from 'node:path';
24
+ import { fileURLToPath } from 'node:url';
25
+
26
+ import { stageProjectAdapters } from '../lib/install/stage-project.mjs';
27
+
28
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
29
+ const PKG_ROOT = path.resolve(HERE, '..');
30
+ const PKG_VERSION = (() => {
31
+ try { return JSON.parse(readFileSync(path.join(PKG_ROOT, 'package.json'), 'utf8')).version || ''; }
32
+ catch { return ''; }
33
+ })();
34
+
35
+ const log = (msg) => process.stdout.write(`[construct-postinstall] ${msg}\n`);
36
+
37
+ if (process.env.CONSTRUCT_SKIP_POSTINSTALL === '1') {
38
+ log('skipping (CONSTRUCT_SKIP_POSTINSTALL=1)');
39
+ process.exit(0);
40
+ }
41
+
42
+ const initCwd = process.env.INIT_CWD || process.cwd();
43
+
44
+ // Skip when installing inside the Construct repo itself, but still wire up
45
+ // the local commit template so contributors get the right editor scaffolding.
46
+ try {
47
+ const pkgRealRoot = statSync(PKG_ROOT).isDirectory() ? PKG_ROOT : null;
48
+ if (pkgRealRoot && pkgRealRoot.startsWith(initCwd) && initCwd === PKG_ROOT) {
49
+ log('install is inside the Construct repo itself; skipping sync');
50
+ if (existsSync(path.join(PKG_ROOT, '.gitmessage')) && existsSync(path.join(PKG_ROOT, '.git'))) {
51
+ const cfg = spawnSync('git', ['config', 'commit.template', '.gitmessage'], {
52
+ cwd: PKG_ROOT,
53
+ stdio: 'ignore',
54
+ });
55
+ if (cfg.status === 0) log('configured git commit.template -> .gitmessage');
56
+ }
57
+ process.exit(0);
58
+ }
59
+ } catch { /* fall through */ }
60
+
61
+ // Require a package.json at the install target so monorepo nested installs
62
+ // don't accidentally trigger staging in the wrong directory.
63
+
64
+ const consumerPkgPath = path.join(initCwd, 'package.json');
65
+ if (!existsSync(consumerPkgPath)) {
66
+ log(`no package.json at ${initCwd}; skipping`);
67
+ process.exit(0);
68
+ }
69
+
70
+ let consumerPkg = {};
71
+ try { consumerPkg = JSON.parse(readFileSync(consumerPkgPath, 'utf8')); } catch { /* empty */ }
72
+ if (consumerPkg.name === '@geraldmaron/construct') {
73
+ log('install target is the Construct package itself; skipping');
74
+ process.exit(0);
75
+ }
76
+
77
+ try {
78
+ stageProjectAdapters({
79
+ projectRoot: initCwd,
80
+ packageRoot: PKG_ROOT,
81
+ pkgVersion: PKG_VERSION,
82
+ log,
83
+ });
84
+ } catch (err) {
85
+ log(`staging failed: ${err.message}; leaving project in a clean state`);
86
+ process.exit(0);
87
+ }
@@ -13,9 +13,9 @@ Before writing a line:
13
13
  1. Read every file you will touch. Understand the existing pattern before deviating.
14
14
  2. If the approach is uncertain, consult cx-architect first.
15
15
 
16
- Verification before done:
17
- - [ ] Changed files compile without errors
18
- - [ ] Existing tests still pass
19
- - [ ] New behavior has test coverage
20
- - [ ] No hardcoded secrets or debug statements
21
- - [ ] No file over 800 lines
16
+ When dispatching subagents: set an implicit timeout expectation. If a dispatched agent
17
+ produces no output or tool activity within two minutes, surface it to the user with the
18
+ agent description and elapsed time rather than waiting silently. Do not re-dispatch until
19
+ the user confirms the prior invocation is not still running.
20
+
21
+ Verification protocol is owned by `cx-engineer` apply its checklist before declaring done.
@@ -1,11 +1,11 @@
1
1
  <!--
2
- commands/plan/feature.md — Plan a feature and import it as workflow task packets
2
+ commands/plan/feature.md — Plan a feature and turn it into a tracker-linked implementation plan
3
3
 
4
4
  Produces a structured spec using the canonical Construct plan format, saves it
5
- to .cx/plans/, and calls workflow_import_plan to create full bead packets.
5
+ to .cx/plans/ as a durable planning artifact linked to the active tracker slice.
6
6
  -->
7
7
  ---
8
- description: Plan a feature — produce a structured spec and import it as workflow task packets
8
+ description: Plan a feature — produce a structured spec and link it to the active tracker-backed plan
9
9
  ---
10
10
 
11
11
  You are Construct. Plan the following: $ARGUMENTS
@@ -45,5 +45,6 @@ Rules:
45
45
 
46
46
  ## Step 3 — Save and import
47
47
  1. Save this full plan to `.cx/plans/{slug}-plan.md`
48
- 2. Call `workflow_import_plan` with the Tasks section markdown and `spec_ref` = the saved plan path
49
- 3. Report: tasks created, plan path, workflow summary
48
+ 2. If the project uses Beads or another external tracker, include the issue id in the plan and keep the current `plan.md` aligned with it
49
+ 3. Declare file ownership explicitly so parallel work still follows the single-writer rule
50
+ 4. Report: tracker links, plan path, and ownership boundaries
@@ -21,4 +21,4 @@ Do not proceed to implementation until these are clear.
21
21
 
22
22
  ## Next step
23
23
 
24
- Once requirements are agreed, run `/plan feature {topic}` to produce a structured implementation plan and import it as workflow task packets (beads) into `.cx/workflow.json`.
24
+ Once requirements are agreed, run `/plan feature {topic}` to produce a structured implementation plan tied to the tracker and `plan.md`.
@@ -10,7 +10,7 @@ description: Status — current project state, workflow, uncommitted changes, re
10
10
  You are Construct. Report status for: $ARGUMENTS
11
11
 
12
12
  Check and report:
13
- 1. Workflow state from `.cx/workflow.json` (if it exists) phase, active tasks, blockers
13
+ 1. Tracker and `plan.md` state active slices, blockers, and ownership boundaries
14
14
  2. Uncommitted changes via `git status`
15
15
  3. Recent commits via `git log --oneline -10`
16
16
  4. Active branch and relationship to main
@@ -11,7 +11,7 @@ You are Construct in drive mode. Execute $ARGUMENTS fully and autonomously witho
11
11
 
12
12
  ## Execution contract
13
13
 
14
- Use the code-backed orchestration policy and workflow task packets as the control plane.
14
+ Use the code-backed orchestration policy, tracker state, and `plan.md` as the control plane.
15
15
  This command turns off planning confirmation, but it does not override validation, acceptance criteria, or approval boundaries.
16
16
 
17
17
  ## Execution Loop
@@ -20,7 +20,7 @@ This command turns off planning confirmation, but it does not override validatio
20
20
  Map the codebase areas relevant to the task. Identify entry points, dependencies, and affected modules.
21
21
 
22
22
  **Step 2 — Plan** (cx-architect)
23
- Produce a structured plan using the canonical Construct plan format (see `commands/plan/feature.md` — `### T{N} — Title` sections with fielded sub-bullets). Save it to `.cx/plans/{slug}-plan.md`, then call `workflow_import_plan` with the Tasks section markdown and `spec_ref` = saved plan path. That populates `.cx/workflow.json` with full bead packets (files, readFirst, doNotChange, acceptanceCriteria, dependsOn). Identify tasks that can run in parallel by inspecting `dependsOn`.
23
+ Produce a structured plan using the canonical Construct plan format (see `commands/plan/feature.md` — `### T{N} — Title` sections with fielded sub-bullets). Save it to `.cx/plans/{slug}-plan.md`, align `plan.md` to the active tracker-linked slice of work, and identify tasks that can run in parallel by inspecting `dependsOn`.
24
24
 
25
25
  Initialize `.cx/drive-state.json`:
26
26
  ```json
@@ -66,4 +66,4 @@ Only stop when ALL of the following are true:
66
66
  - Do not stop to ask for confirmation. If blocked by genuine ambiguity, surface the specific blocker and propose a resolution before stopping.
67
67
  - Prefer parallel execution for independent tasks.
68
68
  - Write verification evidence into each workflow task before marking it `done`.
69
- - If context is running low, save state to `.cx/workflow.json` and summarize the handoff point.
69
+ - If context is running low, summarize the current handoff point in `plan.md` or the tracker and preserve the single-writer boundary for each file.
@@ -1,10 +1,10 @@
1
1
  <!--
2
2
  commands/work/optimize-prompts.md — Prompt optimization command.
3
3
 
4
- Runs the closed-loop prompt optimization workflow using Langfuse trace data.
4
+ Runs the closed-loop prompt optimization workflow using telemetry trace data.
5
5
  -->
6
6
  ---
7
- description: Closed-loop prompt optimization — read Langfuse traces, diagnose failures, push improved version to staging
7
+ description: Closed-loop prompt optimization — read telemetry traces, diagnose failures, push improved version to staging
8
8
  ---
9
9
 
10
10
  You are cx-trace-reviewer running a prompt optimization cycle for: $ARGUMENTS
@@ -19,7 +19,7 @@ Optimize prompt fragments and overlays, not the runtime orchestration policy. If
19
19
  ## Required steps
20
20
 
21
21
  1. **Read current prompt** — read the agent's prompt from `agents/registry.json` (or its `promptFile`)
22
- 2. **Fetch recent scores** — GET `{LANGFUSE_BASEURL}/api/public/scores?name=quality&limit=200`
22
+ 2. **Fetch recent scores** — GET `{CONSTRUCT_TELEMETRY_URL}/api/public/scores?name=quality&limit=200`
23
23
  3. **Skip agents with fewer than 20 scored traces** — insufficient signal; note them but do not optimize
24
24
  4. **Diagnose failure patterns** — analyze low-scoring traces, identify top 3 recurring patterns
25
25
  5. **Generate improved prompt** — targeted edits that address failures without breaking high-scoring behaviors
@@ -1,3 +1,5 @@
1
+ create extension if not exists vector;
2
+
1
3
  create table if not exists construct_documents (
2
4
  id text primary key,
3
5
  project text not null,
@@ -0,0 +1,182 @@
1
+ -- db/schema/002_pgvector.sql
2
+ -- Enable pgvector extension and add vector-typed columns for semantic search.
3
+ -- This migration is idempotent — safe to run multiple times.
4
+
5
+ -- Enable pgvector extension
6
+ CREATE EXTENSION IF NOT EXISTS vector;
7
+
8
+ -- Add vector column to construct_embeddings if it doesn't exist yet
9
+ -- (The original 001_init.sql used double precision[], which we keep for backward compat)
10
+ DO $$
11
+ BEGIN
12
+ -- Check if embedding column is still array type and needs migration
13
+ IF EXISTS (
14
+ SELECT 1 FROM information_schema.columns
15
+ WHERE table_name = 'construct_embeddings'
16
+ AND column_name = 'embedding'
17
+ AND data_type = 'ARRAY'
18
+ ) THEN
19
+ -- Add new vector column
20
+ ALTER TABLE construct_embeddings ADD COLUMN embedding_vec vector(384);
21
+
22
+ -- Copy data from old array column to new vector column
23
+ UPDATE construct_embeddings
24
+ SET embedding_vec = embedding::vector(384);
25
+
26
+ -- Drop old column and rename
27
+ ALTER TABLE construct_embeddings DROP COLUMN embedding;
28
+ ALTER TABLE construct_embeddings RENAME COLUMN embedding_vec TO embedding;
29
+ END IF;
30
+ END $$;
31
+
32
+ -- Ensure embedding column exists as vector type (for fresh installs)
33
+ ALTER TABLE construct_embeddings
34
+ ALTER COLUMN embedding TYPE vector(384) USING embedding::vector(384);
35
+
36
+ -- Create HNSW index for fast approximate nearest neighbor search
37
+ CREATE INDEX IF NOT EXISTS idx_embeddings_hnsw
38
+ ON construct_embeddings
39
+ USING hnsw (embedding vector_cosine_ops)
40
+ WITH (m = 16, ef_construction = 64);
41
+
42
+ -- Create observations table with vector support
43
+ CREATE TABLE IF NOT EXISTS construct_observations (
44
+ id text PRIMARY KEY,
45
+ project text NOT NULL,
46
+ role text NOT NULL,
47
+ category text NOT NULL,
48
+ summary text NOT NULL,
49
+ content text NOT NULL,
50
+ tags jsonb NOT NULL DEFAULT '[]'::jsonb,
51
+ confidence float NOT NULL DEFAULT 0.8,
52
+ source text,
53
+ git_sha text,
54
+ created_at timestamptz NOT NULL DEFAULT now(),
55
+ updated_at timestamptz NOT NULL DEFAULT now(),
56
+ embedding vector(384)
57
+ );
58
+
59
+ -- Indexes for observations
60
+ CREATE INDEX IF NOT EXISTS idx_observations_project ON construct_observations(project);
61
+ CREATE INDEX IF NOT EXISTS idx_observations_category ON construct_observations(project, category);
62
+ CREATE INDEX IF NOT EXISTS idx_observations_created_at ON construct_observations(project, created_at DESC);
63
+ CREATE INDEX IF NOT EXISTS idx_observations_vector ON construct_observations USING hnsw (embedding vector_cosine_ops);
64
+
65
+ -- Create sessions table with vector support
66
+ CREATE TABLE IF NOT EXISTS construct_sessions (
67
+ id text PRIMARY KEY,
68
+ project text NOT NULL,
69
+ platform text,
70
+ summary text,
71
+ decisions jsonb DEFAULT '[]'::jsonb,
72
+ files_changed jsonb DEFAULT '[]'::jsonb,
73
+ open_questions jsonb DEFAULT '[]'::jsonb,
74
+ task_snapshot jsonb DEFAULT '[]'::jsonb,
75
+ status text DEFAULT 'active',
76
+ created_at timestamptz NOT NULL DEFAULT now(),
77
+ updated_at timestamptz NOT NULL DEFAULT now(),
78
+ embedding vector(384)
79
+ );
80
+
81
+ CREATE INDEX IF NOT EXISTS idx_sessions_project ON construct_sessions(project);
82
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON construct_sessions(project, status);
83
+ CREATE INDEX IF NOT EXISTS idx_sessions_vector ON construct_sessions USING hnsw (embedding vector_cosine_ops);
84
+
85
+ -- Create entities table with vector support
86
+ CREATE TABLE IF NOT EXISTS construct_entities (
87
+ name text PRIMARY KEY,
88
+ type text NOT NULL,
89
+ summary text,
90
+ project text,
91
+ observation_ids jsonb DEFAULT '[]'::jsonb,
92
+ related_entities jsonb DEFAULT '[]'::jsonb,
93
+ created_at timestamptz NOT NULL DEFAULT now(),
94
+ updated_at timestamptz NOT NULL DEFAULT now(),
95
+ last_seen timestamptz,
96
+ embedding vector(384)
97
+ );
98
+
99
+ CREATE INDEX IF NOT EXISTS idx_entities_type ON construct_entities(type);
100
+ CREATE INDEX IF NOT EXISTS idx_entities_project ON construct_entities(project);
101
+ CREATE INDEX IF NOT EXISTS idx_entities_vector ON construct_entities USING hnsw (embedding vector_cosine_ops);
102
+
103
+ -- Function for searching documents by embedding
104
+ CREATE OR REPLACE FUNCTION search_documents(
105
+ project_name text,
106
+ query_embedding vector(384),
107
+ match_limit int DEFAULT 10,
108
+ min_similarity float DEFAULT 0.3
109
+ )
110
+ RETURNS TABLE(
111
+ id text,
112
+ title text,
113
+ summary text,
114
+ body text,
115
+ source_path text,
116
+ tags jsonb,
117
+ kind text,
118
+ similarity float
119
+ ) AS $$
120
+ BEGIN
121
+ RETURN QUERY
122
+ SELECT
123
+ d.id,
124
+ d.title,
125
+ d.summary,
126
+ d.body,
127
+ d.source_path,
128
+ d.tags,
129
+ d.kind,
130
+ 1 - (e.embedding <=> query_embedding) AS similarity
131
+ FROM construct_documents d
132
+ JOIN construct_embeddings e ON d.id = e.document_id
133
+ WHERE d.project = project_name
134
+ AND 1 - (e.embedding <=> query_embedding) > min_similarity
135
+ ORDER BY e.embedding <=> query_embedding
136
+ LIMIT match_limit;
137
+ END;
138
+ $$ LANGUAGE plpgsql;
139
+
140
+ -- Function for searching observations by embedding
141
+ CREATE OR REPLACE FUNCTION search_observations(
142
+ project_name text,
143
+ query_embedding vector(384),
144
+ match_limit int DEFAULT 10,
145
+ min_similarity float DEFAULT 0.3,
146
+ filter_role text DEFAULT NULL,
147
+ filter_category text DEFAULT NULL
148
+ )
149
+ RETURNS TABLE(
150
+ id text,
151
+ role text,
152
+ category text,
153
+ summary text,
154
+ content text,
155
+ tags jsonb,
156
+ confidence float,
157
+ source text,
158
+ created_at timestamptz,
159
+ similarity float
160
+ ) AS $$
161
+ BEGIN
162
+ RETURN QUERY
163
+ SELECT
164
+ o.id,
165
+ o.role,
166
+ o.category,
167
+ o.summary,
168
+ o.content,
169
+ o.tags,
170
+ o.confidence,
171
+ o.source,
172
+ o.created_at,
173
+ 1 - (o.embedding <=> query_embedding) AS similarity
174
+ FROM construct_observations o
175
+ WHERE o.project = project_name
176
+ AND 1 - (o.embedding <=> query_embedding) > min_similarity
177
+ AND (filter_role IS NULL OR o.role = filter_role)
178
+ AND (filter_category IS NULL OR o.category = filter_category)
179
+ ORDER BY o.embedding <=> query_embedding
180
+ LIMIT match_limit;
181
+ END;
182
+ $$ LANGUAGE plpgsql;
@@ -0,0 +1,47 @@
1
+ -- 003_intake.sql — R&D intake queue backing table for team and enterprise mode.
2
+ -- Solo mode uses the filesystem under .cx/intake/ instead.
3
+ --
4
+ -- Worker claim algorithm: SELECT ... FROM construct_intake_items
5
+ -- WHERE status = 'pending' ORDER BY created_at ASC FOR UPDATE SKIP LOCKED LIMIT 1;
6
+ -- then set status = 'claimed', claimed_by, claimed_at in the same transaction.
7
+ --
8
+ -- payload jsonb carries the rest of the intake packet (intake, triage,
9
+ -- suggestion, related, excerpt, query) so the on-disk shape and the
10
+ -- in-table shape stay aligned.
11
+
12
+ create table if not exists construct_intake_items (
13
+ id text primary key,
14
+ project text not null,
15
+ tenant_id text,
16
+ status text not null default 'pending',
17
+ intake_type text,
18
+ rd_stage text,
19
+ primary_owner text,
20
+ recommended_action text,
21
+ risk text,
22
+ requires_approval boolean not null default false,
23
+ confidence double precision,
24
+ payload jsonb not null,
25
+ created_at timestamptz not null default now(),
26
+ updated_at timestamptz not null default now(),
27
+ claimed_by text,
28
+ claimed_at timestamptz,
29
+ processed_at timestamptz,
30
+ processed_by text,
31
+ notes text,
32
+ skipped_at timestamptz,
33
+ skipped_by text,
34
+ skip_reason text
35
+ );
36
+
37
+ create index if not exists construct_intake_items_status_idx
38
+ on construct_intake_items(status, created_at);
39
+
40
+ create index if not exists construct_intake_items_owner_idx
41
+ on construct_intake_items(primary_owner, status, created_at);
42
+
43
+ create index if not exists construct_intake_items_payload_gin_idx
44
+ on construct_intake_items using gin(payload);
45
+
46
+ create index if not exists construct_intake_items_project_tenant_idx
47
+ on construct_intake_items(project, tenant_id, status);
@@ -0,0 +1,85 @@
1
+ # Prompt Example Fixtures
2
+
3
+ This directory holds shipped example fixtures for Construct's public persona and internal role layers.
4
+
5
+ Use it for three things:
6
+
7
+ - golden examples: canonical strong behavior worth preserving
8
+ - bad examples: labeled failure modes that should fail review/eval
9
+ - boundary and adversarial examples: ambiguity, escalation, stale context, and injection pressure
10
+
11
+ Best practice in this repo:
12
+
13
+ - keep the public persona and internal specialist prompts lean and rule-based
14
+ - keep most examples here as regression fixtures, not embedded into prompt bodies
15
+ - use bad examples as critique and eval assets, not as raw few-shot prompt content
16
+ - add in-prompt examples only when behavior is hard to specify precisely in rules
17
+
18
+ ## Layout
19
+
20
+ ```text
21
+ examples/
22
+ ├── personas/
23
+ │ └── construct/
24
+ │ ├── golden/
25
+ │ ├── bad/
26
+ │ ├── boundary/
27
+ │ └── adversarial/
28
+ └── internal/
29
+ └── roles/
30
+ ├── architect/
31
+ ├── engineer/
32
+ ├── orchestrator/
33
+ ├── qa/
34
+ └── reviewer/
35
+ ```
36
+
37
+ ## Fixture format
38
+
39
+ Each fixture is markdown with YAML frontmatter.
40
+
41
+ Required frontmatter:
42
+
43
+ - `id`: stable fixture id
44
+ - `surface`: `persona` or `internal-role`
45
+ - `name`: fixture target name, such as `construct` or `engineer`
46
+ - `category`: `golden`, `bad`, `boundary`, or `adversarial`
47
+ - `verdict`: `pass` or `fail`
48
+ - `summary`: one-line purpose
49
+
50
+ Recommended frontmatter:
51
+
52
+ - `references`: prompt or role files this fixture exercises
53
+ - `tags`: stable labels for filtering and future eval harnesses
54
+
55
+ Required body sections:
56
+
57
+ - `## User`
58
+ - `## Expected`
59
+
60
+ Bad fixtures should also include:
61
+
62
+ - `## Why This Fails`
63
+
64
+ ## Coverage policy
65
+
66
+ Required public coverage:
67
+
68
+ - `construct`: at least one `golden`, `bad`, `boundary`, and `adversarial`
69
+
70
+ Required internal coverage:
71
+
72
+ - `architect`, `engineer`, `reviewer`, `qa`, and `orchestrator`: at least one `golden` and one `bad`
73
+
74
+ ## Authoring rules
75
+
76
+ - Keep fixtures short and behaviorally specific.
77
+ - Prefer one core contract per fixture.
78
+ - Name the expected behavior in repo terms: branch confirmation, approval boundary, routing, verification, blocker surfacing, anti-pattern avoidance.
79
+ - For bad examples, show the failure plainly and explain why it violates the surface contract.
80
+
81
+ See `docs/concepts/prompt-surfaces.md` for the canonical public-vs-internal taxonomy.
82
+
83
+ ## Scope
84
+
85
+ These fixtures are shipped examples and regression assets. They are not yet executed by a model harness, but the structure is designed so a future evaluator can consume them without reshaping the corpus.
@@ -0,0 +1,30 @@
1
+ ---
2
+ id: architect-bad-clever-plan-without-contracts
3
+ surface: internal-role
4
+ name: architect
5
+ category: bad
6
+ verdict: fail
7
+ summary: Recommends a clever architecture without exposing contracts or rejected alternatives.
8
+ references:
9
+ - skills/roles/architect.md
10
+ - agents/prompts/cx-architect.md
11
+ tags:
12
+ - missing-contracts
13
+ - hidden-dependencies
14
+ ---
15
+
16
+ ## User
17
+
18
+ Design the runtime coordination layer.
19
+
20
+ ## Expected
21
+
22
+ This is a bad outcome:
23
+
24
+ ```text
25
+ We should add a shared coordinator and let each module figure it out dynamically.
26
+ ```
27
+
28
+ ## Why This Fails
29
+
30
+ It hides the interface contract, does not expose tradeoffs, and gives no basis for downstream engineering or review.
@@ -0,0 +1,23 @@
1
+ ---
2
+ id: architect-golden-explicit-tradeoff-before-plan
3
+ surface: internal-role
4
+ name: architect
5
+ category: golden
6
+ verdict: pass
7
+ summary: Makes interface and dependency tradeoffs explicit before locking in a plan.
8
+ references:
9
+ - skills/roles/architect.md
10
+ - agents/prompts/cx-architect.md
11
+ tags:
12
+ - tradeoffs
13
+ - contracts
14
+ - architecture
15
+ ---
16
+
17
+ ## User
18
+
19
+ Plan the auth/session split across modules.
20
+
21
+ ## Expected
22
+
23
+ Strong architect behavior names the relevant module boundaries, interface contracts, and tradeoffs before recommending a plan. It does not skip directly to file changes or implementation detail.
@@ -0,0 +1,30 @@
1
+ ---
2
+ id: engineer-bad-speculative-abstraction
3
+ surface: internal-role
4
+ name: engineer
5
+ category: bad
6
+ verdict: fail
7
+ summary: Introduces an abstraction for future cases without evidence from the code.
8
+ references:
9
+ - skills/roles/engineer.md
10
+ - agents/prompts/cx-engineer.md
11
+ tags:
12
+ - speculative-abstraction
13
+ - unnecessary-surface-area
14
+ ---
15
+
16
+ ## User
17
+
18
+ Add support for this one new storage backend.
19
+
20
+ ## Expected
21
+
22
+ This is a bad outcome:
23
+
24
+ ```text
25
+ I introduced a generic provider factory, backend registry, pluggable resolver, and four config flags so future backends are easy.
26
+ ```
27
+
28
+ ## Why This Fails
29
+
30
+ It violates the engineer anti-pattern against speculative abstraction. The current case asks for one concrete backend, not a framework for hypothetical future ones.
@@ -0,0 +1,28 @@
1
+ ---
2
+ id: engineer-golden-read-before-write
3
+ surface: internal-role
4
+ name: engineer
5
+ category: golden
6
+ verdict: pass
7
+ summary: Reads the touched files and surrounding pattern before proposing code changes.
8
+ references:
9
+ - skills/roles/engineer.md
10
+ - agents/prompts/cx-engineer.md
11
+ tags:
12
+ - read-before-write
13
+ - local-conventions
14
+ ---
15
+
16
+ ## User
17
+
18
+ Rename the auth token helper and update its callers.
19
+
20
+ ## Expected
21
+
22
+ Strong engineer behavior reads the helper and at least one caller before drafting the change. It does not jump straight to abstraction or a blind rename.
23
+
24
+ The contract is:
25
+
26
+ - surrounding file is read first
27
+ - at least one caller or call site is examined
28
+ - edits follow existing local conventions
@@ -0,0 +1,29 @@
1
+ ---
2
+ id: orchestrator-bad-everything-becomes-multi-agent
3
+ surface: internal-role
4
+ name: orchestrator
5
+ category: bad
6
+ verdict: fail
7
+ summary: Treats a simple ask as a full orchestrated workflow.
8
+ references:
9
+ - skills/roles/orchestrator.md
10
+ tags:
11
+ - over-orchestration
12
+ - ceremony
13
+ ---
14
+
15
+ ## User
16
+
17
+ What file defines the main persona?
18
+
19
+ ## Expected
20
+
21
+ This is a bad outcome:
22
+
23
+ ```text
24
+ Plan: cx-architect for discovery, cx-explorer for repo mapping, cx-reviewer for quality, then cx-docs-keeper for synthesis.
25
+ ```
26
+
27
+ ## Why This Fails
28
+
29
+ It violates the orchestrator contract to classify first and choose the smallest adequate path.