@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
@@ -607,7 +607,13 @@ function _checkAppendOnly(base: string | null, findings: Finding[]): void {
607
607
  '--no-color',
608
608
  ref,
609
609
  '--',
610
- 'agents/memory/intake/',
610
+ // The JSONL drops, not the directory. `INTAKE_GLOB`, this module's
611
+ // docstring and every fixture in the suite all scope this check to
612
+ // `*.jsonl`; asking git for the directory made it govern the tracked
613
+ // skeleton too, so editing the README that documents the append-only
614
+ // rule was reported as a violation of it. `:(glob)` is explicit rather
615
+ // than relying on the default pathspec magic.
616
+ ':(glob)agents/memory/intake/*.jsonl',
611
617
  ]);
612
618
  if (rc !== 0) {
613
619
  findings.push(new Finding(INTAKE_GLOB, 0, 'warning', `append-only: git diff failed vs ${ref}`));
@@ -332,7 +332,7 @@ export function payloadFingerprint(entryPath: string, size: number): string {
332
332
  * convention and the class is empty by observation.
333
333
  */
334
334
  const BOUND_PAYLOAD_EXCEPTIONS: readonly BoundPayloadException[] = [
335
- { fingerprint: '47e4328e71652a0375ade7eb4dac8a3e4b6df1c6e4e74caa75287266676cc9a6', path: 'agents/templates/.ai-council.yml.example', size: 30561, why: 'shipped council config TEMPLATE — a dotfile because the file it is copied to is one. RE-PINNED 2026-09-07, 29,872 -> 30,561 bytes: the exception is path-AND-size-bound by design, so this branch adding a `disabled_reason` honest-null block to the gemini seat in the template invalidated it and the gate refused the entry as unaccounted. The re-pin excepts the SAME path for the SAME reason at its measured new size — it does not widen the class, raise a cap, or except anything the gate was not already carrying.' },
335
+ { fingerprint: '6de9a60d02af4883ab8f09171673a44924ca78ddadd55518f743e95651d3d257', path: 'agents/templates/.ai-council.yml.example', size: 31548, why: 'shipped council config TEMPLATE — a dotfile because the file it is copied to is one. RE-PINNED 2026-10-06, 30,561 -> 31,548 bytes: the exception is path-AND-size-bound by design, so step 3.1 of road-to-a-spend-bound-only-where-one-was-set moving the template cost_budget and debate ceilings to 0 (ADR-279), removing the stale "always asks before invoking" sentence and explaining both invalidated it and the gate refused the entry as unaccounted. The re-pin excepts the SAME path for the SAME reason at its measured new size — it does not widen the class, raise a cap, or except anything the gate was not already carrying. (Previously RE-PINNED 2026-09-07, 29,872 -> 30,561 bytes, for a `disabled_reason` honest-null block on the gemini seat.)' },
336
336
  { fingerprint: 'd36a53951c184db7481139235056e90b53a853714b3a68b31ba1349ecb95ac1d', path: 'agents/templates/.ai-video.xml.example', size: 9209, why: 'shipped video-provider config template — same reason as the council template' },
337
337
  { fingerprint: 'f83229412cf8cceaadd0cb1934140a0c7c8277df43edc590f370572f6df6da98', path: 'dist/agent-src/templates/agents/.gitattributes.fragment', size: 2140, why: 'gitattributes fragment the installer appends to a consumer repo' },
338
338
  { fingerprint: 'a4f51dba3a66c0f2c3548e77961271ed4d7b5ec8a6661ea359ff044758f0d921', path: 'src/templates/minimal/.agent-settings.yml', size: 1042, why: 'the minimal-install settings template; the dot is the consumer-side filename' },
@@ -79,6 +79,7 @@ import {
79
79
  CURATED_HEAD_INSTRUCTION,
80
80
  extract_changelog_section,
81
81
  } from './_lib/release_material.js';
82
+ import { coverageLimitationNote, ledgerCoverageLabel } from './_lib/review_coverage.js';
82
83
  import { assertScanned, assertWatchlistResolves, DeadScopeError } from './_lib/scan_scope.js';
83
84
 
84
85
  const _HERE = fileURLToPath(import.meta.url);
@@ -339,6 +340,15 @@ export function main(argv: readonly string[]): number {
339
340
  const contradictions = highlight_contradictions(curated, derived);
340
341
  if (contradictions.length === 0) {
341
342
  process.stdout.write(`✅ curated head plausible for ${version} (span ${from}..${to})\n`);
343
+ // How much of the change the self-review read, printed where the head's
344
+ // Known-limitations field is decided. Partial coverage IS a known
345
+ // limitation of the record, and the ledger was the only place it was
346
+ // written down. A label, not a floor — the exit code above is already
347
+ // fixed at 0 by the time this runs, deliberately.
348
+ const covNote = coverageLimitationNote(ledgerCoverageLabel(REPO_ROOT, version));
349
+ if (covNote !== null) {
350
+ process.stdout.write(`${covNote}\n`);
351
+ }
342
352
  // Risk 2 of the roadmap that made `Known limitations` derivable, paid
343
353
  // where it lands rather than in a comment: a self-declared residual is
344
354
  // only detectable when somebody WROTE IT DOWN, so a derived `_none_`
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Release-manifest content check — the content half beside
4
+ * `check_release_pr_shape`.
5
+ *
6
+ * The shape check lets a release PR carry `package.json`, `package-lock.json`
7
+ * and the three plugin manifests, and it reads only their NAMES. Smoke is
8
+ * skipped on release heads (`docs/contracts/release-pr-gating.md`), so an added
9
+ * script, a new dependency or a changed `bin` path could ride a release PR with
10
+ * no gate reading it. This compares each manifest against the base and fails on
11
+ * any difference outside the version fields the release writes.
12
+ *
13
+ * Version fields are named per file, never matched by key name anywhere: in
14
+ * `package-lock.json` every dependency also has a `version`, and a key-name
15
+ * rule would wave a dependency bump through as a version bump.
16
+ *
17
+ * Usage: check_release_manifest_content [--base REF] [--root DIR]
18
+ * --base REF ref the head is compared against (default: origin/main)
19
+ * --root DIR repository root to read the head and run git in (testing)
20
+ *
21
+ * Exit codes: 0 = only version fields differ · 1 = other difference · 2 = usage/env.
22
+ */
23
+
24
+ import { spawnSync } from 'node:child_process';
25
+ import * as fs from 'node:fs';
26
+ import * as path from 'node:path';
27
+ import { fileURLToPath, pathToFileURL } from 'node:url';
28
+
29
+ import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
30
+
31
+ const _HERE = fileURLToPath(import.meta.url);
32
+ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
33
+
34
+ type Segment = string;
35
+ /** A JSON path pattern; `*` matches any array index. */
36
+ type Pattern = readonly Segment[];
37
+
38
+ /** The manifests a release PR may carry, and the fields the release writes in each. */
39
+ export const VERSION_FIELDS: Readonly<Record<string, readonly Pattern[]>> = {
40
+ 'package.json': [['version']],
41
+ 'package-lock.json': [['version'], ['packages', '', 'version']],
42
+ '.claude-plugin/marketplace.json': [['version'], ['metadata', 'version'], ['plugins', '*', 'version']],
43
+ '.augment-plugin/plugin.json': [['version']],
44
+ '.augment-plugin/marketplace.json': [['version'], ['metadata', 'version'], ['plugins', '*', 'version']],
45
+ };
46
+
47
+ function _matches(p: readonly Segment[], pat: Pattern): boolean {
48
+ if (p.length !== pat.length) return false;
49
+ return pat.every((seg, i) => seg === p[i] || (seg === '*' && /^\d+$/u.test(p[i] ?? '')));
50
+ }
51
+
52
+ function _render(p: readonly Segment[]): string {
53
+ return p.length === 0 ? '(root)' : p.map((s) => (/^\d+$/u.test(s) ? `[${s}]` : JSON.stringify(s))).join('.');
54
+ }
55
+
56
+ function _isObject(v: unknown): v is Record<string, unknown> {
57
+ return v !== null && typeof v === 'object' && !Array.isArray(v);
58
+ }
59
+
60
+ /** Every JSON path at which `a` and `b` differ, leaf-first where both are containers. */
61
+ function _diffPaths(a: unknown, b: unknown, at: Segment[] = []): Segment[][] {
62
+ if (Array.isArray(a) && Array.isArray(b)) {
63
+ if (a.length !== b.length) return [at];
64
+ return a.flatMap((v, i) => _diffPaths(v, b[i], [...at, String(i)]));
65
+ }
66
+ if (_isObject(a) && _isObject(b)) {
67
+ const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
68
+ const out: Segment[][] = [];
69
+ for (const k of keys) {
70
+ if (!(k in a) || !(k in b)) {
71
+ out.push([...at, k]);
72
+ continue;
73
+ }
74
+ out.push(..._diffPaths(a[k], b[k], [...at, k]));
75
+ }
76
+ return out;
77
+ }
78
+ return JSON.stringify(a) === JSON.stringify(b) ? [] : [at];
79
+ }
80
+
81
+ /**
82
+ * The differences between `base` and `head` text of one manifest that are NOT a
83
+ * version-string change in a declared version field. Empty means in shape.
84
+ */
85
+ export function manifestDifferences(file: string, base: string | null, head: string | null): string[] {
86
+ if (base === null && head === null) return [];
87
+ if (base === null) return [`${file}: added — absent at the base`];
88
+ if (head === null) return [`${file}: removed — present at the base`];
89
+ let a: unknown;
90
+ let b: unknown;
91
+ try {
92
+ a = JSON.parse(base);
93
+ b = JSON.parse(head);
94
+ } catch (err) {
95
+ return [`${file}: not parseable JSON (${(err as Error).message})`];
96
+ }
97
+ const allowed = VERSION_FIELDS[file] ?? [];
98
+ const out: string[] = [];
99
+ for (const p of _diffPaths(a, b)) {
100
+ const atVersion = allowed.some((pat) => _matches(p, pat));
101
+ let before: unknown = a;
102
+ let after: unknown = b;
103
+ for (const s of p) {
104
+ before = (before as Record<string, unknown> | undefined)?.[s];
105
+ after = (after as Record<string, unknown> | undefined)?.[s];
106
+ }
107
+ if (atVersion && typeof before === 'string' && typeof after === 'string') continue;
108
+ out.push(`${file}: ${_render(p)} differs outside the version fields`);
109
+ }
110
+ return out;
111
+ }
112
+
113
+ function _git(args: readonly string[], cwd: string): { status: number; stdout: string } {
114
+ const r = spawnSync('git', args, { cwd, encoding: 'utf8' });
115
+ return { status: r.status ?? 1, stdout: r.stdout ?? '' };
116
+ }
117
+
118
+ function _readHead(root: string, file: string): string | null {
119
+ const abs = path.join(root, file);
120
+ return fs.existsSync(abs) ? fs.readFileSync(abs, 'utf8') : null;
121
+ }
122
+
123
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
124
+ let base = 'origin/main';
125
+ let root = REPO_ROOT;
126
+ for (let i = 0; i < argv.length; i += 1) {
127
+ const a = argv[i];
128
+ if (a === '--base' || a === '--root') {
129
+ const v = argv[i + 1];
130
+ if (v === undefined || v === '') {
131
+ process.stderr.write(`error: ${a} needs a value\n`);
132
+ return 2;
133
+ }
134
+ if (a === '--base') base = v;
135
+ else root = path.resolve(v);
136
+ i += 1;
137
+ continue;
138
+ }
139
+ process.stderr.write(`error: unknown argument ${String(a)}\n`);
140
+ return 2;
141
+ }
142
+ if (_git(['rev-parse', '--verify', `${base}^{commit}`], root).status !== 0) {
143
+ process.stderr.write(`error: base \`${base}\` does not resolve to a commit in ${root}\n`);
144
+ return 2;
145
+ }
146
+
147
+ const findings: string[] = [];
148
+ let scanned = 0;
149
+ for (const file of Object.keys(VERSION_FIELDS)) {
150
+ const shown = _git(['show', `${base}:${file}`], root);
151
+ const before = shown.status === 0 ? shown.stdout : null;
152
+ const after = _readHead(root, file);
153
+ if (before !== null || after !== null) scanned += 1;
154
+ findings.push(...manifestDifferences(file, before, after));
155
+ }
156
+ try {
157
+ reportScanned({ gate: 'check_release_manifest_content', scanned, units: 'manifests', roots: [root] });
158
+ } catch (err) {
159
+ if (err instanceof DeadScopeError) {
160
+ process.stderr.write(`${err.message}\n`);
161
+ return 2;
162
+ }
163
+ throw err;
164
+ }
165
+ if (findings.length > 0) {
166
+ process.stdout.write(
167
+ `❌ release manifests differ from ${base} outside their version fields:\n` +
168
+ findings.map((f) => ` · ${f}`).join('\n') +
169
+ '\n A release PR carries version bumps only. Land the other change on main via its own PR.\n',
170
+ );
171
+ return 1;
172
+ }
173
+ process.stdout.write(`✅ release manifests differ from ${base} in version fields only (${String(scanned)} read)\n`);
174
+ return 0;
175
+ }
176
+
177
+ function _isCliEntry(): boolean {
178
+ if (process.argv[1] === undefined) return false;
179
+ if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) return true;
180
+ try {
181
+ return fs.realpathSync(_HERE) === fs.realpathSync(path.resolve(process.argv[1]));
182
+ } catch {
183
+ return false;
184
+ }
185
+ }
186
+
187
+ if (_isCliEntry()) {
188
+ process.exit(main());
189
+ }
@@ -45,6 +45,16 @@ const ALLOWLIST_GLOBS = [
45
45
  // be able to carry the dispositions of its own self-review findings; the
46
46
  // finding-dispositions gate is red until blocking ones are recorded here.
47
47
  'agents/evidence/release-findings/*.json',
48
+ // Evidence-temperature census — `taskfiles/content.yml` § release-prepare
49
+ // writes one per release, so without this entry the pipeline generates a
50
+ // file its own shape step refuses. Digit classes rather than `?`: fnmatch
51
+ // `?` compiles to `.` under the `s` flag, so it matches any character AND
52
+ // crosses `/` — `????-??-??` admits `evidence-temperature-x/yz-ab-cd.md`,
53
+ // which `[0-9]` cannot. Two reports can appear in one release PR, and
54
+ // both are in shape: `--resume` re-runs release-prepare, so a release
55
+ // carried across UTC midnight writes a second census. What that one
56
+ // contains is the census's business, not this gate's.
57
+ 'agents/evidence/analysis/evidence-temperature-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].md', // code-comment-allow provenance-comment -- the glob IS this gate's operand, not where the code came from
48
58
  // Project-settings template pin — bumped by release.ts set_template_pin and
49
59
  // its regenerated dist twin (kept in lockstep with package.json.version).
50
60
  'src/agent-src/templates/agents/agent-project-settings.example.yml',
@@ -52,16 +62,26 @@ const ALLOWLIST_GLOBS = [
52
62
  ] as const;
53
63
 
54
64
  /**
55
- * Translate a Python `fnmatch` shell pattern to a RegExp, mirroring
56
- * `fnmatch.translate`. fnmatch is case-sensitive on POSIX (fnmatchcase
57
- * semantics on the normalized path); `*` and `?` do NOT cross path
58
- * separators is NOT a property of fnmatch — `*` matches everything
59
- * including `/`. The allowlist relies on that (e.g. nested-file rejection
60
- * in the test works because none of the globs end with the file).
65
+ * Translate a Python `fnmatch` shell pattern to a RegExp, following
66
+ * `fnmatch.translate` for the constructs the allowlist actually uses: `*` and
67
+ * `[0-9]`. No entry uses `?`, and bracket handling beyond that one class is
68
+ * unverified against CPython — see the note at the bracket branch.
69
+ *
70
+ * Matching is case-sensitive, as `fnmatchcase` on a normalized path.
71
+ *
72
+ * THE PROPERTY THE WILDCARD ENTRIES TURN ON — the literal paths are unaffected:
73
+ * in fnmatch, `*` and `?` DO cross path separators.
74
+ * `*` becomes `.*` and `?` becomes `.`, both under the `s` flag, so each matches
75
+ * `/` like any other character. Glob syntax elsewhere (shells, .gitignore) stops
76
+ * `*` at a segment boundary; this does not. So the pack entry admits any depth
77
+ * beneath `src/packs/`, and the census entry uses digit classes precisely
78
+ * because they cannot match a separator. Both sides are pinned in
79
+ * `check_release_pr_shape.test.ts`.
61
80
  */
62
81
  function _fnmatchToRegExp(pat: string): RegExp {
63
- // Mirror Python fnmatch.translate: `*` → `.*`, `?` → `.`, `[seq]` kept,
64
- // everything else escaped. The full pattern is anchored with `(?s:...)\Z`.
82
+ // `*` → `.*`, `?` → `.`, a bracket class kept, everything else escaped.
83
+ // CPython does more inside a class (hyphen and set-operator escaping, `(?!)`
84
+ // for an empty one) and this does not — see the bracket branch below.
65
85
  let i = 0;
66
86
  const n = pat.length;
67
87
  let res = '';
@@ -87,12 +107,13 @@ function _fnmatchToRegExp(pat: string): RegExp {
87
107
  res += '\\[';
88
108
  } else {
89
109
  let stuff = pat.slice(i, j);
90
- if (!stuff.includes('-')) {
91
- stuff = stuff.replace(/\\/g, '\\\\');
92
- } else {
93
- // Rare; not used by the allowlist. Keep simple escape.
94
- stuff = stuff.replace(/\\/g, '\\\\');
95
- }
110
+ // The two arms this replaces were byte-identical, so the branch
111
+ // implemented nothing. Bracket handling here is checked against
112
+ // `[0-9]`, the only class the allowlist uses; anything else is
113
+ // untested against CPython, whose behaviour also varies by
114
+ // version. Add a bracket glob and verify it rather than assuming
115
+ // this mirrors `fnmatch.translate` beyond that one case.
116
+ stuff = stuff.replace(/\\/g, '\\\\');
96
117
  i = j + 1;
97
118
  if (stuff.startsWith('!')) {
98
119
  stuff = '^' + stuff.slice(1);
@@ -105,7 +126,9 @@ function _fnmatchToRegExp(pat: string): RegExp {
105
126
  res += c.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
106
127
  }
107
128
  }
108
- // Python uses `(?s:%s)\Z` — dotAll + full match.
129
+ // Full match with dotAll. Python spells the same thing `(?s:%s)\Z`; in JS
130
+ // `$` without the `m` flag does not match before a trailing newline, so
131
+ // `^(?:…)$` is equivalent rather than merely similar.
109
132
  return new RegExp(`^(?:${res})$`, 's');
110
133
  }
111
134
 
@@ -31,26 +31,47 @@
31
31
  * Exit codes: `0` under cap · `1` over cap or an unstated cap raise · `2` usage
32
32
  * error · `3` dead scan scope.
33
33
  *
34
- * ## This is deliberately NOT a CI gate
34
+ * THIS IS DELIBERATELY NOT A CI GATE, AND THE REASON IS NARROWER THAN IT WAS.
35
35
  *
36
- * Both inputs are machine-local by construction. `.claude/rules/` is gitignored
37
- * (`.gitignore:123` — it is generated by `task sync` / `task generate-tools`),
38
- * and no CI workflow performs a user-scope install, so on a fresh runner
39
- * **neither** layer exists. Wired into `ci` it would either red on a dead scope
40
- * or, with the empty case allowed, sit permanently green while certifying a
41
- * property it cannot observe — the exact failure `src/config/gate-coverage.yml`
42
- * was written to end. It is therefore registered as a local / doctor-surface
43
- * check and is absent from `gate-coverage.yml`, whose contract is CI-identical
44
- * invocation.
36
+ * **Corrected 2026-10-05 (step 0.1 of
37
+ * `road-to-a-rule-carrier-that-works-outside-the-repo`).** This section used to
38
+ * say "no CI workflow performs a user-scope install, so on a fresh runner
39
+ * **neither** layer exists", and then concluded that making the measurement
40
+ * CI-observable "needs the `InstructionsLoaded` record committed from a real
41
+ * session, which is a different piece of work". The first clause describes a
42
+ * workflow inventory; the second turns it into a capability claim, and that
43
+ * step does not hold. A runner CAN stage a user-scope install: the installer
44
+ * reads `HOME` from the environment, and
45
+ * `tests/install/global_install_hooks_smoke.test.ts` already drives
46
+ * `src/scripts/install --global --tools=claude-code` against a `mkdtemp` HOME
47
+ * and asserts the tree it produced. Nothing about the `InstructionsLoaded`
48
+ * event is required to observe the FILESYSTEM half, which is what this script's
49
+ * `filesystem` input reads.
45
50
  *
46
- * What that costs, stated plainly: the duplicate-delivery defect is not
51
+ * What stays true, and is the real reason this is not in `gate-coverage.yml`:
52
+ * **this gate measures THIS machine**, by design. `main()` resolves
53
+ * `os.homedir()` and `REPO_ROOT`, and the question it answers — "how much is
54
+ * the developer in front of me actually loading" — is about a machine, not
55
+ * about a commit. A CI run of it would measure the runner, which is a tree
56
+ * nobody works in, so the number would be real and uninteresting. The
57
+ * `measureStandingDelivery` function underneath takes both directories as
58
+ * PARAMETERS and is therefore already temp-HOME-capable; what is missing is a
59
+ * reason to point it at a runner, not a way to.
60
+ *
61
+ * The honest cost is unchanged: the duplicate-delivery defect is not
47
62
  * mechanically caught for anyone who never runs this locally. The enforced layer
48
63
  * is the installer gate (`install.ts::_gate_rule_layer_overlap`), which refuses
49
64
  * to CREATE the doubled state; this script measures a state that already exists.
50
- * Making the measurement CI-observable needs the `InstructionsLoaded` record
51
- * committed from a real session, which is a different piece of work.
65
+ *
66
+ * `_lib/installed_layer.ts` is the step-0.1 library that takes the same reading
67
+ * per host rule directory with every input as a parameter, and
68
+ * `installed_layer_report.ts` is its report. The two measure different things —
69
+ * that one counts characters after the frontmatter and block-comment strip,
70
+ * this one counts tokens over whole files against a cap — and neither number
71
+ * converts into the other.
52
72
  */
53
73
 
74
+ import { createHash } from 'node:crypto';
54
75
  import * as fs from 'node:fs';
55
76
  import * as os from 'node:os';
56
77
  import * as path from 'node:path';
@@ -60,6 +81,8 @@ import { fileURLToPath } from 'node:url';
60
81
  import { assertScanned, DeadScopeError, reportScanned } from './_lib/scan_scope.js';
61
82
  import { measure, method_note } from './_lib/token_count.js';
62
83
  import * as rule_layer_overlap from './_lib/rule_layer_overlap.js';
84
+ import { lawText, ruleBody } from './_lib/rule_law_section.js';
85
+ import { is_thin_entry, lawDigest, STUB_LAW_OPEN } from './_lib/thin_rules.js';
63
86
 
64
87
  const PROG = 'check_standing_rule_delivery';
65
88
  const _HERE = fileURLToPath(import.meta.url);
@@ -185,6 +208,80 @@ export function measureStandingDelivery(
185
208
  };
186
209
  }
187
210
 
211
+ /** One installed rule, compared against the source it was installed from. */
212
+ export interface ReinstallRow {
213
+ readonly layer: string;
214
+ readonly id: string;
215
+ /** What the two digests are of — named, so a reader knows what "differs" means. */
216
+ readonly compared: 'body' | 'law' | 'none';
217
+ readonly installed: string;
218
+ readonly source: string;
219
+ readonly status: 'current' | 'pending reinstall' | 'no source';
220
+ }
221
+
222
+ function bodyDigest(text: string): string {
223
+ return createHash('sha256').update(ruleBody(text), 'utf-8').digest('hex').slice(0, 16);
224
+ }
225
+
226
+ /**
227
+ * Per installed rule: its digest against the CURRENT source digest
228
+ * (`road-to-a-default-install-served-once` step 1.2).
229
+ *
230
+ * The cap above measures installed directories only, by design, so a source
231
+ * rule that got smaller is invisible until a reinstall. This names every rule
232
+ * whose installed copy no longer matches its source as `pending reinstall`.
233
+ * It REPORTS and fails nothing — every source edit makes an older install
234
+ * differ, and that is a state to act on, not an error.
235
+ *
236
+ * What is compared depends on the installed form, and the row says which:
237
+ *
238
+ * - **body** — a full-bodied copy: sha256 of the body after the frontmatter
239
+ * and comment strip, because the installer rewrites the frontmatter into
240
+ * host form and the body is what the host reads.
241
+ * - **law** — a stub carrying a copied law: the digest the stub recorded
242
+ * against the digest of the source's law section today.
243
+ * - **none** — a stub with no copied text: its body is read from the package
244
+ * at delivery, so nothing installed can go stale.
245
+ */
246
+ export function reinstallRows(
247
+ layer: string,
248
+ installed_dir: string,
249
+ source_dir: string,
250
+ ): ReinstallRow[] {
251
+ const l = rule_layer_overlap.readRuleLayer(installed_dir);
252
+ if (l === null) return [];
253
+ const rows: ReinstallRow[] = [];
254
+ for (const [name, text] of l.files) {
255
+ const id = name.replace(/\.md$/, '');
256
+ let src: string | null;
257
+ try {
258
+ src = fs.readFileSync(path.join(source_dir, name), 'utf-8');
259
+ } catch {
260
+ src = null;
261
+ }
262
+ let compared: ReinstallRow['compared'] = 'body';
263
+ let installed = bodyDigest(text);
264
+ let source = src === null ? '-' : bodyDigest(src);
265
+ if (is_thin_entry(text)) {
266
+ const at = text.indexOf(STUB_LAW_OPEN);
267
+ if (at === -1) {
268
+ compared = 'none';
269
+ installed = '-';
270
+ source = '-';
271
+ } else {
272
+ compared = 'law';
273
+ installed = text.slice(at + STUB_LAW_OPEN.length).split(' ')[0] ?? '';
274
+ const law = src === null ? null : lawText(ruleBody(src));
275
+ source = law === null ? '-' : lawDigest(law);
276
+ }
277
+ }
278
+ const status: ReinstallRow['status'] =
279
+ src === null ? 'no source' : installed === source ? 'current' : 'pending reinstall';
280
+ rows.push({ layer, id, compared, installed, source, status });
281
+ }
282
+ return rows;
283
+ }
284
+
188
285
  /**
189
286
  * Where the loaded-instruction record would live if the host wrote one.
190
287
  *
@@ -311,6 +408,25 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
311
408
  );
312
409
  }
313
410
 
411
+ // Step 1.2 — the installed copy against the current source, per rule.
412
+ // Reported, never failed: see `reinstallRows`.
413
+ const source_dir = path.join(REPO_ROOT, 'dist', 'agent-src', 'rules');
414
+ const rows = [
415
+ ...reinstallRows('global', path.join(os.homedir(), '.claude', 'rules'), source_dir),
416
+ ...reinstallRows('project', path.join(REPO_ROOT, '.claude', 'rules'), source_dir),
417
+ ];
418
+ const pending = rows.filter((r) => r.status === 'pending reinstall');
419
+ out(
420
+ ` reinstall ${pending.length} of ${rows.length} installed rule(s) differ from `
421
+ + `${path.relative(REPO_ROOT, source_dir)} (installed digest vs current source digest)\n`,
422
+ );
423
+ for (const r of rows) {
424
+ out(
425
+ ` ${r.layer.padEnd(8)} ${r.id.padEnd(40)} ${r.compared.padEnd(5)} `
426
+ + `${r.installed.padEnd(16)} ${r.source.padEnd(16)} ${r.status}\n`,
427
+ );
428
+ }
429
+
314
430
  const pct = total / budget.total_cap_tokens;
315
431
  out(
316
432
  ` TOTAL ${String(total).padStart(13)} tok / ${budget.total_cap_tokens} cap `
@@ -264,11 +264,8 @@ export const SUPPRESSION_INVENTORY: readonly SuppressionSpec[] = [
264
264
  file: 'src/config/conformance-claim-baseline.json',
265
265
  listKey: 'undeclared',
266
266
  tier: 'string_list',
267
- // Absent at the base ref because this change introduces it. Remove the
268
- // flag on the next change once the introducing commit is an ancestor of
269
- // main — the scan below fails while it is set and the file resolves,
270
- // so the flag closes itself rather than needing to be remembered.
271
- newInThisChange: true,
267
+ // `newInThisChange` removed: the baseline resolves at the base ref since
268
+ // 9a013fac5, and the scan reported the stale flag as designed.
272
269
  what: 'skill and rule artefacts carrying a standard-conformance claim with no enforced_by declaration',
273
270
  },
274
271
  ];