@event4u/agent-config 16.2.0 → 16.4.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 (651) 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 +337 -234
  5. package/README.md +15 -13
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +11 -8
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  9. package/dist/agent-src/commands/bug/fix.md +17 -2
  10. package/dist/agent-src/commands/bug/investigate.md +1 -1
  11. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  12. package/dist/agent-src/commands/commit.md +72 -33
  13. package/dist/agent-src/commands/condense.md +2 -8
  14. package/dist/agent-src/commands/council/debate.md +11 -7
  15. package/dist/agent-src/commands/council/default.md +10 -9
  16. package/dist/agent-src/commands/council.md +1 -1
  17. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  18. package/dist/agent-src/commands/feature/explore.md +3 -3
  19. package/dist/agent-src/commands/feature/plan.md +2 -2
  20. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  21. package/dist/agent-src/commands/fix/ci.md +18 -4
  22. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  23. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  24. package/dist/agent-src/commands/implement-ticket.md +4 -4
  25. package/dist/agent-src/commands/jira-ticket.md +1 -1
  26. package/dist/agent-src/commands/memory/add.md +4 -16
  27. package/dist/agent-src/commands/memory/load.md +5 -6
  28. package/dist/agent-src/commands/memory/promote.md +3 -16
  29. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  30. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  31. package/dist/agent-src/commands/optimize/deep.md +4 -2
  32. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  33. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  34. package/dist/agent-src/commands/pr/create.md +42 -34
  35. package/dist/agent-src/commands/pr/merge.md +136 -9
  36. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  37. package/dist/agent-src/commands/project/analyze.md +7 -35
  38. package/dist/agent-src/commands/refine-ticket.md +1 -1
  39. package/dist/agent-src/commands/review/changes.md +14 -19
  40. package/dist/agent-src/commands/roadmap/create.md +1 -1
  41. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  42. package/dist/agent-src/commands/roadmap/next.md +10 -1
  43. package/dist/agent-src/commands/roadmap/process-full.md +56 -42
  44. package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
  45. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  46. package/dist/agent-src/commands/roadmap.md +18 -4
  47. package/dist/agent-src/commands/tests/create.md +17 -3
  48. package/dist/agent-src/commands/tests/execute.md +22 -5
  49. package/dist/agent-src/commands/worktree/create.md +7 -3
  50. package/dist/agent-src/commands/worktree/verify.md +2 -1
  51. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  52. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  53. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  54. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  55. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  56. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  57. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
  58. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  59. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  60. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  61. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  62. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  63. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
  64. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  65. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  66. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  67. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  68. package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
  69. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  70. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  71. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  72. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  73. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  74. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  75. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  76. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  77. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  78. package/dist/agent-src/guidelines/php/git.md +15 -2
  79. package/dist/agent-src/rules/active-remediation.md +1 -2
  80. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  81. package/dist/agent-src/rules/architecture.md +0 -1
  82. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  83. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  84. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  85. package/dist/agent-src/rules/autonomous-execution.md +1 -1
  86. package/dist/agent-src/rules/brand-consistency.md +0 -1
  87. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  88. package/dist/agent-src/rules/broken-access-control.md +1 -1
  89. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  90. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  91. package/dist/agent-src/rules/code-provenance.md +0 -1
  92. package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
  93. package/dist/agent-src/rules/commit-conventions.md +1 -2
  94. package/dist/agent-src/rules/communication-through-line.md +1 -2
  95. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  96. package/dist/agent-src/rules/context-hygiene.md +6 -6
  97. package/dist/agent-src/rules/copilot-routing.md +1 -2
  98. package/dist/agent-src/rules/council-availability.md +4 -4
  99. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  100. package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
  101. package/dist/agent-src/rules/delegation-policy.md +2 -3
  102. package/dist/agent-src/rules/design-fidelity.md +12 -16
  103. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  104. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  105. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
  106. package/dist/agent-src/rules/docker-commands.md +0 -1
  107. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  108. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
  109. package/dist/agent-src/rules/domain-safety-pii.md +1 -1
  110. package/dist/agent-src/rules/domain-safety-retention.md +1 -1
  111. package/dist/agent-src/rules/downstream-changes.md +0 -1
  112. package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
  113. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  114. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  115. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  116. package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
  117. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  118. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  119. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  120. package/dist/agent-src/rules/git-history-discipline.md +2 -2
  121. package/dist/agent-src/rules/guidelines.md +0 -1
  122. package/dist/agent-src/rules/history-discipline.md +0 -1
  123. package/dist/agent-src/rules/icon-consistency.md +0 -1
  124. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
  125. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  126. package/dist/agent-src/rules/invite-challenge.md +0 -1
  127. package/dist/agent-src/rules/laravel-routing.md +1 -2
  128. package/dist/agent-src/rules/laravel-translations.md +0 -1
  129. package/dist/agent-src/rules/legal-safety-floor.md +3 -3
  130. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
  131. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  132. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
  133. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  134. package/dist/agent-src/rules/media-governance-routing.md +13 -17
  135. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  136. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  137. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  138. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  139. package/dist/agent-src/rules/model-recommendation.md +0 -1
  140. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  141. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  142. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  143. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  144. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  145. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  146. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  147. package/dist/agent-src/rules/output-discipline.md +0 -1
  148. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  149. package/dist/agent-src/rules/persona-governance.md +4 -5
  150. package/dist/agent-src/rules/php-coding.md +0 -1
  151. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  152. package/dist/agent-src/rules/preservation-guard.md +0 -1
  153. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
  154. package/dist/agent-src/rules/question-not-instruction.md +1 -1
  155. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  156. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  157. package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
  158. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  159. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  160. package/dist/agent-src/rules/runtime-safety.md +1 -1
  161. package/dist/agent-src/rules/scale-discipline.md +0 -1
  162. package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
  163. package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
  164. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  165. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  166. package/dist/agent-src/rules/session-canary.md +7 -62
  167. package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
  168. package/dist/agent-src/rules/size-enforcement.md +0 -1
  169. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  170. package/dist/agent-src/rules/skill-quality.md +0 -1
  171. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  172. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  173. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  174. package/dist/agent-src/rules/source-of-truth.md +0 -1
  175. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  176. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  177. package/dist/agent-src/rules/symfony-routing.md +1 -2
  178. package/dist/agent-src/rules/think-before-action.md +0 -1
  179. package/dist/agent-src/rules/token-budget-discipline.md +12 -46
  180. package/dist/agent-src/rules/token-efficiency.md +0 -1
  181. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  182. package/dist/agent-src/rules/tool-safety.md +1 -1
  183. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  184. package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
  185. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  186. package/dist/agent-src/rules/user-interaction.md +0 -1
  187. package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
  188. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  189. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  190. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  191. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  192. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  193. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  194. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  195. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  196. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  197. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  198. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  199. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  200. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  201. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  202. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  203. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  204. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  205. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  206. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  207. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  208. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  209. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  210. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
  211. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  212. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  213. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  214. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  215. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  216. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  217. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  218. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  219. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  220. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  221. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  222. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  223. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  224. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  225. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  226. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  227. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  228. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
  229. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  230. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  231. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
  232. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  233. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  234. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  235. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  236. package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
  237. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  238. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  239. package/dist/agent-src/templates/AGENTS.md +1 -1
  240. package/dist/agent-src/templates/agent-settings.md +46 -129
  241. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  242. package/dist/agent-src/templates/command.md +2 -2
  243. package/dist/agent-src/templates/roadmaps.md +6 -1
  244. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  245. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  246. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  247. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  248. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  249. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  250. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  251. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  252. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  253. package/dist/agent-src/templates/skill.md +1 -1
  254. package/dist/cli/registry.js +2 -1
  255. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  256. package/dist/cli-delegate/check_update_banner.js +207 -120
  257. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  258. package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
  259. package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
  260. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  261. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  262. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  263. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  264. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  265. package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
  266. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  267. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  268. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  269. package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
  270. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
  271. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
  272. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  273. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  274. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  275. package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
  276. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
  277. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  278. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
  279. package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
  280. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  281. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  282. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  283. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
  284. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  285. package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
  286. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  287. package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
  288. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
  289. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  290. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  291. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  292. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  293. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  294. package/dist/cli-delegate/cmd_conformance.js +1252 -249
  295. package/dist/cli-delegate/cmd_converge.js +3 -3
  296. package/dist/cli-delegate/cmd_doctor.js +19 -9
  297. package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
  298. package/dist/cli-delegate/cmd_explain.js +45 -21
  299. package/dist/cli-delegate/cmd_export.js +13 -10
  300. package/dist/cli-delegate/cmd_fleet.js +3 -3
  301. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  302. package/dist/cli-delegate/cmd_handoff.js +44 -22
  303. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  304. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  305. package/dist/cli-delegate/cmd_migrate.js +3 -3
  306. package/dist/cli-delegate/cmd_packs_active.js +5 -4
  307. package/dist/cli-delegate/cmd_preflight.js +6 -6
  308. package/dist/cli-delegate/cmd_prune.js +14 -11
  309. package/dist/cli-delegate/cmd_refresh.js +2 -1
  310. package/dist/cli-delegate/cmd_route_audit.js +10 -8
  311. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  312. package/dist/cli-delegate/cmd_session_recycle.js +10 -7
  313. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  314. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  315. package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
  316. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  317. package/dist/cli-delegate/cmd_sync.js +14 -11
  318. package/dist/cli-delegate/cmd_uninstall.js +15 -12
  319. package/dist/cli-delegate/cmd_update.js +7 -7
  320. package/dist/cli-delegate/cmd_upgrade.js +9 -8
  321. package/dist/cli-delegate/cmd_validate.js +15 -12
  322. package/dist/cli-delegate/cmd_versions.js +5 -5
  323. package/dist/cli-delegate/deferral_carry.js +16 -0
  324. package/dist/cli-delegate/gate_budget.js +1 -1
  325. package/dist/cli-delegate/gate_execute.js +3 -3
  326. package/dist/cli-delegate/roadmap_gates.js +6 -6
  327. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  328. package/dist/discovery/deprecation-report.md +1 -1
  329. package/dist/discovery/discovery-manifest.json +232 -141
  330. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  331. package/dist/discovery/discovery-manifest.summary.md +3 -3
  332. package/dist/discovery/dormancy-report.md +1 -1
  333. package/dist/discovery/orphan-report.md +1 -1
  334. package/dist/discovery/packs.json +26 -9
  335. package/dist/discovery/trust-report.md +3 -3
  336. package/dist/discovery/workspaces.json +7 -4
  337. package/dist/hooks/dispatch.js +5655 -6623
  338. package/dist/hooks/dispatch.sha256 +1 -1
  339. package/dist/install/claudePathsPlan.js +47 -6
  340. package/dist/install/claudeRuleRewrite.js +7 -0
  341. package/dist/install/emit_host_rules_cli.js +39 -36
  342. package/dist/install/globalRuleScope.js +87 -0
  343. package/dist/install/host_rule_ownership.js +160 -0
  344. package/dist/install/install.mjs +2336 -1249
  345. package/dist/install/installThinLayer.js +289 -0
  346. package/dist/install/installedRuleLinks.js +262 -0
  347. package/dist/install/wizard-plan.js +24 -0
  348. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  349. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  350. package/dist/mcp/registry-manifest.json +5 -5
  351. package/dist/mcp/server.json +2 -2
  352. package/dist/mcp/server.mjs +36504 -30986
  353. package/dist/router.json +1 -1
  354. package/dist/scripts/_lib/agent_settings.js +26 -120
  355. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  356. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  357. package/dist/scripts/_lib/git_convention.js +232 -0
  358. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  359. package/dist/scripts/_lib/installed_layer.js +704 -0
  360. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  361. package/dist/scripts/_lib/package_root.js +68 -0
  362. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  363. package/dist/scripts/_lib/rule_injection.js +67 -10
  364. package/dist/scripts/_lib/rule_law_section.js +122 -0
  365. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  366. package/dist/scripts/_lib/thin_rules.js +535 -0
  367. package/dist/scripts/_lib/windsurf_render.js +60 -0
  368. package/dist/scripts/condense.js +14 -26
  369. package/dist/scripts/project_thin_rules.js +14 -294
  370. package/dist/server/app.js +2 -1
  371. package/dist/server/gitKeysGate.js +105 -0
  372. package/dist/server/routes/settings.js +67 -8
  373. package/dist/server/routes/wizard.js +4 -0
  374. package/dist/server/schemas/settings.js +29 -81
  375. package/dist/shared/skillRanking.js +103 -16
  376. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  377. package/dist/ui/index.html +1 -1
  378. package/docs/MIGRATION.md +72 -1
  379. package/docs/contracts/settings-classes.md +39 -67
  380. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  381. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  382. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  383. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  384. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  385. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  386. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  387. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  388. package/docs/guidelines/php/git.md +15 -2
  389. package/package.json +1 -1
  390. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  391. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  392. package/src/agent-src/scripts/gate_budget.ts +47 -23
  393. package/src/agent-src/scripts/gate_execute.ts +12 -4
  394. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  395. package/src/agent-src/templates/AGENTS.md +1 -1
  396. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  397. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  398. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  399. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  400. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  401. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  402. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  403. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  404. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  405. package/src/config/agent-settings.template.yml +141 -334
  406. package/src/config/agents-paths.yml +16 -0
  407. package/src/config/assurance-capability-registry.json +7 -3
  408. package/src/config/ci-local-parity.yml +3 -0
  409. package/src/config/continuity-surface.json +10 -3
  410. package/src/config/discovery/packs.yml +17 -1
  411. package/src/config/evaluator-budgets.json +23 -10
  412. package/src/config/gate-coverage.yml +138 -3
  413. package/src/config/gate-violation-baselines.json +64 -16
  414. package/src/config/gitignore-block.txt +19 -0
  415. package/src/config/hook-bundle-budget.json +25 -0
  416. package/src/config/hook-token-budget.json +6 -1
  417. package/src/config/host-instruction-limits.json +33 -0
  418. package/src/config/release-gate-locality.yml +2 -1
  419. package/src/config/routing-coverage-seed.json +67 -4
  420. package/src/config/rule-activation-census.json +7 -3
  421. package/src/config/rule-consequence-class.json +161 -0
  422. package/src/config/rule-law-ceilings.json +105 -0
  423. package/src/config/rule-obligations.json +833 -0
  424. package/src/install/claudePathsPlan.ts +46 -4
  425. package/src/install/claudeRuleRewrite.ts +10 -1
  426. package/src/install/emit_host_rules_cli.ts +43 -34
  427. package/src/install/globalRuleScope.ts +109 -0
  428. package/src/install/host_rule_ownership.ts +170 -0
  429. package/src/install/installThinLayer.ts +378 -0
  430. package/src/install/installedRuleLinks.ts +308 -0
  431. package/src/install/wizard-plan.ts +24 -0
  432. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  433. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  434. package/src/scripts/_cli/cmd_doctor.ts +33 -81
  435. package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
  436. package/src/scripts/_cli/cmd_explain.ts +72 -14
  437. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  438. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  439. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  440. package/src/scripts/_cli/doctor_execution.ts +72 -1
  441. package/src/scripts/_dispatch.bash +53 -4
  442. package/src/scripts/_lib/agent_settings.ts +26 -124
  443. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  444. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  445. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  446. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  447. package/src/scripts/_lib/estate_offsets.ts +241 -0
  448. package/src/scripts/_lib/exemption_shape.ts +143 -0
  449. package/src/scripts/_lib/fnv.ts +23 -0
  450. package/src/scripts/_lib/foreign_scan.ts +106 -0
  451. package/src/scripts/_lib/git_base_ref.ts +92 -0
  452. package/src/scripts/_lib/git_convention.ts +291 -0
  453. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  454. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  455. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  456. package/src/scripts/_lib/gitignore_block.ts +314 -0
  457. package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
  458. package/src/scripts/_lib/graph_feeder_record.ts +437 -0
  459. package/src/scripts/_lib/hook_settings.ts +73 -0
  460. package/src/scripts/_lib/host_capability.ts +40 -19
  461. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  462. package/src/scripts/_lib/installed_layer.ts +963 -0
  463. package/src/scripts/_lib/json_merge.ts +82 -0
  464. package/src/scripts/_lib/json_pointers.ts +93 -11
  465. package/src/scripts/_lib/knowledge_global.ts +14 -1
  466. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  467. package/src/scripts/_lib/machine_wake.ts +16 -3
  468. package/src/scripts/_lib/module_reach.ts +456 -0
  469. package/src/scripts/_lib/neighbour_census.ts +760 -0
  470. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  471. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  472. package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
  473. package/src/scripts/_lib/prompt_shape.ts +46 -0
  474. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  475. package/src/scripts/_lib/ratification_subject.ts +92 -0
  476. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  477. package/src/scripts/_lib/release_highlights.ts +5 -0
  478. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  479. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  480. package/src/scripts/_lib/review_coverage.ts +134 -0
  481. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  482. package/src/scripts/_lib/rule_injection.ts +130 -10
  483. package/src/scripts/_lib/rule_law_section.ts +147 -0
  484. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  485. package/src/scripts/_lib/rule_obligations.ts +205 -0
  486. package/src/scripts/_lib/self_repair.ts +1 -1
  487. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  488. package/src/scripts/_lib/skill_origin.ts +254 -0
  489. package/src/scripts/_lib/structured_ask.ts +64 -21
  490. package/src/scripts/_lib/test_red_state.ts +5 -0
  491. package/src/scripts/_lib/thin_rules.ts +620 -0
  492. package/src/scripts/_lib/touched_file_quality.ts +570 -0
  493. package/src/scripts/_lib/turn_end_refusals.ts +77 -2
  494. package/src/scripts/_lib/windsurf_render.ts +63 -0
  495. package/src/scripts/_lib/worker_budget.ts +1 -1
  496. package/src/scripts/adr/regenerate_index.ts +16 -1
  497. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  498. package/src/scripts/ai_council/clients.ts +26 -57
  499. package/src/scripts/ai_council/config.ts +8 -8
  500. package/src/scripts/ai_council/modification_review.ts +100 -0
  501. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  502. package/src/scripts/ai_council/orchestrator.ts +5 -5
  503. package/src/scripts/ai_council/spend_gate.ts +18 -7
  504. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  505. package/src/scripts/ai_team/config.ts +11 -16
  506. package/src/scripts/audit_skill_overlap.ts +261 -0
  507. package/src/scripts/audit_user_type_axis.ts +20 -8
  508. package/src/scripts/before_complete_hook.ts +243 -12
  509. package/src/scripts/bench_ab_clone.ts +1 -2
  510. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  511. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  512. package/src/scripts/bench_touched_file_quality.ts +238 -0
  513. package/src/scripts/check_agent_artifact_location.ts +36 -0
  514. package/src/scripts/check_branch_freshness.ts +147 -24
  515. package/src/scripts/check_enforcement_coverage.ts +130 -0
  516. package/src/scripts/check_enforcement_matrix.ts +377 -20
  517. package/src/scripts/check_estate_count.ts +130 -153
  518. package/src/scripts/check_evaluator_budgets.ts +4 -0
  519. package/src/scripts/check_finding_dispositions.ts +196 -21
  520. package/src/scripts/check_gate_coverage.ts +4 -3
  521. package/src/scripts/check_gate_reachability.ts +48 -1
  522. package/src/scripts/check_generator_sync.ts +48 -0
  523. package/src/scripts/check_hook_bundle_composition.ts +477 -0
  524. package/src/scripts/check_kernel_edit_ratified.ts +132 -14
  525. package/src/scripts/check_memory.ts +7 -1
  526. package/src/scripts/check_pack_size.ts +1 -1
  527. package/src/scripts/check_release_highlights.ts +10 -0
  528. package/src/scripts/check_release_manifest_content.ts +189 -0
  529. package/src/scripts/check_release_pr_shape.ts +38 -15
  530. package/src/scripts/check_standing_rule_delivery.ts +129 -13
  531. package/src/scripts/check_suppression_hygiene.ts +2 -5
  532. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  533. package/src/scripts/ci_settle.ts +42 -5
  534. package/src/scripts/classify_merge_risk.ts +320 -0
  535. package/src/scripts/closure_scan.ts +91 -1
  536. package/src/scripts/code_graph/detect.ts +127 -7
  537. package/src/scripts/code_graph/foreign.ts +194 -0
  538. package/src/scripts/code_graph/query.ts +217 -4
  539. package/src/scripts/code_graph/types.ts +26 -2
  540. package/src/scripts/code_graph/validate.ts +3 -1
  541. package/src/scripts/code_graph/verbs.ts +103 -0
  542. package/src/scripts/command_suggester/settings.ts +8 -108
  543. package/src/scripts/command_suggester/types.ts +4 -5
  544. package/src/scripts/compile_hook_manifest.ts +33 -1
  545. package/src/scripts/condense.ts +14 -27
  546. package/src/scripts/consumer_matrix.ts +102 -0
  547. package/src/scripts/context_hygiene_hook.ts +13 -23
  548. package/src/scripts/cost/preflight.mjs +12 -1
  549. package/src/scripts/council_cli.ts +7 -7
  550. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  551. package/src/scripts/estate_exemption_shape.ts +202 -0
  552. package/src/scripts/explain_run.ts +8 -13
  553. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  554. package/src/scripts/generate_host_cost_table.ts +21 -4
  555. package/src/scripts/handoff_context_hook.ts +86 -37
  556. package/src/scripts/hook_manifest.json +1 -1
  557. package/src/scripts/hook_manifest.yaml +175 -15
  558. package/src/scripts/hooks/block_config_weakening.ts +115 -7
  559. package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
  560. package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
  561. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  562. package/src/scripts/hooks/concern_registry.ts +2 -0
  563. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  564. package/src/scripts/hooks/dispatch_hook.ts +52 -52
  565. package/src/scripts/hooks/evidence_independence.ts +12 -4
  566. package/src/scripts/hooks/exit_codes.ts +2 -1
  567. package/src/scripts/hooks/host_lowering.json +1 -1
  568. package/src/scripts/hooks/host_lowering.ts +19 -1
  569. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  570. package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
  571. package/src/scripts/hooks/payload_stub.ts +10 -1
  572. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  573. package/src/scripts/hooks/rule_inject_hook.ts +795 -60
  574. package/src/scripts/hooks/state_io.ts +8 -4
  575. package/src/scripts/hooks/table_fingerprint.ts +21 -0
  576. package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
  577. package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
  578. package/src/scripts/hooks_status.ts +112 -0
  579. package/src/scripts/injection_scan_hook.ts +7 -0
  580. package/src/scripts/install-hooks.sh +42 -14
  581. package/src/scripts/install.ts +78 -215
  582. package/src/scripts/installed_layer_report.ts +103 -0
  583. package/src/scripts/language_mirror_hook.ts +15 -6
  584. package/src/scripts/learning_sidecar.ts +119 -8
  585. package/src/scripts/lint_blocker_citations.ts +198 -0
  586. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  587. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  588. package/src/scripts/lint_hook_manifest.ts +53 -0
  589. package/src/scripts/lint_major_migration_sections.ts +156 -26
  590. package/src/scripts/lint_pack_boundaries.ts +465 -29
  591. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  592. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  593. package/src/scripts/lint_rule_law_section.ts +647 -0
  594. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  595. package/src/scripts/lint_settings_classes.ts +1 -1
  596. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  597. package/src/scripts/lint_workflow_security.ts +173 -6
  598. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  599. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  600. package/src/scripts/measure_routing_signal.ts +54 -16
  601. package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
  602. package/src/scripts/memory_learn_hook.ts +91 -6
  603. package/src/scripts/model_rule_injection.ts +55 -8
  604. package/src/scripts/onboarding_gate_hook.ts +7 -6
  605. package/src/scripts/print_required_checks.ts +15 -3
  606. package/src/scripts/probe_host_compliance.ts +33 -5
  607. package/src/scripts/probe_turnaround.ts +183 -3
  608. package/src/scripts/project_thin_rules.ts +34 -327
  609. package/src/scripts/ratification_header.ts +77 -0
  610. package/src/scripts/refusal_envelope.ts +138 -0
  611. package/src/scripts/release_publication.ts +29 -3
  612. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  613. package/src/scripts/report_evidence_temperature.ts +657 -0
  614. package/src/scripts/report_installed_rule_links.ts +274 -0
  615. package/src/scripts/report_label_agreement.ts +233 -0
  616. package/src/scripts/report_module_reach.ts +212 -0
  617. package/src/scripts/report_obligation_mechanism.ts +228 -0
  618. package/src/scripts/report_parked_blockers.ts +222 -0
  619. package/src/scripts/report_required_checks_drift.ts +196 -0
  620. package/src/scripts/report_single_token_triggers.ts +277 -0
  621. package/src/scripts/report_skill_ranker_confusion.ts +543 -0
  622. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  623. package/src/scripts/report_verification_record_coverage.ts +306 -0
  624. package/src/scripts/routing_doctor.ts +2 -2
  625. package/src/scripts/rule_activation_census.ts +5 -2
  626. package/src/scripts/rule_trigger_eval.ts +9 -9
  627. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  628. package/src/scripts/schemas/command.schema.json +1 -1
  629. package/src/scripts/schemas/review-findings.schema.json +3 -2
  630. package/src/scripts/schemas/rule.schema.json +5 -0
  631. package/src/scripts/schemas/skill.schema.json +1 -1
  632. package/src/scripts/self_review_gate.ts +101 -9
  633. package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
  634. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  635. package/src/scripts/sync_gitignore.ts +29 -235
  636. package/src/scripts/sync_pr_branch.ts +403 -132
  637. package/src/scripts/trigger_eval_grandfather.json +0 -21
  638. package/src/server/schemas/settings.ts +42 -176
  639. package/src/shared/skillRanking.ts +169 -14
  640. package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
  641. package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
  642. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  643. package/src/scripts/_lib/config_chain.ts +0 -477
  644. package/src/scripts/_lib/conformance_report.ts +0 -403
  645. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  646. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  647. package/src/scripts/_lib/file_slicer.ts +0 -117
  648. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  649. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  650. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  651. package/src/scripts/_lib/role_split.ts +0 -338
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * What the `estate_offset_exempt` population actually says — the producing command.
4
+ *
5
+ * THIS IS A READER, NOT A GATE. It exits 0 on every corpus, including one where
6
+ * no reason names anything. The refusal lives in `check_estate_count`, applies
7
+ * to ADDED files only, and is grandfathered precisely because of what this
8
+ * script measures: 43 of the 221 reasons in the tree on 2026-10-01 name no
9
+ * alternative disposition, so a check that re-read them would land red on a
10
+ * fifth of its corpus.
11
+ *
12
+ * WHAT IT BUYS. Two numbers nobody could produce before: how many exemptions
13
+ * name a rejected alternative, and how many repeat another file's reason
14
+ * verbatim. Both are the inputs to whether the refusal vocabulary is the right
15
+ * one, and both move as the estate moves — so the NEXT reading is a delta
16
+ * rather than a re-derivation, which is the same bargain `roadmap_verify_share`
17
+ * makes for the verify grammar.
18
+ *
19
+ * THE VOCABULARY IS NOT THIS SCRIPT'S. It imports the lemma list the gate
20
+ * refuses on, so the report and the refusal cannot drift. A drifted pair fails
21
+ * silently and in the worst direction: the report says the tree conforms while
22
+ * the gate rejects it.
23
+ *
24
+ * CLI:
25
+ * ./scripts-run src/scripts/estate_exemption_shape
26
+ * ./scripts-run src/scripts/estate_exemption_shape --json
27
+ * ./scripts-run src/scripts/estate_exemption_shape --root <dir>
28
+ *
29
+ * Exit codes: 0 always, except 2 for bad argv or a scan root that holds nothing.
30
+ */
31
+ import * as fs from 'node:fs';
32
+ import * as path from 'node:path';
33
+ import process from 'node:process';
34
+ import { fileURLToPath } from 'node:url';
35
+
36
+ import { exemptionReason } from './_lib/estate_offsets.js';
37
+ import { DISPOSITION_LEMMAS, lemmasNamed, namesDisposition, reasonKey } from './_lib/exemption_shape.js';
38
+ import { DeadScopeError, assertScanned } from './_lib/scan_scope.js';
39
+
40
+ const _HERE = fileURLToPath(import.meta.url);
41
+ const _PROG = 'estate_exemption_shape';
42
+ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
43
+
44
+ /** The three trees an exemption can sit in. `stubs/` and `skipped/` carry none. */
45
+ const TREES: readonly { readonly label: string; readonly dir: string }[] = [
46
+ { label: 'active', dir: 'agents/roadmaps' },
47
+ { label: 'later', dir: 'agents/roadmaps/later' },
48
+ { label: 'archive', dir: 'agents/roadmaps/archive' },
49
+ ];
50
+
51
+ export interface ExemptionRow {
52
+ readonly tree: string;
53
+ readonly file: string;
54
+ readonly reason: string;
55
+ /** The disposition lemmas this reason names; empty means it names none. */
56
+ readonly lemmas: readonly string[];
57
+ }
58
+
59
+ export interface ShapeReport {
60
+ readonly rows: readonly ExemptionRow[];
61
+ readonly shaped: number;
62
+ readonly shapeless: number;
63
+ /** Per-lemma hit counts, in the gate's own lemma order. */
64
+ readonly byLemma: Readonly<Record<string, number>>;
65
+ /** Groups of two or more files sharing one reason, largest first. */
66
+ readonly duplicates: readonly (readonly string[])[];
67
+ }
68
+
69
+ /** Read every exemption under `root`, in a stable order. */
70
+ export function collectExemptions(root: string): ExemptionRow[] {
71
+ const rows: ExemptionRow[] = [];
72
+ for (const tree of TREES) {
73
+ const abs = path.join(root, tree.dir);
74
+ let names: string[];
75
+ try {
76
+ names = fs.readdirSync(abs);
77
+ } catch {
78
+ continue;
79
+ }
80
+ for (const name of [...names].sort()) {
81
+ if (!name.endsWith('.md')) continue;
82
+ const file = path.join(abs, name);
83
+ let text: string;
84
+ try {
85
+ if (!fs.statSync(file).isFile()) continue;
86
+ text = fs.readFileSync(file, 'utf-8');
87
+ } catch {
88
+ continue;
89
+ }
90
+ const reason = exemptionReason(text);
91
+ if (reason === null) continue;
92
+ rows.push({ tree: tree.label, file: `${tree.dir}/${name}`, reason, lemmas: lemmasNamed(reason) });
93
+ }
94
+ }
95
+ return rows;
96
+ }
97
+
98
+ /** Summarise the population against the gate's vocabulary. */
99
+ export function report(rows: readonly ExemptionRow[]): ShapeReport {
100
+ const byLemma: Record<string, number> = {};
101
+ for (const l of DISPOSITION_LEMMAS) {
102
+ byLemma[l.name] = rows.filter((r) => r.lemmas.includes(l.name)).length;
103
+ }
104
+ const groups = new Map<string, string[]>();
105
+ for (const r of rows) {
106
+ const key = reasonKey(r.reason);
107
+ const list = groups.get(key) ?? [];
108
+ list.push(r.file);
109
+ groups.set(key, list);
110
+ }
111
+ const duplicates = [...groups.values()].filter((g) => g.length > 1).sort((a, b) => b.length - a.length);
112
+ return {
113
+ rows,
114
+ shaped: rows.filter((r) => namesDisposition(r.reason)).length,
115
+ shapeless: rows.filter((r) => !namesDisposition(r.reason)).length,
116
+ byLemma,
117
+ duplicates,
118
+ };
119
+ }
120
+
121
+ function render(rep: ShapeReport): string {
122
+ const out: string[] = [];
123
+ const total = rep.rows.length;
124
+ out.push(`${_PROG}: ${String(total)} exemption(s)`);
125
+ for (const tree of TREES) {
126
+ out.push(` ${tree.label.padEnd(10)} ${String(rep.rows.filter((r) => r.tree === tree.label).length).padStart(4)}`);
127
+ }
128
+ out.push(` names a rejected alternative ${String(rep.shaped).padStart(4)}`);
129
+ out.push(` names none ${String(rep.shapeless).padStart(4)}`);
130
+ out.push(' per lemma:');
131
+ for (const l of DISPOSITION_LEMMAS) {
132
+ out.push(` ${l.name.padEnd(12)} ${String(rep.byLemma[l.name] ?? 0).padStart(4)}`);
133
+ }
134
+ const dupFiles = rep.duplicates.reduce((n, g) => n + g.length, 0);
135
+ out.push(` verbatim duplicate groups ${String(rep.duplicates.length).padStart(4)} covering ${String(dupFiles)} file(s)`);
136
+ for (const g of rep.duplicates) {
137
+ out.push(` (${String(g.length)}x) ${g.join(', ')}`);
138
+ }
139
+ if (rep.shapeless > 0) {
140
+ out.push(' naming no rejected alternative:');
141
+ for (const r of rep.rows.filter((x) => !namesDisposition(x.reason))) {
142
+ out.push(` ${r.file}: ${r.reason.slice(0, 120)}`);
143
+ }
144
+ }
145
+ return out.join('\n') + '\n';
146
+ }
147
+
148
+ export function main(argv: string[] = process.argv.slice(2)): number {
149
+ const json = argv.includes('--json');
150
+ const rootIdx = argv.indexOf('--root');
151
+ let root = REPO_ROOT;
152
+ if (rootIdx !== -1) {
153
+ const next = argv[rootIdx + 1];
154
+ if (next === undefined || next.startsWith('-')) {
155
+ process.stderr.write(`usage: ${_PROG} [--root <dir>] [--json]\n`);
156
+ return 2;
157
+ }
158
+ root = path.resolve(next);
159
+ }
160
+ const unknown = argv.filter((a) => a.startsWith('-') && a !== '--json' && a !== '--root');
161
+ if (unknown.length > 0) {
162
+ process.stderr.write(`${_PROG}: unknown argument(s) ${unknown.join(', ')}\n`);
163
+ return 2;
164
+ }
165
+
166
+ const rows = collectExemptions(root);
167
+ try {
168
+ // A root holding no roadmap at all is a dead scope, never an estate with
169
+ // nothing to report: this reader would otherwise print a confident zero
170
+ // over a path that does not exist.
171
+ assertScanned({
172
+ gate: _PROG,
173
+ scanned: TREES.reduce((n, t) => {
174
+ try {
175
+ return n + fs.readdirSync(path.join(root, t.dir)).filter((f) => f.endsWith('.md')).length;
176
+ } catch {
177
+ return n;
178
+ }
179
+ }, 0),
180
+ units: 'roadmap file(s)',
181
+ roots: TREES.map((t) => t.dir),
182
+ });
183
+ } catch (err) {
184
+ if (err instanceof DeadScopeError) {
185
+ process.stderr.write(`❌ ${_PROG}: ${err.message}\n`);
186
+ return 2;
187
+ }
188
+ throw err;
189
+ }
190
+
191
+ const rep = report(rows);
192
+ if (json) {
193
+ process.stdout.write(JSON.stringify(rep, null, 2) + '\n');
194
+ return 0;
195
+ }
196
+ process.stdout.write(render(rep));
197
+ return 0;
198
+ }
199
+
200
+ if (path.resolve(process.argv[1] ?? '') === _HERE) {
201
+ process.exit(main());
202
+ }
@@ -27,7 +27,7 @@
27
27
  * honest "no telemetry record" line, never a fabricated estimate.
