@event4u/agent-config 16.0.0 → 16.2.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 (382) 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 +289 -140
  5. package/CONTRIBUTING.md +9 -0
  6. package/README.md +2 -2
  7. package/dist/agent-src/commands/analyze/inbox.md +26 -0
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
  9. package/dist/agent-src/commands/challenge-me/closure.md +178 -0
  10. package/dist/agent-src/commands/challenge-me.md +9 -2
  11. package/dist/agent-src/commands/council/default.md +25 -5
  12. package/dist/agent-src/commands/feature/plan.md +28 -1
  13. package/dist/agent-src/commands/feature/roadmap.md +28 -1
  14. package/dist/agent-src/commands/implement-ticket.md +27 -0
  15. package/dist/agent-src/commands/jira-ticket.md +27 -0
  16. package/dist/agent-src/commands/pr/create.md +29 -0
  17. package/dist/agent-src/commands/pr/merge.md +60 -9
  18. package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
  19. package/dist/agent-src/commands/roadmap/create.md +74 -27
  20. package/dist/agent-src/commands/roadmap/materialize.md +27 -0
  21. package/dist/agent-src/commands/roadmap/process-full.md +123 -18
  22. package/dist/agent-src/commands/team.md +22 -0
  23. package/dist/agent-src/commands/work.md +4 -0
  24. package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
  25. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +47 -0
  26. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
  27. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +19 -23
  28. package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
  29. package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
  30. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
  31. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
  32. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  33. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  34. package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
  35. package/dist/agent-src/rules/autonomous-execution.md +15 -8
  36. package/dist/agent-src/rules/delegation-policy.md +23 -45
  37. package/dist/agent-src/rules/design-fidelity.md +32 -37
  38. package/dist/agent-src/rules/evaluator-independence.md +43 -49
  39. package/dist/agent-src/rules/test-first.md +41 -0
  40. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  41. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  42. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  43. package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
  44. package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
  45. package/dist/agent-src/skills/database/data/manifest.json +4 -4
  46. package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
  47. package/dist/agent-src/skills/design-review/SKILL.md +80 -4
  48. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  49. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +30 -5
  50. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  51. package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
  52. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  53. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  54. package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
  55. package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
  56. package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
  57. package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
  58. package/dist/agent-src/skills/ui-component-architect/SKILL.md +23 -0
  59. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
  60. package/dist/agent-src/templates/agent-settings.md +1 -1
  61. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  62. package/dist/agent-src/templates/roadmaps.md +218 -0
  63. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  64. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  65. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  66. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  67. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +260 -21
  68. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  69. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  70. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  71. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  72. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  73. package/dist/cli/python/knowledge_ingest.js +1 -1
  74. package/dist/cli/python/workspace_drive.js +1 -1
  75. package/dist/cli-delegate/check_update_banner.js +40 -2
  76. package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
  77. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-4XFP2Y3E.js} +1 -1
  78. package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
  79. package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
  80. package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
  81. package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-7XGBX6ZH.js} +973 -555
  82. package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
  83. package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-FP36SWJD.js} +587 -141
  84. package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-IGD6ERX6.js} +62 -7
  85. package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-JNMVLWLR.js} +99 -14
  86. package/dist/cli-delegate/{chunk-H32DGUJH.js → chunk-P6ZHP5W2.js} +1 -1
  87. package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
  88. package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
  89. package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
  90. package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
  91. package/dist/cli-delegate/{chunk-QJWAUMJW.js → chunk-YJ72UIAK.js} +730 -15
  92. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  93. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  94. package/dist/cli-delegate/cmd_conformance.js +985 -831
  95. package/dist/cli-delegate/cmd_doctor.js +7 -5
  96. package/dist/cli-delegate/cmd_explain.js +2 -2
  97. package/dist/cli-delegate/cmd_export.js +9 -7
  98. package/dist/cli-delegate/cmd_fleet.js +4 -2
  99. package/dist/cli-delegate/cmd_handoff.js +7 -7
  100. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  101. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  102. package/dist/cli-delegate/cmd_migrate.js +2 -2
  103. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  104. package/dist/cli-delegate/cmd_preflight.js +4 -2
  105. package/dist/cli-delegate/cmd_prune.js +10 -8
  106. package/dist/cli-delegate/cmd_route_audit.js +3 -3
  107. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  108. package/dist/cli-delegate/cmd_session_recycle.js +4 -4
  109. package/dist/cli-delegate/cmd_settings_get.js +28 -2
  110. package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
  111. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  112. package/dist/cli-delegate/cmd_sync.js +10 -8
  113. package/dist/cli-delegate/cmd_uninstall.js +16 -13
  114. package/dist/cli-delegate/cmd_update.js +1 -1
  115. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  116. package/dist/cli-delegate/cmd_validate.js +12 -10
  117. package/dist/cli-delegate/cmd_versions.js +1 -1
  118. package/dist/discovery/deprecation-report.md +1 -1
  119. package/dist/discovery/discovery-manifest.json +90 -43
  120. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  121. package/dist/discovery/discovery-manifest.summary.md +4 -4
  122. package/dist/discovery/dormancy-report.md +1 -1
  123. package/dist/discovery/orphan-report.md +1 -1
  124. package/dist/discovery/packs.json +10 -8
  125. package/dist/discovery/trust-report.md +3 -3
  126. package/dist/discovery/workspaces.json +8 -6
  127. package/dist/hooks/dispatch.js +7682 -2772
  128. package/dist/hooks/dispatch.sha256 +1 -0
  129. package/dist/install/claudeRuleRewrite.js +14 -3
  130. package/dist/install/conflict.js +60 -10
  131. package/dist/install/conflictTracker.js +218 -0
  132. package/dist/install/fsPrimitives.js +54 -0
  133. package/dist/install/install.mjs +2200 -1559
  134. package/dist/install/manifestFiles.js +259 -0
  135. package/dist/install/preflight.js +14 -2
  136. package/dist/install/preserve.js +157 -0
  137. package/dist/install/recordedOwnership.js +132 -0
  138. package/dist/install/txlog.js +11 -2
  139. package/dist/mcp/registry-manifest.json +3 -3
  140. package/dist/mcp/server.json +2 -2
  141. package/dist/mcp/server.mjs +3066 -1470
  142. package/dist/router.json +1 -1
  143. package/dist/scripts/_lib/agent_settings.js +3 -2
  144. package/dist/scripts/_lib/fs_atomic.js +167 -0
  145. package/dist/scripts/_lib/installed_tools.js +460 -0
  146. package/dist/scripts/_lib/lean_projection_mode.js +3 -2
  147. package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
  148. package/dist/server/routes/install.js +8 -0
  149. package/dist/server/routes/wizard.js +9 -3
  150. package/dist/server/schemas/settings.js +40 -5
  151. package/dist/shared/missionExecution.js +97 -0
  152. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  153. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  154. package/dist/ui/index.html +2 -2
  155. package/docs/MIGRATION.md +103 -0
  156. package/docs/contracts/settings-classes.md +28 -7
  157. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  158. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  159. package/docs/guidelines/design-fidelity-routing.md +29 -0
  160. package/package.json +4 -4
  161. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  162. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  163. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  164. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  165. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +260 -21
  166. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  167. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  168. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  169. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  170. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  171. package/src/config/agent-settings.template.yml +168 -27
  172. package/src/config/auto-rule-budget.json +16 -0
  173. package/src/config/ci-local-parity.yml +36 -5
  174. package/src/config/continuity-surface.json +23 -2
  175. package/src/config/gate-coverage.yml +377 -13
  176. package/src/config/gate-violation-baselines.json +10 -6
  177. package/src/config/hook-latency-budget.json +21 -0
  178. package/src/config/hook-token-budget.json +4 -2
  179. package/src/config/loop-surfaces.yaml +215 -0
  180. package/src/config/metric-registry.yml +114 -0
  181. package/src/config/placeholder-drift-budget.json +10 -0
  182. package/src/config/platform-anchor.json +3 -2
  183. package/src/config/release-gate-locality.yml +11 -0
  184. package/src/config/routing-coverage-seed.json +33 -5
  185. package/src/config/rule-enforcement-baseline.json +0 -1
  186. package/src/install/claudeRuleRewrite.ts +16 -2
  187. package/src/install/conflict.ts +65 -9
  188. package/src/install/conflictTracker.ts +299 -0
  189. package/src/install/fsPrimitives.ts +54 -0
  190. package/src/install/manifestFiles.ts +312 -0
  191. package/src/install/preflight.ts +16 -2
  192. package/src/install/preserve.ts +205 -0
  193. package/src/install/recordedOwnership.ts +149 -0
  194. package/src/install/txlog.ts +11 -2
  195. package/src/install/types.ts +19 -4
  196. package/src/scripts/_cli/cmd_conformance.ts +88 -15
  197. package/src/scripts/_cli/cmd_doctor.ts +7 -20
  198. package/src/scripts/_cli/cmd_route_explain.ts +9 -2
  199. package/src/scripts/_cli/cmd_settings_get.ts +44 -0
  200. package/src/scripts/_cli/doctor_execution.ts +173 -0
  201. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  202. package/src/scripts/_lib/activation_payload.ts +247 -0
  203. package/src/scripts/_lib/agent_settings.ts +4 -2
  204. package/src/scripts/_lib/authority_path.ts +102 -0
  205. package/src/scripts/_lib/body_portable.ts +102 -0
  206. package/src/scripts/_lib/cascade_base.ts +94 -0
  207. package/src/scripts/_lib/cc_transcript.ts +132 -1
  208. package/src/scripts/_lib/changelog_eras.ts +7 -2
  209. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  210. package/src/scripts/_lib/continuation_ladder.ts +149 -2
  211. package/src/scripts/_lib/council_transport.ts +129 -0
  212. package/src/scripts/_lib/delivery_ready.ts +112 -0
  213. package/src/scripts/_lib/forge_protection.ts +381 -0
  214. package/src/scripts/_lib/forge_reader.ts +558 -0
  215. package/src/scripts/_lib/hook_platform_keys.ts +27 -0
  216. package/src/scripts/_lib/host_env_write.ts +111 -0
  217. package/src/scripts/_lib/json_python_parity.ts +127 -0
  218. package/src/scripts/_lib/lean_projection_mode.ts +14 -3
  219. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  220. package/src/scripts/_lib/loop_surfaces.ts +382 -0
  221. package/src/scripts/_lib/mission_record.ts +190 -0
  222. package/src/scripts/_lib/obligation_frequency.ts +217 -0
  223. package/src/scripts/_lib/obligations.ts +513 -0
  224. package/src/scripts/_lib/orchestration_record.ts +11 -20
  225. package/src/scripts/_lib/probe_inputs.ts +271 -0
  226. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  227. package/src/scripts/_lib/release_highlights.ts +201 -11
  228. package/src/scripts/_lib/release_holds.ts +493 -0
  229. package/src/scripts/_lib/release_migration_gate.ts +184 -0
  230. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  231. package/src/scripts/_lib/rides_along.ts +102 -0
  232. package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
  233. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  234. package/src/scripts/_lib/structural_hiding.ts +622 -0
  235. package/src/scripts/_lib/test_delta.ts +166 -0
  236. package/src/scripts/_lib/test_provenance.ts +171 -0
  237. package/src/scripts/_lib/turn_end_refusals.ts +525 -4
  238. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  239. package/src/scripts/_lib/typed_op_grant.ts +246 -0
  240. package/src/scripts/_lib/typed_op_watch.ts +185 -0
  241. package/src/scripts/_lib/verification_command.ts +324 -0
  242. package/src/scripts/_lib/verification_evidence.ts +647 -0
  243. package/src/scripts/_lib/verify_clause.ts +280 -0
  244. package/src/scripts/ai_council/config.ts +8 -11
  245. package/src/scripts/ai_council/fallback_config.ts +5 -3
  246. package/src/scripts/ai_council/ownership_classes.ts +118 -0
  247. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  248. package/src/scripts/ask_block_census.ts +285 -15
  249. package/src/scripts/before_complete_hook.ts +340 -23
  250. package/src/scripts/bench_hook_latency.ts +412 -5
  251. package/src/scripts/cache_realization_report.ts +61 -1
  252. package/src/scripts/check_argument_hint.ts +287 -0
  253. package/src/scripts/check_claims.ts +125 -1
  254. package/src/scripts/check_enforcement_coverage.ts +38 -9
  255. package/src/scripts/check_enforcement_matrix.ts +866 -0
  256. package/src/scripts/check_finding_dispositions.ts +22 -3
  257. package/src/scripts/check_gate_reachability.ts +173 -10
  258. package/src/scripts/check_generator_sync.ts +1025 -0
  259. package/src/scripts/check_host_docs_digest.ts +786 -0
  260. package/src/scripts/check_host_format_column.ts +559 -0
  261. package/src/scripts/check_input_references.ts +228 -0
  262. package/src/scripts/check_inputs_parity.ts +235 -0
  263. package/src/scripts/check_kernel_edit_ratified.ts +47 -5
  264. package/src/scripts/check_kill_switch_table.ts +294 -0
  265. package/src/scripts/check_placeholder_drift.ts +221 -0
  266. package/src/scripts/check_preamble_payload_budget.ts +75 -2
  267. package/src/scripts/check_read_surface_coverage.ts +515 -0
  268. package/src/scripts/check_release_highlights.ts +33 -1
  269. package/src/scripts/check_release_holds.ts +568 -0
  270. package/src/scripts/check_routing_coverage.ts +378 -11
  271. package/src/scripts/check_rule_projection_integrity.ts +22 -12
  272. package/src/scripts/check_static_parity.ts +17 -0
  273. package/src/scripts/check_test_delta.ts +294 -0
  274. package/src/scripts/check_test_weakening.ts +299 -0
  275. package/src/scripts/ci_settle.ts +145 -19
  276. package/src/scripts/closure_scan.ts +447 -0
  277. package/src/scripts/compile_hook_manifest.ts +102 -18
  278. package/src/scripts/council_record_shape.ts +209 -0
  279. package/src/scripts/external_sources_denylist.json +29 -4
  280. package/src/scripts/hook_manifest.json +1 -1
  281. package/src/scripts/hook_manifest.yaml +127 -11
  282. package/src/scripts/hooks/block_config_weakening.ts +229 -4
  283. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  284. package/src/scripts/hooks/block_plumbing_writes.ts +314 -0
  285. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  286. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  287. package/src/scripts/hooks/code_graph_context_hook.ts +1 -2
  288. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  289. package/src/scripts/hooks/concern_registry.ts +6 -0
  290. package/src/scripts/hooks/concern_timings.ts +94 -0
  291. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  292. package/src/scripts/hooks/design_pass_hook.ts +221 -5
  293. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  294. package/src/scripts/hooks/dispatch_hook.ts +25 -19
  295. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  296. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  297. package/src/scripts/hooks/evidence_independence.ts +97 -2
  298. package/src/scripts/hooks/exit_codes.ts +128 -0
  299. package/src/scripts/hooks/host_lowering.json +1 -0
  300. package/src/scripts/hooks/host_lowering.ts +128 -3
  301. package/src/scripts/hooks/host_lowering.yaml +262 -46
  302. package/src/scripts/hooks/host_semantics.ts +30 -2
  303. package/src/scripts/hooks/injection_budget.ts +9 -2
  304. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  305. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  306. package/src/scripts/hooks/memory_recall_hook.ts +539 -0
  307. package/src/scripts/hooks/obligation_settle_hook.ts +328 -0
  308. package/src/scripts/hooks/one_question_per_ask_hook.ts +25 -4
  309. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  310. package/src/scripts/hooks/permission_gate.ts +1 -2
  311. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  312. package/src/scripts/hooks/replay_hook.ts +2 -1
  313. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  314. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  315. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  316. package/src/scripts/hooks/rule_inject_hook.ts +55 -4
  317. package/src/scripts/hooks/run_continuation_hook.ts +30 -35
  318. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  319. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  320. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  321. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  322. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  323. package/src/scripts/hooks/table_fingerprint.ts +49 -0
  324. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  325. package/src/scripts/hooks/telemetry_usage_hook.ts +1 -2
  326. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  327. package/src/scripts/hooks/turn_end_gate_hook.ts +337 -324
  328. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  329. package/src/scripts/hooks_doctor.ts +85 -0
  330. package/src/scripts/hooks_status.ts +19 -0
  331. package/src/scripts/install.ts +109 -210
  332. package/src/scripts/janitor.ts +7 -0
  333. package/src/scripts/lint_decision_classes.ts +464 -0
  334. package/src/scripts/lint_deny_text.ts +419 -0
  335. package/src/scripts/lint_exit_codes.ts +262 -0
  336. package/src/scripts/lint_hook_manifest.ts +66 -0
  337. package/src/scripts/lint_major_migration_sections.ts +450 -0
  338. package/src/scripts/lint_plan_risk_register.ts +47 -3
  339. package/src/scripts/lint_roadmap_blockers.ts +139 -12
  340. package/src/scripts/lint_roadmap_producers.ts +202 -0
  341. package/src/scripts/lint_skill_descriptions.ts +1 -1
  342. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  343. package/src/scripts/mcp_server/prompts.ts +142 -1
  344. package/src/scripts/measure_rule_budget.ts +101 -5
  345. package/src/scripts/measure_skill_ranker_baseline.ts +305 -51
  346. package/src/scripts/measure_turn_end_gate.ts +193 -0
  347. package/src/scripts/memory_lookup.ts +1 -1
  348. package/src/scripts/new_roadmap.ts +37 -0
  349. package/src/scripts/orchestration_record.ts +0 -5
  350. package/src/scripts/prepack-check.mjs +53 -0
  351. package/src/scripts/release.ts +14 -98
  352. package/src/scripts/release_drill.ts +267 -1
  353. package/src/scripts/release_publication.ts +64 -1
  354. package/src/scripts/report_enforcement_drift.ts +566 -0
  355. package/src/scripts/report_host_injection_effect.ts +3 -11
  356. package/src/scripts/report_invocation_surface.ts +383 -0
  357. package/src/scripts/report_obligation_carriers.ts +699 -0
  358. package/src/scripts/report_obligation_writer_split.ts +236 -0
  359. package/src/scripts/report_skill_menu_census.ts +208 -0
  360. package/src/scripts/report_standing_payload_by_host.ts +26 -152
  361. package/src/scripts/roadmap_verify_share.ts +213 -0
  362. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  363. package/src/scripts/schemas/command.schema.json +48 -0
  364. package/src/scripts/schemas/review-findings.schema.json +4 -0
  365. package/src/scripts/schemas/skill.schema.json +44 -0
  366. package/src/scripts/scope_growth.ts +219 -0
  367. package/src/scripts/self_review_gate.ts +359 -10
  368. package/src/scripts/semantic_parity_census.ts +314 -0
  369. package/src/scripts/session_eol_report.ts +54 -1
  370. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  371. package/src/scripts/trigger_eval_grandfather.json +0 -3
  372. package/src/scripts/trigger_eval_rotation.ts +122 -27
  373. package/src/scripts/ui_conformance_probe.ts +774 -0
  374. package/src/scripts/update_prices.ts +85 -3
  375. package/src/scripts/write_bundle_digest.mjs +74 -0
  376. package/src/server/schemas/settings.ts +62 -7
  377. package/src/shared/missionExecution.ts +126 -0
  378. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  379. package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
  380. package/dist/ui/assets/index-D0jaCRPM.js +0 -29
  381. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
  382. /package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-7RQP4UDH.js} +0 -0
