@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
@@ -23,11 +23,21 @@
23
23
  # - src/scripts/hooks/host_semantics.ts (VERIFIED_PLATFORMS, isBlockCapable, emission shape)
24
24
  # - src/scripts/_lib/host_bindings.ts (per-host bridge bindings + the install smoke probe)
25
25
  # - src/scripts/lint_hook_manifest.ts (schema + expiry gate)
26
+ # - src/scripts/check_host_docs_digest.ts (docs-drift watcher over `verified.docs_digest`)
26
27
  #
27
28
  # COLUMNS
28
29
  # block_exit exit code this host honours as a refusal on that slot;
29
30
  # `null` = this tree has not established that it honours one.
31
+ # answered_at the date the pair above was last answered — REQUIRED on
32
+ # every slot. A `block_exit: null` with no date is
33
+ # indistinguishable from a slot nobody looked at, and that
34
+ # ambiguity is what this column removes. The citation for the
35
+ # answer is the row's `verified.docs_url` unless the slot
36
+ # carries its own `docs_url:`.
30
37
  # json_shape structured-output envelope the dispatcher may emit.
38
+ # `none` means this package has no native envelope for the
39
+ # host, so `emitFor` keeps the legacy pass-through even when
40
+ # the row is verified — see host_semantics.usesNativeEmission.
31
41
  # entry_shape shape of the bridge entry the installer writes.
32
42
  # fail_policy `propagate` = the dispatcher's exit code reaches the host;
33
43
  # `discard` = the trampoline exits 0 regardless.
@@ -35,10 +45,32 @@
35
45
  # timeout_default host default for that timeout. `null` = not established here.
36
46
  # verified provenance of the row, or `null`. `expires` is mandatory
37
47
  # when the block is present — see lint_hook_manifest.
48
+ # `docs_digest` is the sha256 of the `docs_url` body as last
49
+ # ESTABLISHED for the row — recorded by a human-run fill,
50
+ # never silently updated. On drift the watcher leaves it
51
+ # alone and moves `expires` instead, so the field keeps
52
+ # naming the body someone actually read. It is NOT paired
53
+ # with `docs_at`, and the committed rows prove why: all nine
54
+ # carry `docs_at: 2026-09-29` while the eight digests were
55
+ # taken 2026-10-01. The two answer different questions —
56
+ # `docs_at` when a human read the page for the row's ANSWERS,
57
+ # `docs_digest` which body the watcher is comparing against.
58
+ # `check_host_docs_digest --fetch` re-reads and flags a
59
+ # difference.
38
60
  # slots ORDERED. Bridge entries are written in this order, so the
39
61
  # order is part of the generated output and must not be
40
62
  # sorted. `native` may be a list where one slot has two
41
63
  # native events (cline session_start).
64
+ #
65
+ # THE `expires` POLICY, STATED RATHER THAN IMPLIED. No host this package
66
+ # supports publishes a documentation cadence, so no `expires` here is a vendor
67
+ # commitment — each one is a review-by date this package chose. Rows established
68
+ # by a dated documentation read carry `docs_at` + 1 year. `claude` keeps its
69
+ # committed 2027-09-06 because that value predates this policy and nothing in
70
+ # this change gives a reason to move it. The real drift signal is
71
+ # `docs_digest`: when the watcher sees a changed body it sets `expires` to the
72
+ # day BEFORE the detection date, because `lint_hook_manifest` tests `expires <
73
+ # today` — "valid through yesterday" is how a row stops being current today.
42
74
  schema_version: 1
43
75
 
44
76
  hosts:
@@ -52,24 +84,32 @@ hosts:
52
84
  timeout_default: null
53
85
  # Transcribed from the behaviour host_semantics.ts already implements —
54
86
  # this row is a description of the status quo, not a new claim.
55
- # docs_at/host_version are null because the original read was never
56
- # dated; that absence is the record, and the lint reports it.
87
+ # `docs_at` / `host_version` were null until 2026-09-29: the original
88
+ # read was never dated, and the absence was the record. Both are filled
89
+ # now from sources this tree already carries — the 2026-09-06 live probe
90
+ # recorded in `host_semantics.ts` (Claude Code 2.1.263) and a fresh
91
+ # documentation read on 2026-09-29. `expires` is deliberately unchanged.
92
+ #
93
+ # The committed `docs_url` was `https://docs.claude.com/en/docs/claude-code/hooks`,
94
+ # which answers 301 and lands on the URL below. Recording the redirect
95
+ # target is what makes a digest reproducible.
57
96
  verified:
58
- docs_at: null
59
- docs_url: https://docs.claude.com/en/docs/claude-code/hooks
60
- probe_at: null
61
- host_version: null
97
+ docs_at: 2026-09-29
98
+ docs_url: https://code.claude.com/docs/en/hooks.md
99
+ docs_digest: 9dd68316c1111c118e3ddb82861ac6271a8cd164cee0d371b26165efff35fe88
100
+ probe_at: 2026-09-06
101
+ host_version: 2.1.263
62
102
  expires: 2027-09-06
63
103
  slots:
64
- session_start: { native: SessionStart, block_exit: null }
65
- session_end: { native: SessionEnd, block_exit: null }
66
- stop: { native: Stop, block_exit: 2 }
67
- user_prompt_submit: { native: UserPromptSubmit, block_exit: 2 }
68
- pre_tool_use: { native: PreToolUse, block_exit: 2 }
69
- post_tool_use: { native: PostToolUse, block_exit: null }
70
- pre_compact: { native: PreCompact, block_exit: null }
71
- subagent_start: { native: SubagentStart, block_exit: null }
72
- subagent_stop: { native: SubagentStop, block_exit: null }
104
+ session_start: { native: SessionStart, block_exit: null, answered_at: 2026-09-29 }
105
+ session_end: { native: SessionEnd, block_exit: null, answered_at: 2026-09-29 }
106
+ stop: { native: Stop, block_exit: 2, answered_at: 2026-09-29 }
107
+ user_prompt_submit: { native: UserPromptSubmit, block_exit: 2, answered_at: 2026-09-29 }
108
+ pre_tool_use: { native: PreToolUse, block_exit: 2, answered_at: 2026-09-29 }
109
+ post_tool_use: { native: PostToolUse, block_exit: null, answered_at: 2026-09-29 }
110
+ pre_compact: { native: PreCompact, block_exit: null, answered_at: 2026-09-29 }
111
+ subagent_start: { native: SubagentStart, block_exit: null, answered_at: 2026-09-29 }
112
+ subagent_stop: { native: SubagentStop, block_exit: null, answered_at: 2026-09-29 }
73
113
 
74
114
  augment:
75
115
  surfaces:
@@ -81,13 +121,30 @@ hosts:
81
121
  fail_policy: discard
82
122
  timeout_unit: unknown
83
123
  timeout_default: null
84
- verified: null
124
+ # Established by a documentation read on 2026-09-29, not by a live
125
+ # probe — `probe_at` stays null and says so.
126
+ verified:
127
+ docs_at: 2026-09-29
128
+ docs_url: https://docs.augmentcode.com/cli/hooks.md
129
+ docs_digest: e500823be8303717020c1823f670e06d100108f6e3ac4b8d12a46d91fd1898fa
130
+ probe_at: null
131
+ host_version: null
132
+ expires: 2027-09-29
133
+ # THE FINDING THIS ROW CARRIES. Augment's own documentation states that
134
+ # `PreToolUse` can block tool execution and shows `exit 2` doing it. The
135
+ # `block_exit: null` below is therefore NOT a claim that the host cannot
136
+ # refuse — this file's header says a row never makes that claim. It is a
137
+ # fact about this package: `augment-dispatcher.sh` exits 0
138
+ # unconditionally (`fail_policy: discard`), so no verdict this package
139
+ # produces can reach the host at all. Arming it means changing the
140
+ # trampoline, which is an enforcement expansion and belongs to its own
141
+ # change with its own ratification — not to a dating pass.
85
142
  slots:
86
- session_start: { native: SessionStart, block_exit: null }
87
- session_end: { native: SessionEnd, block_exit: null }
88
- stop: { native: Stop, block_exit: null }
89
- pre_tool_use: { native: PreToolUse, block_exit: null }
90
- post_tool_use: { native: PostToolUse, block_exit: null }
143
+ session_start: { native: SessionStart, block_exit: null, answered_at: 2026-09-29 }
144
+ session_end: { native: SessionEnd, block_exit: null, answered_at: 2026-09-29 }
145
+ stop: { native: Stop, block_exit: null, answered_at: 2026-09-29 }
146
+ pre_tool_use: { native: PreToolUse, block_exit: null, answered_at: 2026-09-29 }
147
+ post_tool_use: { native: PostToolUse, block_exit: null, answered_at: 2026-09-29 }
91
148
 