28
28
  * Sources: `_lib/judgment_ladder.ts::explainLadder` + the same
29
29
  * audit-log-v1 files as §4.
30
- * 5. Hook / loop / freshness state snapshot. Source:
30
+ * 5. Hook / freshness state snapshot. Source:
31
31
  * `agents/state/context-hygiene.json` (the code path the hook
32
32
  * actually writes — see `context_hygiene_hook.ts::STATE_FILE`) or
33
33
  * the doc-referenced `agents/runtime/state/context-hygiene.json`.
@@ -477,7 +477,7 @@ function renderSummarySection(
477
477
  out.push('- Session health: no state recorded.');
478
478
  } else {
479
479
  const s = hygiene.state;
480
- out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded, loop detected: ${String(s['loop_detected'] ?? '(unset)')}.`);
480
+ out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded.`);
481
481
  }
482
482
  return out;
483
483
  }
@@ -686,7 +686,7 @@ function renderDecisionSection(
686
686
 
687
687
  function renderHygieneSection(hygiene: HygieneReadResult): string[] {
688
688
  const out: string[] = [];
689
- out.push('## Hook / loop state (context-hygiene)');
689
+ out.push('## Hook state (context-hygiene)');
690
690
  out.push(`_Source: tried ${hygiene.checkedPaths.map((p) => `\`${p}\``).join(', then ')}_`);
691
691
  out.push('');
692
692
  if (hygiene.state === null) {
@@ -697,9 +697,6 @@ function renderHygieneSection(hygiene: HygieneReadResult): string[] {
697
697
  out.push(`Found at \`${hygiene.path}\`.`);
