@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
@@ -43,6 +43,7 @@
43
43
  * ./scripts-run src/scripts/measure_skill_ranker_baseline --corpus routing-matrix
44
44
  * ./scripts-run src/scripts/measure_skill_ranker_baseline --corpus all
45
45
  * ./scripts-run src/scripts/measure_skill_ranker_baseline --ranker keyword-v2
46
+ * ./scripts-run src/scripts/measure_skill_ranker_baseline --corpus routing-matrix --slice sealed
46
47
  */
47
48
 
48
49
  import * as fs from 'node:fs';
@@ -50,6 +51,7 @@ import * as path from 'node:path';
50
51
  import { fileURLToPath } from 'node:url';
51
52
 
52
53
  import { wilsonInterval } from './_lib/capture_rate.js';
54
+ import { fnv1a } from './_lib/fnv.js';
53
55
  import { rank } from './skill_tools/score_skill_relevance.js';
54
56
  import type { RankOptions } from '../shared/skillRanking.js';
55
57
 
@@ -204,6 +206,84 @@ export function promptsForCorpus(corpus: CorpusName, repo = REPO): LabelledPromp
204
206
  return [...readLabelledPrompts(repo), ...readMatrixLabelledPrompts(repo)];
205
207
  }
206
208
 
209
+ /**
210
+ * Which half of the corpus a row belongs to.
211
+ *
212
+ * `road-to-a-ranker-that-routes` 1.2. Tuning and reading on one corpus of 390
213
+ * overfits it: a signal chosen because it lifted the number on the rows it was
214
+ * chosen from will lift the number on exactly those rows, and the interval
215
+ * printed beside it then describes the fitting rather than the ranker. Every
216
+ * lift claim in Phases 2 and 3 is read on `sealed` only.
217
+ */
218
+ export type SliceName = 'all' | 'tuning' | 'sealed';
219
+ export const SLICE_NAMES: readonly SliceName[] = ['all', 'tuning', 'sealed'];
220
+
221
+ /**
222
+ * One row in five — nominally 20 %, measured 19.2 % (75 of 390) on the live
223
+ * corpus, because a hash is not a shuffle and the exact count is a property of
224
+ * the ids.
225
+ *
226
+ * Stated as a modulus rather than a fraction because the partition has to be a
227
+ * pure function of the id: a share applied to a shuffled list would move every
228
+ * row the moment a prompt is added, and the sealed slice would stop being the
229
+ * same slice between two runs of the same measurement.
230
+ */
231
+ export const SEALED_MODULUS = 5;
232
+
233
+ /**
234
+ * The slice one case id falls in — deterministic and order-independent.
235
+ *
236
+ * STABILITY UNDER CORPUS CHANGE IS PARTIAL, and an earlier version of this block
237
+ * claimed otherwise. The matrix id is `rule#section[ordinal]` and the ordinal is
238
+ * POSITIONAL — it counts `- prompt:` entries within a section. So:
239
+ *
240
+ * - APPENDING a prompt to the end of a section is stable: every existing row
241
+ * keeps its ordinal, its id, and its side of the seal. This is the workflow
242
+ * the matrix README documents, which is why the partition survives the
243
+ * release-to-release growth the `history` array is for.
244
+ * - INSERTING or DELETING mid-section renumbers every later row in THAT
245
+ * section, which re-hashes them and moves roughly one in five across the
246
+ * seal.
247
+ *
248
+ * A content key (`rule|section|prompt`) would close the second case and is the
249
+ * right shape for the next corpus version. It is deliberately NOT applied here:
250
+ * the signals in Phase 2 were chosen by reading the TUNING rows of this
251
+ * partition, so re-drawing the boundary now would move ~20 % of those rows into
252
+ * the sealed slice and silently contaminate the very claims the seal exists to
253
+ * protect. Changing a partition after choosing on it is worse than a partially
254
+ * stable partition, so the key moves when the corpus does, not before.
255
+ */
256
+ export function sliceForId(id: string): Exclude<SliceName, 'all'> {
257
+ return fnv1a(id) % SEALED_MODULUS === 0 ? 'sealed' : 'tuning';
258
+ }
259
+
260
+ /** The rows of `prompts` that fall in `slice`; `all` is the identity. */
261
+ export function partitionBySlice<T extends { id: string }>(
262
+ prompts: readonly T[],
263
+ slice: SliceName,
264
+ ): T[] {
265
+ if (slice === 'all') return [...prompts];
266
+ return prompts.filter((p) => sliceForId(p.id) === slice);
267
+ }
268
+
269
+ /** How the corpus divides, printed on every run so a reader never assumes it. */
270
+ export interface SliceSizes {
271
+ all: number;
272
+ tuning: number;
273
+ sealed: number;
274
+ sealed_modulus: number;
275
+ }
276
+
277
+ export function sliceSizes(prompts: readonly { id: string }[]): SliceSizes {
278
+ const sealed = prompts.filter((p) => sliceForId(p.id) === 'sealed').length;
279
+ return {
280
+ all: prompts.length,
281
+ tuning: prompts.length - sealed,
282
+ sealed,
283
+ sealed_modulus: SEALED_MODULUS,
284
+ };
285
+ }
286
+
207
287
  /**
208
288
  * The packs a skill declares, read from its own `packs:` frontmatter block.
209
289
  *
@@ -278,6 +358,10 @@ export interface Interval {
278
358
 
279
359
  export interface AccuracyArm {
280
360
  corpus: CorpusName;
361
+ /** Which half of the corpus this arm read. `all` is the whole of it. */
362
+ slice: SliceName;
363
+ /** The division of the FULL corpus, printed whichever slice was read. */
364
+ slice_sizes: SliceSizes;
281
365
  corpus_prompts: number;
