@event4u/agent-config 16.1.0 → 16.3.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 (467) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +98 -257
  5. package/README.md +14 -12
  6. package/dist/agent-src/commands/analyze/inbox.md +1 -1
  7. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  8. package/dist/agent-src/commands/bug/fix.md +17 -2
  9. package/dist/agent-src/commands/feature/plan.md +1 -1
  10. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  11. package/dist/agent-src/commands/fix/ci.md +1 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/jira-ticket.md +1 -1
  14. package/dist/agent-src/commands/roadmap/create.md +1 -1
  15. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  16. package/dist/agent-src/commands/roadmap/process-full.md +5 -5
  17. package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
  18. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  19. package/dist/agent-src/commands/roadmap.md +18 -4
  20. package/dist/agent-src/commands/tests/create.md +17 -3
  21. package/dist/agent-src/commands/tests/execute.md +22 -5
  22. package/dist/agent-src/commands/work.md +4 -0
  23. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  25. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  27. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  28. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  29. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  30. package/dist/agent-src/rules/active-remediation.md +1 -1
  31. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  32. package/dist/agent-src/rules/broken-access-control.md +1 -0
  33. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  34. package/dist/agent-src/rules/context-hygiene.md +1 -1
  35. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  36. package/dist/agent-src/rules/design-fidelity.md +13 -16
  37. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  39. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  40. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  43. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  44. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  45. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  46. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  47. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  48. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  49. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  50. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  51. package/dist/agent-src/rules/persona-governance.md +2 -2
  52. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  53. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  54. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  55. package/dist/agent-src/rules/runtime-safety.md +1 -0
  56. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  57. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  58. package/dist/agent-src/rules/session-canary.md +8 -62
  59. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  60. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  61. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  62. package/dist/agent-src/rules/tool-safety.md +1 -0
  63. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  64. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  65. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  66. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  67. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  68. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  69. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  70. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  71. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  72. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  74. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  75. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  76. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  77. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
  78. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  79. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  80. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  81. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  82. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  83. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  84. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  85. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  86. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  87. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  88. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  89. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  90. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  91. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  92. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  93. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  94. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  95. package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
  96. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  97. package/dist/agent-src/templates/roadmaps.md +30 -0
  98. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  99. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  100. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  101. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  102. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  103. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  104. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  105. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  106. package/dist/cli/python/knowledge_ingest.js +1 -1
  107. package/dist/cli/python/workspace_drive.js +1 -1
  108. package/dist/cli/registry.js +1 -1
  109. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  110. package/dist/cli-delegate/check_update_banner.js +12 -1
  111. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  112. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  113. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  114. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  115. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  116. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  117. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  118. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  119. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
  120. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  121. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  122. package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
  123. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  124. package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
  125. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  126. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  127. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  128. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  129. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
  131. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
  132. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  133. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
  134. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  135. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  136. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  137. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  138. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  139. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  140. package/dist/cli-delegate/cmd_conformance.js +1862 -809
  141. package/dist/cli-delegate/cmd_doctor.js +13 -6
  142. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  143. package/dist/cli-delegate/cmd_explain.js +5 -5
  144. package/dist/cli-delegate/cmd_export.js +11 -8
  145. package/dist/cli-delegate/cmd_fleet.js +3 -3
  146. package/dist/cli-delegate/cmd_handoff.js +10 -7
  147. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  148. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  149. package/dist/cli-delegate/cmd_migrate.js +2 -2
  150. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  151. package/dist/cli-delegate/cmd_preflight.js +6 -6
  152. package/dist/cli-delegate/cmd_prune.js +11 -8
  153. package/dist/cli-delegate/cmd_refresh.js +2 -1
  154. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  155. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  156. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  157. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  158. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  159. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  160. package/dist/cli-delegate/cmd_sync.js +11 -8
  161. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  162. package/dist/cli-delegate/cmd_update.js +1 -1
  163. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  164. package/dist/cli-delegate/cmd_validate.js +11 -8
  165. package/dist/cli-delegate/cmd_versions.js +1 -1
  166. package/dist/cli-delegate/deferral_carry.js +16 -0
  167. package/dist/cli-delegate/gate_execute.js +2 -2
  168. package/dist/cli-delegate/roadmap_gates.js +5 -5
  169. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  170. package/dist/discovery/deprecation-report.md +1 -1
  171. package/dist/discovery/discovery-manifest.json +132 -80
  172. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  173. package/dist/discovery/discovery-manifest.summary.md +3 -3
  174. package/dist/discovery/dormancy-report.md +1 -1
  175. package/dist/discovery/orphan-report.md +1 -1
  176. package/dist/discovery/packs.json +7 -5
  177. package/dist/discovery/trust-report.md +2 -2
  178. package/dist/discovery/workspaces.json +6 -4
  179. package/dist/hooks/dispatch.js +7972 -5186
  180. package/dist/hooks/dispatch.sha256 +1 -0
  181. package/dist/install/claudePathsPlan.js +47 -6
  182. package/dist/install/claudeRuleRewrite.js +7 -0
  183. package/dist/install/emit_host_rules_cli.js +39 -36
  184. package/dist/install/globalRuleScope.js +87 -0
  185. package/dist/install/host_rule_ownership.js +160 -0
  186. package/dist/install/install.mjs +2226 -1055
  187. package/dist/install/installThinLayer.js +261 -0
  188. package/dist/install/installedRuleLinks.js +176 -0
  189. package/dist/install/wizard-plan.js +24 -0
  190. package/dist/mcp/registry-manifest.json +3 -3
  191. package/dist/mcp/server.json +2 -2
  192. package/dist/mcp/server.mjs +40913 -34865
  193. package/dist/scripts/_lib/agent_settings.js +11 -0
  194. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  195. package/dist/scripts/_lib/installed_layer.js +378 -0
  196. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  197. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  198. package/dist/scripts/_lib/rule_injection.js +67 -10
  199. package/dist/scripts/_lib/rule_law_section.js +122 -0
  200. package/dist/scripts/_lib/thin_rules.js +458 -0
  201. package/dist/scripts/_lib/windsurf_render.js +60 -0
  202. package/dist/scripts/condense.js +14 -26
  203. package/dist/scripts/project_thin_rules.js +14 -294
  204. package/dist/server/schemas/settings.js +29 -0
  205. package/dist/shared/skillRanking.js +74 -13
  206. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  207. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  208. package/dist/ui/index.html +2 -2
  209. package/docs/contracts/settings-classes.md +10 -6
  210. package/package.json +4 -4
  211. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  212. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  213. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  214. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  215. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  216. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  217. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  218. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  219. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  220. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  221. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  222. package/src/config/agent-settings.template.yml +91 -22
  223. package/src/config/ci-local-parity.yml +18 -0
  224. package/src/config/continuity-surface.json +9 -2
  225. package/src/config/evaluator-budgets.json +4 -4
  226. package/src/config/gate-coverage.yml +327 -3
  227. package/src/config/gate-violation-baselines.json +21 -9
  228. package/src/config/hook-bundle-budget.json +25 -0
  229. package/src/config/hook-latency-budget.json +21 -0
  230. package/src/config/hook-token-budget.json +8 -3
  231. package/src/config/host-instruction-limits.json +33 -0
  232. package/src/config/metric-registry.yml +114 -0
  233. package/src/config/placeholder-drift-budget.json +10 -0
  234. package/src/config/routing-coverage-seed.json +38 -3
  235. package/src/config/rule-activation-census.json +7 -3
  236. package/src/config/rule-consequence-class.json +161 -0
  237. package/src/config/rule-law-ceilings.json +99 -0
  238. package/src/install/claudePathsPlan.ts +46 -4
  239. package/src/install/claudeRuleRewrite.ts +10 -1
  240. package/src/install/emit_host_rules_cli.ts +43 -34
  241. package/src/install/globalRuleScope.ts +109 -0
  242. package/src/install/host_rule_ownership.ts +170 -0
  243. package/src/install/installThinLayer.ts +312 -0
  244. package/src/install/installedRuleLinks.ts +220 -0
  245. package/src/install/wizard-plan.ts +24 -0
  246. package/src/scripts/_cli/cmd_doctor.ts +28 -90
  247. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  248. package/src/scripts/_cli/doctor_execution.ts +100 -17
  249. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  250. package/src/scripts/_dispatch.bash +16 -2
  251. package/src/scripts/_lib/agent_settings.ts +11 -0
  252. package/src/scripts/_lib/body_portable.ts +102 -0
  253. package/src/scripts/_lib/cc_transcript.ts +132 -1
  254. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  255. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  256. package/src/scripts/_lib/estate_offsets.ts +241 -0
  257. package/src/scripts/_lib/exemption_shape.ts +143 -0
  258. package/src/scripts/_lib/fnv.ts +23 -0
  259. package/src/scripts/_lib/foreign_scan.ts +106 -0
  260. package/src/scripts/_lib/forge_protection.ts +114 -0
  261. package/src/scripts/_lib/forge_reader.ts +558 -0
  262. package/src/scripts/_lib/gitignore_block.ts +314 -0
  263. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  264. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  265. package/src/scripts/_lib/hook_settings.ts +73 -0
  266. package/src/scripts/_lib/host_capability.ts +40 -19
  267. package/src/scripts/_lib/host_env_write.ts +111 -0
  268. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  269. package/src/scripts/_lib/installed_layer.ts +538 -0
  270. package/src/scripts/_lib/json_merge.ts +82 -0
  271. package/src/scripts/_lib/json_pointers.ts +93 -11
  272. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  273. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  274. package/src/scripts/_lib/machine_wake.ts +16 -3
  275. package/src/scripts/_lib/neighbour_census.ts +760 -0
  276. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  277. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  278. package/src/scripts/_lib/obligations.ts +119 -8
  279. package/src/scripts/_lib/probe_inputs.ts +271 -0
  280. package/src/scripts/_lib/prompt_shape.ts +46 -0
  281. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  282. package/src/scripts/_lib/release_highlights.ts +2 -1
  283. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  284. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  285. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  286. package/src/scripts/_lib/review_coverage.ts +134 -0
  287. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  288. package/src/scripts/_lib/rule_injection.ts +130 -10
  289. package/src/scripts/_lib/rule_law_section.ts +147 -0
  290. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  291. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  292. package/src/scripts/_lib/skill_origin.ts +254 -0
  293. package/src/scripts/_lib/structural_hiding.ts +622 -0
  294. package/src/scripts/_lib/structured_ask.ts +64 -21
  295. package/src/scripts/_lib/thin_rules.ts +540 -0
  296. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  297. package/src/scripts/_lib/turn_end_refusals.ts +600 -4
  298. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  299. package/src/scripts/_lib/verification_command.ts +324 -0
  300. package/src/scripts/_lib/verification_evidence.ts +647 -0
  301. package/src/scripts/_lib/verify_clause.ts +280 -0
  302. package/src/scripts/_lib/windsurf_render.ts +63 -0
  303. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  304. package/src/scripts/ai_council/clients.ts +26 -57
  305. package/src/scripts/ai_council/config.ts +1 -1
  306. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  307. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  308. package/src/scripts/audit_skill_overlap.ts +261 -0
  309. package/src/scripts/before_complete_hook.ts +573 -25
  310. package/src/scripts/bench_hook_latency.ts +412 -5
  311. package/src/scripts/bench_touched_file_quality.ts +238 -0
  312. package/src/scripts/cache_realization_report.ts +61 -1
  313. package/src/scripts/check_argument_hint.ts +287 -0
  314. package/src/scripts/check_claims.ts +125 -1
  315. package/src/scripts/check_enforcement_coverage.ts +38 -9
  316. package/src/scripts/check_enforcement_matrix.ts +621 -22
  317. package/src/scripts/check_estate_count.ts +130 -153
  318. package/src/scripts/check_finding_dispositions.ts +138 -7
  319. package/src/scripts/check_generator_sync.ts +71 -0
  320. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  321. package/src/scripts/check_host_docs_digest.ts +786 -0
  322. package/src/scripts/check_host_format_column.ts +559 -0
  323. package/src/scripts/check_input_references.ts +228 -0
  324. package/src/scripts/check_inputs_parity.ts +235 -0
  325. package/src/scripts/check_kernel_edit_ratified.ts +89 -9
  326. package/src/scripts/check_kill_switch_table.ts +294 -0
  327. package/src/scripts/check_memory.ts +7 -1
  328. package/src/scripts/check_placeholder_drift.ts +221 -0
  329. package/src/scripts/check_read_surface_coverage.ts +515 -0
  330. package/src/scripts/check_release_highlights.ts +10 -0
  331. package/src/scripts/check_release_holds.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +38 -15
  333. package/src/scripts/check_routing_coverage.ts +378 -11
  334. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  335. package/src/scripts/check_static_parity.ts +17 -0
  336. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  337. package/src/scripts/ci_settle.ts +145 -19
  338. package/src/scripts/closure_scan.ts +115 -1
  339. package/src/scripts/code_graph/detect.ts +127 -7
  340. package/src/scripts/code_graph/foreign.ts +194 -0
  341. package/src/scripts/code_graph/query.ts +217 -4
  342. package/src/scripts/code_graph/types.ts +26 -2
  343. package/src/scripts/code_graph/validate.ts +3 -1
  344. package/src/scripts/code_graph/verbs.ts +103 -0
  345. package/src/scripts/compile_hook_manifest.ts +90 -14
  346. package/src/scripts/condense.ts +14 -27
  347. package/src/scripts/estate_exemption_shape.ts +202 -0
  348. package/src/scripts/external_sources_denylist.json +29 -4
  349. package/src/scripts/generate_host_cost_table.ts +1 -1
  350. package/src/scripts/hook_manifest.json +1 -1
  351. package/src/scripts/hook_manifest.yaml +192 -14
  352. package/src/scripts/hooks/block_config_weakening.ts +294 -4
  353. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  354. package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
  355. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  356. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  357. package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
  358. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  359. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  360. package/src/scripts/hooks/concern_registry.ts +2 -0
  361. package/src/scripts/hooks/concern_timings.ts +94 -0
  362. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  363. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  364. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  365. package/src/scripts/hooks/dispatch_hook.ts +77 -71
  366. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  367. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  368. package/src/scripts/hooks/evidence_independence.ts +1 -2
  369. package/src/scripts/hooks/exit_codes.ts +129 -0
  370. package/src/scripts/hooks/host_lowering.json +1 -0
  371. package/src/scripts/hooks/host_lowering.ts +146 -3
  372. package/src/scripts/hooks/host_lowering.yaml +262 -46
  373. package/src/scripts/hooks/host_semantics.ts +30 -2
  374. package/src/scripts/hooks/injection_budget.ts +9 -2
  375. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  376. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  377. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  378. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  379. package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
  380. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  381. package/src/scripts/hooks/payload_stub.ts +10 -1
  382. package/src/scripts/hooks/permission_gate.ts +1 -2
  383. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  384. package/src/scripts/hooks/replay_hook.ts +2 -1
  385. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  386. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  387. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  388. package/src/scripts/hooks/rule_inject_hook.ts +765 -68
  389. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  390. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  391. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  392. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  393. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  394. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  395. package/src/scripts/hooks/table_fingerprint.ts +70 -0
  396. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  397. package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
  398. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  399. package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
  400. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  401. package/src/scripts/hooks_status.ts +112 -0
  402. package/src/scripts/injection_scan_hook.ts +7 -0
  403. package/src/scripts/install.ts +75 -189
  404. package/src/scripts/installed_layer_report.ts +103 -0
  405. package/src/scripts/language_mirror_hook.ts +15 -6
  406. package/src/scripts/learning_sidecar.ts +119 -8
  407. package/src/scripts/lint_deny_text.ts +419 -0
  408. package/src/scripts/lint_exit_codes.ts +262 -0
  409. package/src/scripts/lint_hook_manifest.ts +108 -0
  410. package/src/scripts/lint_major_migration_sections.ts +156 -26
  411. package/src/scripts/lint_pack_boundaries.ts +63 -5
  412. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  413. package/src/scripts/lint_rule_law_section.ts +517 -0
  414. package/src/scripts/lint_skill_descriptions.ts +1 -1
  415. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  416. package/src/scripts/lint_workflow_security.ts +161 -5
  417. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  418. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  419. package/src/scripts/mcp_server/prompts.ts +142 -1
  420. package/src/scripts/measure_routing_signal.ts +54 -16
  421. package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
  422. package/src/scripts/measure_turn_end_gate.ts +193 -0
  423. package/src/scripts/memory_learn_hook.ts +91 -6
  424. package/src/scripts/memory_lookup.ts +1 -1
  425. package/src/scripts/model_rule_injection.ts +52 -5
  426. package/src/scripts/prepack-check.mjs +53 -0
  427. package/src/scripts/project_thin_rules.ts +34 -327
  428. package/src/scripts/release_publication.ts +13 -1
  429. package/src/scripts/report_evidence_temperature.ts +657 -0
  430. package/src/scripts/report_installed_rule_links.ts +157 -0
  431. package/src/scripts/report_invocation_surface.ts +383 -0
  432. package/src/scripts/report_label_agreement.ts +233 -0
  433. package/src/scripts/report_obligation_carriers.ts +699 -0
  434. package/src/scripts/report_obligation_mechanism.ts +230 -0
  435. package/src/scripts/report_obligation_writer_split.ts +236 -0
  436. package/src/scripts/report_single_token_triggers.ts +277 -0
  437. package/src/scripts/report_skill_menu_census.ts +208 -0
  438. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  439. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  440. package/src/scripts/report_verification_record_coverage.ts +306 -0
  441. package/src/scripts/roadmap_verify_share.ts +213 -0
  442. package/src/scripts/rule_activation_census.ts +5 -2
  443. package/src/scripts/rule_trigger_eval.ts +9 -9
  444. package/src/scripts/schemas/command.schema.json +44 -0
  445. package/src/scripts/schemas/review-findings.schema.json +7 -2
  446. package/src/scripts/schemas/rule.schema.json +5 -0
  447. package/src/scripts/schemas/skill.schema.json +44 -0
  448. package/src/scripts/self_review_gate.ts +421 -17
  449. package/src/scripts/semantic_parity_census.ts +314 -0
  450. package/src/scripts/session_eol_report.ts +54 -1
  451. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  452. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  453. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  454. package/src/scripts/sync_gitignore.ts +29 -235
  455. package/src/scripts/trigger_eval_grandfather.json +0 -7
  456. package/src/scripts/trigger_eval_rotation.ts +122 -27
  457. package/src/scripts/ui_conformance_probe.ts +156 -4
  458. package/src/scripts/update_prices.ts +85 -3
  459. package/src/scripts/write_bundle_digest.mjs +74 -0
  460. package/src/server/schemas/settings.ts +41 -0
  461. package/src/shared/skillRanking.ts +117 -11
  462. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  463. package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
  464. package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
  465. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  466. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  467. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