698
698
  out.push('');
699
699
  out.push(`- tool_calls: ${String(s['tool_calls'] ?? '(unset)')}`);
700
- out.push(`- consecutive_same_tool: ${String(s['consecutive_same_tool'] ?? '(unset)')}`);
701
- out.push(`- last_tool: ${String(s['last_tool'] ?? '(unset)')}`);
702
- out.push(`- loop_detected: ${String(s['loop_detected'] ?? '(unset)')}`);
703
700
  out.push(`- freshness_threshold: ${String(s['freshness_threshold'] ?? '(unset)')}`);
704
701
  out.push(`- checked_at: ${String(s['checked_at'] ?? '(unset)')}`);
705
702
  return out;
@@ -718,14 +715,12 @@ function renderParkedSection(): string[] {
718
715
  ' thin-projector budget decision** — no on-disk record of "artefact',
719
716
  ' considered but dropped for budget" exists today. Revisit-if such a',
720
717
  ' record ships.',
721
- '3. **Which memory entry id influenced a specific answer**, when the run',
722
- ' did NOT opt into `decision_engine.surface_traces` — the',
718
+ '3. **Which memory entry id influenced a specific answer** — the',
723
719
  ' `🧠 Memory: n/m · ids=[...]` line is printed to stdout only, never',
724
- ' persisted. The durable form (`memory.ids` in',
725
- ' `agents/runtime/state/work/<id>/decision-trace-<phase>.json`) exists',
726
- ' ONLY when `decision_engine.surface_traces: true` (off by default) and',
727
- ' the run went through /work or /implement-ticket — see `explain last`',
728
- ' for that narrower, per-run case; not duplicated here.',
720
+ ' persisted. The per-phase decision-trace file that once carried',
721
+ ' `memory.ids` is no longer written: its opt-in key,',
722
+ ' `decision_engine.surface_traces`, was retired (2026-10-09) with its',
723
+ ' default (off) as the fixed behavior.',
729
724
  '4. **Why a given subagent primitive was/wasn\'t available on this host**',
730
725
  ' — the host-capability manifest is resolved in-session by the agent',
731
726
  ' from its own knowledge (+ an optional settings override) and is never',
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Writes the grammar block of the commit-subject reference from
4
+ * `_lib/git_convention_grammar.ts`, so the fallback a command reads when the
5
+ * `agent-config` binary cannot run is the grammar the binary runs.
6
+ *
7
+ * Usage:
8
+ * tsx src/scripts/generate_git_convention_grammar.ts # rewrite in place
9
+ * tsx src/scripts/generate_git_convention_grammar.ts --check # exit 1 when stale
10
+ * tsx src/scripts/generate_git_convention_grammar.ts --out PATH # write the refreshed page elsewhere
11
+ *
12
+ * Exit codes: 0 written / in sync · 1 stale, or the markers are missing · 2 usage.
13
+ */
14
+ import * as fs from 'node:fs';
15
+ import * as path from 'node:path';
16
+ import process from 'node:process';
17
+ import { fileURLToPath, pathToFileURL } from 'node:url';
18
+
19
+ import { FAMILY_ERE, FORMAT_GRAMMAR, GIT_OWN_SUBJECT, TICKETLESS_FORM, TICKET_DENYLIST, TICKET_GRAMMAR, TICKET_TOKEN, VERSION_LIKE_KEYS } from './_lib/git_convention_grammar.js';
20
+ import {
21
+ AUTHOR_CAP_PER_HALF,
22
+ BULK_IMPORT_FILES,
23
+ MEASURE_LIMIT,
24
+ MEASURE_SINCE,
25
+ MIN_BRANCHES,
26
+ MIN_CAPPED_AUTHORS,
27
+ MIN_N,
28
+ RECENT_WINDOW,
29
+ SHARE_BAR,
30
+ SMALL_TEAM_SHARE_BAR,
31
+ pct,
32
+ } from './_lib/git_convention_measure.js';
33
+
34
+ const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
35
+
36
+ export const REFERENCE = 'src/skills/git-workflow/references/commit-subject.md';
37
+ export const GENERATOR = 'src/scripts/generate_git_convention_grammar.ts';
38
+ export const GRAMMAR_MODULE = 'src/scripts/_lib/git_convention_grammar.ts';
39
+ export const MEASURE_MODULE = 'src/scripts/_lib/git_convention_measure.ts';
40
+
41
+ const BEGIN = '<!-- BEGIN GENERATED: git-convention-grammar -->';
42
+ const END = '<!-- END GENERATED: git-convention-grammar -->';
43
+
44
+ export function renderBlock(): string {
45
+ const rows: [string, string][] = [
46
+ ['ticket', TICKET_GRAMMAR],
47
+ ['ticket in text', TICKET_TOKEN],
48
+ ['standard names', TICKET_DENYLIST.join(' ')],
49
+ ['version-like names', `${VERSION_LIKE_KEYS.join(' ')} (one-digit number, no card)`],
50
+ ...Object.entries(FORMAT_GRAMMAR).map(([f, re]) => [`format ${f}`, re] as [string, string]),
51
+ ...FAMILY_ERE.map(([f, ere]) => [`family ${f}`, ere] as [string, string]),
52
+ ...Object.entries(TICKETLESS_FORM).map(([f, ere]) => [`family ${f}, no ticket`, `${ere ?? ''} (no ticket elsewhere in the subject)`] as [string, string]),
53
+ ['any format or family', `${GIT_OWN_SUBJECT} (git's own subjects)`],
54
+ ['measure sample', `newest ${MEASURE_LIMIT} non-merge commits since ${MEASURE_SINCE}, or regardless of age when that window yields fewer than ${MIN_N}; bots, automation subjects, commits over ${BULK_IMPORT_FILES} files dropped`],
55
+ ['measure bar', `n >= ${MIN_N}; >= ${pct(SHARE_BAR)} capped at ${AUTHOR_CAP_PER_HALF} per author per half (${MIN_CAPPED_AUTHORS}+ authors), else >= ${pct(SMALL_TEAM_SHARE_BAR)} uncapped; both halves agree`],
56
+ ['measure migration', `the newer half, or the newest ${RECENT_WINDOW} commits, clearing the bar on another family than the dominant one: "migrating to <family>", and that family is proposed`],
57
+ ['measure branches', `>= ${MIN_BRANCHES} remote branch names, top shape >= ${pct(SHARE_BAR)}`],
58
+ ];
59
+ const width = Math.max(...rows.map(([k]) => k.length)) + 2;
60
+ return [
61
+ BEGIN,
62
+ `<!-- Written by \`./scripts-run ${GENERATOR.replace(/\.ts$/, '')}\` from \`${GRAMMAR_MODULE}\` and \`${MEASURE_MODULE}\`; edit the modules, never this block. -->`,
63
+ '',
64
+ '```',
65
+ ...rows.map(([k, v]) => `${k.padEnd(width)}${v}`),
66
+ '```',
67
+ '',
68
+ 'Formats are JavaScript / PCRE syntax; families are POSIX extended, matched in',
69
+ 'order, first hit wins. Under `format ticket-conventional` and `family',
70
+ 'ticket-conventional` a ticket anywhere inside the scope fails, and a standard',
71
+ 'name in the ticket position fails. A ticket is found in a branch or scope only as',
72
+ 'a whole token (`ticket in text`). Without a card, a version-like name — one of',
73
+ 'the keys above with a one-digit number, such as `HTTP-2` or `PHP-8` — is not a',
74
+ 'ticket; `HTTP2-1` still has the ticket shape. A convention card\'s `ticket_keys`',
75
+ 'settles both, and matches a key written in lower case; without a card a',
76
+ 'lower-case key is never detected.',
77
+ END,
78
+ ].join('\n');
79
+ }
80
+
81
+ export function refresh(text: string): { ok: true; text: string } | { ok: false; reason: string } {
82
+ const start = text.indexOf(BEGIN);
83
+ const end = text.indexOf(END);
84
+ if (start === -1 || end === -1 || end < start) return { ok: false, reason: `${REFERENCE} lacks the ${BEGIN} / ${END} markers` };
85
+ return { ok: true, text: text.slice(0, start) + renderBlock() + text.slice(end + END.length) };
86
+ }
87
+
88
+ export function main(argv: readonly string[] = process.argv.slice(2), root = REPO_ROOT): number {
89
+ let check = false;
90
+ let out: string | null = null;
91
+ for (let i = 0; i < argv.length; i++) {
92
+ if (argv[i] === '--check') check = true;
93
+ else if (argv[i] === '--out' && argv[i + 1] !== undefined) out = argv[++i] as string;
94
+ else {
95
+ process.stderr.write(`unknown argument: ${String(argv[i])}\nusage: generate_git_convention_grammar [--check | --out PATH]\n`);
96
+ return 2;
97
+ }
98
+ }
99
+ const file = path.join(root, REFERENCE);
100
+ const current = fs.readFileSync(file, 'utf-8');
101
+ const next = refresh(current);
102
+ if (!next.ok) {
103
+ process.stderr.write(`${next.reason}\n`);
104
+ return 1;
105
+ }
106
+ if (check) {
107
+ if (next.text === current) return 0;
108
+ process.stderr.write(`${REFERENCE} is stale — run ./scripts-run ${GENERATOR.replace(/\.ts$/, '')}\n`);
109
+ return 1;
110
+ }
111
+ fs.writeFileSync(out ?? file, next.text);
112
+ return 0;
113
+ }
114
+
115
+ function _isCliEntry(): boolean {
116
+ if (process.argv[1] === undefined) return false;
117
+ if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) return true;
118
+ try {
119
+ return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
120
+ } catch {
121
+ return false;
122
+ }
123
+ }
124
+
125
+ if (_isCliEntry()) {
126
+ process.exitCode = main();
127
+ }
@@ -52,6 +52,7 @@ import * as fs from 'node:fs';
52
52
  import * as path from 'node:path';