282
366
  top1: number;
283
367
  top1_ci95: Interval;
@@ -350,8 +434,11 @@ export function measureAccuracy(opts: {
350
434
  repo: string;
351
435
  skillsDir: string;
352
436
  rankOpts: RankOptions;
437
+ slice?: SliceName;
353
438
  }): AccuracyArm {
354
- const labelled = promptsForCorpus(opts.corpus, opts.repo);
439
+ const slice = opts.slice ?? 'all';
440
+ const whole = promptsForCorpus(opts.corpus, opts.repo);
441
+ const labelled = partitionBySlice(whole, slice);
355
442
  let top1 = 0;
356
443
  let top3 = 0;
357
444
  const misses: string[] = [];
@@ -365,6 +452,8 @@ export function measureAccuracy(opts: {
365
452
  const census = packCensus(labelled, opts.skillsDir);
366
453
  return {
367
454
  corpus: opts.corpus,
455
+ slice,
456
+ slice_sizes: sliceSizes(whole),
368
457
  corpus_prompts: n,
369
458
  top1: n ? round3(top1 / n) : 0,
370
459
  top1_ci95: ci(top1, n),
@@ -381,20 +470,85 @@ export function measureAccuracy(opts: {
381
470
  };
382
471
  }
383
472
 
473
+ /**
474
+ * The ranker label → the options it means.
475
+ *
476
+ * One table rather than a conditional at each call site, because a measurement
477
+ * harness that resolves `--ranker` differently from the report that quotes it
478
+ * is a comparison of two things under one name. Every entry past `keyword-v1`
479
+ * is a candidate configuration under `road-to-a-ranker-that-routes` Phase 2,
480
+ * each a single flag so it can be measured alone, plus the combinations the
481
+ * same phase names.
482
+ *
483
+ * AN UNKNOWN LABEL THROWS. It used to resolve to `keyword-v1` — the baseline —
484
+ * which is the exact failure this table exists to prevent: every consumer
485
+ * echoes the requested label back into its output, so a typo published a
486
+ * BASELINE number under another configuration's name, in the report's own title
487
+ * and in the regenerate command it prints beside it. The two sibling parsers in
488
+ * this file refuse an unknown value and so does the sweep; the lenient branch
489
+ * was the inconsistent one.
490
+ */
491
+ export const RANKER_LABELS: Readonly<Record<string, RankOptions>> = {
492
+ 'keyword-v1': {},
493
+ 'keyword-v2': { includeTriggers: true },
494
+ 'when-to-use': { includeWhenToUse: true },
495
+ headings: { includeHeadings: true },
496
+ idf: { idfWeighting: true },
497
+ 'idf+when-to-use': { idfWeighting: true, includeWhenToUse: true },
498
+ // `road-to-a-ranker-whose-ties-break-on-signal` Phase 3: the order inside a
499
+ // block of equal integer scores, alone and over the one weighting that
500
+ // makes the unrounded score vary.
501
+ ties: { tieBreakUnrounded: true },
502
+ 'idf+ties': { idfWeighting: true, tieBreakUnrounded: true },
503
+ };
504
+
505
+ /**
506
+ * The message carries NO tool name.
507
+ *
508
+ * Three scripts resolve `--ranker` through this module now, so a hardcoded
509
+ * prefix would print one tool's name when another was the failing command. The
510
+ * caller's own `process.stderr` line is where the command is identified.
511
+ */
512
+ export class UnknownRankerLabel extends Error {
513
+ constructor(label: string) {
514
+ super(
515
+ `unknown --ranker ${label || '(nothing)'}; ` +
516
+ `known: ${Object.keys(RANKER_LABELS).join(' | ')}`,
517
+ );
518
+ this.name = 'UnknownRankerLabel';
519
+ }
520
+ }
521
+
522
+ /** Whether `label` is one of the table's OWN keys — never an inherited one. */
523
+ export function isKnownRanker(label: string): boolean {
524
+ return Object.hasOwn(RANKER_LABELS, label);
525
+ }
526
+
527
+ export function rankOptionsFor(ranker: string): RankOptions {
528
+ // `Object.hasOwn`, not a truthiness check on the lookup: `RANKER_LABELS`
529
+ // is an object literal, so `constructor`, `toString` and `valueOf` resolve
530
+ // to inherited FUNCTIONS rather than to undefined. A plain `=== undefined`
531
+ // guard lets those three through, scores them as the baseline, and echoes
532
+ // the label into the report title — which is the whole defect this guard
533
+ // was added to close, surviving in its own fix.
534
+ if (!isKnownRanker(ranker)) throw new UnknownRankerLabel(ranker);
535
+ return RANKER_LABELS[ranker] as RankOptions;
536
+ }
537
+
384
538
  export function measure(opts: {
385
539
  ranker: string;
386
540
  commit: string;
387
541
  corpus?: CorpusName;
542
+ slice?: SliceName;
388
543
  skillsDir?: string;
389
544
  repo?: string;
390
545
  }): RankerBaseline {
391
546
  const repo = opts.repo ?? REPO;
392
547
  const skillsDir = opts.skillsDir ?? SKILLS_DIR;
393
- // `keyword-v2` is Phase 3.1: the same formula with `triggers:` prose folded
394
- // into each skill's term source. Any other label measures v1.
395
- const rankOpts: RankOptions = opts.ranker === 'keyword-v2' ? { includeTriggers: true } : {};
548
+ // Resolved through the one table, which throws on a label it does not know.
549
+ const rankOpts: RankOptions = rankOptionsFor(opts.ranker);
396
550
  const corpus = opts.corpus ?? 'labelled';
397
- const accuracy = measureAccuracy({ corpus, repo, skillsDir, rankOpts });
551
+ const accuracy = measureAccuracy({ corpus, repo, skillsDir, rankOpts, slice: opts.slice ?? 'all' });
398
552
 
399
553
  const cases = readMatrixCases(repo);
400
554
  let withResult = 0;
@@ -446,17 +600,76 @@ function parseCorpus(argv: readonly string[]): CorpusName {
446
600
  return raw as CorpusName;
447
601
  }
448
602
 
603
+ /**
604
+ * The `--ranker` value, or the baseline when the flag is absent.
605
+ *
606
+ * A PRESENT flag with no value after it is an error, not an omission — the
607
+ * sibling `--slice` has always refused that shape, and substituting the
608
+ * baseline for a malformed flag is the same silent-fallback defect one level
609
+ * up from the label table.
610
+ */
611
+ export function parseRanker(argv: readonly string[]): string {
612
+ const i = argv.indexOf('--ranker');
613
+ if (i === -1) return 'keyword-v1';
614
+ const raw = argv[i + 1];
615
+ if (!raw || raw.startsWith('--')) {
616
+ throw new Error(
617
+ `--ranker expects one of ${Object.keys(RANKER_LABELS).join(' | ')}, got ${raw ?? '(nothing)'}`,
618
+ );
619
+ }
620
+ return raw;
621
+ }
622
+
623
+ /**
624
+ * A flag's value, or `fallback` when the flag is absent.
625
+ *
626
+ * A PRESENT flag followed by nothing — or by the next flag — is an error. Both
627
+ * `--commit` and `--date` are echoed verbatim into published artifacts (the
628
+ * baseline's provenance field, the confusion report's own header), so
629
+ * `--commit --ranker idf` silently publishing `--ranker` as the commit is the
630
+ * same silent-substitution class `parseRanker` was written to close, two flags
631
+ * over in the same two functions.
632
+ */
633
+ export function parseFlagValue(argv: readonly string[], flag: string, fallback: string): string {
634
+ const i = argv.indexOf(flag);
635
+ if (i === -1) return fallback;
636
+ const raw = argv[i + 1];
637
+ if (!raw || raw.startsWith('--')) {
638
+ throw new Error(`${flag} expects a value, got ${raw ?? '(nothing)'}`);
639
+ }
640
+ return raw;
641
+ }
642
+
643
+ export function parseSlice(argv: readonly string[]): SliceName {
644
+ const i = argv.indexOf('--slice');
645
+ if (i === -1) return 'all';
646
+ const raw = argv[i + 1];
647
+ if (!raw || !SLICE_NAMES.includes(raw as SliceName)) {
648
+ throw new Error(
649
+ `measure_skill_ranker_baseline: --slice expects one of ${SLICE_NAMES.join(' | ')}, got ${raw ?? '(nothing)'}`,
650
+ );
651
+ }
652
+ return raw as SliceName;
653
+ }
654
+
449
655
  export function main(argv: readonly string[]): number {
450
- const ranker = argv.includes('--ranker') ? (argv[argv.indexOf('--ranker') + 1] ?? 'keyword-v1') : 'keyword-v1';
451
- const commit = argv.includes('--commit') ? (argv[argv.indexOf('--commit') + 1] ?? 'unknown') : 'unknown';
452
656
  let corpus: CorpusName;
657
+ let slice: SliceName;
658
+ let ranker: string;
659
+ let commit: string;
660
+ let out: RankerBaseline;
453
661
  try {
454
662
  corpus = parseCorpus(argv);
663
+ slice = parseSlice(argv);
664
+ ranker = parseRanker(argv);
665
+ commit = parseFlagValue(argv, '--commit', 'unknown');
666
+ // Inside the same guard as the two parsers above: an unknown --ranker is
667
+ // the same class of mistake and now gets the same exit code.
668
+ out = measure({ ranker, commit, corpus, slice });
455
669
  } catch (err) {
456
670
  process.stderr.write(`${(err as Error).message}\n`);
457
671
  return 2;
458
672
  }
459
- const out = measure({ ranker, commit, corpus });
460
673
  process.stdout.write(`${JSON.stringify(out, null, 2)}\n`);
461
674
  return 0;
462
675
  }
@@ -22,6 +22,11 @@
22
22
  * PROMOTED lesson is surfaced as a one-line visibility marker pointing
23
23
  * at the existing /memory:propose flow. Nothing auto-writes curated
24
24
  * `agents/memory/*.yml`.
25
+ * - Measured: every run appends one line to the gitignored dogfood ledger
26
+ * (`agents/runtime/state/learning-dogfood.jsonl`) BEFORE the early
27
+ * returns, so the 30-day window the default flip is gated on can read a
28
+ * zero rather than a silence. See `runLearn` for why that distinction is
29
+ * the whole point.
25
30
  *
26
31
  * Exit codes (dispatcher contract): 0 always (allow).
27
32
  */
@@ -44,8 +49,9 @@ import type { SettingsClass } from '../shared/settingsClasses.js';
44
49
  import { consentVerdict, type ConsentVerdict } from '../shared/settingsConsent.js';
45
50
 
46
51
  import {
47
- buildSidecar,
52
+ buildSidecarFromSignals,
48
53
  LESSONS_NAME,
54
+ readSignals,
49
55
  renderLessonsMd,
50
56
  SIDECAR_NAME,
51
57
  } from './learning_sidecar.js';
@@ -175,23 +181,102 @@ export function enabled(root: string): boolean {
175
181
  return learnConsent(root) === 'granted';
176
182
  }
177
183
 
178
- /** Run the aggregation. Returns the one-line marker to emit, or null. */
184
+ /**
185
+ * The dogfood ledger: repo-relative POSIX path, one JSON object per line.
186
+ *
187
+ * Under `agents/runtime/` — gitignored wholesale — because it is one machine's
188
+ * timings and counts, not a shared artefact. Its continuity-surface row records
189
+ * it as `excluded`: nothing restores a session from it.
190
+ */
191
+ export const DOGFOOD_LEDGER_POSIX = 'agents/runtime/state/learning-dogfood.jsonl';
192
+
193
+ /** One session end, as the ledger records it. */
194
+ export interface DogfoodLine {
195
+ /** The `now` the aggregation ran against. */
196
+ at: string;
197
+ /** Wall-clock ms for read + aggregate — the portion the 2 s budget governs. */
198
+ wall_ms: number;
199
+ /** Well-formed signal records read from the intake. */
200
+ signals_in: number;
201
+ /** Lessons the aggregation produced. */
202
+ lessons_out: number;
203
+ /** Of those, how many carry the `preferred` verdict. */
204
+ preferred: number;
205
+ }
206
+
207
+ /**
208
+ * Append one measurement line. Never throws: the ledger is a measurement, and
209
+ * a measurement that can break the thing it measures is worse than no ledger.
210
+ */
211
+ export function appendDogfoodLine(root: string, line: DogfoodLine): void {
212
+ try {
213
+ const file = path.join(root, ...DOGFOOD_LEDGER_POSIX.split('/'));
214
+ fs.mkdirSync(path.dirname(file), { recursive: true });
215
+ fs.appendFileSync(file, `${JSON.stringify(line)}\n`, 'utf8');
216
+ } catch {
217
+ // fail-open, same contract as the aggregation itself.
218
+ }
219
+ }
220
+
221
+ /** Read the ledger back. Malformed lines are skipped, an absent file is empty. */
222
+ export function readDogfoodLines(root: string): DogfoodLine[] {
223
+ let text: string;
224
+ try {
225
+ text = fs.readFileSync(path.join(root, ...DOGFOOD_LEDGER_POSIX.split('/')), 'utf8');
226
+ } catch {
227
+ return [];
228
+ }
229
+ const out: DogfoodLine[] = [];
230
+ for (const raw of text.split('\n')) {
231
+ const line = raw.trim();
232
+ if (!line) continue;
233
+ try {
234
+ out.push(JSON.parse(line) as DogfoodLine);
235
+ } catch {
236
+ continue;
237
+ }
238
+ }
239
+ return out;
240
+ }
241
+
242
+ /**
243
+ * Run the aggregation. Returns the one-line marker to emit, or null.
244
+ *
245
+ * MEASURE FIRST, THEN DECIDE. The flip condition this hook's default is gated
246
+ * on (`src/config/agent-settings.template.yml:1376-1378`) names two numbers —
247
+ * non-trivial signal AND session-end p95 < 2 s — and until the ledger below
248
+ * existed, neither was recorded: every early return here fired before any
249
+ * measurement point, so a checkout with an empty intake produced an unbroken
250
+ * silence. A silence and a measured zero read identically to whoever opens the
251
+ * window, which is the one failure a 30-day window cannot recover from. So the
252
+ * read, the aggregation and the ledger line all happen before the first return.
253
+ */
179
254
  export function runLearn(root: string, nowIso: string, budgetMs: number = BUDGET_MS): string | null {
180
255
  const started = Date.now();
181
256
  const intakeDir = path.join(root, 'agents', 'memory', 'intake');
182
257
  const outDir = path.join(root, 'agents', 'memory');
183
- if (!fs.existsSync(intakeDir)) return null;
184
- const sidecar = buildSidecar(intakeDir, nowIso);
258
+ // An absent intake directory is a zero-signal session, not an absent one.
259
+ const haveIntake = fs.existsSync(intakeDir);
260
+ const signals = haveIntake ? readSignals(intakeDir) : [];
261
+ const sidecar = buildSidecarFromSignals(signals, nowIso);
262
+ const preferred = sidecar.lessons.filter((l) => l.verdict === 'preferred').length;
263
+ appendDogfoodLine(root, {
264
+ at: nowIso,
265
+ wall_ms: Date.now() - started,
266
+ signals_in: signals.length,
267
+ lessons_out: sidecar.lessons.length,
268
+ preferred,
269
+ });
270
+ if (!haveIntake) return null;
185
271
  if (Date.now() - started > budgetMs) return null; // over budget — skip the write
186
272
  if (sidecar.lessons.length === 0) return null;
187
273
  fs.writeFileSync(path.join(outDir, SIDECAR_NAME), `${JSON.stringify(sidecar, null, 2)}\n`, 'utf8');
188
274
  fs.writeFileSync(path.join(outDir, LESSONS_NAME), renderLessonsMd(sidecar), 'utf8');
189
- const promoted = sidecar.lessons.filter((l) => l.verdict === 'preferred').length;
190
275
  const deadEnds = sidecar.lessons.filter((l) => l.verdict === 'dead_end').length;
191
276
  // Memory-visibility contract shape: one line, ids/counters only, no bodies.
192
277
  return (
193
278
  `🧠 Memory: sidecar refreshed — ${sidecar.lessons.length} lesson(s) ` +
194
- `(${promoted} preferred · ${deadEnds} dead-end); promote via /memory:propose`
279
+ `(${preferred} preferred · ${deadEnds} dead-end); promote via /memory:propose`
195
280
  );
196
281
  }
197
282
 
@@ -65,6 +65,7 @@ import {
65
65
  triggerlessRuleIds,
66
66
  type Router,
67
67
  } from './_lib/rule_injection.js';
68
+ import { ruleBody } from './_lib/rule_law_section.js';
68
69
  import {
69
70
  renderArmExperiment,
70
71
  runArmExperiment,
@@ -616,7 +617,7 @@ export function runEndpoints(corpusDir: string): EndpointResult[] {
616
617
  let deliveries = 0;
617
618
  let unequal = 0;
618
619
  for (const c of positives) {
619
- const injection = buildInjection(REPO_ROOT, c.prompt, c.openFiles, null, new Set());
620
+ const injection = buildInjection(REPO_ROOT, c.prompt, c.openFiles, null, new Set(), false);
620
621
  if (injection === null) continue;
621
622
  for (const id of injection.rules) {
622
623
  const projected = loadRuleBody(REPO_ROOT, id);
@@ -682,6 +683,34 @@ export function runEndpoints(corpusDir: string): EndpointResult[] {
682
683
  ]);
683
684
  const thinnedAndPathOnly = pathOnlyReach.filter((id) => !alwaysEager.has(id));
684
685
 
686
+ // PROMPT-LEVEL beside RULE-LEVEL — step 0.4 of
687
+ // `road-to-a-rule-carrier-that-works-outside-the-repo`.
688
+ //
689
+ // The two numbers above are per RULE: a rule counts as reachable when ANY
690
+ // of its labelled positives matches. That is the right unit for the bar —
691
+ // "no labelled rule left unreachable" — and it is the wrong unit for the
692
+ // question a reader actually asks next, which is how much of the corpus the
693
+ // shipped binding delivers. A rule reachable on one of twelve prompts and a
694
+ // rule reachable on all twelve are the same row in `byRule`.
695
+ //
696
+ // So the pair is reported in both units. The SUMMARY view has computed the
697
+ // prompt-level figures since the two-readings split landed; what was missing
698
+ // is that `--endpoints`, which is the view a claim cites, printed only the
699
+ // rule-level half. A reader comparing the two views saw 99/102 and 305/335
700
+ // and had no way to tell they measure different things.
701
+ const promptHonoured = positives.filter((c) => reach(c, true)).length;
702
+ const promptIgnored = positives.filter((c) => reach(c, false)).length;
703
+
704
+ // The SUMMARY view prints a LOWER pair over the same corpus, and the gap is
705
+ // not noise. `scoreExact` calls `matchTierRules(router, c.prompt, of)` with
706
+ // three arguments and drops the case's `command`, so a positive whose rule
707
+ // is reached by a `command:` trigger scores as a miss there and as a hit
708
+ // here. Recorded rather than repaired: this phase changes no behaviour, and
709
+ // the SUMMARY figures are cited in a roadmap and in the prereg. Both
710
+ // readings are printed so neither view has to be trusted over the other.
711
+ const summaryHonoured = scoreExact(router, cases, true);
712
+ const summaryIgnored = scoreExact(router, cases, false);
713
+
685
714
  // (c) A near-miss must never deliver its labelled rule.
686
715
  const exact = scoreExact(router, cases, true);
687
716
 
@@ -716,7 +745,15 @@ export function runEndpoints(corpusDir: string): EndpointResult[] {
716
745
  `${byRule.size - pathOnlyReach.length}/${byRule.size}; reachable only via a ` +
717
746
  `path trigger: ${pathOnlyReach.length === 0 ? 'none' : pathOnlyReach.join(', ')}` +
718
747
  ` (of which thinned, i.e. at no scope on that route: ` +
719
- `${thinnedAndPathOnly.length === 0 ? 'none' : thinnedAndPathOnly.join(', ')})`,
748
+ `${thinnedAndPathOnly.length === 0 ? 'none' : thinnedAndPathOnly.join(', ')})` +
749
+ ` | per-prompt reach: ${promptIgnored}/${positives.length} with open_files ` +
750
+ `IGNORED against ${promptHonoured}/${positives.length} honoured — the same ` +
751
+ `corpus in prompts rather than in rules, because a rule reachable on one of ` +
752
+ `twelve positives and one reachable on all twelve are one row above` +
753
+ ` | SUMMARY prints ${summaryIgnored.hits}/${summaryIgnored.positives} and ` +
754
+ `${summaryHonoured.hits}/${summaryHonoured.positives} for the same corpus: ` +
755
+ `scoreExact drops the case's command trigger, so a command-reached positive ` +
756
+ `misses there and hits here`,
720
757
  bar: 'unreachable == 0 (a rule with zero matched positives is a rule the mode removed)',
721
758
  passed: unreachable.length === 0,
722
759
  },
@@ -766,12 +803,12 @@ export function runSelftest(corpusDir: string): SelftestCase[] {
766
803
  const probe = cases.find(
767
804
  (c) =>
768
805
  c.label === 'positive' &&
769
- buildInjection(REPO_ROOT, c.prompt, c.openFiles, null, new Set()) !== null,
806
+ buildInjection(REPO_ROOT, c.prompt, c.openFiles, null, new Set(), false) !== null,
770
807
  );
771
808
  const injection =
772
809
  probe === undefined
773
810
  ? null
774
- : buildInjection(REPO_ROOT, probe.prompt, probe.openFiles, null, new Set());
811
+ : buildInjection(REPO_ROOT, probe.prompt, probe.openFiles, null, new Set(), false);
775
812
  if (injection === null || injection.rules.length === 0) {
776
813
  out.push({
777
814
  endpoint: 'a-delivery',
@@ -781,13 +818,23 @@ export function runSelftest(corpusDir: string): SelftestCase[] {
781
818
  });
782
819
  } else {
783
820
  const id = injection.rules[0] as string;
784
- const projected = loadRuleBody(REPO_ROOT, id) ?? '';
785
- const mutated = `${projected.trim().slice(0, -1)}~MUTATED~`;
821
+ // THE DELIVERED FORM, not the raw file. Since step 1.4 the concern emits
822
+ // `ruleBody` of the projection — frontmatter and HTML comments stripped
823
+ // by the same parser `project_thin_rules` uses — so comparing against
824
+ // the raw file asserts a substring the payload no longer contains. The
825
+ // endpoint's claim is unchanged: the payload carries the body verbatim
826
+ // and rejects a mutation of it. What "the body" means moved, and this
827
+ // moved with it.
828
+ const projected = ruleBody(loadRuleBody(REPO_ROOT, id) ?? '');
829
+ const mutated = `${projected.slice(0, -1)}~MUTATED~`;
786
830
  out.push({
787
831
  endpoint: 'a-delivery',
788
832
  name: 'one-byte mutation rejected',
789
- passed: injection.body.includes(projected.trim()) && !injection.body.includes(mutated),
790
- detail: `${id}: the concern's payload carries the projected body verbatim and rejects a mutation of it`,
833
+ passed:
834
+ projected !== ''
835
+ && injection.body.includes(projected)
836
+ && !injection.body.includes(mutated),
837
+ detail: `${id}: the concern's payload carries the delivered body verbatim and rejects a mutation of it`,
791
838
  });
792
839
  }
793
840
 
@@ -10,7 +10,7 @@
10
10
  * deterministic state file the rule body can cite as the source of
11
11
  * truth for "do I need to prompt the user about /onboard?".
12
12
  *
13
- * Output is written to `agents/runtime/state/onboarding-gate.json` with:
13
+ * Output is written to `agents/state/onboarding-gate.json` with:
14
14
  * {
15
15
  * "required": <bool>, // true → rule fires on first turn
16
16
  * "reason": "<string>", // why this state was set
@@ -33,8 +33,9 @@ import path from "node:path";
33
33
  import { fileURLToPath, pathToFileURL } from "node:url";
34
34
 
35
35
  // Re-use the shared atomic-write helper so concerns honour the single
36
- // `agents/runtime/state/.dispatcher.lock` discipline (hook-architecture-v1.md
37
- // § Concurrency, Phase 7.4).
36
+ // `agents/state/.dispatcher.lock` discipline (hook-architecture-v1.md,
37
+ // Concurrency, Phase 7.4) — the lock sits beside THIS hook's own target, not
38
+ // the fixed `agents/runtime/state/` path the discipline cites generally.
38
39
  import { atomic_write_json } from "./hooks/state_io.js";
39
40
  import { readHookStdin } from "./hooks/hook_stdin.js";
40
41
 
@@ -153,11 +154,11 @@ function _now_iso(): string {
153
154
  }
154
155
 
155
156
  /**
156
- * Write `agents/runtime/state/onboarding-gate.json` atomically.
157
+ * Write `agents/state/onboarding-gate.json` atomically.
157
158
  *
158
- * Uses the shared `agents/runtime/state/.dispatcher.lock` so concurrent
159
+ * Uses the shared `agents/state/.dispatcher.lock` so concurrent
159
160
  * dispatcher invocations across platforms cannot tear the file
160
- * (hook-architecture-v1.md § Concurrency, Phase 7.4).
161
+ * (hook-architecture-v1.md, Concurrency, Phase 7.4).
161
162
  */
162
163
  function _write_state(
163
164
  consumer_root: string,
@@ -63,6 +63,8 @@ const DOCS_ONLY_ALLOWED_TOP: ReadonlySet<string> = new Set([
63
63
 
64
64
  // Check names below are the strings GitHub actually REPORTS, verified against
65
65
  // `gh pr checks 1108` on 2026-08-02 (road-to-renewal-foundation Phase 1).
66
+ // `Standing payload delta + budget gate` was added to all three shapes on
67
+ // 2026-10-07, when it was found required by the ruleset and absent here.
66
68
  //
67
69
  // They previously named a matrix that had drifted into fiction — `Consistency`,
68
70
  // `Skill Lint`, `Tests / install-tests`, `Tests / node-tests`,
@@ -79,6 +81,7 @@ const DOCS_ONLY_ALLOWED_TOP: ReadonlySet<string> = new Set([
79
81
  // change — the exact failure this reconciliation removed.
80
82
  const FEATURE_CHECKS = [
81
83
  'Sync + Generate Tools Consistency',
84
+ 'Standing payload delta + budget gate',
82
85
  'Smoke — kernel',
83
86
  'Smoke — router',
84
87
  'Smoke — schema',
@@ -98,6 +101,7 @@ const FEATURE_CHECKS = [
98
101
 
99
102
  const RELEASE_CHECKS = [
100
103
  'Sync + Generate Tools Consistency',
104
+ 'Standing payload delta + budget gate',
101
105
  'Smoke — kernel',
102
106
  'Smoke — router',
103
107
  'Smoke — schema',
@@ -112,6 +116,7 @@ const RELEASE_CHECKS = [
112
116
 
113
117
  const DOCS_ONLY_CHECKS = [
114
118
  'Sync + Generate Tools Consistency',
119
+ 'Standing payload delta + budget gate',
115
120
  'Smoke — kernel',
116
121
  'Smoke — router',
117
122
  'Smoke — schema',
@@ -120,8 +125,11 @@ const DOCS_ONLY_CHECKS = [
120
125
 
121
126
  /**
122
127
  * The checks that mechanically BLOCK a merge, per the repository ruleset
123
- * `main protection` (id 17749383). Everything else above runs and is visible
124
- * on the PR but does not gate the merge button.
128
+ * `main protection` (id 17749383), read on 2026-10-07: two required status
129
+ * contexts, the second added on 2026-09-11 (ADR-276, recorded by #2169).
130
+ * Everything else above runs and is visible on the PR but does not gate the
131
+ * merge button. `standing-payload-delta.yml` runs on every `pull_request`, so
132
+ * the second context appears in all three shapes.
125
133
  *
126
134
  * Deliberately a constant, not an API read: this script is contractually
127
135
  * offline ("never invokes `gh`, never touches the network"). Re-verify with
@@ -129,7 +137,10 @@ const DOCS_ONLY_CHECKS = [
129
137
  * changes — `docs/contracts/branch-protection-policy.md` § Change discipline
130
138
  * owns that procedure.
131
139
  */
132
- const ENFORCED_CHECKS = ['Sync + Generate Tools Consistency'] as const;
140
+ const ENFORCED_CHECKS = [
141
+ 'Sync + Generate Tools Consistency',
142
+ 'Standing payload delta + budget gate',
143
+ ] as const;
133
144
 
134
145
  /** `git rev-parse --abbrev-ref HEAD`, mirroring `_git(check=True)`. */
135
146
  function current_branch(): string {
@@ -314,6 +325,7 @@ export {
314
325
  FEATURE_CHECKS,
315
326
  RELEASE_CHECKS,
316
327
  DOCS_ONLY_CHECKS,
328
+ ENFORCED_CHECKS,
317
329
  current_branch,
318
330
  diff_files,
319
331
  is_docs_only,