92
149
  cursor:
93
150
  surfaces:
@@ -97,13 +154,19 @@ hosts:
97
154
  fail_policy: propagate
98
155
  timeout_unit: unknown
99
156
  timeout_default: null
100
- verified: null
157
+ verified:
158
+ docs_at: 2026-09-29
159
+ docs_url: https://cursor.com/docs/hooks.md
160
+ docs_digest: 7294a2d63b19d79a5283c948afe174cba8b06a7585563d34a2c41b90f5df0d39
161
+ probe_at: null
162
+ host_version: null
163
+ expires: 2027-09-29
101
164
  slots:
102
- session_start: { native: sessionStart, block_exit: null }
103
- session_end: { native: sessionEnd, block_exit: null }
104
- stop: { native: stop, block_exit: null }
105
- user_prompt_submit: { native: beforeSubmitPrompt, block_exit: null }
106
- post_tool_use: { native: postToolUse, block_exit: null }
165
+ session_start: { native: sessionStart, block_exit: null, answered_at: 2026-09-29 }
166
+ session_end: { native: sessionEnd, block_exit: null, answered_at: 2026-09-29 }
167
+ stop: { native: stop, block_exit: null, answered_at: 2026-09-29 }
168
+ user_prompt_submit: { native: beforeSubmitPrompt, block_exit: null, answered_at: 2026-09-29 }
169
+ post_tool_use: { native: postToolUse, block_exit: null, answered_at: 2026-09-29 }
107
170
 
108
171
  cline:
109
172
  surfaces:
@@ -115,13 +178,27 @@ hosts:
115
178
  fail_policy: discard
116
179
  timeout_unit: unknown
117
180
  timeout_default: null
118
- verified: null
181
+ # SECOND FINDING FROM THE 2026-09-29 READ. `docs.cline.bot`'s hooks page
182
+ # is now a one-line pointer to its SDK-plugins page and names none of
183
+ # the `TaskStart` / `TaskResume` / `TaskComplete` / `TaskCancel` events
184
+ # the slots below bind. The row is dated against the page that exists,
185
+ # and the digest watcher is what will surface the next move; re-deriving
186
+ # the event names from a page that no longer lists them is a separate
187
+ # piece of work, and inventing a citation for them here would be the
188
+ # defect this file was built to remove.
189
+ verified:
190
+ docs_at: 2026-09-29
191
+ docs_url: https://docs.cline.bot/customization/hooks.md
192
+ docs_digest: ef87561721f4cb80fe6d682b6866d638a4952dd416d36cd5ab398426ce64084b
193
+ probe_at: null
194
+ host_version: null
195
+ expires: 2027-09-29
119
196
  slots:
120
- session_start: { native: [TaskStart, TaskResume], block_exit: null }
121
- session_end: { native: TaskComplete, block_exit: null }
122
- stop: { native: TaskCancel, block_exit: null }
123
- user_prompt_submit: { native: UserPromptSubmit, block_exit: null }
124
- post_tool_use: { native: PostToolUse, block_exit: null }
197
+ session_start: { native: [TaskStart, TaskResume], block_exit: null, answered_at: 2026-09-29 }
198
+ session_end: { native: TaskComplete, block_exit: null, answered_at: 2026-09-29 }
199
+ stop: { native: TaskCancel, block_exit: null, answered_at: 2026-09-29 }
200
+ user_prompt_submit: { native: UserPromptSubmit, block_exit: null, answered_at: 2026-09-29 }
201
+ post_tool_use: { native: PostToolUse, block_exit: null, answered_at: 2026-09-29 }
125
202
 
126
203
  windsurf:
127
204
  surfaces:
@@ -131,11 +208,20 @@ hosts:
131
208
  fail_policy: propagate
132
209
  timeout_unit: unknown
133
210
  timeout_default: null
134
- verified: null
211
+ # THIRD FINDING FROM THE 2026-09-29 READ. `docs.windsurf.com` now
212
+ # redirects to `docs.devin.ai`; the redirect target is recorded so the
213
+ # digest is reproducible.
214
+ verified:
215
+ docs_at: 2026-09-29
216
+ docs_url: https://docs.devin.ai/desktop/cascade/hooks.md
217
+ docs_digest: 460ffe7aa91998804920f6722c0153b9948eadd5edafa19582298475a19835a2
218
+ probe_at: null
219
+ host_version: null
220
+ expires: 2027-09-29
135
221
  slots:
136
- session_start: { native: post_setup_worktree, block_exit: null }
137
- user_prompt_submit: { native: pre_user_prompt, block_exit: null }
138
- stop: { native: post_cascade_response, block_exit: null }
222
+ session_start: { native: post_setup_worktree, block_exit: null, answered_at: 2026-09-29 }
223
+ user_prompt_submit: { native: pre_user_prompt, block_exit: null, answered_at: 2026-09-29 }
224
+ stop: { native: post_cascade_response, block_exit: null, answered_at: 2026-09-29 }
139
225
 
140
226
  gemini:
141
227
  surfaces:
@@ -149,14 +235,21 @@ hosts:
149
235
  # 0.50.0 in an isolated scratch workspace and could not run: the CLI
150
236
  # aborts with IneligibleTierError before any turn begins, so no tool
151
237
  # call and therefore no BeforeTool hook is reachable. An unrunnable
152
- # probe establishes nothing, so this stays null.
153
- verified: null
238
+ # probe establishes nothing, which is why `probe_at` is still null —
239
+ # the block below rests on the 2026-09-29 documentation read alone.
240
+ verified:
241
+ docs_at: 2026-09-29
242
+ docs_url: https://geminicli.com/docs/hooks/reference.md
243
+ docs_digest: 06d37f2f66812ee78bb46c37a112203376f0bae4d3b8b44ac79d0bda4b86a118
244
+ probe_at: null
245
+ host_version: null
246
+ expires: 2027-09-29
154
247
  slots:
155
- session_start: { native: SessionStart, block_exit: null, matcher: "" }
156
- session_end: { native: SessionEnd, block_exit: null, matcher: "" }
157
- stop: { native: AfterAgent, block_exit: null, matcher: "" }
158
- user_prompt_submit: { native: BeforeAgent, block_exit: null, matcher: "" }
159
- post_tool_use: { native: AfterTool, block_exit: null, matcher: ".*" }
248
+ session_start: { native: SessionStart, block_exit: null, answered_at: 2026-09-29, matcher: "" }
249
+ session_end: { native: SessionEnd, block_exit: null, answered_at: 2026-09-29, matcher: "" }
250
+ stop: { native: AfterAgent, block_exit: null, answered_at: 2026-09-29, matcher: "" }
251
+ user_prompt_submit: { native: BeforeAgent, block_exit: null, answered_at: 2026-09-29, matcher: "" }
252
+ post_tool_use: { native: AfterTool, block_exit: null, answered_at: 2026-09-29, matcher: ".*" }
160
253
 
161
254
  cowork:
162
255
  surfaces:
@@ -168,7 +261,18 @@ hosts:
168
261
  fail_policy: discard
169
262
  timeout_unit: unknown
170
263
  timeout_default: null
171
- verified: null
264
+ # `docs_url` is null and that is the answer, not a gap: the 2026-09-29
265
+ # sweep found no public hook documentation for this host to cite. What
266
+ # the row records is this tree's own finding, restated above the
267
+ # `slots: {}` below — nothing is bound, so there is no pair to date.
268
+ # `docs_digest` is null for the same reason: there is no body to hash.
269
+ verified:
270
+ docs_at: 2026-09-29
271
+ docs_url: null
272
+ docs_digest: null
273
+ probe_at: null
274
+ host_version: null
275
+ expires: 2027-09-29
172
276
  slots: {}
173
277
 
174
278
  copilot:
@@ -181,5 +285,117 @@ hosts:
181
285
  timeout_default: null
182
286
  # `fallback_only: true` in hook_manifest.yaml. This package binds
183
287
  # nothing here and has measured nothing here.