@@ -152,10 +152,9 @@ import {
152
152
  sessionRefusalFile,
153
153
  } from '../_lib/turn_end_refusals.js';
154
154
  import { phaseLines } from '../_lib/roadmap_checkboxes.js';
155
+ import { commandBearing, renderVerifyLine, type VerifyClause } from '../_lib/verify_clause.js';
155
156
 
156
- const EXIT_ALLOW = 0;
157
157
  /** Dispatcher-internal block code; the dispatcher maps stop-slot 1 → host 2. */
158
- const EXIT_BLOCK = 1;
159
158
 
160
159
  /**
161
160
  * The gate's cap, IMPORTED rather than restated — the two must agree by
@@ -185,6 +184,7 @@ import { premiseMoved, readContextObservation } from '../_lib/context_observatio
185
184
  import { RUN_TERMINAL_VOCABULARY_VERSION } from '../_lib/outcome_vocabularies.js';
186
185
  import {
187
186
  HALT_ACTIONS,
187
+ buildLedgerEvent, parseDeliveryState, type DeliveryState,
188
188
  ladder,
189
189
  MAX_ITERATIONS,
190
190
  parseHaltStamp,
@@ -193,6 +193,7 @@ import {
193
193
  WALL_CLOCK_CAP_MS,
194
194
  type LadderAction,
195
195
  } from '../_lib/continuation_ladder.js';
196
+ import { EXIT_ALLOW, EXIT_BLOCK } from './exit_codes.js';
196
197
 
197
198
  /**
198
199
  * DECLARED in `_lib/continuation_ladder.ts`, re-exported here: one declaration,
@@ -322,6 +323,8 @@ export interface RunState {
322
323
  * observed one, which is never a disagreement (`premiseMoved`).
323
324
  */