@@ -52,15 +52,43 @@
52
52
  # of them.
53
53
  # canary optional mutation recipe (Phase 7) — see CANARY below
54
54
  #
55
- # COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-09-13)
55
+ # COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-10-01)
56
56
  # ----------------------------------------------------------
57
- # 330 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
57
+ # 347 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
58
58
  # (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`,
59
59
  # re-run on the tree carrying these rows.)
60
- # **97 rows are listed below**, so the manifest covers 97/332 = 29.2 % of the
60
+ # **109 rows are listed below**, so the manifest covers 109/347 = 31.4 % of the
61
61
  # population, and is complete for every gate that can carry a floor. The row
62
62
  # count is `grep -c '^ - id:'`, recomputed here rather than incremented.
63
63
  #
64
+ # RECOUNTED 2026-09-29 ON A MERGE, and this is the hazard the two blocks below
65
+ # predicted arriving in the form they predicted. Two branches each recounted
66
+ # CORRECTLY for their own tree — 341/103 here, 341/102-then-103 there — and
67
+ # after the merge both rows exist, so NEITHER pair describes the file. Both
68
+ # figures are recomputed on the MERGED tree rather than reconciled or
69
+ # incremented: 345 from `count_gate_scripts`, 107 from `grep -c '^ - id:'`.
70
+ # The same failure `.secret-allow` records for its own line pin, in a second
71
+ # file, for the same structural reason: a figure about an append-heavy manifest
72
+ # drifts per-branch, not only per-commit.
73
+ #
74
+ # RECOUNTED 2026-09-29, on the change that adds `check_read_surface_coverage`.
75
+ # The header said 97 rows against an actual 102 and 330 scripts against an
76
+ # actual 341 — drift of 5 and 11 against the tolerance of 15 in
77
+ # `check_gate_coverage.test.ts` § states an honest denominator, so nothing was
78
+ # red and the 341st arrival would not have redded it either. Corrected on the
79
+ # way past, which the block below says is exactly how this figure keeps ending
80
+ # up a function of who happened to look. Both numbers are computed here, not
81
+ # incremented: 341 from `count_gate_scripts`, 103 from `grep -c '^ - id:'`.
82
+ # RECOUNTED 2026-09-29, on the change that adds `check_host_format_column`, and
83
+ # BOTH figures had already drifted — which is the block below predicting itself.
84
+ # The header read 330 scripts against a measured 341 (drift 11, against the
85
+ # tolerance of 15 in `check_gate_coverage.test.ts` § states an honest
86
+ # denominator) and 97 rows against a measured 102 before this change. Neither
87
+ # was red and neither would have been for another four arrivals. Both are
88
+ # recomputed on this tree rather than incremented, for the reason the 2026-09-13
89
+ # block gives: an incremented figure inherits whatever error it started from,
90
+ # and the drift above is what that inheritance looks like after sixteen days.
91
+ #
64
92
  # RECOUNTED 2026-09-13, on a change that adds NO gate script — and that is the