53
53
  import { fileURLToPath } from 'node:url';
54
54
 
55
+ import { extractSection, SectionError } from './_lib/md_section.js';
55
56
  import {
56
57
  ARTIFACT_REL,
57
58
  HOST_SURFACES,
@@ -63,7 +64,7 @@ import {
63
64
  const _HERE = fileURLToPath(import.meta.url);
64
65
  export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
65
66
 
66
- /** The contract the README points at for projection modes (README.md:288). */
67
+ /** The contract the README points at for projection modes. */
67
68
  export const CONTRACT_REL = path.join('docs', 'contracts', 'rule-router.md');
68
69
 
69
70
  export const BEGIN = '<!-- BEGIN generated: host-standing-cost -->';
@@ -85,9 +86,25 @@ export interface HostRow {
85
86
  * without anything saying so.
86
87
  */
87
88
  export function parseCensus(text: string): HostRow[] {
88
- const start = text.indexOf('## Per host');
89
- if (start === -1) return [];
90
- const lines = text.slice(start).split('\n');
89
+ // Anchored on the LINE, never a substring — a prose mention of the same
90
+ // heading earlier in the artefact used to be indistinguishable from the
91
+ // real one under a plain `indexOf` (the measured 2026-08-20 incident
92
+ // `_lib/md_section.ts` documents). `extractSection` also refuses a
93
+ // heading that occurs more than once, which this census format never
94
+ // intends — exactly the silent-wrong-match failure this script's own
95
+ // "deliberately strict" design already asks for.
96
+ let section: string;
97
+ try {
98
+ section = extractSection(text, '## Per host');
99
+ } catch (err) {
100
+ // "not found" means the format moved — the pre-existing, intentional
101
+ // `[]` contract below. "ambiguous" (the heading occurs more than
102
+ // once) is NOT the same case and must stay loud: that is exactly the
103
+ // silently-wrong-match failure this wiring exists to stop.
104
+ if (err instanceof SectionError && err.message.startsWith('heading not found')) return [];
105
+ throw err;
106
+ }
107
+ const lines = section.split('\n');
91
108
  const rows: HostRow[] = [];
92
109
  for (const line of lines) {
93
110
  if (!line.startsWith('|')) {
@@ -332,42 +332,65 @@ export function consume_recycle_envelope(
332
332
  * and reading the wrong record for the wrong reason is how a continuation
333
333
  * acquires a stranger's state — the failure this step exists to prevent.
334
334
  *
335
- * - `startup` (and an ABSENT source) — a fresh session. Inject: this is the
336
- * ordinary case and the one every existing fixture exercises.
337
- * - `clear` — the operator wrote the record and cleared. Inject. This is the
338
- * recycle path the record was built for, and suppressing it would defeat
339
- * the mechanism. Note that hot-context DISCARDS on the same source, and the
340
- * two are right for opposite reasons: hot-context is a cache of a session
341
- * that was deliberately thrown away, while the record is the thing the
342
- * operator wrote in order to survive throwing it away.
343
- * - `compact` — the SAME session continuing past a compaction. Inject: the
344
- * resolver keys on session id, so what comes back is this session's own
345
- * record rather than a predecessor's. That identity is the reason this is
346
- * an inject rather than a suppression.
335
+ * TWO SEPARATE GATES, not one, since a 2/2 council verdict (2026-10-06): the
336
+ * prose handoff and the recycle-envelope RECORD are different artefacts with
337
+ * different safety properties, and coupling them under one `compact` verdict
338
+ * is what let a stale claim about the record go unnoticed inside a test that
339
+ * only ever exercised the handoff.
340
+ *
341
+ * - `startup` (and an ABSENT source) — a fresh session. Both gates inject:
342
+ * this is the ordinary case and the one every existing fixture exercises.
343
+ * - `clear` — the operator wrote the record and cleared. Both gates inject.
344
+ * This is the recycle path the record was built for, and suppressing it
345
+ * would defeat the mechanism. Note that hot-context DISCARDS on the same
346
+ * source, and the two are right for opposite reasons: hot-context is a
347
+ * cache of a session that was deliberately thrown away, while the record
348
+ * is the thing the operator wrote in order to survive throwing it away.
349
+ * - `compact` — the SAME session continuing past a compaction.
350
+ * {@link sourceGate} still injects the prose handoff (narrative
351
+ * continuity carries no peer-isolation risk). {@link recycleEnvelopeGate}
352
+ * does NOT inject the recycle-envelope record: the resolver's own Rule 1
353
+ * never returns the reader's own record (a prior sentence here claimed
354
+ * the opposite — that claim was never true against the resolver chosen
355
+ * 2026-09-09, and the council found no safe reading of the alternative
356
+ * either — a non-own session id proves only difference, not lineage, so
357
+ * consuming "the one other record" on `compact` can hand a session a
358
+ * concurrent peer's in-progress state). Until a real predecessor-identity
359
+ * signal exists, `compact` leaves every recycle-envelope record
360
+ * untouched, exactly like `resume`/`fork`.
347
361
  * - `resume` / `fork` — the host has already restored the conversation.
348
- * Inject NOTHING. On `resume` an injection would duplicate context the host
349
- * just replayed; on `fork` it is worse than duplication, because the fork
350
- * would consume a record belonging to a session that is still alive.
351
- * - anything else — inject nothing. An unrecognised source is a host this
352
- * code has not been taught, and guessing is the failure mode, not the
353
- * conservative choice.
362
+ * Both gates inject NOTHING. On `resume` an injection would duplicate
363
+ * context the host just replayed; on `fork` it is worse than
364
+ * duplication, because the fork would consume a record belonging to a
365
+ * session that is still alive.
366
+ * - anything else — both gates inject nothing. An unrecognised source is a
367
+ * host this code has not been taught, and guessing is the failure mode,
368
+ * not the conservative choice.
354
369
  *
355
- * SUPPRESSION MUST NOT CONSUME. The gate runs BEFORE
356
- * {@link consume_recycle_envelope}, never inside it, because that function
357
- * moves the file aside on every outcome except `absent`. Calling it and then
358
- * discarding the result would destroy the record without anyone reading it —
359
- * the operator's recycle would silently evaporate on a `resume`.
370
+ * SUPPRESSION MUST NOT CONSUME. Each gate runs BEFORE its own consumer —
371
+ * {@link recycleEnvelopeGate} before {@link consume_recycle_envelope}, never
372
+ * inside it — because that function moves the file aside on every outcome
373
+ * except `absent`. Calling it and then discarding the result would destroy
374
+ * the record without anyone reading it — the operator's recycle would
375
+ * silently evaporate on a `resume`, and now also on a `compact`.
360
376
  */
361
377
  export const INJECTING_SOURCES: ReadonlySet<string> = new Set(['', 'startup', 'clear', 'compact']);
362
378
 
379
+ /**
380
+ * The recycle-envelope RECORD's own injecting set — narrower than
381
+ * {@link INJECTING_SOURCES}. `compact` is deliberately absent: see the
382
+ * module docblock's `compact` bullet.
383
+ */
384
+ export const RECYCLE_INJECTING_SOURCES: ReadonlySet<string> = new Set(['', 'startup', 'clear']);
385
+
363
386
  export interface SourceGate {
364
387
  inject: boolean;
365
388
  reason: string;
366
389
  }
367
390
 
368
- export function sourceGate(source: string): SourceGate {
391
+ function _gate(source: string, injectingSources: ReadonlySet<string>): SourceGate {
369
392
  const s = source.trim();
370
- if (INJECTING_SOURCES.has(s)) {
393
+ if (injectingSources.has(s)) {
371
394
  return { inject: true, reason: `source=${s === '' ? 'absent' : s}` };
372
395
  }
373
396
  if (s === 'resume' || s === 'fork') {
@@ -379,12 +402,31 @@ export function sourceGate(source: string): SourceGate {
379
402
  : 'duplicate context the host just replayed'),
380
403
  };
381
404
  }
405
+ if (s === 'compact' && !injectingSources.has('compact')) {
406
+ return {
407
+ inject: false,
408
+ reason:
409
+ 'source=compact — a non-own session id proves only difference, not lineage; ' +
410
+ 'consuming the one other record on compact could hand a session a concurrent ' +
411
+ "peer's in-progress state (agents/evidence/council/compact-resume-2026-10.md)",
412
+ };
413
+ }
382
414
  return {
383
415
  inject: false,
384
416
  reason: `source=${s} is not a source this reader knows — injecting nothing rather than guessing`,
385
417
  };
386
418
  }
387
419
 
420
+ /** Gate for the prose handoff ({@link consume_handoff_context}). */
421
+ export function sourceGate(source: string): SourceGate {
422
+ return _gate(source, INJECTING_SOURCES);
423
+ }
424
+
425
+ /** Gate for the recycle-envelope record ({@link consume_recycle_envelope}). */
426
+ export function recycleEnvelopeGate(source: string): SourceGate {
427
+ return _gate(source, RECYCLE_INJECTING_SOURCES);
428
+ }
429
+
388
430
  // ---------------------------------------------------------------------
389
431
  // CLI — dispatcher concern entry point
390
432
  // ---------------------------------------------------------------------
@@ -415,21 +457,28 @@ export function main(): number {
415
457
  envelope.payload && typeof envelope.payload === 'object' && !Array.isArray(envelope.payload)
416
458
  ? (envelope.payload as Record<string, unknown>)
417
459
  : {};
418
- // 3.3. The gate is evaluated FIRST and short-circuits, because both
419
- // consumers below move their file aside on every non-absent
420
- // outcome. Consuming and then dropping the result would delete the
460
+ // 3.3 / compact-resume-2026-10 council. Each gate is evaluated
461
+ // FIRST and short-circuits ITS OWN consumer, because both
462
+ // consumers move their file aside on every non-absent outcome.
463
+ // Consuming and then dropping the result would delete the
421
464
  // record a suppressed source was supposed to leave alone.
422
- const gate = sourceGate(String(payload['source'] ?? envelope['source'] ?? ''));
423
- if (!gate.inject) {
424
- process.stderr.write(`handoff-context-hook: no injection (${gate.reason})\n`);
465
+ const source = String(payload['source'] ?? envelope['source'] ?? '');
466
+ const handoffGate = sourceGate(source);
467
+ const recycleGate = recycleEnvelopeGate(source);
468
+ if (!handoffGate.inject && !recycleGate.inject) {
469
+ process.stderr.write(`handoff-context-hook: no injection (${handoffGate.reason})\n`);
425
470
  return 0;
426
471
  }
427
- const handoff = consume_handoff_context(root);
428
- const recycle = consume_recycle_envelope(
429
- root,
430
- new Date(),
431
- String(envelope['session_id'] ?? '').trim() || env_session_id(),
432
- );
472
+ const handoff: ConsumeDecision = handoffGate.inject
473
+ ? consume_handoff_context(root)
474
+ : { action: 'absent', reason: handoffGate.reason };
475
+ const recycle: ConsumeDecision = recycleGate.inject
476
+ ? consume_recycle_envelope(
477
+ root,
478
+ new Date(),
479
+ String(envelope['session_id'] ?? '').trim() || env_session_id(),
480
+ )
481
+ : { action: 'absent', reason: recycleGate.reason };
433
482
  const blocks: string[] = [];
434
483
  const reasons: string[] = [];
435
484
  // Recycle envelope first — it is the task-state restore the