@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
@@ -41,13 +41,19 @@
41
41
  import path from 'node:path';
42
42
  import process from 'node:process';
43
43
 
44
+ import { readHookStdin } from './hook_stdin.js';
45
+ // The WRITER's own root resolver, imported rather than re-derived. A second
46
+ // spelling of "which tree is this" is how a reader comes to address a ledger
47
+ // the writer never wrote — which is the defect this whole file is repairing,
48
+ // one field over.
49
+ import { workspaceRoot as writerWorkspaceRoot } from './rule_inject_hook.js';
50
+
44
51
  import { may_refuse_on } from '../_lib/obligation_frequency.js';
45
52
  import { appendShadow, readDelivered, readDischarged, stamp } from '../_lib/obligations.js';
46
53
  import { loadRouter, matchTierRules } from '../_lib/rule_injection.js';
47
54
  import { gitNumstatRows, isDocPath, untrackedNonDocFiles } from './end_review_nudge_hook.js';
48
55
  import { openRecordStats } from './subagent_ledger_hook.js';
49
-
50
- const EXIT_ALLOW = 0;
56
+ import { EXIT_ALLOW } from './exit_codes.js';
51
57
 
52
58
  /**
53
59
  * Every non-doc path this turn wrote, tracked or not.
@@ -142,9 +148,144 @@ export function shouldContinue(attempt: number): boolean {
142
148
  return attempt <= 1;
143
149
  }
144
150
 
145
- export function main(): number {
146
- const root = process.cwd();
147
- const session = (process.env['CLAUDE_CODE_SESSION_ID'] ?? '').trim();
151
+ /**
152
+ * The session and root this reading is about, resolved the way the WRITER does.
153
+ *
154
+ * THE DEFECT THIS EXISTS TO CLOSE. This hook used to read
155
+ * `CLAUDE_CODE_SESSION_ID` out of the process environment and return allow when
156
+ * it was empty. The dispatcher sets no such variable — it hands each concern
157
+ * the envelope on stdin and `AGENT_CONFIG_PACKAGE_ROOT` in the environment,
158
+ * nothing else — so on every dispatched stop event the reader looked for a
159
+ * ledger under a key the writer never used. Measured 2026-09-29 on this
160
+ * machine's own ledgers: 187 delivered rows, 0 shadow rows, across 8 sessions.
161
+ *
162
+ * WHY THE ORDER IS ENVELOPE-THEN-ENVIRONMENT AND NOT THE REVERSE. The envelope
163
+ * id is the key `rule_inject_hook.ts` wrote the delivered rows under, so it is
164
+ * not merely the better source — it is the ONLY one that can find them. The
165
+ * environment fallback survives for a raw invocation that carries no envelope
166
+ * at all (a maintainer piping nothing, a host shim that skips the dispatcher),
167
+ * which is a case where guessing wrong costs a missing reading rather than a
168
+ * wrong one.
169
+ *
170
+ * THE ROOT IS PART OF THE SAME JOIN, not a second change riding along. A ledger
171
+ * is addressed by root AND session; reading the session from the envelope while
172
+ * taking the root from `process.cwd()` would leave the pair half-joined, and the
173
+ * two disagree exactly on the hosts whose shim does not chdir. `cwd` stays the
174
+ * fallback because that is what the dispatcher sets it to.
175
+ *
176
+ * Both spellings of each key are accepted because the injector accepts both.
177
+ */
178
+ export function resolveSettleContext(
179
+ envelope: Record<string, unknown>,
180
+ payload: Record<string, unknown>,
181
+ env: Record<string, string | undefined>,
182
+ ): { root: string; session: string } {
183
+ const str = (...values: unknown[]): string => {
184
+ for (const v of values) {
185
+ if (typeof v === 'string' && v.trim() !== '') return v.trim();
186
+ }
187
+ return '';
188
+ };
189
+ return {
190
+ // `workspaceRoot` is the INJECTOR's function, not a copy of it. It reads
191
+ // `workspace` / `cwd` / `project_dir`; this file used to read
192
+ // `workspace_root` / `workspace` / `cwd`, so the two key sets overlapped
193
+ // without matching and the pair was joined on the session only. It
194
+ // happened to agree on both real envelope shapes — the dispatcher sets
195
+ // `workspace_root` and chdirs concerns to it, a native wiring passes
196
+ // `cwd` — which made the asymmetry a property of today's envelopes
197
+ // rather than of the code. `workspace_root` is appended ahead of the
198
+ // shared resolver because the dispatcher is the only producer that sets
199
+ // it and nothing else reads it.
200
+ root:
201
+ str(envelope['workspace_root'])
202
+ || writerWorkspaceRoot(envelope as Parameters<typeof writerWorkspaceRoot>[0]),
203
+ session: str(
204
+ envelope['session_id'],
205
+ envelope['sessionId'],
206
+ payload['session_id'],
207
+ payload['sessionId'],
208
+ // The one pre-existing source, kept as the last resort and NOT
209
+ // joined by siblings: adding a name the writer never keys on
210
+ // would address a ledger that cannot exist.
211
+ env['CLAUDE_CODE_SESSION_ID'],
212
+ ),
213
+ };
214
+ }
215
+
216
+ /**
217
+ * The session id the WRITER would have used, for the ledger nobody reads.
218
+ *
219
+ * `rule_inject_hook.ts` defaults an unnamed session to the literal `unknown`
220
+ * and writes delivered rows there; this reader used to return `''` and allow, so
221
+ * that population was invisible to every reading of the bar. Reported rather
222
+ * than silently joined: a shared `unknown` bucket aggregates unrelated sessions,
223
+ * so reading it as one session's turn would be worse than not reading it. The
224
+ * constant is exported so a future census can count what is sitting there.
225
+ */
226
+ export const WRITER_UNNAMED_SESSION = 'unknown';
227
+
228
+ /** The envelope on stdin, or an empty object when there is none to read. */
229
+ function readEnvelope(): { envelope: Record<string, unknown>; payload: Record<string, unknown> } {
230
+ let envelope: Record<string, unknown> = {};
231
+ try {
232
+ const raw = readHookStdin();
233
+ const parsed: unknown = raw.trim() === '' ? {} : JSON.parse(raw);
234
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
235
+ envelope = parsed as Record<string, unknown>;
236
+ }
237
+ } catch {
238
+ // A malformed envelope is not a reason to refuse, and this concern
239
+ // refuses nothing anyway. It is a reason to read nothing from it.
240
+ }
241
+ const nested = envelope['payload'];
242
+ const payload =
243
+ typeof nested === 'object' && nested !== null && !Array.isArray(nested)
244
+ ? (nested as Record<string, unknown>)
245
+ : envelope;
246
+ return { envelope, payload };
247
+ }
248
+
249
+ /**
250
+ * The resolver as it stood BEFORE the join fix, kept reachable for one test.
251
+ *
252
+ * A reproduction that cannot run the old code is not a reproduction — it is an
253
+ * assertion about the new function's behavior on inputs nobody sends, and
254
+ * `tests/hooks/obligation_settle.test.ts` carried exactly that until an
255
+ * independent review named it. This function is dead on every production path
256
+ * (nothing but the fixture calls it) and exists so the defect stays executable:
257
+ * environment-only resolution, allow when empty, root from the cwd.
258
+ */
259
+ export function resolveSettleContextPreFix(
260
+ _envelope: Record<string, unknown>,
261
+ _payload: Record<string, unknown>,
262
+ env: Record<string, string | undefined>,
263
+ ): { root: string; session: string } {
264
+ // Same arity as the live resolver ON PURPOSE. A narrower signature would let
265
+ // the fixture pass the envelope in as `env`, where the lookup misses for the
266
+ // wrong reason and the test goes green without exercising the defect.
267
+ return { root: process.cwd(), session: (env['CLAUDE_CODE_SESSION_ID'] ?? '').trim() };
268
+ }
269
+
270
+ /**
271
+ * Which context resolver this reading uses — the seam the pre-fix fixture needs.
272
+ *
273
+ * It is NOT a parameter of `main()`, and that is a contract rather than a
274
+ * preference: `concern_main_signature` requires every concern's `main()` to take
275
+ * argv first or nothing, because the dispatcher calls `main(argv)` — so a
276
+ * resolver in first position would receive an argv array at runtime and resolve
277
+ * a session from it. Caught by that test, which is the reason this indirection
278
+ * exists instead of the obvious default parameter.
279
+ */
280
+ export type SettleResolver = (
281
+ envelope: Record<string, unknown>,
282
+ payload: Record<string, unknown>,
283
+ env: Record<string, string | undefined>,
284
+ ) => { root: string; session: string };
285
+
286
+ export function runSettle(resolve: SettleResolver = resolveSettleContext): number {
287
+ const { envelope, payload } = readEnvelope();
288
+ const { root, session } = resolve(envelope, payload, process.env);
148
289
  if (session === '') return EXIT_ALLOW;
149
290
 
150
291
  let verdict: SettleVerdict;
@@ -176,6 +317,11 @@ export function main(): number {
176
317
  return EXIT_ALLOW;
177
318
  }
178
319
 
320
+ /** The dispatcher entry point. Argv-shaped, per `concern_main_signature`. */
321
+ export function main(_argv: readonly string[] = process.argv.slice(2)): number {
322
+ return runSettle();
323
+ }
324
+
179
325
  // Bundle-safety: never auto-run when inlined into an esbuild bundle.
180
326
  if (process.argv[1] !== undefined && path.basename(process.argv[1]).startsWith('obligation_settle')) {
181
327
  process.exit(main());
@@ -14,12 +14,38 @@
14
14
  * names the count so the caller can split the ask instead of guessing what
15
15
  * happened.
16
16
  *
17
- * WHAT IT SEES, honestly. `_lib/structured_ask.ts` carries no observed
18
- * per-host tool, so this guard matches on a name SHAPE and is filtered by the
19
- * manifest's per-concern `tools:` key to the same candidate names. On every
20
- * host measured today it therefore fires on nothing — the concern exists so
21
- * that the first host to ship a picker meets the rule already in force, not
22
- * because a violation has been observed.
17
+ * WHAT IT SEES, honestly. `_lib/structured_ask.ts` carries ONE observed
18
+ * per-host tool — `claude`'s `AskUserQuestion`, 48 calls across versions
19
+ * 2.1.252 to 2.1.284 between 2026-09-01 and 2026-10-02.
20
+ *
21
+ * THIS GUARD DOES NOT USE THAT ROW, and the distinction matters enough to say
22
+ * rather than leave to a reader. `verdict()` calls `isStructuredAskTool(tool)`
23
+ * with no host id, so the shape branch is unreachable from here and the name
24
+ * SHAPE pattern decides on every host, `claude` included — filtered by the
25
+ * manifest's per-concern `tools:` key to the same candidate names. Threading a
26
+ * host id through would NARROW what this guard matches on the one host where a
27
+ * picker is known to exist (`ask_user_question` would stop matching), which is
28
+ * a behaviour change and not a header repair, so it is deliberately not made
29
+ * here.
30
+ *
31
+ * This header carried the opposite claim until 2026-10-05 — that no host's
32
+ * delivered surface had been observed carrying a picker — and it was wrong in
33
+ * a specific, instructive way rather than merely stale. Its measurement base
34
+ * was one `false` row taken from a SUBAGENT leg, whose surface carries no
35
+ * picker because a subagent has no user to ask. The step from "this leg has
36
+ * none" to "no host has been observed with one" is the substitution the
37
+ * observation protocol exists to refuse, and the registry comment now records
38
+ * which leg each reading came from for that reason. The old wording is
39
+ * described rather than quoted, because 1.1's drift check is a grep and a grep
40
+ * cannot tell a refuted quotation from a live assertion.
41
+ *
42
+ * The other eight hosts in `docs/enforcement-by-host.md` still have no row at
43
+ * all — never looked, not measured — so nothing here is a claim about them.
44
+ *
45
+ * WHAT THE OBSERVATION DOES NOT CHANGE: the deny threshold. One question per
46
+ * call is `ask-when-uncertain`'s Iron Law, not a host limit, and all 47
47
+ * parsed calls already carried exactly one. The guard has had nothing to deny
48
+ * and that is the expected reading, not evidence it is inert.
23
49
  *
24
50
  * ENFORCEMENT REACH, also honestly. `fail_closed: false` and the exit-1 deny
25
51
  * are only a deny where the host both binds `pre_tool_use` AND honours the
@@ -141,6 +167,17 @@ export function selfTest(): number {
141
167
  { tool_name: 'ask_user_question', tool_input: { question: 'which one?' } },
142
168
  false,
143
169
  ],
170
+ [
171
+ // PINS THE HEADER'S INVARIANT. `ask_user_question` is not the name
172
+ // claude's observed shape row carries, so this case denies only
173
+ // while `verdict()` passes no host id and the name-SHAPE pattern
174
+ // decides. Thread a host id through and the shape branch rejects
175
+ // the name, the call stops being an ask, and this flips to allow —
176
+ // which is the silent narrowing the header says is not being made.
177
+ 'a snake_case picker with two questions is still denied — this guard is host-blind',
178
+ { tool_name: 'ask_user_question', tool_input: { questions: [{}, {}] } },
179
+ true,
180
+ ],
144
181
  [
145
182
  'an empty ask passes — malformed, but not this guard\'s failure',
146
183
  { tool_name: 'AskUserQuestion', tool_input: { questions: [] } },
@@ -72,8 +72,7 @@ import { buildOrchestrationLine, type RecordInput } from '../_lib/orchestration_
72
72
  import { DEFAULT_DIR } from '../orchestration_record.js';
73
73
  import { is_replay_mode } from './state_io.js';
74
74
  import { readHookStdin } from './hook_stdin.js';
75
-
76
- const EXIT_ALLOW = 0;
75
+ import { EXIT_ALLOW } from './exit_codes.js';
77
76
 
78
77
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
79
78
  type JsonObject = { [k: string]: JsonValue };
@@ -108,7 +108,16 @@ export const BODY_CLASSES: readonly BodyClass[] = ["input", "result"] as const;
108
108
  */
109
109
  export const BODY_KEYS: Readonly<Record<BodyClass, readonly string[]>> = {
110
110
  input: ["tool_input", "toolInput"],
111
- result: ["tool_response", "toolResponse", "tool_result", "toolUseResult"],
111
+ // `error` is a result body and is listed as one. On claude's
112
+ // `PostToolUseFailure` the failing call carries NO `tool_response` at all —
113
+ // the command's own stdout and stderr arrive here instead, under the first
114
+ // line stating the exit code. Until that event was bound this key reached no
115
+ // concern, so its absence from this list cost nothing; binding the event
116
+ // without adding it would have delivered raw command output in full to every
117
+ // concern on the slot, including the fourteen that never declared `result`.
118
+ // That is exactly the content this module exists to withhold, so the key
119
+ // belongs to the class whose semantics it has — not to an exception.
120
+ result: ["tool_response", "toolResponse", "tool_result", "toolUseResult", "error"],
112
121
  };
113
122
 
114
123
  export interface PayloadStub extends JsonObject {
@@ -20,6 +20,7 @@ import {
20
20
  type PermissionDecision,
21
21
  type PermissionEmission,
22
22
  } from "./host_semantics.js";
23
+ import { EXIT_ALLOW, EXIT_BLOCK } from './exit_codes.js';
23
24
 
24
25
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
25
26
  type JsonObject = { [k: string]: JsonValue };
@@ -29,8 +30,6 @@ function _isObject(v: unknown): v is JsonObject {
29
30
  }
30
31
 
31
32
  /** Mirrors `dispatch_hook.EXIT_ALLOW` / `EXIT_BLOCK`; imported would be a cycle. */
32
- const EXIT_ALLOW = 0;
33
- const EXIT_BLOCK = 1;
34
33
 
35
34
  /** The host's `tool_name`, or `""` when the event carries none. */
36
35
  export function _payload_tool_name(envelope: JsonObject): string {
@@ -54,9 +54,7 @@ import path from "node:path";
54
54
  import { execFileSync } from "node:child_process";
55
55
  import { fileURLToPath, pathToFileURL } from "node:url";
56
56
  import { readHookStdin } from "./hook_stdin.js";
57
-
58
- const EXIT_ALLOW = 0;
59
- const EXIT_WARN = 2;
57
+ import { EXIT_ALLOW, EXIT_WARN } from './exit_codes.js';
60
58
 
61
59
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
62
60
  type JsonObject = { [k: string]: JsonValue };
@@ -36,6 +36,7 @@ import { spawnSync } from "node:child_process";
36
36
  import fs from "node:fs";
37
37
  import path from "node:path";
38
38
  import { fileURLToPath, pathToFileURL } from "node:url";
39
+ import { EXIT_USAGE } from './exit_codes.js';
39
40
 
40
41
  // src/scripts/hooks/replay_hook.ts → parents[3] is the repo root.
41
42
  const REPO_ROOT = path.resolve(
@@ -175,7 +176,7 @@ function _parse_args(argv: string[]): ReplayArgs {
175
176
  process.stderr.write(
176
177
  `replay_hook: the following arguments are required: ${missing.join(", ")}\n`,
177
178
  );
178
- process.exit(2);
179
+ process.exit(EXIT_USAGE);
179
180
  }
180
181
  return args;
181
182
  }
@@ -69,12 +69,11 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
69
69
  import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
70
70
  import { readHookStdin } from './hook_stdin.js';
71
71
  import { atomic_write_json } from './state_io.js';
72
+ import { EXIT_ALLOW, EXIT_WARN } from './exit_codes.js';
72
73
 
73
- const EXIT_ALLOW = 0;
74
74
  // Severity is taken from the EXIT CODE, not from the `decision` field — see
75
75
  // the file header for why this never blocks on `claude`. This concern never
76
76
  // returns exit 1 on any path.
77
- const EXIT_WARN = 2;
78
77
 
79
78
  /**
80
79
  * Committed exemption list — deliberately duplicated from
@@ -49,8 +49,7 @@ import { deriveSessionKey, totalNonDocMutatedLinesWithMeasure } from './end_revi
49
49
  import { unwrap, type JsonObject, type JsonValue } from './envelope.js';
50
50
  import { readHookStdin } from './hook_stdin.js';
51
51
  import { atomic_write_json } from './state_io.js';
52
-
53
- const EXIT_OK = 0;
52
+ import { EXIT_ALLOW as EXIT_OK } from './exit_codes.js';
54
53
 
55
54
  export function buildBaseline(workspaceRoot: string, now: Date = new Date()): ReviewBaseline {
56
55
  const measured = totalNonDocMutatedLinesWithMeasure(workspaceRoot);
@@ -63,10 +63,9 @@ import {
63
63
  } from "./block_no_verify.js";
64
64
  import { readHookStdin } from "./hook_stdin.js";
65
65
  import { detectRtkCached } from "../../install/rtkDetection.js";
66
+ import { EXIT_ALLOW, EXIT_WARN } from './exit_codes.js';
66
67
 
67
68
  const SETTINGS_FILE = ".agent-settings.yml";
68
- const EXIT_ALLOW = 0;
69
- const EXIT_WARN = 2;
70
69
 
71
70
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
72
71
  type JsonObject = { [k: string]: JsonValue };