324
325
  context_fingerprint?: string;
326
+ /** DELIVERY position (8.1), written by the run; absent is no hold. */
327
+ delivery?: DeliveryState;
325
328
  }
326
329
 
327
330
  /**
@@ -372,8 +375,8 @@ export function isDuplicateFire(
372
375
  export interface NextStep {
373
376
  /** The step's own line, checkbox stripped, truncated for the message. */
374
377
  text: string;
375
- /** The step's `verify:` command, when its line carries one. */
376
- verify: string | null;
378
+ /** The step's `verify:` clause — command plus optional expectation. */
379
+ verify: VerifyClause | null;
377
380
  }
378
381
 
379
382
  export interface ScanResult {
@@ -478,15 +481,15 @@ export function scanOpenSteps(text: string): ScanResult {
478
481
  * The comment form wins when both are present: it is the machine-readable one,
479
482
  * and a step carrying both has a human-facing line and a tooling-facing line
480
483
  * rather than two commands.
484
+ *
485
+ * The hook's narrowing only — a prose clause is not a command, and the
486
+ * continuation message renders commands. It parses nothing itself: a second
487
+ * copy of the arrow grammar is how this hook and `closure_scan` would drift,
488
+ * and a drifted grammar stops reading expectations without failing anything.
489
+ * `_lib/verify_clause.ts` owns the grammar and the sweep that keeps it single.
481
490
  */
482
- export function extractVerify(stepText: string): string | null {
483
- const html = /<!--\s*verify:\s*(.*?)\s*-->/.exec(stepText);
484
- if (html !== null) return (html[1] as string).trim() || null;
485
- // `verify:` then the command, both backticked. The label's own backticks
486
- // are optional because the tree carries `verify:` and `` `verify:` ``.
487
- const backticked = /`?verify:`?\s*`([^`]+)`/.exec(stepText);
488
- if (backticked !== null) return (backticked[1] as string).trim() || null;
489
- return null;
491
+ export function extractVerify(stepText: string): VerifyClause | null {
492
+ return commandBearing(stepText);
490
493
  }
491
494
 
492
495
  /**
@@ -651,6 +654,10 @@ function readState(file: string): RunState | null {
651
654
  if (o['inert_reported'] === true) {
652
655
  rec.inert_reported = true;
653
656
  }
657
+ // Round-tripped for the same reason `history_source` is: without this the
658
+ // 8.1 hold is dead code that reads as shipped.
659
+ const dlv = parseDeliveryState(o['delivery']);
660
+ if (dlv !== undefined) rec.delivery = dlv;
654
661
  // Round-tripped for the same reason `history_source` is: dropped, the
655
662
  // premise would be re-recorded every fire from the newest observation, so
656
663
  // the two sides could never differ and the rung would be dead code.
@@ -1252,7 +1259,6 @@ export function main(): number {
1252
1259
  return EXIT_ALLOW;
1253
1260
  }
1254
1261
 
1255
-
1256
1262
  // The two-tree provenance, carried on every event this run emits. See
1257
1263
  // `provenance()` for the six fields and why none of them is a boolean.
1258
1264
  //
@@ -1384,14 +1390,14 @@ export function main(): number {
1384
1390
  const observed = readContextObservation(workspaceRoot)?.fingerprint ?? null;
1385
1391
  const premiseInvalidated = premiseMoved(state.context_fingerprint, observed);
1386
1392
 
1393
+ const delivery = parseDeliveryState(state.delivery) ?? null;
1387
1394
  const action = ladder(
1388
- state,
1389
- scan.open,
1390
- Date.now(),
1395
+ state, scan.open, Date.now(),
1391
1396
  scan.blocked,
1392
1397
  undefined,
1393
1398
  unavailable,
1394
1399
  premiseInvalidated,
1400
+ delivery,
1395
1401
  );
1396
1402
 
1397
1403
  if (action !== 'engage') {
@@ -1408,23 +1414,13 @@ export function main(): number {
1408
1414
  const alreadyBlocked =
1409
1415
  action === 'blocked' && eventAlreadyLogged(workspaceRoot, runId, slug, 'blocked');
1410
1416
  if (!alreadyStamped && !alreadyBlocked) {
1411
- appendEvent(workspaceRoot, {
1412
- event: action,
1413
- run_id: runId,
1414
- roadmap: slug,
1415
- turn: turnOrdinal,
1416
- iterations: state.iterations,
1417
- open: scan.open,
1418
- blocked: scan.blocked,
1419
- // A ledger line is a persisted shape carrying a `RunTerminalState`,
1420
- // so it names the vocabulary version it was written against: a
1421
- // reader meeting an unknown value can then tell a newer writer
1422
- // from a corrupt row.
1423
- terminal_state: terminalStateFor(action),
1424
- terminal_vocabulary_version: RUN_TERMINAL_VOCABULARY_VERSION,
1425
- at: new Date().toISOString(),
1426
- ...roots,
1427
- });
1417
+ const line = buildLedgerEvent(
1418
+ { action, runId, slug, turn: turnOrdinal, iterations: state.iterations,
1419
+ open: scan.open, blocked: scan.blocked, delivery },
1420
+ RUN_TERMINAL_VOCABULARY_VERSION,
1421
+ new Date(),
1422
+ );
1423
+ appendEvent(workspaceRoot, { ...line, ...roots } as JsonObject);
1428
1424
  }
1429
1425
  if (action === 'complete') {
1430
1426
  // Only a COMPLETION clears the state, so a later run on the same
@@ -1490,8 +1486,7 @@ export function main(): number {
1490
1486
 
1491
1487
  function _continuationText(slug: string, scan: ScanResult, iteration: number): string {
1492
1488
  const stepLine = scan.next
1493
- ? `Next step: ${scan.next.text}` +
1494
- (scan.next.verify ? `\n verify: ${scan.next.verify}` : '')
1489
+ ? `Next step: ${scan.next.text}${renderVerifyLine(scan.next.verify)}`
1495
1490
  : 'Next step: (first open checkbox in the roadmap)';
1496
1491
  return (
1497
1492
  `run-continuation: the contracted roadmap \`${slug}\` has ${scan.open} open ` +
@@ -143,10 +143,9 @@ import { isSyntheticPrompt } from "../_lib/prompt_shape.js";
143
143
  import { OBSERVATION_LOG, readObservationLog, resolveSkillCatalogueRoots } from "../_lib/skill_catalogue.js";
144
144
  import { knownBareNames } from "../_lib/skill_catalogue_series.js";
145
145
  import { _tokenize, rank, type RankRow } from "../skill_tools/score_skill_relevance.js";
146
+ import { EXIT_ALLOW, EXIT_WARN } from './exit_codes.js';
146
147
 
147
- const EXIT_ALLOW = 0;
148
148
  /** See the header: reduced to a real exit of 0 by `emitFor`'s warn branch. */
149
- const EXIT_WARN = 2;
150
149
 
151
150
  /**
152
151
  * Minimum top-1 ranker score before this concern speaks.
@@ -95,8 +95,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
95
95
  import { is_replay_mode } from './state_io.js';
96
96
  import { readHookStdin } from './hook_stdin.js';
97
97
  import { resolveConsumerRoot } from './subagent_ledger_hook.js';
98
-
99
- const EXIT_ALLOW = 0;
98
+ import { EXIT_ALLOW } from './exit_codes.js';
100
99
 
101
100
  /** Would-warns per session before the valve goes silent — `MAX_NUDGES` shape. */
102
101
  export const MAX_SHADOW_WARNS = 2;
@@ -55,8 +55,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
55
55
 
56
56
  import { appendLedgerLine, openRecordStats, resolveConsumerRoot } from './subagent_ledger_hook.js';
57
57
  import { readHookStdin } from './hook_stdin.js';
58
-
59
- const EXIT_ALLOW = 0;
58
+ import { EXIT_ALLOW } from './exit_codes.js';
60
59
 
61
60
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
62
61
  type JsonObject = { [k: string]: JsonValue };
@@ -115,8 +115,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
115
115
  import { countContractFields, validateResponse } from '../_lib/subagent_response.js';
116
116
  import { atomic_write_json, is_replay_mode } from './state_io.js';
117
117
  import { readHookStdin } from './hook_stdin.js';
118
-
119
- const EXIT_ALLOW = 0;
118
+ import { EXIT_ALLOW } from './exit_codes.js';
120
119
 
121
120
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
122
121
  type JsonObject = { [k: string]: JsonValue };
@@ -51,8 +51,8 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
51
51
  import { unwrap } from './envelope.js';
52
52
  import { readHookStdin } from './hook_stdin.js';
53
53
  import { humanTypedThisTurn } from '../_lib/machine_wake.js';
54
+ import { EXIT_ALLOW } from './exit_codes.js';
54
55
 
55
- const EXIT_ALLOW = 0;
56
56
  const SETTINGS_FILE = '.agent-settings.yml';
57
57
  const SINK_REL = path.join('agents', 'runtime', 'state', 'audit', 'suggestion-capture.jsonl');
58
58
  const LATCH_REL = path.join('agents', 'runtime', 'state', 'suggestion-latch.json');
@@ -0,0 +1,49 @@
1
+ import { createHash } from 'node:crypto';
2
+
3
+ /**
4
+ * table_fingerprint — the content fingerprint a compiled plumbing table is
5
+ * validated against.
6
+ *
7
+ * Extracted from `dispatch_hook._manifest_fingerprint` so a SECOND table
8
+ * (`host_lowering.yaml`) can use the same helper without importing the
9
+ * dispatcher: `dispatch_hook` → `host_semantics` → `host_lowering` is a live
10
+ * import chain, so the reverse edge would be a cycle.
11
+ *
12
+ * DELIBERATELY CONTENT-DERIVED, NOT MTIME. The first version of the manifest
13
+ * fast path compared mtimes and that was a measured defect, not a theoretical
14
+ * one: on a fresh `actions/checkout` both files carry the checkout timestamp in
15
+ * whatever order git wrote them, so whether the optimisation applied at all was
16
+ * a coin flip — it won on a PR run (p95 129 ms) and lost on the trunk
17
+ * (p95 186 ms) for the same commit. A fingerprint is deterministic wherever the
18
+ * tree came from.
19
+ *
20
+ * SHA-256 over the UTF-8 bytes, plus the length. This replaced an FNV-1a loop
21
+ * in step 3.1 of `road-to-a-kernel-that-guards-its-plumbing`, and the reason
22
+ * the old one existed no longer holds. Its header said a cryptographic hash was
23
+ * refused because `require('node:crypto')` costs 8 ms of process start, which
24
+ * is most of what the precompiled table saves. Both halves were re-measured
25
+ * against the tree as it now stands, and both had gone stale:
26
+ *
27
+ * - The module is ALREADY LOADED. `dist/hooks/dispatch.js` carries 23
28
+ * top-level `import … from "node:crypto"` statements from other parts of the
29
+ * graph, so the 8 ms is paid on every dispatch whether this function uses it
30
+ * or not. There is no startup cost left to avoid.
31
+ * - SHA-256 is FASTER here, not slower: 0.106 ms against 0.113 ms over the
32
+ * 99,792-byte manifest, because Node's digest is native and the FNV-1a loop
33
+ * was 99,792 interpreted `charCodeAt` calls.
34
+ *
35
+ * The change is therefore free, and it buys the property the old comment had to
36
+ * disclaim: this now guards against a CRAFTED sibling as well as a stale one,
37
+ * which is what a file called a fingerprint should mean when the roadmap around
38
+ * it is about integrity.
39
+ *
40
+ * Producer and both consumers import THIS function — `compile_hook_manifest`
41
+ * writes the value, `dispatch_hook` and `host_lowering` check it — so the
42
+ * algorithm can never drift between the two sides. A mismatch is not a failure
43
+ * either way: the reader falls through to parsing the YAML source, which is
44
+ * correct and merely slower.
45
+ */
46
+ export function tableFingerprint(text: string): string {
47
+ const digest = createHash('sha256').update(text, 'utf-8').digest('hex');
48
+ return `${digest}:${String(text.length)}`;
49
+ }
@@ -45,8 +45,7 @@ import {
45
45
  import { is_replay_mode } from './state_io.js';
46
46
  import { readHookStdin } from './hook_stdin.js';
47
47
  import { _resolveRoot, readSettingsFor } from './telemetry_usage_hook.js';
48
-
49
- const EXIT_ALLOW = 0;
48
+ import { EXIT_ALLOW } from './exit_codes.js';
50
49
 
51
50
  /**
52
51
  * Where `flush_sender.mjs` lives, relative to this module.
@@ -57,8 +57,7 @@ import {
57
57
  } from '../../agent-src/templates/scripts/telemetry/transport.js';
58
58
  import { is_replay_mode } from './state_io.js';
59
59
  import { readHookStdin } from './hook_stdin.js';
60
-
61
- const EXIT_ALLOW = 0;
60
+ import { EXIT_ALLOW } from './exit_codes.js';
62
61
 
63
62
  /** The tool name Phase 0 spike 1 confirmed for a skill invocation. */
64
63
  export const SKILL_TOOL_NAME = 'Skill';
@@ -24,10 +24,10 @@
24
24
  *
25
25
  * PRIVACY BY CONSTRUCTION — never widen this file to record content.
26
26
  *
27
- * The record type has exactly three fields and NONE of them can hold free
27
+ * The record type has exactly four fields and NONE of them can hold free
28
28
  * text: a timestamp, a tool NAME (an id-shaped enum — `Read`, `Bash`,
29
29
  * `Grep` — the same single host string `orchestration_record_hook` already
30
- * records), and a BYTE COUNT. A tool result routinely carries file
30
+ * records), and TWO BYTE COUNTS. A tool result routinely carries file
31
31
  * contents, command output, secrets in an env dump, and customer data from
32
32
  * an API response. None of it reaches this file's output, because the
33
33
  * output has no field able to carry it. A record shape that cannot hold a
@@ -47,6 +47,34 @@
47
47
  * identical while the cost came back. The `RESULT_KEYS` literals below are the
48
48
  * key NAMES this concern looks under, not a read of the body.
49
49
  *
50
+ * TWO COUNTS, ONE OF THEM REDUNDANT TODAY. `raw_bytes` is what
51
+ * the host handed the dispatcher; `delivered_bytes` is what reached the
52
+ * model. Today they are EQUAL BY CONSTRUCTION, and the construction is
53
+ * checkable: nothing under `src/` or `docs/` emits the host's result-rewrite
54
+ * field, so no concern can rewrite a tool result on its way past. That
55
+ * absence is a grep, and the grep lives in this concern's test rather than
56
+ * in this sentence - a claim in a comment is not falsifiable, and naming the
57
+ * field here would put a match in the very tree the grep sweeps.
58
+ *
59
+ * Recording both NOW is what makes a later reduction measurable instead of
60
+ * asserted. With one field, a future release that starts trimming results
61
+ * has no before-number and can only claim an improvement; with two, the
62
+ * delta is in the census the day the trimming lands. The cost of the second
63
+ * field is one integer per line in one workspace — see the gate below.
64
+ *
65
+ * DEFAULT OFF OUTSIDE THE MAINTAINER WORKSPACE. A byte counter on every
66
+ * tool call in every consumer install is
67
+ * the cheapest possible way to add a second unread instrument: it costs a
68
+ * write per tool call, accumulates volume, and answers a question only this
69
+ * package's maintainers have asked. So {@link resolvesMaintainerWorkspace}
70
+ * gates the write, and with no maintainer workspace resolved a dispatch
71
+ * writes nothing at all — not an empty line, not a file.
72
+ *
73
+ * A consumer who WANTS the census sets `AGENT_CONFIG_TOOL_BYTE_CENSUS=1`.
74
+ * That is a deliberate opt-in and it is the only other way the write
75
+ * happens; there is no settings key, because a key would put the decision in
76
+ * a file this concern would then have to parse on the hot path.
77
+ *
50
78
  * ── Always exit 0 ─────────────────────────────────────────────────────
51
79
  *
52
80
  * A `warn` (exit 2) is read as a hard BLOCK on this host, and this concern
@@ -56,8 +84,8 @@
56
84
  *
57
85
  * ── Absence is recorded, not inferred ─────────────────────────────────
58
86
  *
59
- * A payload carrying no readable result writes a line with `bytes: null`
60
- * and `measurable: false` rather than writing nothing. The two cases are
87
+ * A payload carrying no readable result writes a line with both byte fields
88
+ * null and `measurable: false` rather than writing nothing. The two cases are
61
89
  * otherwise byte-identical in the output — "this host does not carry tool
62
90
  * results in its PostToolUse payload" and "no tools ran" would produce the
63
91
  * same empty file, and the first is a finding about the instrument's own
@@ -72,8 +100,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
72
100
  import { is_replay_mode } from './state_io.js';
73
101
  import { readHookStdin } from './hook_stdin.js';
74
102
  import { stubbedBytes } from './payload_stub.js';
75
-
76
- const EXIT_ALLOW = 0;
103
+ import { EXIT_ALLOW } from './exit_codes.js';
77
104
 
78
105
  type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
79
106
  type JsonObject = { [k: string]: JsonValue };
@@ -85,7 +112,7 @@ function isObject(v: unknown): v is JsonObject {
85
112
  /**
86
113
  * Census file, relative to the consumer repo root. Sibling of
87
114
  * `injection-census.jsonl` in the same directory and the same
88
- * `{ts, …, bytes}` line shape — one family, two units: that file counts
115
+ * `{ts, …, bytes}` line family — one family, two units: that file counts
89
116
  * bytes this suite injects, this one counts bytes the host's tools do.
90
117
  * Gitignored via `/agents/runtime/`.
91
118
  */
@@ -169,13 +196,65 @@ function censusFile(consumerRoot: string): string {
169
196
  export interface CensusLine {
170
197
  ts: string;
171
198
  tool: string | null;
172
- bytes: number | null;
199
+ /** UTF-8 bytes the host handed the dispatcher. `null` ⇒ unmeasurable. */
200
+ raw_bytes: number | null;
201
+ /**
202
+ * UTF-8 bytes that reached the model.
203
+ *
204
+ * Equal to {@link CensusLine.raw_bytes} by construction today — nothing in
205
+ * this tree rewrites a tool result. It is recorded anyway so that a later
206
+ * reduction is a measured delta rather than a claim. See the header.
207
+ */
208
+ delivered_bytes: number | null;
173
209
  /** `false` ⇒ the payload carried no readable result. See the header. */
174
210
  measurable: boolean;
175
211
  }
176
212
 
213
+ /** `package.json.name` of the workspace this census is for. */
214
+ export const MAINTAINER_PACKAGE_NAME = '@event4u/agent-config';
215
+
216
+ /** Deliberate consumer opt-in. Any other value, or unset, leaves the census off. */
217
+ export const CENSUS_OPT_IN_ENV = 'AGENT_CONFIG_TOOL_BYTE_CENSUS';
218
+
219
+ /** Memoised per root: this is read once per dispatched tool call otherwise. */
220
+ const _maintainerCache = new Map<string, boolean>();
221
+
222
+ /** Test seam — the cache would otherwise outlive a fixture root's contents. */
223
+ export function _resetMaintainerCache(): void {
224
+ _maintainerCache.clear();
225
+ }
226
+
227
+ /**
228
+ * Does this root resolve the maintainer workspace?
229
+ *
230
+ * Read off `package.json.name`, which is the cheapest unambiguous marker of
231
+ * the one workspace whose `workspaces: [agent-config-maintainer]` artefacts
232
+ * are active. A settings key was rejected: it would put a YAML parse on the
233
+ * post_tool_use path for a decision that never changes within a checkout.
234
+ *
235
+ * Any failure — no `package.json`, unreadable, unparseable, a different name
236
+ * — resolves to FALSE. The default is silence, which is the safe direction
237
+ * for an instrument nobody in that workspace is going to read.
238
+ */
239
+ export function resolvesMaintainerWorkspace(consumerRoot: string): boolean {
240
+ if (process.env[CENSUS_OPT_IN_ENV] === '1') return true;
241
+ const cached = _maintainerCache.get(consumerRoot);
242
+ if (cached !== undefined) return cached;
243
+ let verdict = false;
244
+ try {
245
+ const raw = fs.readFileSync(path.join(consumerRoot, 'package.json'), 'utf8');
246
+ const parsed = JSON.parse(raw) as unknown;
247
+ verdict = isObject(parsed) && parsed['name'] === MAINTAINER_PACKAGE_NAME;
248
+ } catch {
249
+ verdict = false;
250
+ }
251
+ _maintainerCache.set(consumerRoot, verdict);
252
+ return verdict;
253
+ }
254
+
177
255
  export function _appendCensusLine(consumerRoot: string, line: CensusLine): void {
178
256
  if (is_replay_mode()) return;
257
+ if (!resolvesMaintainerWorkspace(consumerRoot)) return;
179
258
  const file = censusFile(consumerRoot);
180
259
  fs.mkdirSync(path.dirname(file), { recursive: true });
181
260
  fs.appendFileSync(file, `${JSON.stringify(line)}\n`, 'utf8');
@@ -193,7 +272,12 @@ export function processEnvelope(envelope: JsonValue, consumerRoot: string): numb
193
272
  _appendCensusLine(consumerRoot, {
194
273
  ts: new Date().toISOString(),
195
274
  tool: _toolName(payload, envelope),
196
- bytes,
275
+ raw_bytes: bytes,
276
+ // Equal BY CONSTRUCTION, not by copy-as-convenience: no concern
277
+ // can rewrite a result between the host and the model, because
278
+ // nothing under src/ or docs/ emits the host's rewrite field. The
279
+ // test pins that as a grep; naming the field here would match it.
280
+ delivered_bytes: bytes,
197
281
  measurable: bytes !== null,
198
282
  });
199
283
  } catch {