65
93
  # point of this block rather than an aside. Every recount below was triggered by
66
94
  # someone adding a row and noticing the header was stale on the way past, which
@@ -1418,6 +1446,14 @@ gates:
1418
1446
  status: enforced
1419
1447
  no_canary_reason: "The gate carries its own `--self-test` (5 cases, 3 rejecting) — so this row is an adopter, not an exemption; the reason field states why a PLANTED canary is additionally unavailable. Beyond the self-test the negative controls are the 30 mechanism tests in tests/scripts/check_claims.test.ts (17) and tests/scripts/check_claims_retired_phrasings.test.ts (13), each building a throwaway tree and running the real script in it. Twenty-one assert a REJECTION, and one publishes the LITERAL historical string (`zero runtime daemon`) that shipped in package.json and .github/about.yml while claim:no-runtime-daemon was already withdrawn. A planted canary here would mean committing a retired phrasing to a real publish surface and removing it again, and a forgotten one is precisely the defect this gate exists to catch."
1420
1448
 
1449
+ - id: check_kill_switch_table
1450
+ argv: []
1451
+ ci_invocation: .github/workflows/rule-backstops.yml
1452
+ min_scanned: 3
1453
+ corpus: "the three ledger targets this gate resolves — the tree enumeration over `src/scripts/hooks/` and `src/scripts/_lib/` (419 files, 29 switches at registration), the table's row set in `docs/contracts/hook-architecture-v1.md` § Kill switches (29 rows), and the set comparison between them. The FILE count is separately floored by `assertScanned`, which refuses a run that read zero source files, so a moved root fails rather than reporting an empty tree as agreement with an empty table."
1454
+ status: enforced
1455
+ no_canary_reason: "The gate carries its own `--self-test` (6 cases, 4 rejecting), run as its own CI step: a switch with no row, a row with no switch, one-added-plus-one-stale (which a COUNT comparison would pass and a set comparison must not), and a missing section — plus two ACCEPT cases pinning that the two esbuild `--define` identifiers stay excluded, so a gate that started rejecting everything would not pass either. A planted canary would mean committing a fake `AGENT_CONFIG_*` read into a real hook file and removing it again, and a forgotten one is an environment variable in the shipped hook layer that nothing reads — the exact defect this gate exists to catch, left behind by its own canary."
1456
+
1421
1457
  - id: check_rule_evidence_declaration
