@event4u/agent-config 9.7.0 → 9.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (901) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +314 -190
  3. package/CONTRIBUTING.md +23 -7
  4. package/MIGRATION.md +20 -0
  5. package/README.md +57 -11
  6. package/dist/agent-src/commands/agents/audit.md +1 -1
  7. package/dist/agent-src/commands/agents/optimize.md +2 -2
  8. package/dist/agent-src/commands/agents/user.md +1 -1
  9. package/dist/agent-src/commands/agents.md +1 -1
  10. package/dist/agent-src/commands/check-current-md.md +3 -3
  11. package/dist/agent-src/commands/commit/in-chunks.md +8 -0
  12. package/dist/agent-src/commands/commit.md +17 -0
  13. package/dist/agent-src/commands/fix/portability.md +2 -2
  14. package/dist/agent-src/commands/fix/pr-comments-loop.md +136 -0
  15. package/dist/agent-src/commands/fix/refs.md +2 -2
  16. package/dist/agent-src/commands/fix/route.md +4 -3
  17. package/dist/agent-src/commands/fix.md +9 -6
  18. package/dist/agent-src/commands/ghostwriter.md +1 -1
  19. package/dist/agent-src/commands/image.md +1 -1
  20. package/dist/agent-src/commands/optimize/augmentignore.md +1 -1
  21. package/dist/agent-src/commands/optimize/skills.md +2 -2
  22. package/dist/agent-src/commands/post-as.md +1 -1
  23. package/dist/agent-src/commands/pr/create.md +4 -0
  24. package/dist/agent-src/commands/research.md +1 -1
  25. package/dist/agent-src/commands/roadmap/ai-council.md +1 -1
  26. package/dist/agent-src/commands/security-audit-config.md +1 -1
  27. package/dist/agent-src/commands/team/delegate.md +4 -0
  28. package/dist/agent-src/commands/video.md +1 -1
  29. package/dist/agent-src/contexts/authority/kernel-rule-edits.md +1 -1
  30. package/dist/agent-src/contexts/contracts/emergency-triage-block.md +2 -2
  31. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +48 -2
  32. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +10 -0
  33. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +109 -8
  34. package/dist/agent-src/contexts/execution/subagent-response-contract.md +20 -0
  35. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +53 -3
  36. package/dist/agent-src/contexts/override-system.md +75 -5
  37. package/dist/agent-src/rules/code-provenance.md +112 -0
  38. package/dist/agent-src/rules/context-hygiene.md +2 -0
  39. package/dist/agent-src/rules/doc-screenshot-hygiene.md +97 -0
  40. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  41. package/dist/agent-src/rules/external-code-graph-interop.md +13 -3
  42. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
  43. package/dist/agent-src/rules/git-history-discipline.md +2 -0
  44. package/dist/agent-src/rules/history-discipline.md +80 -0
  45. package/dist/agent-src/rules/language-and-tone.md +2 -0
  46. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -0
  47. package/dist/agent-src/rules/media-governance-routing.md +2 -0
  48. package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
  49. package/dist/agent-src/rules/no-roadmap-references.md +4 -1
  50. package/dist/agent-src/rules/non-destructive-by-default.md +20 -0
  51. package/dist/agent-src/rules/onboarding-gate.md +2 -0
  52. package/dist/agent-src/rules/output-discipline.md +2 -0
  53. package/dist/agent-src/rules/persona-governance.md +2 -0
  54. package/dist/agent-src/rules/php-coding.md +1 -0
  55. package/dist/agent-src/rules/preservation-guard.md +3 -0
  56. package/dist/agent-src/rules/reviewer-awareness.md +1 -0
  57. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +1 -0
  58. package/dist/agent-src/rules/roadmap-progress-sync.md +9 -0
  59. package/dist/agent-src/rules/scale-discipline.md +92 -0
  60. package/dist/agent-src/rules/secret-vcs-guard.md +106 -0
  61. package/dist/agent-src/rules/security-sensitive-stop.md +11 -1
  62. package/dist/agent-src/rules/session-canary.md +77 -0
  63. package/dist/agent-src/rules/skill-quality.md +2 -0
  64. package/dist/agent-src/rules/source-confidentiality.md +2 -0
  65. package/dist/agent-src/rules/source-of-truth.md +2 -0
  66. package/dist/agent-src/rules/telegraph-speak.md +2 -0
  67. package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -1
  68. package/dist/agent-src/rules/tool-safety.md +4 -1
  69. package/dist/agent-src/rules/untrusted-input-defense.md +10 -0
  70. package/dist/agent-src/rules/verify-before-complete.md +2 -0
  71. package/dist/agent-src/skills/adr-create/SKILL.md +17 -1
  72. package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +97 -0
  74. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  75. package/dist/agent-src/skills/corpus-grounding/SKILL.md +0 -3
  76. package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
  77. package/dist/agent-src/skills/design-review/SKILL.md +5 -6
  78. package/dist/agent-src/skills/design-tokens/SKILL.md +0 -1
  79. package/dist/agent-src/skills/gated-reach/SKILL.md +185 -0
  80. package/dist/agent-src/skills/gated-reach/evals/triggers.json +72 -0
  81. package/dist/agent-src/skills/history-design/SKILL.md +101 -0
  82. package/dist/agent-src/skills/history-design/evals/triggers.json +17 -0
  83. package/dist/agent-src/skills/humanizer/SKILL.md +3 -3
  84. package/dist/agent-src/skills/image-analyser/SKILL.md +14 -12
  85. package/dist/agent-src/skills/image-editing/SKILL.md +2 -1
  86. package/dist/agent-src/skills/image-generation/SKILL.md +2 -1
  87. package/dist/agent-src/skills/image-provider-routing/SKILL.md +2 -2
  88. package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
  89. package/dist/agent-src/skills/license-compliance-audit/SKILL.md +161 -0
  90. package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +52 -0
  91. package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +145 -0
  92. package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +52 -0
  93. package/dist/agent-src/skills/license-compliance-credits/SKILL.md +97 -0
  94. package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +52 -0
  95. package/dist/agent-src/skills/md-language-check/SKILL.md +1 -1
  96. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  97. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +7 -7
  98. package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
  99. package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -2
  100. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +2 -2
  101. package/dist/agent-src/skills/readme-writing/SKILL.md +6 -1
  102. package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -0
  103. package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -3
  104. package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -0
  105. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +31 -12
  106. package/dist/agent-src/skills/rule-refactor/SKILL.md +3 -3
  107. package/dist/agent-src/skills/schema-review/SKILL.md +92 -0
  108. package/dist/agent-src/skills/schema-review/evals/triggers.json +17 -0
  109. package/dist/agent-src/skills/screenshot-hygiene/SKILL.md +171 -0
  110. package/dist/agent-src/skills/secrets-management/SKILL.md +43 -1
  111. package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
  112. package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +1 -1
  113. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -3
  114. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  115. package/dist/agent-src/skills/source-discovery/SKILL.md +5 -5
  116. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +45 -85
  117. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +5 -4
  118. package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +29 -0
  119. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge-two-stage.md +29 -0
  120. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge.md +29 -0
  121. package/dist/agent-src/skills/subagent-orchestration/prompts/do-competitively.md +29 -0
  122. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-parallel.md +29 -0
  123. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +29 -0
  124. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-worktrees.md +29 -0
  125. package/dist/agent-src/skills/subagent-orchestration/prompts/judge-with-debate.md +29 -0
  126. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  127. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +2 -3
  128. package/dist/agent-src/skills/token-optimizer/SKILL.md +4 -4
  129. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +4 -0
  130. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +2 -3
  131. package/dist/agent-src/templates/AGENTS.md +1 -1
  132. package/dist/agent-src/templates/agents/.gitattributes.fragment +25 -6
  133. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  134. package/dist/agent-src/templates/command.md +3 -3
  135. package/dist/agent-src/templates/github-workflows/secret-scan.yml +65 -0
  136. package/dist/agent-src/templates/persona.md +2 -2
  137. package/dist/agent-src/templates/rule.md +2 -2
  138. package/dist/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
  139. package/dist/agent-src/templates/scripts/telemetry_record.ts +33 -1
  140. package/dist/cli/commands/doctorShell.js +20 -0
  141. package/dist/cli/commands/doctorShell.js.map +1 -1
  142. package/dist/cli/commands/rtkDetect.js +58 -0
  143. package/dist/cli/commands/rtkDetect.js.map +1 -0
  144. package/dist/cli/configRoot.js +112 -0
  145. package/dist/cli/configRoot.js.map +1 -0
  146. package/dist/cli/configRoot.test.js +97 -0
  147. package/dist/cli/configRoot.test.js.map +1 -0
  148. package/dist/cli/firstRunNotice.js +70 -0
  149. package/dist/cli/firstRunNotice.js.map +1 -0
  150. package/dist/cli/help.js +4 -1
  151. package/dist/cli/help.js.map +1 -1
  152. package/dist/cli/main.js +54 -5
  153. package/dist/cli/main.js.map +1 -1
  154. package/dist/cli/registry.js +8 -1
  155. package/dist/cli/registry.js.map +1 -1
  156. package/dist/discovery/deprecation-report.md +1 -1
  157. package/dist/discovery/discovery-manifest.json +502 -101
  158. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  159. package/dist/discovery/discovery-manifest.summary.md +6 -4
  160. package/dist/discovery/orphan-report.md +1 -1
  161. package/dist/discovery/packs.json +95 -8
  162. package/dist/discovery/trust-report.md +11 -11
  163. package/dist/discovery/workspaces.json +36 -7
  164. package/dist/hooks/dispatch.js +19475 -0
  165. package/dist/install/agentSwitchDetection.js +75 -0
  166. package/dist/install/agentSwitchDetection.js.map +1 -0
  167. package/dist/install/agentSwitchProfile.js +117 -0
  168. package/dist/install/agentSwitchProfile.js.map +1 -0
  169. package/dist/install/atomic.js +1 -1
  170. package/dist/install/detect.js +1 -1
  171. package/dist/install/install.mjs +791 -486
  172. package/dist/install/rtkDetection.js +213 -0
  173. package/dist/install/rtkDetection.js.map +1 -0
  174. package/dist/install/rule_scope.js +2 -1
  175. package/dist/install/rule_scope.js.map +1 -1
  176. package/dist/install/types.js +2 -2
  177. package/dist/install/wizard-plan.js +1 -1
  178. package/dist/install/wizardDismissals.js +58 -0
  179. package/dist/install/wizardDismissals.js.map +1 -0
  180. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  181. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  182. package/dist/mcp/registry-manifest.json +15 -4
  183. package/dist/mcp/server.json +20 -0
  184. package/dist/mcp/server.mjs +44292 -0
  185. package/dist/router.json +1 -1
  186. package/dist/scripts/condense.js +14 -7
  187. package/dist/scripts/condense.js.map +1 -1
  188. package/dist/server/app.js +12 -0
  189. package/dist/server/app.js.map +1 -1
  190. package/dist/server/io/sharedWriteCheck.js +101 -0
  191. package/dist/server/io/sharedWriteCheck.js.map +1 -0
  192. package/dist/server/routes/ping.js +32 -0
  193. package/dist/server/routes/ping.js.map +1 -1
  194. package/dist/server/routes/settings.js +21 -4
  195. package/dist/server/routes/settings.js.map +1 -1
  196. package/dist/server/routes/userMd.js +21 -4
  197. package/dist/server/routes/userMd.js.map +1 -1
  198. package/dist/server/routes/wizard.js +68 -25
  199. package/dist/server/routes/wizard.js.map +1 -1
  200. package/dist/server/schemas/settings.js +12 -2
  201. package/dist/server/schemas/settings.js.map +1 -1
  202. package/dist/server/serverInfo.js +6 -2
  203. package/dist/server/serverInfo.js.map +1 -1
  204. package/dist/server/token.js +11 -4
  205. package/dist/server/token.js.map +1 -1
  206. package/dist/server/writeRoot.js +15 -1
  207. package/dist/server/writeRoot.js.map +1 -1
  208. package/dist/shared/capabilities.js +33 -0
  209. package/dist/shared/capabilities.js.map +1 -0
  210. package/dist/shared/capabilities.test.js +39 -0
  211. package/dist/shared/capabilities.test.js.map +1 -0
  212. package/dist/ui/assets/index-BpSQt5vm.js +40 -0
  213. package/dist/ui/assets/index-BpSQt5vm.js.map +1 -0
  214. package/dist/ui/assets/index-jSfMW8_t.css +1 -0
  215. package/dist/ui/index.html +15 -6
  216. package/docs/MIGRATION.md +16 -0
  217. package/docs/guidelines/component-oriented-and-oop-development.md +4 -2
  218. package/package.json +22 -9
  219. package/src/agent-src/templates/AGENTS.md +1 -1
  220. package/src/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
  221. package/src/agent-src/templates/scripts/telemetry_record.ts +33 -1
  222. package/src/config/agent-settings.template.yml +94 -13
  223. package/src/config/discovery/packs.yml +22 -0
  224. package/src/config/discovery/workspaces.yml +1 -1
  225. package/src/config/evaluator-budgets.json +47 -0
  226. package/src/config/hook-latency-budget.json +20 -0
  227. package/src/config/reach-channels.yml +217 -0
  228. package/src/config/reach-prescriptions-intake.yml +200 -0
  229. package/src/install/agentSwitchDetection.ts +90 -0
  230. package/src/install/agentSwitchProfile.ts +131 -0
  231. package/src/install/atomic.ts +1 -1
  232. package/src/install/detect.ts +1 -1
  233. package/src/install/rtkDetection.ts +274 -0
  234. package/src/install/rule_scope.ts +9 -2
  235. package/src/install/types.ts +2 -2
  236. package/src/install/wizard-plan.ts +1 -1
  237. package/src/install/wizardDismissals.ts +60 -0
  238. package/src/scripts/_cli/cmd_doctor.ts +62 -1
  239. package/src/scripts/_cli/cmd_memory_get.ts +197 -0
  240. package/src/scripts/_cli/cmd_refresh.ts +30 -0
  241. package/src/scripts/_dispatch.bash +96 -0
  242. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +64 -1
  243. package/src/scripts/_lib/auto_dispatch.ts +76 -0
  244. package/src/scripts/_lib/detect_target_license.ts +714 -0
  245. package/src/scripts/_lib/exec_evidence.ts +251 -0
  246. package/src/scripts/_lib/fixtures/secret-detector/negatives.txt +15 -0
  247. package/src/scripts/_lib/fixtures/secret-detector/positives.txt +15 -0
  248. package/src/scripts/_lib/install_drift.ts +194 -0
  249. package/src/scripts/_lib/kernel_rules.ts +46 -0
  250. package/src/scripts/_lib/memory_fts_index.ts +390 -0
  251. package/src/scripts/_lib/orchestration_record.ts +91 -2
  252. package/src/scripts/_lib/persistence/adapter_raw_sql.ts +443 -0
  253. package/src/scripts/_lib/persistence/detect_audit_coverage.ts +423 -0
  254. package/src/scripts/_lib/persistence/detect_bounded_reads.ts +154 -0
  255. package/src/scripts/_lib/persistence/detect_index_parity.ts +576 -0
  256. package/src/scripts/_lib/persistence/detect_n1_eloquent.ts +226 -0
  257. package/src/scripts/_lib/persistence/detect_offload.ts +441 -0
  258. package/src/scripts/_lib/persistence/detect_prisma_growth.ts +74 -0
  259. package/src/scripts/_lib/persistence/offload_catalog.ts +73 -0
  260. package/src/scripts/_lib/persistence/types.ts +109 -0
  261. package/src/scripts/_lib/reddit_thread_parse.ts +598 -0
  262. package/src/scripts/_lib/risk_paths.ts +160 -0
  263. package/src/scripts/_lib/rtk_allowlist.ts +44 -0
  264. package/src/scripts/_lib/secret_detector.test.ts +108 -0
  265. package/src/scripts/_lib/secret_detector.ts +328 -0
  266. package/src/scripts/_lib/secret_detector_adversarial.test.ts +116 -0
  267. package/src/scripts/_lib/spawn_env.ts +7 -0
  268. package/src/scripts/_lib/sqlite_guard.ts +191 -0
  269. package/src/scripts/_lib/subagent_spawn.ts +53 -0
  270. package/src/scripts/_lib/tool_probe.ts +359 -0
  271. package/src/scripts/_lib/worker_budget.ts +107 -0
  272. package/src/scripts/adr/regenerate_index.ts +81 -6
  273. package/src/scripts/ai_council/blind_review.ts +0 -0
  274. package/src/scripts/ai_council/config.ts +12 -6
  275. package/src/scripts/ai_council/orchestrator.ts +73 -3
  276. package/src/scripts/ai_team/review_gate.ts +8 -10
  277. package/src/scripts/ai_team/team_dispatch.ts +48 -0
  278. package/src/scripts/audit_adr_coverage.ts +33 -0
  279. package/src/scripts/audit_initial_context.ts +1 -1
  280. package/src/scripts/bench_cross_source_eval.ts +400 -0
  281. package/src/scripts/bench_honesty_score.ts +1093 -0
  282. package/src/scripts/bench_hook_latency.ts +218 -0
  283. package/src/scripts/build_mcp_catalog.ts +275 -0
  284. package/src/scripts/build_mcp_registry_manifest.ts +46 -0
  285. package/src/scripts/build_proof.ts +207 -0
  286. package/src/scripts/chat_history.ts +8 -5
  287. package/src/scripts/check_adr_frontmatter.ts +195 -0
  288. package/src/scripts/check_artefact_count_messaging.ts +4 -0
  289. package/src/scripts/check_backstop_debt.ts +210 -0
  290. package/src/scripts/check_bundle_path_leakage.ts +343 -0
  291. package/src/scripts/check_claims.ts +188 -8
  292. package/src/scripts/check_comparison.ts +12 -0
  293. package/src/scripts/check_enforcement_coverage.ts +592 -0
  294. package/src/scripts/check_evaluator_budgets.ts +99 -0
  295. package/src/scripts/check_kernel_rule_bundle.ts +16 -12
  296. package/src/scripts/check_knowledge_sharing.ts +12 -1
  297. package/src/scripts/check_no_external_sources.ts +2 -2
  298. package/src/scripts/check_reach_channels.ts +407 -0
  299. package/src/scripts/check_reach_staleness.ts +364 -0
  300. package/src/scripts/check_secret_leak.test.ts +47 -0
  301. package/src/scripts/check_secret_leak.ts +290 -0
  302. package/src/scripts/check_source_pointer_freshness.ts +28 -3
  303. package/src/scripts/code_graph/build.ts +0 -0
  304. package/src/scripts/code_graph/cli.ts +379 -0
  305. package/src/scripts/code_graph/detect.ts +186 -0
  306. package/src/scripts/code_graph/extract.ts +386 -0
  307. package/src/scripts/code_graph/intent.ts +45 -0
  308. package/src/scripts/code_graph/loader.ts +123 -0
  309. package/src/scripts/code_graph/query.ts +290 -0
  310. package/src/scripts/code_graph/sanitize.ts +30 -0
  311. package/src/scripts/code_graph/sqlite_store.ts +174 -0
  312. package/src/scripts/code_graph/types.ts +83 -0
  313. package/src/scripts/code_graph/validate.ts +63 -0
  314. package/src/scripts/condense.ts +14 -6
  315. package/src/scripts/context_hygiene_hook.ts +8 -5
  316. package/src/scripts/council_cli.ts +126 -12
  317. package/src/scripts/detect_target_license.ts +203 -0
  318. package/src/scripts/evaluator_umbrella.sh +145 -0
  319. package/src/scripts/external_sources_denylist.json +8 -4
  320. package/src/scripts/first_run_gate_hook.ts +9 -5
  321. package/src/scripts/generate_subagent_floor.ts +194 -0
  322. package/src/scripts/hermetic-install.sh +3 -3
  323. package/src/scripts/hook_manifest.yaml +65 -16
  324. package/src/scripts/hooks/block_kernel_rule_writes.ts +212 -0
  325. package/src/scripts/hooks/block_no_verify.ts +9 -9
  326. package/src/scripts/hooks/code_graph_nudge_hook.ts +191 -0
  327. package/src/scripts/hooks/concern_registry.ts +75 -0
  328. package/src/scripts/hooks/design_slop_hook.ts +8 -5
  329. package/src/scripts/hooks/dispatch_entry.ts +37 -0
  330. package/src/scripts/hooks/dispatch_hook.ts +176 -3
  331. package/src/scripts/hooks/hook_stdin.ts +42 -0
  332. package/src/scripts/hooks/rtk_wrap_hook.ts +26 -12
  333. package/src/scripts/hot_context_hook.ts +7 -6
  334. package/src/scripts/injection_scan_hook.ts +9 -1
  335. package/src/scripts/install +6 -6
  336. package/src/scripts/install-hooks.sh +4 -4
  337. package/src/scripts/install.sh +5 -4
  338. package/src/scripts/install.ts +264 -23
  339. package/src/scripts/iron_law_sha.ts +3 -12
  340. package/src/scripts/learning_sidecar.ts +0 -0
  341. package/src/scripts/lint_budget_ownership.ts +89 -0
  342. package/src/scripts/lint_command_routing.ts +35 -5
  343. package/src/scripts/lint_command_verbs.ts +42 -9
  344. package/src/scripts/lint_consumer_internal_refs.ts +211 -0
  345. package/src/scripts/lint_discovery_vocabulary.ts +2 -0
  346. package/src/scripts/lint_documented_commands.ts +670 -0
  347. package/src/scripts/lint_framework_leakage.ts +17 -3
  348. package/src/scripts/lint_framework_leakage_allowlist.json +32 -0
  349. package/src/scripts/lint_governed_writes.ts +335 -0
  350. package/src/scripts/lint_hidden_unicode.ts +6 -0
  351. package/src/scripts/lint_mcp_registry_manifest.ts +26 -1
  352. package/src/scripts/lint_memory_tripwire.ts +186 -0
  353. package/src/scripts/lint_override_kernel_guard.ts +267 -0
  354. package/src/scripts/lint_persistence.ts +171 -0
  355. package/src/scripts/lint_pre_migration_refs.ts +106 -0
  356. package/src/scripts/lint_provenance.ts +547 -0
  357. package/src/scripts/lint_provenance_vocabulary.ts +437 -0
  358. package/src/scripts/lint_spawn_payload.ts +283 -0
  359. package/src/scripts/lint_store_boundary.ts +152 -0
  360. package/src/scripts/lint_versioned_cache.ts +7 -1
  361. package/src/scripts/mcp_server/__main__.ts +7 -2
  362. package/src/scripts/mcp_server/catalog.ts +23 -1
  363. package/src/scripts/mcp_server/consumer_tool_catalog.json +563 -193
  364. package/src/scripts/mcp_server/prompts.ts +6 -0
  365. package/src/scripts/mcp_server/tool_catalog_source.ts +332 -0
  366. package/src/scripts/mcp_server/tools.ts +56 -5
  367. package/src/scripts/mcp_telemetry_query.ts +2 -33
  368. package/src/scripts/mcp_telemetry_store.ts +64 -34
  369. package/src/scripts/measure_rule_budget.ts +3 -12
  370. package/src/scripts/memory_learn_hook.ts +126 -0
  371. package/src/scripts/memory_lookup.ts +0 -0
  372. package/src/scripts/memory_replay_24.ts +312 -0
  373. package/src/scripts/memory_report.ts +16 -3
  374. package/src/scripts/memory_signal.ts +48 -0
  375. package/src/scripts/memory_status.ts +6 -0
  376. package/src/scripts/minimal_safe_diff_hook.ts +8 -5
  377. package/src/scripts/onboarding_gate_hook.ts +8 -5
  378. package/src/scripts/orchestration_record.ts +16 -0
  379. package/src/scripts/pr_url_reminder_hook.ts +8 -1
  380. package/src/scripts/prepack-check.mjs +17 -0
  381. package/src/scripts/prepack_lifecycle_check.d.mts +8 -0
  382. package/src/scripts/prepack_lifecycle_check.mjs +82 -0
  383. package/src/scripts/profile_staleness_hook.ts +8 -7
  384. package/src/scripts/reach_doctor.ts +1651 -0
  385. package/src/scripts/release.ts +24 -3
  386. package/src/scripts/report_install_drift.ts +109 -0
  387. package/src/scripts/risk_escalation_shadow.ts +160 -0
  388. package/src/scripts/roadmap_progress_hook.ts +8 -5
  389. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  390. package/src/scripts/schemas/license-policy.schema.json +89 -0
  391. package/src/scripts/schemas/provenance-borrow.schema.json +46 -0
  392. package/src/scripts/schemas/reach-channels.schema.json +134 -0
  393. package/src/scripts/schemas/reach-doctor-payload.schema.json +220 -0
  394. package/src/scripts/schemas/rule.schema.json +20 -0
  395. package/src/scripts/self_review_gate.test.ts +173 -1
  396. package/src/scripts/self_review_gate.ts +155 -15
  397. package/src/scripts/session_canary_hook.ts +182 -0
  398. package/src/scripts/skill_linter.ts +55 -0
  399. package/src/scripts/smoke_quickstart.ts +2 -2
  400. package/src/scripts/surface_probe_hook.ts +8 -7
  401. package/src/scripts/sync_gitattributes.ts +310 -0
  402. package/src/scripts/team_review_gate_hook.ts +13 -16
  403. package/src/scripts/validate_reach_prescriptions.ts +751 -0
  404. package/src/scripts/verify_before_complete_hook.ts +8 -5
  405. package/src/scripts/wrapper_freshness_hook.ts +8 -7
  406. package/src/server/schemas/settings.ts +24 -2
  407. package/src/shared/capabilities.test.ts +43 -0
  408. package/src/shared/capabilities.ts +75 -0
  409. package/src/templates/minimal/agents-overrides-readme.md +20 -0
  410. package/dist/ui/assets/index-BPFMZWUs.css +0 -1
  411. package/dist/ui/assets/index-BiEZiZ31.js +0 -40
  412. package/dist/ui/assets/index-BiEZiZ31.js.map +0 -1
  413. package/docs/CLAIMS.md +0 -261
  414. package/docs/DISTRIBUTION_CHECKLIST.md +0 -170
  415. package/docs/RELEASE_STORY_TEMPLATE.md +0 -37
  416. package/docs/SKILL_CENSUS.md +0 -352
  417. package/docs/adrs/cost/0001-hard-stop-hook.md +0 -114
  418. package/docs/adrs/cost/README.md +0 -9
  419. package/docs/adrs/memory/0001-consumer-side-snapshot.md +0 -119
  420. package/docs/adrs/memory/README.md +0 -10
  421. package/docs/adrs/router/0001-three-tier-routing.md +0 -119
  422. package/docs/adrs/router/README.md +0 -9
  423. package/docs/adrs/schema/0001-json-schema-frontmatter.md +0 -102
  424. package/docs/adrs/schema/README.md +0 -9
  425. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +0 -99
  426. package/docs/adrs/smoke/README.md +0 -9
  427. package/docs/adrs/telegraph/0001-default-off-until-bench.md +0 -93
  428. package/docs/adrs/telegraph/README.md +0 -9
  429. package/docs/announcements/2026-05-non-dev-launch.md +0 -79
  430. package/docs/announcements/2026-07-honest-cost-sweep-launch.md +0 -84
  431. package/docs/anti-reskin-gate.md +0 -60
  432. package/docs/architecture/augment-projection.md +0 -70
  433. package/docs/architecture/claude-bundle.md +0 -77
  434. package/docs/architecture/current-onboard-baseline.md +0 -126
  435. package/docs/architecture/current-safety-behavior.md +0 -137
  436. package/docs/architecture/multi-tool-projection.md +0 -125
  437. package/docs/architecture/setup-vs-settings-shared-surface.md +0 -114
  438. package/docs/architecture/source-projection.md +0 -85
  439. package/docs/architecture.md +0 -390
  440. package/docs/archive/CHANGELOG-6.0.0-overview.md +0 -953
  441. package/docs/archive/CHANGELOG-7.0.0.md +0 -419
  442. package/docs/archive/CHANGELOG-pre-2.11.0.md +0 -141
  443. package/docs/archive/CHANGELOG-pre-2.15.0.md +0 -244
  444. package/docs/archive/CHANGELOG-pre-2.16.0.md +0 -48
  445. package/docs/archive/CHANGELOG-pre-2.17.0.md +0 -63
  446. package/docs/archive/CHANGELOG-pre-2.2.0.md +0 -2138
  447. package/docs/archive/CHANGELOG-pre-2.20.0.md +0 -159
  448. package/docs/archive/CHANGELOG-pre-2.25.0.md +0 -191
  449. package/docs/archive/CHANGELOG-pre-2.7.0.md +0 -185
  450. package/docs/archive/CHANGELOG-pre-3.0.0.md +0 -130
  451. package/docs/archive/CHANGELOG-pre-3.1.0.md +0 -167
  452. package/docs/archive/CHANGELOG-pre-3.2.0.md +0 -268
  453. package/docs/archive/CHANGELOG-pre-4.0.0.md +0 -80
  454. package/docs/archive/CHANGELOG-pre-4.5.0.md +0 -289
  455. package/docs/archive/CHANGELOG-pre-5.4.0.md +0 -260
  456. package/docs/archive/CHANGELOG-pre-5.9.0.md +0 -270
  457. package/docs/archive/CHANGELOG-pre-6.0.0.md +0 -473
  458. package/docs/archive/CHANGELOG-pre-7.0.0.md +0 -126
  459. package/docs/archive/CHANGELOG-pre-8.0.0.md +0 -301
  460. package/docs/archive/CHANGELOG-pre-8.1.0.md +0 -316
  461. package/docs/archive/CHANGELOG-pre-8.12.0.md +0 -304
  462. package/docs/archive/CHANGELOG-pre-8.9.0.md +0 -306
  463. package/docs/archive/CHANGELOG-pre-9.2.0.md +0 -276
  464. package/docs/artefact-census.md +0 -71
  465. package/docs/benchmark.md +0 -648
  466. package/docs/benchmark.pinned.yml +0 -31
  467. package/docs/benchmarks.md +0 -85
  468. package/docs/capability-matrix.md +0 -33
  469. package/docs/case-studies/_template.md +0 -60
  470. package/docs/case-studies/frontend-design-positioning.md +0 -86
  471. package/docs/catalog.md +0 -721
  472. package/docs/command-flows.md +0 -272
  473. package/docs/command-naming-audit.md +0 -60
  474. package/docs/comparison.yaml +0 -45
  475. package/docs/contracts/CHANGELOG-conventions.md +0 -149
  476. package/docs/contracts/STABILITY.md +0 -188
  477. package/docs/contracts/adoption-signal-floor.md +0 -127
  478. package/docs/contracts/adr-architectural-consensus-mechanism.md +0 -68
  479. package/docs/contracts/adr-chat-history-split.md +0 -140
  480. package/docs/contracts/adr-command-suggestion.md +0 -144
  481. package/docs/contracts/adr-forecast-construction-shape.md +0 -90
  482. package/docs/contracts/adr-gtm-context-spine.md +0 -116
  483. package/docs/contracts/adr-implement-ticket-runtime.md +0 -121
  484. package/docs/contracts/adr-install-user-type-axis.md +0 -107
  485. package/docs/contracts/adr-layout.md +0 -107
  486. package/docs/contracts/adr-level-6-productization.md +0 -145
  487. package/docs/contracts/adr-mcp-runtime.md +0 -128
  488. package/docs/contracts/adr-product-ui-track.md +0 -381
  489. package/docs/contracts/adr-prompt-driven-execution.md +0 -186
  490. package/docs/contracts/adr-settings-sync-engine.md +0 -128
  491. package/docs/contracts/adr-user-types-axis.md +0 -127
  492. package/docs/contracts/adr-wing4-context-spine.md +0 -126
  493. package/docs/contracts/agent-user-schema.md +0 -170
  494. package/docs/contracts/agents-layout.md +0 -148
  495. package/docs/contracts/agents-md-tech-stack.md +0 -75
  496. package/docs/contracts/ai-council-config.md +0 -829
  497. package/docs/contracts/ai-team-config.md +0 -224
  498. package/docs/contracts/analysis-memory-loop.md +0 -149
  499. package/docs/contracts/at-rest-encryption.md +0 -191
  500. package/docs/contracts/audit-log-v1.md +0 -150
  501. package/docs/contracts/auto-orchestration-v1.md +0 -70
  502. package/docs/contracts/benchmark-ab-contract.md +0 -106
  503. package/docs/contracts/benchmark-corpus-spec.md +0 -125
  504. package/docs/contracts/benchmark-report-schema.md +0 -113
  505. package/docs/contracts/branch-protection-policy.md +0 -139
  506. package/docs/contracts/brand-token-consumption.md +0 -74
  507. package/docs/contracts/capability-boundary.md +0 -69
  508. package/docs/contracts/capability-packs.md +0 -217
  509. package/docs/contracts/ci-cost-budget.md +0 -111
  510. package/docs/contracts/ci-green-floor.md +0 -141
  511. package/docs/contracts/command-category-governance.md +0 -84
  512. package/docs/contracts/command-clusters.md +0 -399
  513. package/docs/contracts/command-surface-tiers.md +0 -176
  514. package/docs/contracts/command-taxonomy.md +0 -137
  515. package/docs/contracts/condensation-default-kill-criterion.md +0 -116
  516. package/docs/contracts/config-presets.md +0 -144
  517. package/docs/contracts/conformance.md +0 -84
  518. package/docs/contracts/consumer-bridge.md +0 -73
  519. package/docs/contracts/context-paths.md +0 -101
  520. package/docs/contracts/context-spine.md +0 -179
  521. package/docs/contracts/cost-dashboard.md +0 -143
  522. package/docs/contracts/cost-enforcement.md +0 -134
  523. package/docs/contracts/cost-profile-defaults.md +0 -110
  524. package/docs/contracts/cost-summary-schema.md +0 -107
  525. package/docs/contracts/creative-pack-boundary.md +0 -63
  526. package/docs/contracts/cross-repo-retrieval.md +0 -64
  527. package/docs/contracts/cross-wing-handoff.md +0 -134
  528. package/docs/contracts/daily-workspace.md +0 -147
  529. package/docs/contracts/decision-engine-gates.md +0 -120
  530. package/docs/contracts/decision-trace-v1.md +0 -177
  531. package/docs/contracts/design-artifact-lifecycle.md +0 -93
  532. package/docs/contracts/design-artifact-verification.md +0 -153
  533. package/docs/contracts/discovery-manifest.md +0 -209
  534. package/docs/contracts/discovery-manifest.schema.json +0 -254
  535. package/docs/contracts/evidence-based-pruning.md +0 -102
  536. package/docs/contracts/explain-modes.md +0 -187
  537. package/docs/contracts/explain-trace.schema.json +0 -144
  538. package/docs/contracts/file-ownership-matrix.json +0 -13941
  539. package/docs/contracts/file-ownership-matrix.md +0 -135
  540. package/docs/contracts/frontmatter-contract.md +0 -140
  541. package/docs/contracts/ghostwriter-schema.md +0 -337
  542. package/docs/contracts/governance-enforcement-projection.md +0 -159
  543. package/docs/contracts/gui-wizard.md +0 -350
  544. package/docs/contracts/harness-expectations.md +0 -128
  545. package/docs/contracts/hook-architecture-v1.md +0 -325
  546. package/docs/contracts/host-agent-protocol.md +0 -110
  547. package/docs/contracts/implement-ticket-flow.md +0 -625
  548. package/docs/contracts/init-telemetry.md +0 -132
  549. package/docs/contracts/injected-block-authenticity-model.md +0 -66
  550. package/docs/contracts/install-layout.md +0 -249
  551. package/docs/contracts/install-scopes.md +0 -82
  552. package/docs/contracts/installed-tools-lockfile.md +0 -144
  553. package/docs/contracts/installer-agent-mode.md +0 -137
  554. package/docs/contracts/iron-law-overrides.txt +0 -26
  555. package/docs/contracts/kernel-membership.md +0 -339
  556. package/docs/contracts/linear-ai-rules-inclusion.md +0 -143
  557. package/docs/contracts/linear-ai-three-layers.md +0 -130
  558. package/docs/contracts/linter-structural-model.md +0 -181
  559. package/docs/contracts/load-context-budget-model.md +0 -259
  560. package/docs/contracts/load-context-schema.md +0 -220
  561. package/docs/contracts/local-analytics.md +0 -160
  562. package/docs/contracts/local-knowledge-ingestion.md +0 -96
  563. package/docs/contracts/local-server-api.md +0 -134
  564. package/docs/contracts/low-impact-corpus-format.md +0 -95
  565. package/docs/contracts/mcp-beta-criteria.md +0 -130
  566. package/docs/contracts/mcp-cloud-scope.md +0 -355
  567. package/docs/contracts/mcp-discovery-phase-notice.md +0 -60
  568. package/docs/contracts/mcp-phase-1-scope.md +0 -272
  569. package/docs/contracts/mcp-registry-manifest.schema.json +0 -129
  570. package/docs/contracts/mcp-tool-inventory.md +0 -64
  571. package/docs/contracts/mcp-tool-stub-envelope.md +0 -78
  572. package/docs/contracts/measurement-baseline.md +0 -103
  573. package/docs/contracts/memory-visibility-v1.md +0 -160
  574. package/docs/contracts/mental-models.md +0 -336
  575. package/docs/contracts/migrate-command.md +0 -233
  576. package/docs/contracts/multi-tool-projection-fidelity.md +0 -134
  577. package/docs/contracts/namespace.md +0 -125
  578. package/docs/contracts/no-runtime-boundary.md +0 -61
  579. package/docs/contracts/one-off-script-lifecycle.md +0 -110
  580. package/docs/contracts/orchestration-dsl-v1.md +0 -153
  581. package/docs/contracts/package-self-orientation.md +0 -163
  582. package/docs/contracts/pilot/agent-authority.md +0 -24
  583. package/docs/contracts/pilot/direct-answers.md +0 -70
  584. package/docs/contracts/pilot/language-and-tone.md +0 -63
  585. package/docs/contracts/plain-language-surface.md +0 -117
  586. package/docs/contracts/prelaunch-diagnostics.md +0 -151
  587. package/docs/contracts/profile-system.md +0 -167
  588. package/docs/contracts/reasoning-discipline-protocol.md +0 -83
  589. package/docs/contracts/release-pr-gating.md +0 -151
  590. package/docs/contracts/release-sizing.md +0 -107
  591. package/docs/contracts/release-trunk-sync.md +0 -105
  592. package/docs/contracts/review-lens-schema.md +0 -64
  593. package/docs/contracts/roadmap-complexity-standard.md +0 -138
  594. package/docs/contracts/role-experience.md +0 -125
  595. package/docs/contracts/router-blending.md +0 -71
  596. package/docs/contracts/rule-classification.md +0 -171
  597. package/docs/contracts/rule-interactions.md +0 -132
  598. package/docs/contracts/rule-interactions.yml +0 -260
  599. package/docs/contracts/rule-priority-hierarchy.md +0 -88
  600. package/docs/contracts/rule-router.md +0 -287
  601. package/docs/contracts/safety-model.md +0 -129
  602. package/docs/contracts/session-profile-overlay.md +0 -157
  603. package/docs/contracts/settings-api.md +0 -264
  604. package/docs/contracts/settings-gui-agent-mode.schema.json +0 -128
  605. package/docs/contracts/settings-sync-yaml-subset.md +0 -139
  606. package/docs/contracts/skill-bundled-assets.md +0 -62
  607. package/docs/contracts/skill-discovery.md +0 -80
  608. package/docs/contracts/skill-distribution-channels.md +0 -66
  609. package/docs/contracts/skill-domains.md +0 -144
  610. package/docs/contracts/skill-dry-run.md +0 -47
  611. package/docs/contracts/skill-family-map.yml +0 -915
  612. package/docs/contracts/smoke-contracts.md +0 -144
  613. package/docs/contracts/subagent-boundary.md +0 -59
  614. package/docs/contracts/surface-agent-contracts.md +0 -153
  615. package/docs/contracts/surface-matrix.md +0 -108
  616. package/docs/contracts/surface-tiers.md +0 -81
  617. package/docs/contracts/telegraph-telemetry.md +0 -83
  618. package/docs/contracts/ticket-bundle-format.md +0 -233
  619. package/docs/contracts/tier-3-contrib-plugin.md +0 -137
  620. package/docs/contracts/trust-and-safety.md +0 -144
  621. package/docs/contracts/ui-stack-extension.md +0 -237
  622. package/docs/contracts/ui-track-flow.md +0 -329
  623. package/docs/contracts/universal-skills.md +0 -91
  624. package/docs/contracts/user-type-schema.md +0 -146
  625. package/docs/contracts/value-dashboard-spec.md +0 -378
  626. package/docs/contracts/value-report-schema.md +0 -168
  627. package/docs/contracts/workflow-packs.md +0 -121
  628. package/docs/contracts/workspace-boundary.md +0 -84
  629. package/docs/contracts/workspace-documents.md +0 -144
  630. package/docs/contracts/write-engine.md +0 -182
  631. package/docs/cookbook.md +0 -152
  632. package/docs/customization.md +0 -685
  633. package/docs/decisions/ADR-001-kernel-swap-deferred.md +0 -109
  634. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +0 -135
  635. package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +0 -137
  636. package/docs/decisions/ADR-004-rule-governance-pruning.md +0 -240
  637. package/docs/decisions/ADR-005-subagent-worktrees.md +0 -120
  638. package/docs/decisions/ADR-006-skill-tools-python-pilot.md +0 -114
  639. package/docs/decisions/ADR-007-agent-discovery-scopes.md +0 -371
  640. package/docs/decisions/ADR-008-installed-tools-manifest.md +0 -160
  641. package/docs/decisions/ADR-009-event4u-namespace.md +0 -188
  642. package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +0 -168
  643. package/docs/decisions/ADR-011-domain-pack-readiness.md +0 -213
  644. package/docs/decisions/ADR-012-typescript-cli-shell.md +0 -162
  645. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +0 -342
  646. package/docs/decisions/ADR-014-gui-framework-choice.md +0 -136
  647. package/docs/decisions/ADR-015-discovery-manifest-contract.md +0 -146
  648. package/docs/decisions/ADR-016-installer-architecture.md +0 -189
  649. package/docs/decisions/ADR-017-monorepo-physical-layout.md +0 -261
  650. package/docs/decisions/ADR-018-trust-and-safety-layer.md +0 -159
  651. package/docs/decisions/ADR-019-router-json-dist-location.md +0 -124
  652. package/docs/decisions/ADR-020-global-only-consumer-scope.md +0 -213
  653. package/docs/decisions/ADR-021-deployment-shape.md +0 -153
  654. package/docs/decisions/ADR-022-daily-workspace-decomposition.md +0 -140
  655. package/docs/decisions/ADR-023-host-agent-protocol.md +0 -129
  656. package/docs/decisions/ADR-024-workspace-v0-feature-floor.md +0 -126
  657. package/docs/decisions/ADR-025-workspace-chrome.md +0 -119
  658. package/docs/decisions/ADR-026-explain-mode-translation.md +0 -117
  659. package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +0 -129
  660. package/docs/decisions/ADR-028-root-layout.md +0 -147
  661. package/docs/decisions/ADR-029-multi-workspace-deferred.md +0 -122
  662. package/docs/decisions/ADR-030-claude-code-command-projection.md +0 -147
  663. package/docs/decisions/ADR-031-validation-severity-tiers-and-projection-roundtrip.md +0 -97
  664. package/docs/decisions/ADR-032-linked-projects-scope.md +0 -122
  665. package/docs/decisions/ADR-033-distribution-identity-npm-primary.md +0 -81
  666. package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +0 -63
  667. package/docs/decisions/ADR-035-model-capability-tiers.md +0 -104
  668. package/docs/decisions/ADR-036-global-install-browser-wizard-handoff.md +0 -106
  669. package/docs/decisions/ADR-037-cost-profile-untangle.md +0 -117
  670. package/docs/decisions/ADR-038-canonical-settings-path.md +0 -96
  671. package/docs/decisions/ADR-039-claude-skills-untracked.md +0 -139
  672. package/docs/decisions/ADR-040-execution-model-projection-time-filtering.md +0 -244
  673. package/docs/decisions/ADR-041-controlled-command-verbs.md +0 -133
  674. package/docs/decisions/ADR-042-runtime-resolver-decision-gate.md +0 -113
  675. package/docs/decisions/ADR-043-monorepo-collapse-to-src-domains.md +0 -128
  676. package/docs/decisions/ADR-044-command-naming-scheme-hyphenated.md +0 -250
  677. package/docs/decisions/ADR-045-src-source-layout-and-profiles-as-views.md +0 -111
  678. package/docs/decisions/ADR-046-thin-command-principle.md +0 -93
  679. package/docs/decisions/ADR-047-framework-neutral-stack-adaptive-commands.md +0 -94
  680. package/docs/decisions/ADR-048-command-justification-rule.md +0 -106
  681. package/docs/decisions/ADR-049-configuration-trust-boundary.md +0 -132
  682. package/docs/decisions/ADR-050-workspace-vs-package-root-boundary.md +0 -121
  683. package/docs/decisions/ADR-051-uncondensed-source-container-relocation.md +0 -114
  684. package/docs/decisions/ADR-052-packages-removal-and-pack-home-migration.md +0 -86
  685. package/docs/decisions/ADR-053-agents-namespace-dual-role-resolution.md +0 -132
  686. package/docs/decisions/ADR-054-rule-adherence-decay-triggered-restate.md +0 -143
  687. package/docs/decisions/ADR-055-flow-layer-data-model.md +0 -235
  688. package/docs/decisions/ADR-056-unvalidated-video-adapters-disposition.md +0 -124
  689. package/docs/decisions/ADR-057-consolidation-evidence-gate-outcomes.md +0 -135
  690. package/docs/decisions/ADR-058-condensed-output-relocation-to-dist.md +0 -94
  691. package/docs/decisions/ADR-059-render-resume-filesystem-as-state.md +0 -161
  692. package/docs/decisions/ADR-060-comfyui-sandbox-model.md +0 -154
  693. package/docs/decisions/ADR-061-corpus-grounding-layer.md +0 -230
  694. package/docs/decisions/ADR-062-encrypt-at-rest-store-architecture.md +0 -121
  695. package/docs/decisions/ADR-063-append-jsonl-encryption-deferred.md +0 -83
  696. package/docs/decisions/ADR-064-append-jsonl-per-record-encryption.md +0 -113
  697. package/docs/decisions/ADR-065-tier3-inbox-handoff-v0.md +0 -86
  698. package/docs/decisions/ADR-066-skill-body-prerendering.md +0 -93
  699. package/docs/decisions/ADR-067-glama-registry-listing.md +0 -259
  700. package/docs/decisions/ADR-068-host-tier-detection.md +0 -90
  701. package/docs/decisions/ADR-069-prompt-renderer.md +0 -97
  702. package/docs/decisions/ADR-070-tier1-drive-loop.md +0 -94
  703. package/docs/decisions/ADR-071-launch-drive-integration.md +0 -95
  704. package/docs/decisions/ADR-072-codex-gemini-drive-configs.md +0 -90
  705. package/docs/decisions/ADR-073-drive-health-kill-switch.md +0 -81
  706. package/docs/decisions/ADR-074-drive-kill-switch-auto-recovery.md +0 -84
  707. package/docs/decisions/ADR-075-workspace-gui-drive.md +0 -83
  708. package/docs/decisions/ADR-076-workspace-multi-turn.md +0 -92
  709. package/docs/decisions/ADR-077-workspace-followup-gui.md +0 -70
  710. package/docs/decisions/ADR-078-drive-health-panel.md +0 -70
  711. package/docs/decisions/ADR-079-workspace-host-picker.md +0 -81
  712. package/docs/decisions/ADR-080-host-session-expired-410.md +0 -92
  713. package/docs/decisions/ADR-081-drive-health-reset-and-410-affordance.md +0 -71
  714. package/docs/decisions/ADR-082-410-one-click-relaunch.md +0 -58
  715. package/docs/decisions/ADR-083-session-thread-and-arbitrary-continuation.md +0 -85
  716. package/docs/decisions/ADR-084-drive-health-refresh-on-drive.md +0 -52
  717. package/docs/decisions/ADR-085-mcp-stdio-end-user-distribution-shape.md +0 -158
  718. package/docs/decisions/ADR-086-read-only-cross-agent-mcp-discovery-helper.md +0 -171
  719. package/docs/decisions/ADR-087-installer-e2e-test-strategy.md +0 -111
  720. package/docs/decisions/ADR-088-no-external-runtime-federation.md +0 -144
  721. package/docs/decisions/ADR-089-lean-local-plugin-install.md +0 -111
  722. package/docs/decisions/ADR-090-visibility-command-frontmatter-field.md +0 -95
  723. package/docs/decisions/ADR-091-split-meta-capability-packs.md +0 -113
  724. package/docs/decisions/ADR-092-defer-command-tier-alias-removal.md +0 -117
  725. package/docs/decisions/ADR-093-ai-council-config-user-global.md +0 -117
  726. package/docs/decisions/ADR-094-agent-memory-layer-removal.md +0 -94
  727. package/docs/decisions/ADR-095-workspace-boundary-contract.md +0 -108
  728. package/docs/decisions/ADR-096-analysis-workbench.md +0 -110
  729. package/docs/decisions/ADR-097-mission-recipe-privilege-boundary.md +0 -121
  730. package/docs/decisions/ADR-098-evidence-first-structure-discovery.md +0 -154
  731. package/docs/decisions/ADR-099-file-first-pattern-library.md +0 -87
  732. package/docs/decisions/ADR-100-global-knowledge-card-sharing.md +0 -140
  733. package/docs/decisions/ADR-101-ticket-bundle-emission.md +0 -109
  734. package/docs/decisions/ADR-102-ticket-handoff-paste-and-mcp.md +0 -72
  735. package/docs/decisions/ADR-103-global-knowledge-default-off-until-measured.md +0 -92
  736. package/docs/decisions/ADR-104-ai-council-config-global-only.md +0 -119
  737. package/docs/decisions/ADR-105-automatic-subagent-orchestration.md +0 -108
  738. package/docs/decisions/ADR-106-recursive-verification-benchmark-gate.md +0 -126
  739. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +0 -70
  740. package/docs/decisions/ADR-108-open-source-forever-no-commercial-tier.md +0 -46
  741. package/docs/decisions/ADR-109-subagent-v1-contract.md +0 -246
  742. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +0 -110
  743. package/docs/decisions/ADR-111-canonical-glama-listing.md +0 -97
  744. package/docs/decisions/ADR-112-stdio-lite-stays-read-only.md +0 -92
  745. package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +0 -201
  746. package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +0 -85
  747. package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +0 -91
  748. package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +0 -144
  749. package/docs/decisions/ADR-117-subagents-auto-default-on.md +0 -89
  750. package/docs/decisions/ADR-118-loop-engineering-boundaries.md +0 -162
  751. package/docs/decisions/ADR-119-global-knowledge-default-on.md +0 -104
  752. package/docs/decisions/ADR-120-council-chairman-mode.md +0 -70
  753. package/docs/decisions/ADR-121-knowledge-sensitivity-classes.md +0 -90
  754. package/docs/decisions/ADR-122-adversarial-verification-council.md +0 -166
  755. package/docs/decisions/ADR-123-runtime-security-scope-and-spawn-hardening.md +0 -142
  756. package/docs/decisions/ADR-200-python-to-typescript-migration.md +0 -203
  757. package/docs/decisions/ADR-rule-kernel-and-router.md +0 -133
  758. package/docs/decisions/INDEX.md +0 -136
  759. package/docs/deploy/connector-setup.md +0 -129
  760. package/docs/deploy/env-vars.md +0 -70
  761. package/docs/deploy/policy-cookbook.md +0 -130
  762. package/docs/deploy/quickstart.md +0 -112
  763. package/docs/deploy/small-team-recipe.md +0 -148
  764. package/docs/deploy/team-deployment-posture.md +0 -111
  765. package/docs/design/adversarial-council-eval.md +0 -106
  766. package/docs/design/council-vs-solo-baseline.md +0 -92
  767. package/docs/design/cross-model-parity-eval.md +0 -82
  768. package/docs/design/length-neutral-judge-rerun.md +0 -92
  769. package/docs/design/utilization-window-criteria.md +0 -51
  770. package/docs/development.md +0 -230
  771. package/docs/distribution/awesome-list-submission.md +0 -46
  772. package/docs/distribution/consumer-matrix.md +0 -96
  773. package/docs/distribution/launch-story-draft.md +0 -58
  774. package/docs/distribution/mcp-submission-checklist.md +0 -95
  775. package/docs/distribution/public-install-smoke.md +0 -68
  776. package/docs/distribution/registries.md +0 -117
  777. package/docs/distribution/registry-submissions.md +0 -85
  778. package/docs/distribution/telemetry-privacy.md +0 -128
  779. package/docs/distribution/telemetry-schema.md +0 -174
  780. package/docs/distribution/topics-equivalents-decay-policy.md +0 -51
  781. package/docs/end-to-end-walkthroughs.md +0 -165
  782. package/docs/enforcement-by-host.md +0 -44
  783. package/docs/examples/agent-user.example.md +0 -22
  784. package/docs/experiences/agency.md +0 -49
  785. package/docs/experiences/content_creator.md +0 -49
  786. package/docs/experiences/developer.md +0 -49
  787. package/docs/experiences/finance.md +0 -50
  788. package/docs/experiences/founder.md +0 -49
  789. package/docs/experiences/ops.md +0 -49
  790. package/docs/featured-commands.md +0 -27
  791. package/docs/featured-skills.md +0 -95
  792. package/docs/flows.md +0 -67
  793. package/docs/getting-started-by-role.md +0 -190
  794. package/docs/getting-started-laravel.md +0 -72
  795. package/docs/getting-started-local-stdio.md +0 -77
  796. package/docs/getting-started.md +0 -254
  797. package/docs/github-topics.md +0 -93
  798. package/docs/governance-advantage.md +0 -72
  799. package/docs/governance.md +0 -96
  800. package/docs/guides/cross-repo-linked-projects.md +0 -93
  801. package/docs/guides/cross-repo-retrieval.md +0 -61
  802. package/docs/guides/frontend-design-corpus-refresh.md +0 -83
  803. package/docs/guides/local-analytics.md +0 -125
  804. package/docs/guides/local-knowledge.md +0 -127
  805. package/docs/guides/skill-discovery.md +0 -71
  806. package/docs/guides/skill-preview.md +0 -71
  807. package/docs/hook-payload-capture.md +0 -221
  808. package/docs/install-friction-report.md +0 -66
  809. package/docs/installation.md +0 -959
  810. package/docs/maintainers/branch-protection.md +0 -105
  811. package/docs/maintainers/dev-mode.md +0 -106
  812. package/docs/maintainers/optional-media-deps.md +0 -50
  813. package/docs/maintainers/system-map.md +0 -85
  814. package/docs/mcp-registries.md +0 -94
  815. package/docs/mcp-server.md +0 -175
  816. package/docs/mcp.md +0 -147
  817. package/docs/media/proof-demo.cast +0 -14
  818. package/docs/media/proof-demo.gif +0 -0
  819. package/docs/migration/consumer-template-consumption-model.md +0 -145
  820. package/docs/migration/divergences/README.md +0 -55
  821. package/docs/migration/divergences/_template.md +0 -50
  822. package/docs/migration/divergences/bench-stats-float-precision.md +0 -72
  823. package/docs/migration/divergences/mcp-telemetry-node-sqlite.md +0 -61
  824. package/docs/migration/divergences/pack-mcp-content-gzip-body.md +0 -53
  825. package/docs/migration/divergences/src-scripts-build_cloud_bundle.md +0 -63
  826. package/docs/migration/divergences/src-scripts-check_memory.md +0 -91
  827. package/docs/migration/divergences/src-scripts-inventory_abstraction_budget.md +0 -65
  828. package/docs/migration/divergences/src-scripts-lint_marketplace.md +0 -57
  829. package/docs/migration/divergences/src-scripts-lint_mcp_registry_manifest.md +0 -70
  830. package/docs/migration/divergences/src-scripts-spotcheck_thin_root.md +0 -60
  831. package/docs/migration/divergences/src-scripts-validate_agent_settings.md +0 -58
  832. package/docs/migration/node-floor.md +0 -86
  833. package/docs/migration/v1-to-v2.md +0 -156
  834. package/docs/migration/yaml-roundtrip-spike.md +0 -163
  835. package/docs/migrations/commands-1.15.0.md +0 -117
  836. package/docs/parity/bench-external.json +0 -58
  837. package/docs/parity/bench.json +0 -41
  838. package/docs/parity/command-frontmatter.md +0 -60
  839. package/docs/parity/external-runtime.md +0 -46
  840. package/docs/personas.md +0 -178
  841. package/docs/positioning-evidence.md +0 -86
  842. package/docs/profiles.md +0 -108
  843. package/docs/proof.md +0 -176
  844. package/docs/quality.md +0 -98
  845. package/docs/readme-split-plan.md +0 -102
  846. package/docs/recruits/_template.md +0 -81
  847. package/docs/release-runbook.md +0 -141
  848. package/docs/role-experiences.md +0 -19
  849. package/docs/safety.md +0 -30
  850. package/docs/second-brain-scope.md +0 -116
  851. package/docs/self-review-gate.md +0 -65
  852. package/docs/setup/enterprise-and-offline.md +0 -201
  853. package/docs/setup/mcp-client-config.md +0 -358
  854. package/docs/setup/mcp-cloud-endpoints.md +0 -116
  855. package/docs/setup/mcp-cloud-registry-listing.md +0 -99
  856. package/docs/setup/mcp-cloud-setup.md +0 -183
  857. package/docs/setup/mcp-r2-bootstrap.md +0 -82
  858. package/docs/setup/mcp-server-docker.md +0 -101
  859. package/docs/setup/per-ide/aider.md +0 -48
  860. package/docs/setup/per-ide/antigravity.md +0 -68
  861. package/docs/setup/per-ide/augment.md +0 -89
  862. package/docs/setup/per-ide/claude-code.md +0 -97
  863. package/docs/setup/per-ide/claude-desktop.md +0 -207
  864. package/docs/setup/per-ide/cline.md +0 -43
  865. package/docs/setup/per-ide/codebuddy.md +0 -63
  866. package/docs/setup/per-ide/codex.md +0 -46
  867. package/docs/setup/per-ide/continue.md +0 -68
  868. package/docs/setup/per-ide/copilot.md +0 -80
  869. package/docs/setup/per-ide/cursor.md +0 -125
  870. package/docs/setup/per-ide/droid.md +0 -65
  871. package/docs/setup/per-ide/gemini-cli.md +0 -45
  872. package/docs/setup/per-ide/jetbrains.md +0 -76
  873. package/docs/setup/per-ide/kilocode.md +0 -66
  874. package/docs/setup/per-ide/kiro.md +0 -72
  875. package/docs/setup/per-ide/opencode.md +0 -62
  876. package/docs/setup/per-ide/qoder.md +0 -63
  877. package/docs/setup/per-ide/roocode.md +0 -68
  878. package/docs/setup/per-ide/trae.md +0 -63
  879. package/docs/setup/per-ide/warp.md +0 -63
  880. package/docs/setup/per-ide/windsurf.md +0 -109
  881. package/docs/setup/per-ide/zed.md +0 -73
  882. package/docs/showcase.md +0 -209
  883. package/docs/skill-duplication-findings.md +0 -91
  884. package/docs/skills-catalog.md +0 -265
  885. package/docs/skills-taxonomy.md +0 -90
  886. package/docs/spawn-site-policy.md +0 -72
  887. package/docs/succession.md +0 -80
  888. package/docs/threat-model.md +0 -29
  889. package/docs/troubleshooting.md +0 -155
  890. package/docs/ui-track-mental-model.md +0 -121
  891. package/docs/us-vs-the-category.md +0 -38
  892. package/docs/value.md +0 -86
  893. package/docs/walkthroughs/assets/workspace-role-grid.png +0 -0
  894. package/docs/walkthroughs/assets/workspace-session-started.png +0 -0
  895. package/docs/walkthroughs/assets/workspace-task-picker.png +0 -0
  896. package/docs/walkthroughs/daily-workspace-a11y.md +0 -87
  897. package/docs/walkthroughs/daily-workspace.md +0 -127
  898. package/docs/wedge/production-validator/README.md +0 -81
  899. package/docs/wedge/production-validator/first-run-check.sh +0 -42
  900. package/docs/wedge/production-validator/production-validator.md +0 -83
  901. package/docs/wizard.md +0 -173