184
- verified: null
288
+ #
289
+ # THE PHASE-2 FINDING, RECORDED WHERE IT IS READ. The 2026-09-29
290
+ # documentation check found that the host DOES document lifecycle hooks
291
+ # — `sessionStart`, `sessionEnd`, `userPromptSubmitted`, `preToolUse`,
292
+ # `postToolUse`, `agentStop`, `subagentStop`, `errorOccurred` — at
293
+ # `~/.copilot/hooks/*.json`. So the roadmap's dated zero does NOT apply
294
+ # to this host, and the row below is a dated statement about this
295
+ # package, not about the host: nothing is bound, so `slots:` stays
296
+ # empty.
297
+ #
298
+ # CORRECTED 2026-10-01, and the correction is the point of this file.
299
+ # This comment previously ended "...with `preToolUse` fail-closed on
300
+ # exit 2". **The cited page does not say that.** It was re-fetched on
301
+ # 2026-10-01 — hashing byte-identical to the `docs_digest` below, so the
302
+ # body read is provably the body pinned — and it contains NO exit-code
303
+ # semantics at all: no `exit 2`, no non-zero convention, no stderr
304
+ # contract. What it documents is the CAPABILITY — `preToolUse` "can
305
+ # approve or deny tool executions" — and a `version`/`type`/`bash`/
306
+ # `cwd`/`env`/`timeoutSec` config shape. The mechanism is undocumented
307
+ # on that page.
308
+ #
309
+ # A capability is not a contract, and writing the contract in anyway is
310
+ # precisely the "statement about what a host can do that the tree has
311
+ # not established" this file's header forbids. The claim was inherited
312
+ # rather than invented here, and it survived two readings before a
313
+ # review fetched the page and grepped it; that is the whole argument for
314
+ # `docs_digest` existing, so it is recorded rather than quietly deleted.
315
+ #
316
+ # WHY `probe_at` IS STILL NULL ON 2026-10-01, STATED SO IT IS NOT READ
317
+ # AS AN OVERSIGHT. The sibling `codex` row was probed on that date
318
+ # because `codex` is installed on the machine that ran the pass. The
319
+ # Copilot CLI is not installed and `~/.copilot` carries no binary, so
320
+ # there was no host to run a deny against. That is an absence of
321
+ # opportunity, not an absence of effort, and it is the one thing
322
+ # blocking this row from carrying what the codex row now carries.
323
+ #
324
+ # The codex probe is also the reason this row should NOT be armed from
325
+ # its documentation alone — though the argument is WEAKER than it first
326
+ # read, and the weaker version is the true one. On the sibling host a
327
+ # documented exit-2 refusal did not reproduce on the installed build.
328
+ # Here there is no documented exit-2 contract to arm in the first place
329
+ # (see the correction above), so this host is further from a binding
330
+ # than codex, not equally close. Either way the gate is the same: a
331
+ # probe, never a re-read.
332
+ verified:
333
+ docs_at: 2026-09-29
334
+ docs_url: https://docs.github.com/en/copilot/concepts/agents/hooks.md
335
+ docs_digest: bfd40aa93ad62133efc17a50f189034f01594dc89a5d31a13a0c541d691acede
336
+ probe_at: null
337
+ host_version: null
338
+ expires: 2027-09-29
339
+ slots: {}
340
+
341
+ codex:
342
+ surfaces:
343
+ any:
344
+ entry_shape: none
345
+ json_shape: none
346
+ fail_policy: discard
347
+ timeout_unit: unknown
348
+ timeout_default: null
349
+ # THE OTHER HALF OF THE PHASE-2 FINDING. Until 2026-09-29 this file had
350
+ # no `codex` row at all, and `docs/enforcement-by-host.md` called that
351
+ # "the third kind of absence" — no row because no `platforms:` key. The
352
+ # documentation check replaced the absence with an answer: Codex
353
+ # documents `SessionStart`, `SessionEnd`, `SubagentStart`,
354
+ # `SubagentStop`, `PreToolUse`, `PermissionRequest`, `PostToolUse`,
355
+ # `PreCompact`, `PostCompact`, `UserPromptSubmit`, `Stop` and
356
+ # `Interrupt` at `~/.codex/hooks.json`, in a config shape and with an
357
+ # `exit 2` + `hookSpecificOutput` contract that match Claude Code's.
358
+ #
359
+ # The row exists so the fact is dated and citable. `slots: {}` is the
360
+ # honest state of THIS package: no `platforms.codex` block, no
361
+ # trampoline, nothing installed. A row with slots the installer does
362
+ # not write would be the claim-without-evidence this file refuses.
363
+ #
364
+ # LIVE PROBE, 2026-10-01 — AND IT DID NOT REPRODUCE THE DOCUMENTED
365
+ # DENY. The paragraph above ends "...a contract that match Claude
366
+ # Code's", which was read off the vendor page and had never been run.
367
+ # It has now been run, against the installed `codex-cli 0.148.0`:
368
+ #
369
+ # - An isolated `CODEX_HOME` was given a `hooks.json` binding
370
+ # `PreToolUse` with `matcher: "Bash"` to a script that writes to
371
+ # stderr and exits 2 — the documented refusal path, verbatim.
372
+ # - `codex exec --sandbox read-only "Run the shell command: echo …"`
373
+ # executed the shell call and returned its output. The call was
374
+ # NOT refused.
375
+ # - The feature is not switched off: `codex features list` reports
376
+ # `hooks stable true` on this build.
377
+ #
378
+ # WHAT THAT ESTABLISHES, AND WHAT IT EXPLICITLY DOES NOT. It establishes
379
+ # that `block_exit` must stay null: this package has no demonstrated
380
+ # refusal path on this host, which is exactly what a null means here. It
381
+ # does NOT establish that Codex cannot refuse — this file's header
382
+ # forbids that reading, and two unexcluded explanations remain. The
383
+ # installed build is 0.148.0 against a current 0.159.3, and the page
384
+ # that was read describes the current one; and the probe never
385
+ # distinguished "the hook fired and was ignored" from "the matcher never
386
+ # matched", because the instrumented re-run (a hook that records its own
387
+ # input before refusing) was refused by the harness this probe ran
388
+ # under. A marker-file re-run on >= 0.159.3 is the one cheap experiment
389
+ # that would separate them, and it is named here rather than guessed at.
390
+ #
391
+ # The practical consequence is that a docs-only reading would have
392
+ # armed a refusal this tree cannot demonstrate. The row records the
393
+ # negative instead.
394
+ verified:
395
+ docs_at: 2026-09-29
396
+ docs_url: https://developers.openai.com/codex/hooks.md
397
+ docs_digest: 724881d81f1a9fdb35ea42d4851a11b1f6606bbc6e9d2d05c1e8c466fc25c630
398
+ probe_at: 2026-10-01
399
+ host_version: 0.148.0
400
+ expires: 2027-09-29
185
401
  slots: {}