1422
1458
  argv: []
1423
1459
  min_scanned: 10
@@ -1460,6 +1496,30 @@ gates:
1460
1496
  cannot survive a collapse: at that point the gate's own `reportScanned`
1461
1497
  fires first. (Set to 50 in the first version, corrected on an R2 finding.)
1462
1498
 
1499
+ - id: check_verify_expectation_delta
1500
+ argv: []
1501
+ min_scanned: 0
1502
+ corpus: "the `verify:` clauses a change ADDS under agents/roadmaps/ — a set difference against the base ref, not a file set, which is why the floor is 0: a change touching no roadmap legitimately adds none, and a floor above 0 would fail every unrelated pull request. The denominator the gate reports is added clauses, so a change that adds ten to one file scanned ten things."
1503
+ status: enforced
1504
+ no_canary_reason: >
1505
+ A canary cannot express this gate's violation. The violation is a property
1506
+ of the DIFF — a clause that was ADDED without an expectation — so a file
1507
+ planted in the tree is, from the gate's point of view, a clause somebody
1508
+ added, which is either a true positive (and the canary is indistinguishable
1509
+ from the thing it is meant to detect) or, once committed on main, invisible
1510
+ forever. The negative control is the gate's own `--self-test`, run as its
1511
+ own CI step: 10 cases, 4 rejecting — an added bare clause, a bare clause
1512
+ among expectation-carrying siblings, a `cat` command asked for an oracle
1513
+ despite a weak exit status, and an `./path/script.ts` invocation that the
1514
+ pointer carve-out must NOT exempt — plus six ACCEPT cases pinning what must
1515
+ not fire (an expectation in either form, the prose MANUAL form, a backticked
1516
+ file pointer with and without a `:line` suffix, and a bare clause already at
1517
+ base). One limit is stated rather than implied: the already-at-base case
1518
+ does not exercise context-line handling, because under `--unified=0` the
1519
+ unchanged clause does not appear in the patch at all; the unit test
1520
+ `reads ADDED lines only` is what pins that. Same class as
1521
+ check_estate_count's diff-scoped half.
1522
+
1463
1523
  - id: check_static_parity