@@ -0,0 +1,592 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Enforcement-coverage gate — how many rules have a backstop that actually runs.
4
+ *
5
+ * This package's positioning is falsifiability, and its own doctrine says a MUST
6
+ * that depends on agent self-report is honor-system theatre. That doctrine had
7
+ * no instrument: 107 rules carry `type / tier / description / …` and not one
8
+ * field said what enforces them. This script is that instrument.
9
+ *
10
+ * The load-bearing design choice is **resolution over declaration**. A rule that
11
+ * declares `validator:src/scripts/lint_x.ts` is NOT counted as enforced merely
12
+ * because the file exists — the script must also be *reachable*: referenced from
13
+ * a taskfile, a GitHub workflow, or the hook manifest. A linter that ships and
14
+ * runs nowhere is exactly the defect this gate exists to surface, and a
15
+ * declaration-only checker would rate it green. (Found on the first run:
16
+ * `lint_output_slop.ts` is wired nowhere while `output-discipline` asserts in
17
+ * shipped prose that violations cause a CI exit-code-2.)
18
+ *
19
+ * Second choice: **blocking and instrumenting are different tiers.** A hook
20
+ * registered `fail_closed: false` cannot fail a build; it writes evidence. It
21
+ * resolves to `observer`, never `validator`, and declaring it as one is reported
22
+ * as a misdeclaration rather than silently accepted.
23
+ *
24
+ * `none` is a legal, counted value. An honest recorded gap is worth more than a
25
+ * false claim of coverage — that is the whole point of the exercise.
26
+ *
27
+ * Usage:
28
+ * ./scripts-run src/scripts/check_enforcement_coverage # report
29
+ * ./scripts-run src/scripts/check_enforcement_coverage --json # machine
30
+ * ./scripts-run src/scripts/check_enforcement_coverage --check # ratchet
31
+ * ./scripts-run src/scripts/check_enforcement_coverage --write-baseline
32
+ *
33
+ * Exit codes: 0 ok · 1 ratchet regression (--check) · 2 usage/env error.
34
+ */
35
+
36
+ import * as fs from 'node:fs';
37
+ import * as path from 'node:path';
38
+ import { fileURLToPath, pathToFileURL } from 'node:url';
39
+
40
+ const _HERE = path.dirname(fileURLToPath(import.meta.url));
41
+ const REPO_ROOT = path.resolve(_HERE, '..', '..');
42
+ const RULES_DIR = path.join(REPO_ROOT, 'src', 'rules');
43
+ const HOOK_MANIFEST = path.join(REPO_ROOT, 'src', 'scripts', 'hook_manifest.yaml');
44
+ const BASELINE = path.join(REPO_ROOT, 'internal', 'reports', 'enforcement-coverage.json');
45
+
46
+ /**
47
+ * Two wiring corpora, deliberately separate.
48
+ *
49
+ * The first version treated `taskfiles/` and `.github/workflows/` as one bag, so
50
+ * "named in a taskfile" resolved to `validator` and counted under a headline that
51
+ * read "can actually fail a build". Which build? **No workflow invokes `task ci`,
52
+ * `ci-strict`, or `ci-fast`** — only the narrow `ci-cloud-bundle` and
53
+ * `ci-linear-digest`. So for a taskfile-only validator the honest answer was
54
+ * "a local run someone starts by hand", and the number said otherwise.
55
+ *
56
+ * That is the same defect the coverage gate was built to catch — a check whose
57
+ * wiring is weaker than the claim about it — committed by the gate itself. Hence
58
+ * the split: `validator` means CI runs it, `validator-local` means a human does.
59
+ */
60
+ const WORKFLOW_DIRS = [path.join(REPO_ROOT, '.github', 'workflows')];
61
+ const TASK_DIRS = [path.join(REPO_ROOT, 'taskfiles')];
62
+ const TASK_FILES = [path.join(REPO_ROOT, 'Taskfile.yml'), HOOK_MANIFEST];
63
+
64
+ export type Resolution =
65
+ | 'validator' // reachable from a WORKFLOW — CI fails without a human
66
+ | 'validator-local' // reachable only from a taskfile — fails a run someone starts
67
+ | 'test' // test file exists; the suite runs it
68
+ | 'hook' // registered in the hook manifest with fail_closed: true
69
+ | 'observer' // instruments only — never blocks
70
+ | 'unwired' // declared script exists but nothing runs it ← the D1 class
71
+ | 'missing' // declared target does not exist at all
72
+ | 'none'; // honest, recorded gap
73
+
74
+ export interface RuleCoverage {
75
+ id: string;
76
+ tier: string;
77
+ type: string;
78
+ declared: string[];
79
+ resolutions: Resolution[];
80
+ /** Strongest resolution, by the ordering in `RANK`. */
81
+ effective: Resolution;
82
+ notes: string[];
83
+ }
84
+
85
+ /** Strength order — a rule is credited with its strongest resolving backstop. */
86
+ const RANK: Resolution[] = [
87
+ 'validator',
88
+ 'test',
89
+ 'hook',
90
+ 'validator-local',
91
+ 'observer',
92
+ 'unwired',
93
+ 'missing',
94
+ 'none',
95
+ ];
96
+
97
+ /**
98
+ * A resolution that fails a CI build — the headline number.
99
+ *
100
+ * `validator-local` is NOT here, and that is the whole correction. It ranks above
101
+ * `observer` (it does block *something*) and below `hook` (which fires in the
102
+ * agent runtime without anyone asking), but a gate only a human can start is not
103
+ * what "can fail a build" means to a reader.
104
+ */
105
+ const BLOCKING: ReadonlySet<Resolution> = new Set<Resolution>(['validator', 'test', 'hook']);
106
+
107
+ // ---------------------------------------------------------------- frontmatter
108
+
109
+ /**
110
+ * Read frontmatter, keeping list values as arrays.
111
+ *
112
+ * `measure_rule_budget.strip_frontmatter` is scalar-only by design; `enforced_by`
113
+ * is a list, so this reader handles both `key: [a, b]` and block `- item` form.
114
+ * Deliberately not a general YAML parser: the accepted shape is exactly what the
115
+ * rule schema permits, and anything else is left for the schema validator to
116
+ * reject rather than silently coerced here.
117
+ */
118
+ export function read_frontmatter(text: string): Record<string, string | string[]> {
119
+ if (!text.startsWith('---\n')) return {};
120
+ const end = text.indexOf('\n---\n', 4);
121
+ if (end === -1) return {};
122
+ const out: Record<string, string | string[]> = {};
123
+ const lines = text.slice(4, end).split('\n');
124
+
125
+ let pending_key: string | null = null;
126
+ let pending_list: string[] = [];
127
+
128
+ const flush = (): void => {
129
+ if (pending_key !== null) {
130
+ out[pending_key] = pending_list;
131
+ pending_key = null;
132
+ pending_list = [];
133
+ }
134
+ };
135
+
136
+ for (const raw of lines) {
137
+ const line = raw.replace(/\s+$/, '');
138
+ if (!line || line.trimStart().startsWith('#')) continue;
139
+
140
+ const block_item = /^\s+-\s+(.*)$/.exec(line);
141
+ const item_value = block_item?.[1];
142
+ if (item_value !== undefined && pending_key !== null) {
143
+ pending_list.push(unquote(item_value.trim()));
144
+ continue;
145
+ }
146
+ flush();
147
+
148
+ const idx = line.indexOf(':');
149
+ if (idx === -1) continue;
150
+ const key = line.slice(0, idx).trim();
151
+ const val = line.slice(idx + 1).trim();
152
+
153
+ if (val === '') {
154
+ // Either a block list follows, or an empty scalar. Assume list; if no
155
+ // item follows, flush() records an empty array, which reads as absent.
156
+ pending_key = key;
157
+ pending_list = [];
158
+ continue;
159
+ }
160
+ if (val.startsWith('[') && val.endsWith(']')) {
161
+ const inner = val.slice(1, -1).trim();
162
+ out[key] = inner === '' ? [] : inner.split(',').map((s) => unquote(s.trim()));
163
+ continue;
164
+ }
165
+ out[key] = unquote(val);
166
+ }
167
+ flush();
168
+ return out;
169
+ }
170
+
171
+ function unquote(s: string): string {
172
+ if (s.length >= 2 && ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'")))) {
173
+ return s.slice(1, -1);
174
+ }
175
+ return s;
176
+ }
177
+
178
+ // ------------------------------------------------------------------- wiring
179
+
180
+ /**
181
+ * Every file whose text decides whether a script is reachable.
182
+ *
183
+ * Read once and concatenated: the question is only ever "does this path appear
184
+ * anywhere that runs things", so a single haystack is both correct and cheap.
185
+ */
186
+ function load_corpus(dirs: readonly string[], files: readonly string[] = []): string {
187
+ const parts: string[] = [];
188
+ for (const f of files) {
189
+ if (fs.existsSync(f)) parts.push(fs.readFileSync(f, 'utf-8'));
190
+ }
191
+ for (const dir of dirs) {
192
+ if (!fs.existsSync(dir)) continue;
193
+ for (const entry of walk(dir)) {
194
+ if (/\.(ya?ml)$/.test(entry)) parts.push(fs.readFileSync(entry, 'utf-8'));
195
+ }
196
+ }
197
+ return parts.join('\n');
198
+ }
199
+
200
+ /**
201
+ * Scripts reachable from a CI entry point, following umbrella indirection.
202
+ *
203
+ * A direct-mention test is not sufficient and the miss is not hypothetical:
204
+ * `lint_skill_frontmatter_safety.ts` is never named in a taskfile, yet it runs on
205
+ * every CI pass as a sub-check of the `lint_agent_security` umbrella, which is.
206
+ * Reporting it unwired would be a false alarm — the same defect class, pointed
207
+ * the other way. So reachability is transitive: seed with the scripts CI names
208
+ * directly, then expand through the scripts those name, to a fixed point.
209
+ *
210
+ * Deliberately NOT part of the seed: `_dispatch.bash`. A CLI subcommand is
211
+ * something a human or agent may invoke; enforcement is something that runs
212
+ * whether or not anyone chooses to. Conflating the two is how a package ends up
213
+ * believing an on-demand tool is a gate.
214
+ */
215
+ function reachable_scripts(wiring: string): Set<string> {
216
+ const scripts_dir = path.join(REPO_ROOT, 'src', 'scripts');
217
+ const all: string[] = fs.existsSync(scripts_dir)
218
+ ? walk(scripts_dir).filter((p) => p.endsWith('.ts'))
219
+ : [];
220
+
221
+ const rel = (abs: string): string => path.relative(REPO_ROOT, abs);
222
+ const stem = (abs: string): string => path.basename(abs).replace(/\.ts$/, '');
223
+
224
+ const reached = new Set<string>();
225
+ for (const abs of all) {
226
+ if (wiring.includes(rel(abs)) || wiring.includes(stem(abs))) reached.add(rel(abs));
227
+ }
228
+
229
+ let grew = true;
230
+ while (grew) {
231
+ grew = false;
232
+ const frontier = [...reached];
233
+ const bodies = frontier
234
+ .map((r) => {
235
+ const abs = path.join(REPO_ROOT, r);
236
+ return fs.existsSync(abs) ? strip_comments(fs.readFileSync(abs, 'utf-8')) : '';
237
+ })
238
+ .join('\n');
239
+ for (const abs of all) {
240
+ const r = rel(abs);
241
+ if (reached.has(r)) continue;
242
+ if (mentions_as_code(bodies, path.basename(abs), stem(abs))) {
243
+ reached.add(r);
244
+ grew = true;
245
+ }
246
+ }
247
+ }
248
+ return reached;
249
+ }
250
+
251
+ /**
252
+ * Drop comments before deciding whether one script invokes another.
253
+ *
254
+ * This function exists because its absence produced a live false negative. The
255
+ * first version matched any textual occurrence, so the moment THIS file's own
256
+ * docstring named `lint_output_slop.ts` as an example of an unwired linter, the
257
+ * closure "reached" it and the gate reported the very defect it was built to
258
+ * catch as fixed. A prose mention is not a call.
259
+ *
260
+ * That is the general class: a check that matches on substring presence rather
261
+ * than on the resolved structure is fail-open by construction. Stripping
262
+ * comments and requiring a quoted specifier is the narrow structural test —
263
+ * invocation always goes through a path string or an import specifier.
264
+ */
265
+ export function strip_comments(src: string): string {
266
+ return src
267
+ .replace(/\/\*[\s\S]*?\*\//g, ' ')
268
+ .split('\n')
269
+ .map((l) => l.replace(/(^|[^:])\/\/.*$/, '$1'))
270
+ .join('\n');
271
+ }
272
+
273
+ /** True when `base`/`stem` appears inside a quoted specifier — an invocation shape. */
274
+ export function mentions_as_code(haystack: string, base: string, stem: string): boolean {
275
+ for (const needle of [base, stem]) {
276
+ const q = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
277
+ if (new RegExp(`['"\`][^'"\`]*${q}[^'"\`]*['"\`]`).test(haystack)) return true;
278
+ }
279
+ return false;
280
+ }
281
+
282
+ function walk(dir: string): string[] {
283
+ const out: string[] = [];
284
+ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
285
+ const p = path.join(dir, e.name);
286
+ if (e.isDirectory()) out.push(...walk(p));
287
+ else out.push(p);
288
+ }
289
+ return out;
290
+ }
291
+
292
+ /**
293
+ * Hook name → whether it can fail a build.
294
+ *
295
+ * Parsed with a narrow reader rather than a YAML dependency: the manifest's
296
+ * `concerns:` block is a fixed two-level shape, and the only fact needed is the
297
+ * `fail_closed` flag per concern.
298
+ */
299
+ export function parse_hook_manifest(text: string): Map<string, boolean> {
300
+ const out = new Map<string, boolean>();
301
+ let in_concerns = false;
302
+ let current: string | null = null;
303
+ for (const raw of text.split('\n')) {
304
+ const line = raw.replace(/\s+$/, '');
305
+ if (/^concerns:\s*$/.test(line)) { in_concerns = true; continue; }
306
+ if (!in_concerns) continue;
307
+ if (/^\S/.test(line)) break; // left the concerns block
308
+
309
+ const concern_name = /^ {2}([a-z0-9_-]+):\s*$/.exec(line)?.[1];
310
+ if (concern_name !== undefined) {
311
+ current = concern_name;
312
+ out.set(current, false);
313
+ continue;
314
+ }
315
+ const fc = /^\s+fail_closed:\s*(true|false)\s*$/.exec(line)?.[1];
316
+ if (fc !== undefined && current !== null) out.set(current, fc === 'true');
317
+ }
318
+ return out;
319
+ }
320
+
321
+ // ---------------------------------------------------------------- resolution
322
+
323
+ export function resolve_one(
324
+ decl: string,
325
+ ctx: {
326
+ /** Scripts reachable from a GitHub workflow (transitively). */
327
+ reachable_ci: Set<string>;
328
+ /** Scripts reachable from a taskfile or the hook manifest (transitively). */
329
+ reachable_local: Set<string>;
330
+ hooks: Map<string, boolean>;
331
+ exists: (rel: string) => boolean;
332
+ },
333
+ ): { resolution: Resolution; note?: string } {
334
+ if (decl === 'none') return { resolution: 'none' };
335
+
336
+ const idx = decl.indexOf(':');
337
+ const kind = decl.slice(0, idx);
338
+ const target = decl.slice(idx + 1);
339
+
340
+ if (kind === 'observer') return { resolution: 'observer' };
341
+
342
+ if (kind === 'hook') {
343
+ if (!ctx.hooks.has(target)) {
344
+ return { resolution: 'missing', note: `hook '${target}' is not registered in hook_manifest.yaml` };
345
+ }
346
+ if (!ctx.hooks.get(target)) {
347
+ // Registered but non-blocking. It instruments; it does not enforce.
348
+ return {
349
+ resolution: 'observer',
350
+ note: `hook '${target}' is fail_closed: false — it instruments, it cannot block; counted as observer`,
351
+ };
352
+ }
353
+ return { resolution: 'hook' };
354
+ }
355
+
356
+ if (kind === 'test') {
357
+ return ctx.exists(target)
358
+ ? { resolution: 'test' }
359
+ : { resolution: 'missing', note: `test path does not exist: ${target}` };
360
+ }
361
+
362
+ if (kind === 'validator') {
363
+ if (!ctx.exists(target)) {
364
+ return { resolution: 'missing', note: `validator script does not exist: ${target}` };
365
+ }
366
+ // Resolution, not declaration — and now: reachable from WHAT.
367
+ if (ctx.reachable_ci.has(target)) return { resolution: 'validator' };
368
+ if (ctx.reachable_local.has(target)) {
369
+ return {
370
+ resolution: 'validator-local',
371
+ note: `validator '${target}' is reachable only from a taskfile — no workflow runs it, so it fails a local run someone starts, not a CI build`,
372
+ };
373
+ }
374
+ return {
375
+ resolution: 'unwired',
376
+ note: `validator '${target}' exists but is referenced by no taskfile, workflow, or hook manifest — it runs nowhere`,
377
+ };
378
+ }
379
+
380
+ return { resolution: 'missing', note: `unrecognised enforced_by form: ${decl}` };
381
+ }
382
+
383
+ export function strongest(resolutions: Resolution[]): Resolution {
384
+ if (resolutions.length === 0) return 'none';
385
+ let best: Resolution = 'none';
386
+ let best_rank = Number.POSITIVE_INFINITY;
387
+ for (const r of resolutions) {
388
+ const rank = RANK.indexOf(r);
389
+ if (rank < best_rank) {
390
+ best = r;
391
+ best_rank = rank;
392
+ }
393
+ }
394
+ return best;
395
+ }
396
+
397
+ // -------------------------------------------------------------------- report
398
+
399
+ export function collect(): RuleCoverage[] {
400
+ const ci_corpus = load_corpus(WORKFLOW_DIRS);
401
+ const local_corpus = load_corpus(TASK_DIRS, TASK_FILES);
402
+ const hooks = fs.existsSync(HOOK_MANIFEST)
403
+ ? parse_hook_manifest(fs.readFileSync(HOOK_MANIFEST, 'utf-8'))
404
+ : new Map<string, boolean>();
405
+ const exists = (rel: string): boolean => fs.existsSync(path.join(REPO_ROOT, rel));
406
+ // Seeded separately so the umbrella expansion answers "reachable from CI"
407
+ // rather than "reachable from anything". The expansion itself was correct;
408
+ // it was the seed that conflated the two.
409
+ const reachable_ci = reachable_scripts(ci_corpus);
410
+ const reachable_local = reachable_scripts(`${ci_corpus}\n${local_corpus}`);
411
+
412
+ const out: RuleCoverage[] = [];
413
+ for (const name of fs.readdirSync(RULES_DIR).sort()) {
414
+ if (!name.endsWith('.md')) continue;
415
+ const fm = read_frontmatter(fs.readFileSync(path.join(RULES_DIR, name), 'utf-8'));
416
+ const raw = fm['enforced_by'];
417
+ const declared = Array.isArray(raw) ? raw : typeof raw === 'string' && raw ? [raw] : [];
418
+
419
+ const resolutions: Resolution[] = [];
420
+ const notes: string[] = [];
421
+ for (const d of declared) {
422
+ const { resolution, note } = resolve_one(d, { reachable_ci, reachable_local, hooks, exists });
423
+ resolutions.push(resolution);
424
+ if (note) notes.push(note);
425
+ }
426
+ out.push({
427
+ id: name.replace(/\.md$/, ''),
428
+ tier: String(fm['tier'] ?? '—'),
429
+ type: String(fm['type'] ?? '—'),
430
+ declared,
431
+ resolutions,
432
+ effective: strongest(resolutions),
433
+ notes,
434
+ });
435
+ }
436
+ return out;
437
+ }
438
+
439
+ export interface Summary {
440
+ total: number;
441
+ declared: number;
442
+ /** Fails a CI build without a human starting anything. The headline. */
443
+ blocking: number;
444
+ /** Reachable only from a taskfile — reported beside the headline, never folded in. */
445
+ local_only: number;
446
+ observer: number;
447
+ unwired: number;
448
+ missing: number;
449
+ undeclared: number;
450
+ blocking_pct: number;
451
+ }
452
+
453
+ export function summarise(rows: RuleCoverage[]): Summary {
454
+ const declared = rows.filter((r) => r.declared.length > 0);
455
+ const count = (p: (r: RuleCoverage) => boolean): number => rows.filter(p).length;
456
+ const blocking = count((r) => BLOCKING.has(r.effective));
457
+ return {
458
+ total: rows.length,
459
+ declared: declared.length,
460
+ blocking,
461
+ local_only: count((r) => r.effective === 'validator-local'),
462
+ observer: count((r) => r.effective === 'observer'),
463
+ unwired: count((r) => r.effective === 'unwired'),
464
+ missing: count((r) => r.effective === 'missing'),
465
+ undeclared: rows.length - declared.length,
466
+ blocking_pct: rows.length === 0 ? 0 : Math.round((blocking / rows.length) * 1000) / 10,
467
+ };
468
+ }
469
+
470
+ function main(argv: string[]): number {
471
+ const as_json = argv.includes('--json');
472
+ const check = argv.includes('--check');
473
+ const write = argv.includes('--write-baseline');
474
+
475
+ if (!fs.existsSync(RULES_DIR)) {
476
+ process.stderr.write(`❌ check_enforcement_coverage: no rules dir at ${RULES_DIR}\n`);
477
+ return 2;
478
+ }
479
+
480
+ const rows = collect();
481
+ const summary = summarise(rows);
482
+
483
+ if (as_json) {
484
+ process.stdout.write(JSON.stringify({ summary, rules: rows }, null, 2) + '\n');
485
+ return 0;
486
+ }
487
+
488
+ if (write) {
489
+ fs.mkdirSync(path.dirname(BASELINE), { recursive: true });
490
+ fs.writeFileSync(
491
+ BASELINE,
492
+ JSON.stringify(
493
+ {
494
+ _doc:
495
+ 'Enforcement-coverage baseline. `blocking` counts rules whose strongest ' +
496
+ 'enforced_by resolves to something that can fail a build. Coverage is a ' +
497
+ 'ratchet: --check fails when blocking falls or unwired rises. Regenerate ' +
498
+ 'intentionally with --write-baseline when the change is the point.',
499
+ summary,
500
+ },
501
+ null,
502
+ 2,
503
+ ) + '\n',
504
+ );
505
+ process.stdout.write(`✅ wrote baseline → ${path.relative(REPO_ROOT, BASELINE)}\n`);
506
+ return 0;
507
+ }
508
+
509
+ // Human report.
510
+ const lines: string[] = [];
511
+ lines.push(
512
+ `enforcement coverage · ${summary.blocking}/${summary.total} rules (${summary.blocking_pct}%) ` +
513
+ `have a backstop that fails a CI build`,
514
+ );
515
+ lines.push(
516
+ ` declared ${summary.declared} · local-only ${summary.local_only} · observer ${summary.observer} · ` +
517
+ `unwired ${summary.unwired} · missing ${summary.missing} · undeclared ${summary.undeclared}`,
518
+ );
519
+ if (summary.local_only > 0) {
520
+ lines.push(
521
+ ` local-only = a validator no workflow runs. It fails \`task ci\` if someone types it; ` +
522
+ `it does not fail the build. Counted separately, never in the headline.`,
523
+ );
524
+ }
525
+
526
+ const problems = rows.filter((r) => r.notes.length > 0);
527
+ if (problems.length > 0) {
528
+ lines.push('');
529
+ lines.push(' resolution findings:');
530
+ for (const r of problems) {
531
+ for (const n of r.notes) lines.push(` · ${r.id}: ${n}`);
532
+ }
533
+ }
534
+ process.stdout.write(lines.join('\n') + '\n');
535
+
536
+ if (check) {
537
+ if (!fs.existsSync(BASELINE)) {
538
+ process.stderr.write(
539
+ `❌ check_enforcement_coverage --check: no baseline at ${path.relative(REPO_ROOT, BASELINE)}; ` +
540
+ `run --write-baseline first\n`,
541
+ );
542
+ return 2;
543
+ }
544
+ const base = JSON.parse(fs.readFileSync(BASELINE, 'utf-8')).summary as Summary;
545
+ const regressions: string[] = [];
546
+ if (summary.blocking < base.blocking) {
547
+ regressions.push(`blocking coverage fell: ${base.blocking} → ${summary.blocking}`);
548
+ }
549
+ if (summary.unwired > base.unwired) {
550
+ regressions.push(`unwired declarations rose: ${base.unwired} → ${summary.unwired}`);
551
+ }
552
+ // A validator dropping out of a workflow back into taskfile-only is the
553
+ // exact regression this split was built to name. Without this line the
554
+ // headline would fall and only the `blocking` check would notice, which
555
+ // reports the symptom rather than the cause.
556
+ if (summary.local_only > (base.local_only ?? 0)) {
557
+ regressions.push(
558
+ `validators fell back to taskfile-only: ${base.local_only ?? 0} → ${summary.local_only} ` +
559
+ `(a gate left .github/workflows/ — add it back to rule-backstops.yml)`,
560
+ );
561
+ }
562
+ if (summary.missing > base.missing) {
563
+ regressions.push(`missing targets rose: ${base.missing} → ${summary.missing}`);
564
+ }
565
+ if (regressions.length > 0) {
566
+ process.stderr.write('❌ enforcement-coverage ratchet:\n');
567
+ for (const r of regressions) process.stderr.write(` · ${r}\n`);
568
+ process.stderr.write(
569
+ ' Raise coverage, or regenerate the baseline with --write-baseline if the drop is the point.\n',
570
+ );
571
+ return 1;
572
+ }
573
+ process.stdout.write('✅ enforcement-coverage ratchet holds\n');
574
+ }
575
+ return 0;
576
+ }
577
+
578
+ // Main-guard (realpath-compared, mirrors the repo convention).
579
+ if (process.argv[1] !== undefined) {
580
+ try {
581
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
582
+ const argv1 = fs.realpathSync(path.resolve(process.argv[1]));
583
+ if (here === argv1) {
584
+ process.exit(main(process.argv.slice(2)));
585
+ }
586
+ } catch {
587
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
588
+ if (import.meta.url === argvUrl) {
589
+ process.exit(main(process.argv.slice(2)));
590
+ }
591
+ }
592
+ }
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * check_evaluator_budgets — enforce the outside-in evaluator budgets
4
+ * (road-to-credible-install Phase 6) against a measurements JSON.
5
+ *
6
+ * Two failure modes per metric:
7
+ * 1. absolute: measured > budgets[metric].max
8
+ * 2. regression: measured > last_measured * (1 + regression_pct/100)
9
+ * — fails EVEN WHEN still under the absolute budget (the >10%
10
+ * creep rule), so slow rot cannot hide under a generous cap.
11
+ *
12
+ * Usage:
13
+ * ./scripts-run src/scripts/check_evaluator_budgets --measurements <file.json>
14
+ * (measurements: flat { metric: number } — produced by evaluator_umbrella.sh)
15
+ *
16
+ * Exit codes: 0 green · 1 budget/regression exceeded · 2 internal error.
17
+ */
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import { fileURLToPath } from 'node:url';
21
+
22
+ const REPO_ROOT = path.resolve(fileURLToPath(import.meta.url), '..', '..', '..');
23
+ const BUDGETS_PATH = path.join(REPO_ROOT, 'src', 'config', 'evaluator-budgets.json');
24
+
25
+ interface BudgetEntry {
26
+ max: number;
27
+ last_measured: number;
28
+ method: string;
29
+ /** Per-metric creep override — wall-clock timings get a loose one
30
+ * (absolute cap is their real gate); sizes/counts keep the tight
31
+ * global default. */
32
+ regression_pct?: number;
33
+ }
34
+ interface BudgetsDoc {
35
+ regression_pct: number;
36
+ budgets: Record<string, BudgetEntry>;
37
+ }
38
+
39
+ export function evaluate(
40
+ budgetsDoc: BudgetsDoc,
41
+ measurements: Record<string, number>,
42
+ ): string[] {
43
+ const errors: string[] = [];
44
+ for (const [metric, entry] of Object.entries(budgetsDoc.budgets)) {
45
+ const measured = measurements[metric];
46
+ if (measured === undefined || Number.isNaN(measured)) {
47
+ errors.push(`${metric}: no measurement supplied (method: ${entry.method})`);
48
+ continue;
49
+ }
50
+ if (measured > entry.max) {
51
+ errors.push(`${metric}: measured ${measured} exceeds budget ${entry.max}`);
52
+ continue;
53
+ }
54
+ const pct = entry.regression_pct ?? budgetsDoc.regression_pct;
55
+ const ceiling = entry.last_measured * (1 + pct / 100);
56
+ if (entry.last_measured > 0 && measured > ceiling) {
57
+ errors.push(
58
+ `${metric}: measured ${measured} regressed >${pct}% vs ` +
59
+ `last_measured ${entry.last_measured} (ceiling ${ceiling.toFixed(2)}) — ` +
60
+ 'fails even under the absolute budget',
61
+ );
62
+ }
63
+ }
64
+ return errors;
65
+ }
66
+
67
+ export function main(argv: string[] = process.argv.slice(2)): number {
68
+ const idx = argv.indexOf('--measurements');
69
+ if (idx < 0 || argv[idx + 1] === undefined) {
70
+ process.stderr.write('usage: check_evaluator_budgets --measurements <file.json>\n');
71
+ return 2;
72
+ }
73
+ let budgetsDoc: BudgetsDoc;
74
+ let measurements: Record<string, number>;
75
+ try {
76
+ budgetsDoc = JSON.parse(fs.readFileSync(BUDGETS_PATH, 'utf-8')) as BudgetsDoc;
77
+ measurements = JSON.parse(fs.readFileSync(argv[idx + 1] as string, 'utf-8')) as Record<
78
+ string,
79
+ number
80
+ >;
81
+ } catch (e) {
82
+ process.stderr.write(`check_evaluator_budgets: ${(e as Error).message}\n`);
83
+ return 2;
84
+ }
85
+ const errors = evaluate(budgetsDoc, measurements);
86
+ if (errors.length > 0) {
87
+ for (const e of errors) process.stderr.write(`❌ evaluator budget: ${e}\n`);
88
+ return 1;
89
+ }
90
+ process.stdout.write(
91
+ `✅ evaluator budgets met (${Object.keys(budgetsDoc.budgets).length} metrics)\n`,
92
+ );
93
+ return 0;
94
+ }
95
+
96
+ const _selfPath = fileURLToPath(import.meta.url);
97
+ if (process.argv[1] !== undefined && path.resolve(process.argv[1]) === path.resolve(_selfPath)) {
98
+ process.exit(main());
99
+ }