@@ -60,6 +60,34 @@ export interface Emission {
60
60
  */
61
61
  export const VERIFIED_PLATFORMS: ReadonlySet<string> = verifiedPlatforms();
62
62
 
63
+ /**
64
+ * Does this platform have a NATIVE emission shape this package can produce?
65
+ *
66
+ * WHY THIS IS A SECOND PREDICATE AND NOT JUST `VERIFIED_PLATFORMS`. The set
67
+ * above answers "has anyone dated this row", and until 2026-09-29 exactly one
68
+ * host carried a `verified` block, so the two questions had the same answer and
69
+ * one predicate served both. Dating the other seven rows separated them: those
70
+ * rows are cited now, and every one of them declares `json_shape: none` —
71
+ * this package has no structured envelope for them. Gating `emitFor` on
72
+ * verified-ness alone would therefore have started writing Claude Code's
73
+ * `hookSpecificOutput` JSON onto hosts that parse no such thing, as a side
74
+ * effect of a documentation read. That is precisely the "speculative mapping"
75
+ * this module's header calls the same class of bug it exists to remove.
76
+ *
77
+ * So the emission branch reads the shape, and the shape is what the table says.
78
+ * Both halves are required: an expired citation falls back exactly as an absent
79
+ * one does, and a row with no envelope falls back however current its citation.
80
+ */
81
+ export function usesNativeEmission(platform: string): boolean {
82
+ if (!VERIFIED_PLATFORMS.has(platform)) return false;
83
+ // An ABSENT row reads as no envelope, not as one. The optional chain must
84
+ // not fall through to `undefined !== "none"`, which is true and would make
85
+ // a missing row the most permissive answer in the function — the inversion
86
+ // this module's header calls speculative mapping.
87
+ const shape = surfaceRow(platform, DEFAULT_SURFACE, loadHostLowering())?.json_shape ?? "none";
88
+ return shape !== "none";
89
+ }
90
+
63
91
  /** Internal event name -> host-native event name, for structured output. */
64
92
  function nativeEventName(platform: string, event: string): string {
65
93
  return surfaceRow(platform, DEFAULT_SURFACE, loadHostLowering())?.slots.get(event)?.native[0] ?? event;
@@ -187,7 +215,7 @@ export function claudePermissionDecision(
187
215
  * copy one module away is a copy that drifts.
188
216
  */
189
217
  export function emissionCarriesReasons(platform: string, severity: Severity): boolean {
190
- if (!VERIFIED_PLATFORMS.has(platform)) return false;
218
+ if (!usesNativeEmission(platform)) return false;
191
219
  return severity !== "allow";
192
220
  }
193
221
 
@@ -219,7 +247,7 @@ export function emitFor(
219
247
  legacyExit: number,
220
248
  permission?: PermissionEmission | null,
221
249
  ): Emission {
222
- if (!VERIFIED_PLATFORMS.has(platform)) {
250
+ if (!usesNativeEmission(platform)) {
223
251
  return { exit: legacyExit, stdout: "", stderr: "" };
224
252
  }
225
253
  const reason = _joinReasons(reasons);
@@ -67,7 +67,7 @@ import * as fs from "node:fs";
67
67
  import * as path from "node:path";
68
68
 
69
69
  import { log_dispatch_issue } from "./dispatch_issues.js";
70
- import { VERIFIED_PLATFORMS, emissionCarriesReasons, type Severity } from "./host_semantics.js";
70
+ import { emissionCarriesReasons, usesNativeEmission, type Severity } from "./host_semantics.js";
71
71
 
72
72
  /**
73
73
  * The event that STARTS a turn, and therefore the one that resets the per-turn
@@ -605,7 +605,14 @@ function _sessionKey(ctx: ShapingContext): string | null {
605
605
  * whose turn boundary cannot be observed, must never become a budget of zero.
606
606
  */
607
607
  export function resolveVolumeCap(ctx: ShapingContext): number | null {
608
- if (!VERIFIED_PLATFORMS.has(ctx.platform)) return null;
608
+ // NOT `VERIFIED_PLATFORMS`: a row being dated says someone read the host's
609
+ // page, never that this package has an envelope to put on it. Since
610
+ // 2026-09-29 every row is dated, so the verified set is no longer the set
611
+ // whose emission carries anything — `usesNativeEmission` is. Reading the
612
+ // wider set here would have started metering bytes on six hosts that
613
+ // receive none, and a ceiling charged for undelivered output drops the
614
+ // NEXT advisory, which does get delivered.
615
+ if (!usesNativeEmission(ctx.platform)) return null;
609
616
  if (_sessionKey(ctx) === null) return null;
610
617
  if (!_turnStartBound(ctx.packageRoot, ctx.platform)) return null;
611
618
  try {
@@ -60,8 +60,7 @@ import { derive_session_tag } from '../chat_history.js';
60
60
  import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
61
61
  import { readHookStdin } from './hook_stdin.js';
62
62
  import { HANDBACK, finalParagraph, readTranscriptTail } from './turn_end_gate_hook.js';
63
-
64
- const EXIT_OK = 0;
63
+ import { EXIT_ALLOW as EXIT_OK } from './exit_codes.js';
65
64
 
66
65
  /** Same cap the turn-end gate reads its tail under. */
67
66
  const TRANSCRIPT_READ_MAX_BYTES = 2 * 1024 * 1024;
@@ -102,8 +102,7 @@ import {
102
102
  } from '../_lib/runtime_journal.js';
103
103
  import { readHookStdin } from './hook_stdin.js';
104
104
  import { is_replay_mode } from './state_io.js';
105
-
106
- const EXIT_ALLOW = 0;
105
+ import { EXIT_ALLOW } from './exit_codes.js';
107
106
 
108
107
  /** The `.agent-settings.yml` section under `hooks:` that arms this concern. */
109
108
  export const SETTINGS_SECTION = 'runtime_journal';
@@ -68,13 +68,12 @@ import { COMMAND_TOOLS } from '../before_complete_hook.js';
68
68
  import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
69
69
  import { readHookStdin } from './hook_stdin.js';
70
70
  import { atomic_write_json } from './state_io.js';
71
+ import { EXIT_ALLOW, EXIT_WARN } from './exit_codes.js';
71
72
 
72
- const EXIT_ALLOW = 0;
73
73
  /**
74
74
  * Severity comes from the exit code, not from the `decision` field. See the
75
75
  * header: this never blocks, and never returns 1 on any path.
76
76
  */
77
- const EXIT_WARN = 2;
78
77
 
79
78
  /** Hard ceiling on `reason` + `additional_context`, matching the registered row. */
80
79
  export const CAP_BYTES = 768;