1464
1524
  argv: ["--quiet"]
1465
1525
  min_scanned: 20
@@ -2882,6 +2942,146 @@ gates:
2882
2942
  A projected rule routing to a guideline body the projection does not
2883
2943
  contain. The gate must fail on this and pass once it is removed.
2884
2944
 
2945
+ - id: check_placeholder_drift
2946
+ argv: []
2947
+ ci_invocation: .github/workflows/consistency.yml
2948
+ min_scanned: 400
2949
+ corpus: "every projected command and skill source — 502 at baseline; the ratchet reads their PROSE, per the unit published in report_invocation_surface.ts"
2950
+ status: enforced
2951
+ no_canary_reason: >-
2952
+ a create-only canary CAN plant a skill, and a planted body carrying a
2953
+ foreign placeholder is exactly what this gate rejects — so the plant is
2954
+ not impossible, it is redundant. `--self-test` already runs that plant as
2955
+ one of five cases over a fixture root, and doing it in-tree would drop a
2956
+ stray SKILL.md into a projected directory, reddening unrelated generator
2957
+ and count gates before this one is reached. Discrimination is proven by
2958
+ that self-test (5 cases, 3 rejecting) covering both directions the ratchet
2959
+ has to separate: at the seed and BELOW it, green — it must never fail on
2960
+ the absolute number; one occurrence over a ceiling, and a first occurrence
2961
+ against a zero ceiling, red; and an unreadable budget refusing with exit 2
2962
+ rather than certifying a green it could not compute.
2963
+
2964
+ - id: check_input_references
2965
+ argv: []
2966
+ ci_invocation: .github/workflows/consistency.yml
2967
+ min_scanned: 400
2968
+ corpus: "projected commands and skill sources — 502 at baseline. Only artifacts that DECLARE an inputs block are checked, so the finding population is a subset that grows with adoption"
2969
+ status: enforced
2970
+ no_canary_reason: >-
2971
+ the finding population is empty by construction until artifacts adopt the
2972
+ optional block, so a create-only canary would have to plant a DECLARING
2973
+ artifact carrying an unbacked reference — which is precisely what the
2974
+ self-test plants, over a fixture root instead of into src/skills/.
2975
+ Discrimination is proven there (3 cases, 1 rejecting) across the
2976
+ distinction that actually matters for this gate: a backed reference
2977
+ passes, an unbacked one fails, and an artifact with NO declaration passes
2978
+ however it references — the scope rule that lets the gate ship green.
2979
+
2980
+ - id: check_argument_hint
2981
+ argv: []
2982
+ ci_invocation: .github/workflows/consistency.yml
2983
+ min_scanned: 200
2984
+ corpus: "command sources under src/domains — 203 at baseline. Commands only, because argument-hint is a key of command.schema.json and of no other schema"
2985
+ status: enforced
2986
+ no_canary_reason: >-
2987
+ every violation is a DISAGREEMENT between two fields of one file — a
2988
+ hand-written hint contradicting a declaration, or a declaration with no
2989
+ hint. A created file is a legitimate corpus member unless it carries that
2990
+ disagreement, so the useful plant is a content plant, which the self-test
2991
+ performs over a fixture root (4 cases, 2 rejecting): a matching hint
2992
+ passes, a contradicting one fails, a declaration with no hint fails, and
2993
+ an artifact with no declaration keeps its free-text hint untouched. The
2994
+ conflict case was also reproduced by hand against the real tree on
2995
+ 2026-09-29 by planting a wrong hint on a declaring command, which exits 1.
2996
+
2997
+ - id: check_inputs_parity
2998
+ argv: []
2999
+ ci_invocation: .github/workflows/consistency.yml
3000
+ min_scanned: 400
3001
+ corpus: "command sources, skill sources and projected commands — 705 at baseline; only those declaring an inputs block can diverge"
3002
+ status: enforced
3003
+ no_canary_reason: >-
3004
+ a violation is a DIFFERENCE between two readings of one file, so nothing
3005
+ about a file's existence can produce it — only its content can. The
3006
+ self-test plants that content over a fixture root (5 cases, 4 rejecting),
3007
+ one per way the stdlib-only MCP reader and a real YAML parse can part
3008
+ company: the flow form, a nested mapping under an item key, a block
3009
+ scalar, and a dash on its own line. The accepting case is the supported
3010
+ block form, because a suite that only proves failures proves a gate that
3011
+ refuses everything.
3012
+
3013
+ - id: check_read_surface_coverage
3014
+ argv: ["--quiet"]
3015
+ ci_invocation: .github/workflows/consistency.yml
3016
+ min_scanned: 12
3017
+ corpus: >
3018
+ modules under `src/scripts/` that both bring outside bytes in through a
3019
+ recognised inbound shape (`await fetch`, a `node:http(s)` request, a
3020
+ subprocess of curl/wget/gh, a parse of markup on stdin, or a shape the
3021
+ module declares at its own site) and hand a string onward — 24 at
3022
+ baseline. The floor sits at 12 because the shape set is narrow and the
3023
+ corpus moves by ones as a network call is added or removed; a reading
3024
+ below it means a detector stopped matching or the walk lost `src/scripts/`,
3025
+ not that half this repository's network calls were deleted.
3026
+ status: enforced
3027
+ no_canary_reason: >-
3028
+ the canary contract is create-only, and a planted module carrying a fetch
3029
+ would be a legitimate corpus member — the gate would emit a row for it and
3030
+ be right to. Every violation this gate has is a DIFFERENCE between two
3031
+ readings: the committed table against the regenerated one, the floor's
3032
+ header against the table, the detector's text against the no-percentage
3033
+ rule. None of those can be produced by a file's existence, only by its
3034
+ content. Discrimination is proven by `--self-test` instead (7 cases, 6
3035
+ rejecting: a seeded unsanitized fetch-derived emit the table does not
3036
+ carry, a hand-flipped coverage cell, a header restating a module path the
3037
+ table lists, a header with no pointer at all, a recall percentage in the
3038
+ structural detector, and an empty scan root). That last case is the
3039
+ scan-scope collapse `assertScanned` exists for, observed red on
3040
+ 2026-09-29 by planting a fixture root with no `src/scripts/` at all: it
3041
+ exits 1 with "scanned 0 read surface(s)" rather than certifying a table it
3042
+ never compared.
3043
+
3044
+ - id: check_hook_bundle_composition
3045
+ argv: []
3046
+ ci_invocation: .github/workflows/consistency.yml
3047
+ min_scanned: 150
3048
+ corpus: >
3049
+ modules esbuild inlines into `dist/hooks/dispatch.js` — 276 at baseline,
3050
+ read from the metafile of a build this gate performs rather than from the
3051
+ untracked bundle on disk. The floor sits at 150 because the dispatcher's
3052
+ concern chain alone accounts for most of that graph and the figure moves by
3053
+ ones as a concern is added or a dependency dropped; a reading below it means
3054
+ the entry point moved or the build produced a stub, not that half the hook
3055
+ layer was deleted. Note the floor is a MODULE count while the gate's own
3056
+ bound is a BYTE count — deliberately two different units, because a bundle
3057
+ can collapse to a stub at constant byte size only by also collapsing its
3058
+ module graph, and neither number alone sees both failures.
3059
+ status: enforced
3060
+ no_canary_reason: >-
3061
+ the canary contract is create-only and this gate's corpus is a BUILD
3062
+ OUTPUT, not a tree. A planted file under `src/` is in scope only if
3063
+ something imports it, and a planted file under `dist/hooks/` is read by
3064
+ nothing here — the gate builds its own bundle to a temporary directory
3065
+ precisely so no on-disk artefact can steer its verdict. Both violations it
3066
+ has are properties of that build: a second YAML package contributing bytes,
3067
+ and a byte count over the committed ceiling. Discrimination is proven by
3068
+ `--self-test` instead (4 cases, 3 rejecting: a second YAML reader, a bundle
3069
+ one byte over the ceiling, and a metafile with no entry-point output — the
3070
+ last being the build-produced-nothing case, which must exit non-zero rather
3071
+ than certify a composition of 0 bytes). Proven additionally against the
3072
+ REAL artefact rather than only against fixtures: run over the metafile of
3073
+ the pre-swap bundle, both findings fire with the measured figures
3074
+ (`js-yaml` 95,846 B beside `yaml` 258,839 B, 1,563,576 bytes against a
3075
+ 1,500,000 ceiling), which is the regression this gate was built for seen
3076
+ red on the bytes that actually shipped.
3077
+ note: >
3078
+ road-to-a-hook-bundle-with-one-yaml-reader 1.3 + 2.1. Its two siblings are
3079
+ local-only by construction (`dist/hooks/` is untracked, so CI has no bundle
3080
+ to read); this one is not, because it builds the bundle it measures. What it
3081
+ deliberately does NOT claim is anything about latency — the wall-clock axis
3082
+ is `src/config/hook-latency-budget.json` and no number here is derived from
3083
+ it.
3084
+
2885
3085
  - id: check_enforcement_matrix
2886
3086
  argv: ["--quiet"]
2887
3087
  ci_invocation: .github/workflows/consistency.yml
@@ -2905,6 +3105,77 @@ gates:
2905
3105
  and the phantom value wrote through; the backing set now reads the raw
2906
3106
  configuration fields and the same sabotage exits 1.
2907
3107
 
3108
+ - id: check_host_format_column
3109
+ argv: ["--quiet"]
3110
+ ci_invocation: .github/workflows/consistency.yml
3111
+ min_scanned: 8
3112
+ corpus: "rows of the host table in docs/enforcement-by-host.md, found by its exact header line (9 at baseline — the nine hosts the file lists)"
3113
+ status: enforced
3114
+ no_canary_reason: >-
3115
+ the corpus is the one table in ONE document at a fixed path, and the
3116
+ canary contract is create-only. A planted second `enforcement-by-host.md`
3117
+ would have to overwrite the real one to land in scope, and every violation
3118
+ this gate can have is a MODIFICATION — a format cell hand-edited to name a
3119
+ path no emitter writes. Discrimination is proven by `--self-test` instead
3120
+ (5 cases, 4 rejecting: the historical `.cursorrules` defect planted back
3121
+ into the Cursor cell, the near-miss `.cursor/rules.mdc`, an invented
3122
+ surface on a correct neighbouring row, and a document whose table header
3123
+ is gone — which must fail on the scope assertion rather than pass over an
3124
+ empty corpus). The self-test earned that list rather than being written to
3125
+ match: on its first run it reported the near-miss case as NOT behaving,
3126
+ twice and for two different real defects. The first was in the matcher —
3127
+ `USER_SCOPE_PATHS`' bare `~/.cursor/` anchor was being treated as a root
3128
+ anything could refine, so `.cursor/rules.mdc` passed on an anchor no
3129
+ emitter writes into; anchors are exact-match only now. The second was in
3130
+ the fixture — it replaced the token rather than the whole row, and the
3131
+ same token appears in the prose paragraph above the table, which this gate
3132
+ does not scan, so `String.replace` mutated the prose and the case asserted
3133
+ nothing. End to end by hand on 2026-09-29: restoring `.cursorrules` into
3134
+ the committed Cursor row exits 1 naming that row and that token, and the
3135
+ restore exits 0.
3136
+
3137
+ - id: lint_deny_text
3138
+ argv: []
3139
+ ci_invocation: .github/workflows/consistency.yml
3140
+ min_scanned: 5
3141
+ corpus: "the `severity: blocking` concerns in src/scripts/hook_manifest.yaml, read from the manifest rather than listed in the gate (9 at baseline)"
3142
+ status: enforced
3143
+ no_canary_reason: >-
3144
+ the corpus is derived from one manifest at a fixed path and the canary
3145
+ contract is create-only. A planted extra concern file is out of scope
3146
+ unless the manifest also names it, and every violation this gate can have
3147
+ is a MODIFICATION — a refusal message edited to name the switch that
3148
+ turns the guard off. Discrimination is proven by `--self-test` instead
3149
+ (7 cases, 3 rejecting: an env assignment with its value, an `export`
3150
+ line, a settings key in prose, and — the direction that matters for a
3151
+ young pattern gate — a bare settings key used as a LOOKUP, which must
3152
+ pass, because a rule that fired on it would fire on every concern that
3153
+ reads its own configuration). An empty corpus is refused by
3154
+ `assertScanned` before the verdict, so a manifest whose `severity:` key
3155
+ was renamed fails rather than certifying zero concerns clean.
3156
+
3157
+ - id: lint_exit_codes
3158
+ argv: []
3159
+ ci_invocation: .github/workflows/consistency.yml
3160
+ min_scanned: 40
3161
+ corpus: "every `.ts` under src/scripts/hooks/ except `exit_codes.ts` itself, which is where the numerals are defined (59 at baseline)"
3162
+ status: enforced
3163
+ no_canary_reason: >-
3164
+ the canary contract is create-only, and a planted hook file carrying a
3165
+ bare `process.exit(1)` WOULD be a legitimate violation the gate is right
3166
+ to report — so a create-only canary here proves detection, not
3167
+ discrimination, and the interesting direction is the opposite one: an
3168
+ imported name must PASS. Discrimination is proven by `--self-test`
3169
+ instead (6 cases, 4 rejecting: a bare deny numeral, a bare allow numeral
3170
+ — `0` is the one people assume is harmless — a call with whitespace
3171
+ inside it, and an empty corpus; against two accepting cases, an imported
3172
+ name and the table file, whose fixture plants a bare exit into
3173
+ `exit_codes.ts` every run so the one exclusion is exercised rather than
3174
+ asserted). What a green does NOT cover is stated in the gate's header: it
3175
+ accepts an identifier without resolving where the identifier came from, so
3176
+ a local `const EXIT_BLOCK = 1` shadowing the import passes this gate and
3177
+ is caught in review as a duplicate declaration.
3178
+
2908
3179
  - id: check_release_holds
2909
3180
  argv: ['--lint']
2910
3181
  ci_invocation: .github/workflows/release-validation.yml
@@ -2933,3 +3204,56 @@ gates:
2933
3204
  inside the gate by `assertScanned` — observed red on 2026-09-19 by
2934
3205
  pointing the folder list at a non-existent directory, which exits 1 with
2935
3206
  "scanned 0 roadmap file(s)" rather than certifying an empty corpus.
3207
+ - id: check_host_docs_digest
3208
+ argv: []
3209
+ min_scanned: 8
3210
+ corpus: "verified ROWS of src/scripts/hooks/host_lowering.yaml — the (host, surface) pairs carrying a `verified:` block, which are the rows that can cite a page at all. Nine today; the floor is 8 because a host legitimately leaving the table is a one-row move, while a resolver that stopped seeing the table would read zero. Counting rows and not URLs is deliberate: `cowork` carries a verified block with `docs_url: null` and is a real row the watcher must still see and skip, so a URL count would make a correct no-url row look like corpus loss."
3211
+ status: enforced
3212
+ ci_invocation: .github/workflows/host-docs-digest.yml
3213
+ no_canary_reason: >-
3214
+ A planted file cannot express this gate's violation. The corpus is ONE
3215
+ configuration file plus the live bodies of eight vendor pages, so there is
3216
+ no tree a canary could be added to: the only way to make the floor fire is
3217
+ to remove rows from `host_lowering.yaml`, which is the thing the floor
3218
+ exists to notice and not something a canary may do to a plumbing source
3219
+ under `check_kernel_edit_ratified`. Discrimination is proven instead by
3220
+ two things that run. `--self-test` drives the real decision functions over
3221
+ the real table, including both directions of every state — unchanged vs
3222
+ changed, filled vs missed, 404 (`gone`) vs 503 (`unreachable`), and drift
3223
+ write vs no write. And `tests/scripts/host_docs_digest.test.ts` (20 cases)
3224
+ runs the REAL `lint_hook_manifest._check_host_lowering` over the REAL
3225
+ writer's output, so the full drift-to-refusal chain is exercised end to
3226
+ end rather than asserted. Both were seen RED deliberately: neutralising
3227
+ `isDrift` fails 4 of 20, and reverting the `gone` write-skip fails the
3228
+ case that pins it. The `filled`-vs-`missed` direction named above is
3229
+ asserted in BOTH places — it was credited to `--self-test` before it was
3230
+ actually there, which a review caught and which is why the assertion now
3231
+ exists rather than the sentence being softened.
3232
+ - id: lint_workflow_security
3233
+ argv: []
3234
+ min_scanned: 25
3235
+ corpus: "workflow files under .github/workflows/ — `*.yml` then `*.yaml`, the two globs the gate scans in that order (34 today). The floor is 25 because workflows are consolidated and split routinely, so a handful leaving is normal, while a glob that stopped matching or a directory that moved reads far below it. Counting FILES and not findings is the point: this gate legitimately reports zero findings, so a floor over findings would be the false-count shape this file rejects."
3236
+ status: enforced
3237
+ ci_invocation: .github/workflows/consistency.yml
3238
+ no_canary_reason: >-
3239
+ A create-only canary cannot change this gate's verdict. It is warn-only by
3240
+ design — the council-locked severity model (2026-06-13) makes MEDIUM
3241
+ advisory and only `--strict` turns a HIGH into exit 1 — and the CI
3242
+ invocation this row pins carries no `--strict`, so a planted workflow with
3243
+ a `pull_request_target` untrusted checkout would be REPORTED and the gate
3244
+ would still exit 0. A canary run under a different argv would prove
3245
+ something about an invocation CI does not make, which is the drift
3246
+ `ci_invocation` exists to stop. Discrimination is proven by `--self-test`
3247
+ instead (5 cases, 3 rejecting), which drives the two exits the gate really
3248
+ has rather than the one the CI invocation cannot reach: an empty workflows
3249
+ directory exits 2 instead of printing "0 HIGH, 0 MEDIUM" over nothing, a
3250
+ `pull_request_target` checkout of the untrusted ref exits 1 under
3251
+ `--strict`, and an over-cap allowlist exits 2 instead of suppressing
3252
+ silently. The two accepting cases pin the warn-only tier from the other
3253
+ side — a MEDIUM under `--strict` must still PASS, which is the direction a
3254
+ future re-tiering would silently break, and a clean workflow must pass at
3255
+ all. Seen red deliberately on 2026-10-01 by emptying `DANGEROUS_TRIGGERS`:
3256
+ the HIGH case alone fails, 4/5, and restoring it returns 5/5. Promoting the
3257
+ tier so a canary becomes expressible is a separate decision, recorded
3258
+ unresolved in
3259
+ agents/evidence/analysis/workflow-security-net-degraded-decision.md.