@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
@@ -6,10 +6,14 @@
6
6
  * Python module exactly (snake_case kept deliberately — fidelity over
7
7
  * TS idiom).
8
8
  *
9
- * Per `docs/contracts/hook-architecture-v1.md` § Concurrency, every concern
10
- * that writes under `agents/runtime/state/` MUST:
11
- *
12
- * 1. Acquire an exclusive lock on `agents/runtime/state/.dispatcher.lock`.
9
+ * Per `docs/contracts/hook-architecture-v1.md`, Concurrency, every concern
10
+ * that writes a state file under `agents/` MUST:
11
+ *
12
+ * 1. Acquire an exclusive lock on `<state_dir>/.dispatcher.lock` — the SAME
13
+ * directory the target file lives in, derived from the target's own
14
+ * path (`path.dirname`), never a single fixed location: one concern's
15
+ * target under `agents/runtime/state/` locks there, another's target
16
+ * under `agents/state/` locks there instead.
13
17
  * 2. Write to a sibling `<dest>.tmp.<pid>` file in the same directory.
14
18
  * 3. Rename(2) (atomic on the same filesystem) tmp → dest.
15
19
  * 4. Release the lock.
@@ -9,6 +9,27 @@ import { createHash } from 'node:crypto';
9
9
  * dispatcher: `dispatch_hook` → `host_semantics` → `host_lowering` is a live
10
10
  * import chain, so the reverse edge would be a cycle.
11
11
  *
12
+ * THE RETIRED ARGUMENT, kept because both callers point here for it rather
13
+ * than restating it. `dispatch_hook._manifest_fingerprint` argued AGAINST a
14
+ * cryptographic hash on two grounds, and by the time road-to-blocking-
15
+ * severities 3.1 read that header the body had already been delegating here for
16
+ * a release — so a reader checking whether the dispatcher resists a CRAFTED
17
+ * sibling met a disclaimer the code had stopped making. Both grounds were
18
+ * re-measured when this module was extracted, and both were stale:
19
+ *
20
+ * - "`require('node:crypto')` costs 8 ms of process start, which is most of
21
+ * what the precompiled manifest exists to save." The module is already
22
+ * loaded: `dist/hooks/dispatch.js` carries 23 top-level
23
+ * `import … from "node:crypto"` statements from other parts of the graph,
24
+ * so the cost is paid whether this function uses it or not.
25
+ * - "An FNV-1a loop runs in about 0.2 ms and is the right trade." SHA-256
26
+ * measured FASTER — 0.106 ms against 0.113 ms over the 99,792-byte
27
+ * manifest — because Node's digest is native and the loop was that many
28
+ * interpreted `charCodeAt` calls.
29
+ *
30
+ * Both readers now point here instead of restating it, so the argument and the
31
+ * numbers that retired it cannot part company again.
32
+ *
12
33
  * DELIBERATELY CONTENT-DERIVED, NOT MTIME. The first version of the manifest
13
34
  * fast path compared mtimes and that was a measured defect, not a theoretical
14
35
  * one: on a fresh `actions/checkout` both files carry the checkout timestamp in
@@ -22,12 +22,19 @@
22
22
  * activates only when `enabled` is true AND the org pack supplied an
23
23
  * endpoint, an org id, and a salt. An external clone of this repository
24
24
  * carries the key names and no values, so copying the tree cannot reach the
25
- * write path. When inactive this concern performs zero telemetry file
26
- * operations — no log write, no directory creation — and zero network calls.
25
+ * write path. When inactive this concern performs zero TELEMETRY file
26
+ * operations — no log write, no spool, no directory under the configured
27
+ * output path — and zero network calls.
27
28
  * (It does read `.agent-settings.yml`, once per process and memoised: the
28
29
  * settings file is how it learns it is off, the same as the artefact-
29
30
  * engagement surface it mirrors.)
30
31
  *
32
+ * The foreign-MCP tool-name recorder that once branched here lives in its own
33
+ * concern, `mcp-usage-observation` (road-to-neighbours-that-pull-their-weight
34
+ * D12): this concern's `tools: [Skill]` filter meant the dispatcher never
35
+ * called that branch, and default-on local collection does not belong under an
36
+ * opt-in telemetry name.
37
+ *
31
38
  * NO OUTBOUND CALL EXISTS HERE, DELIBERATELY. Transport is Phase 2 and is
32
39
  * blocked on `sink-choice`; org-wide enablement is Phase 3 and is blocked on
33
40
  * `dpo-signoff`. This concern appends to a local JSONL file and stops.
@@ -247,7 +254,8 @@ function processEnvelope(envelope: JsonValue, consumer_root: string): number {
247
254
  if (!isObject(envelope)) return EXIT_ALLOW;
248
255
 
249
256
  const payload = unwrapPayload(envelope);
250
- if (extractToolName(payload) !== SKILL_TOOL_NAME) return EXIT_ALLOW;
257
+ const tool = extractToolName(payload);
258
+ if (tool !== SKILL_TOOL_NAME) return EXIT_ALLOW;
251
259
 
252
260
  const { settings, text, root } = readSettingsFor(consumer_root);
253
261
  if (!settings.active) return EXIT_ALLOW;
@@ -339,11 +347,18 @@ export function main(): number {
339
347
 
340
348
  // Bundle-safety: never auto-run when inlined into an esbuild bundle, where
341
349
  // every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
350
+ //
351
+ // The bundle test is at the CALL SITE rather than at the top of
352
+ // `_isCliEntry`, and that placement is the whole point. Inside the function
353
+ // esbuild folds the condition to `if (true) return false` and then emits the
354
+ // nine unreachable lines below it anyway — measured at 475 bytes of dead code
355
+ // in a bundle `check_hook_bundle_composition` caps. Guarding the call instead
356
+ // makes the whole statement `if (false)`, which esbuild drops, taking the now
357
+ // unreferenced function with it. Behavior outside the bundle is unchanged:
358
+ // `__AGENT_CONFIG_BUNDLE__` is undeclared there, the first operand is true,
359
+ // and `!__AGENT_CONFIG_BUNDLE__` is never evaluated — so no ReferenceError.
342
360
  declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
343
361
  function _isCliEntry(): boolean {
344
- if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
345
- return false;
346
- }
347
362
  if (process.argv[1] === undefined) return false;
348
363
  const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
349
364
  if (import.meta.url === argvUrl) return true;
@@ -353,4 +368,6 @@ function _isCliEntry(): boolean {
353
368
  return false;
354
369
  }
355
370
  }
356
- if (_isCliEntry()) process.exit(main());
371
+ if (typeof __AGENT_CONFIG_BUNDLE__ === 'undefined' || !__AGENT_CONFIG_BUNDLE__) {
372
+ if (_isCliEntry()) process.exit(main());
373
+ }
@@ -186,6 +186,17 @@ export { readTurnRunState };
186
186
  // Detector E, extracted to `_lib` where its prose costs no ratchet debt.
187
187
  // Re-exported so every existing importer of this module is unchanged.
188
188
  import { detectDroppedDecision } from '../_lib/dropped_decision.js';
189
+ // Step 3.2 of `road-to-a-graph-that-feeds-the-gate` — the shadow feeder. It
190
+ // lives in `_lib` for the reason every other extraction here does: this file
191
+ // sits against a 1,500-line shrink-only source budget, and the module it would
192
+ // otherwise grow into is one a recall reading has to be able to open on its own.
193
+ import {
194
+ appendFeederRow,
195
+ buildFeederRow,
196
+ type FeederLayer,
197
+ graphUntestedVerdict,
198
+ } from '../_lib/graph_feeder_record.js';
199
+ import { type GraphState, graphState } from '../code_graph/detect.js';
189
200
  import { isVerificationCommand } from '../_lib/verification_command.js';
190
201
  // Round 8 — the record path detector C prefers over its own regex. The regex
191
202
  // reads a command's TEXT and `echo test` matches it; these read what the run
@@ -215,6 +226,7 @@ import {
215
226
  readInstallBoundary,
216
227
  sessionRefusalFile,
217
228
  sessionShadowFile,
229
+ shadowSetBy,
218
230
  type RefusalRecord,
219
231
  type ShadowLayer,
220
232
  type ShadowRecord,
@@ -1276,6 +1288,66 @@ function runDetectors(inputs: DetectorInputs): Finding[] {
1276
1288
  return findings;
1277
1289
  }
1278
1290
 
1291
+ /**
1292
+ * Write the graph feeder row for ONE stop (step 3.2).
1293
+ *
1294
+ * Called from both stop paths with the findings that path already computed, so
1295
+ * the F verdict in the row is the SAME verdict the gate acted on — never a
1296
+ * second evaluation written beside it, which is the shape
1297
+ * `obligation_settle_hook.ts` names as measuring nothing.
1298
+ *
1299
+ * It changes no exit code, and the whole body is wrapped: a stop that crashed on
1300
+ * its own instrument would be a new failure mode on a path that is supposed to
1301
+ * cost nothing. The graph half is skipped outright unless the state is `fresh`
1302
+ * or `edited` — an answer from an index that predates the change is not evidence
1303
+ * about the change.
1304
+ */
1305
+ function recordGraphFeeder(
1306
+ inputs: DetectorInputs,
1307
+ findings: readonly Finding[],
1308
+ layer: FeederLayer,
1309
+ ): void {
1310
+ if (is_replay_mode()) return;
1311
+ try {
1312
+ let state: GraphState;
1313
+ try {
1314
+ state = graphState(inputs.workspaceRoot);
1315
+ } catch {
1316
+ return;
1317
+ }
1318
+ // No graph at all is the silent case, exactly as it is for the context
1319
+ // hook: a consumer who never builds one never grows this file.
1320
+ if (state === 'absent') return;
1321
+ // The SAME path set detector F reads, filtered by the SAME predicate.
1322
+ // A completion review found the two arms running over different inputs:
1323
+ // the feeder passed every edit path while F filters to production
1324
+ // source, so the graph arm would have fired on precisely the turns F is
1325
+ // silent for — a recall comparison between two detectors answering
1326
+ // different questions, which is worse than no comparison.
1327
+ const paths = inputs.toolCalls
1328
+ .filter((c) => _EDIT_TOOLS.has(c.name) && c.path !== undefined)
1329
+ .map((c) => c.path as string)
1330
+ .filter(_isProductionSource);
1331
+ const f = findings.find((x) => x.detector === 'untested');
1332
+ appendFeederRow(
1333
+ inputs.workspaceRoot,
1334
+ inputs.sessionKey,
1335
+ buildFeederRow({
1336
+ root: inputs.workspaceRoot,
1337
+ turn: inputs.turnOrdinal,
1338
+ layer,
1339
+ state,
1340
+ fFired: f !== undefined,
1341
+ fMode: f?.mode ?? null,
1342
+ paths,
1343
+ graph: graphUntestedVerdict(inputs.workspaceRoot, state, paths),
1344
+ }),
1345
+ );
1346
+ } catch {
1347
+ // An instrument is never a reason to change what the gate does.
1348
+ }
1349
+ }
1350
+
1279
1351
  /**
1280
1352
  * Record what this retry WOULD have been refused for, then let it end.
1281
1353
  *
@@ -1289,6 +1361,14 @@ function recordShadow(inputs: DetectorInputs, layer: ShadowLayer): void {
1289
1361
  if (is_replay_mode()) return;
1290
1362
  try {
1291
1363
  const findings = runDetectors(inputs);
1364
+ // On `refused_turn` the answer is `ours` by construction — that marker
1365
+ // is this gate's own and nothing else writes it. On `stop_hook_active`
1366
+ // the host sets the flag for ANY stop hook's block, so it has to be
1367
+ // read from our own refusal record rather than assumed.
1368
+ const setBy = layer === 'refused_turn'
1369
+ ? 'ours'
1370
+ : shadowSetBy(inputs.workspaceRoot, inputs.sessionKey);
1371
+ recordGraphFeeder(inputs, findings, layer);
1292
1372
  const file = sessionShadowFile(inputs.workspaceRoot, inputs.sessionKey);
1293
1373
  let prev: ShadowRecord | null = null;
1294
1374
  try {
@@ -1303,6 +1383,7 @@ function recordShadow(inputs: DetectorInputs, layer: ShadowLayer): void {
1303
1383
  turnOrdinal: inputs.turnOrdinal,
1304
1384
  at: new Date().toISOString(),
1305
1385
  layer,
1386
+ setBy,
1306
1387
  }) as unknown as Record<string, unknown>,
1307
1388
  );
1308
1389
  } catch {
@@ -1361,6 +1442,10 @@ export function main(): number {
1361
1442
  // warranted"; there is no second, configurable notion of warranted layered
1362
1443
  // on top of it.
1363
1444
  const findings = runDetectors(inputs);
1445
+ // The live verdict's own row. It is written BEFORE the branch below, so a
1446
+ // turn the gate allows and a turn it refuses are both in the record — a
1447
+ // recall reading needs the allowed turns as its negative arm.
1448
+ recordGraphFeeder(inputs, findings, 'live');
1364
1449
  if (findings.length === 0) return EXIT_ALLOW;
1365
1450
 
1366
1451
  markRefusedTurn(
@@ -23,11 +23,14 @@ import fs from "node:fs";
23
23
  import path from "node:path";
24
24
  import { fileURLToPath, pathToFileURL } from "node:url";
25
25
 
26
+ import { enforcementFor } from "./check_enforcement_matrix.js";
26
27
  import {
27
28
  type JsonObject,
28
29
  type JsonValue,
29
30
  _load_yaml,
30
31
  } from "./hooks/dispatch_hook.js";
32
+ import { loadHostLowering } from "./hooks/host_lowering.js";
33
+ import { type SlotReading, readSlots } from "./report_enforcement_drift.js";
31
34
 
32
35
  // src/scripts/hooks_status.ts → parents[1] is the repo root (.../parents[2]
33
36
  // in the Python which lives one level deeper relative computation).
@@ -90,6 +93,18 @@ export interface PlatformRow {
90
93
  */
91
94
  ask: AskShape;
92
95
  bindings: Record<string, string[]>;
96
+ /**
97
+ * For each slot that binds at least one `blocking` concern, what that host's
98
+ * slot can actually carry — `refusal`, `warning-only`, `unverified` or
99
+ * `proof-expired` (road-to-blocking-severities 1.2).
100
+ *
101
+ * Slots with no blocking concern are ABSENT rather than present with a
102
+ * value, so a reader cannot mistake "nothing here claims to refuse" for a
103
+ * capability reading. Derived from `host_lowering.yaml`, never from the
104
+ * manifest: the manifest declares intent and only the lowering table records
105
+ * whether a refusal can land.
106
+ */
107
+ blocking_enforcement: Record<string, string>;
93
108
  hint: string | null;
94
109
  }
95
110
 
@@ -123,10 +138,79 @@ function _bridge_status(project_root: string, rel_path: string): string {
123
138
  return stat && stat.isFile() ? "installed" : "missing";
124
139
  }
125
140
 
141
+ /**
142
+ * `severity` per concern, read off the manifest this report already loaded.
143
+ *
144
+ * `(undeclared)` is folded into "not blocking": this report publishes the
145
+ * enforcement of concerns that CLAIM to refuse, and a concern that claims
146
+ * nothing has nothing to reconcile. `lint_hook_manifest` is what refuses an
147
+ * undeclared severity; duplicating that judgement here would put two answers
148
+ * in the tree.
149
+ */
150
+ function _severities(manifest: JsonObject): Map<string, string> {
151
+ const out = new Map<string, string>();
152
+ const concerns = manifest["concerns"];
153
+ if (!_isObject(concerns)) {
154
+ return out;
155
+ }
156
+ for (const [name, spec] of Object.entries(concerns)) {
157
+ const sev = _isObject(spec) ? spec["severity"] : undefined;
158
+ if (typeof sev === "string") {
159
+ out.set(name, sev);
160
+ }
161
+ }
162
+ return out;
163
+ }
164
+
165
+ /**
166
+ * What each slot carrying a `blocking` concern can actually do on this host.
167
+ *
168
+ * road-to-blocking-severities 1.2, the third surface. The decision and the
169
+ * vocabulary live in `check_enforcement_matrix`; this reads them rather than
170
+ * restating them, so the published document and this report cannot drift into
171
+ * two different answers to one question.
172
+ *
173
+ * Failure is SILENT and the field is simply absent. This is a read-only status
174
+ * report that the post-install smoke probe runs, and a malformed or missing
175
+ * lowering table must degrade it, never abort it — the gate is where a broken
176
+ * lowering table is supposed to fail.
177
+ */
178
+ function _blocking_enforcement(
179
+ platform: string,
180
+ bindings: Record<string, string[]>,
181
+ severities: Map<string, string>,
182
+ ): Record<string, string> {
183
+ const out: Record<string, string> = {};
184
+ let slots: SlotReading[];
185
+ try {
186
+ slots = readSlots(loadHostLowering(), platform).slots;
187
+ } catch {
188
+ return out;
189
+ }
190
+ const bySlot = new Map(slots.map((s) => [s.slot, s]));
191
+ for (const [event, concerns] of Object.entries(bindings)) {
192
+ if (!concerns.some((c) => severities.get(c) === "blocking")) {
193
+ continue;
194
+ }
195
+ const row = bySlot.get(event);
196
+ out[event] = enforcementFor(
197
+ row === undefined
198
+ ? "unlowerable"
199
+ : row.literal === null
200
+ ? "null-block"
201
+ : row.effective === null
202
+ ? "stale-proof"
203
+ : null,
204
+ );
205
+ }
206
+ return out;
207
+ }
208
+
126
209
  /** Build the runtime matrix as a plain object — JSON-serialisable. */
127
210
  export function collect(project_root: string, manifest: JsonObject): StatusMatrix {
128
211
  const platformsRaw = manifest["platforms"];
129
212
  const platforms = _isObject(platformsRaw) ? platformsRaw : {};
213
+ const severities = _severities(manifest);
130
214
  const rows: PlatformRow[] = [];
131
215
  for (const platform of Object.keys(PLATFORM_BRIDGES)) {
132
216
  const [rel, hint] = PLATFORM_BRIDGES[platform] as [string, string];
@@ -148,6 +232,7 @@ export function collect(project_root: string, manifest: JsonObject): StatusMatri
148
232
  rows.push({
149
233
  platform,
150
234
  status,
235
+ blocking_enforcement: _blocking_enforcement(platform, bindings, severities),
151
236
  bridge_path: rel || null,
152
237
  fallback_only,
153
238
  ask,
@@ -160,6 +245,23 @@ export function collect(project_root: string, manifest: JsonObject): StatusMatri
160
245
  return { schema_version: 1, platforms: rows };
161
246
  }
162
247
 
248
+ /**
249
+ * One short line per enforcement value, for the table.
250
+ *
251
+ * `unverified` says what is MISSING, never what the host cannot do — the same
252
+ * wording discipline `docs/enforcement-by-host.md` carries, and the reason this
253
+ * report distinguishes the two values at all.
254
+ */
255
+ const _ENFORCEMENT_NOTE: Record<string, string> = {
256
+ refusal: "the slot denies, so a blocking verdict stops the call",
257
+ "proof-expired":
258
+ "the slot can deny; this package's `verified` citation has lapsed",
259
+ "warning-only":
260
+ "`block_exit` is null here — they run and warn, they cannot refuse",
261
+ unverified:
262
+ "no lowering row for this slot — nothing bound natively, nothing established",
263
+ };
264
+
163
265
  const _STATUS_MARKER: Record<string, string> = {
164
266
  installed: "✅ ",
165
267
  missing: "❌ ",
@@ -199,6 +301,16 @@ export function _render_table(matrix: StatusMatrix): string {
199
301
  for (const event of Object.keys(row.bindings).sort()) {
200
302
  const concerns = row.bindings[event]?.join(", ") || "—";
201
303
  lines.push(` ${event.padEnd(22)} → ${concerns}`);
304
+ // road-to-blocking-severities 1.2 — printed only where a concern on this
305
+ // slot DECLARES `blocking`, and worded so `unverified` never reads as a
306
+ // claim about the host.
307
+ const enforcement = row.blocking_enforcement[event];
308
+ if (enforcement !== undefined) {
309
+ lines.push(
310
+ ` ${" ".repeat(22)} blocking concerns here: ${enforcement} — ` +
311
+ `${_ENFORCEMENT_NOTE[enforcement] ?? "see docs/enforcement-by-host.md"}`,
312
+ );
313
+ }
202
314
  }
203
315
  if (row.hint) {
204
316
  lines.push(` hint: ${row.hint}`);
@@ -214,6 +214,13 @@ export const OUTPUT_KEYS: readonly string[] = [
214
214
  "toolResponse",
215
215
  "tool_result",
216
216
  "toolUseResult",
217
+ // The failure event's result body. A FAILING command on claude carries its
218
+ // stdout and stderr here and carries no `tool_response` at all, so without
219
+ // this line a failed `curl` of a hostile page would reach the model with
220
+ // nothing scanned — the one direction where the output is most likely to be
221
+ // attacker-shaped. Caught by this concern's own coverage test, which pins
222
+ // OUTPUT_KEYS as a superset of what the dispatcher serves.
223
+ "error",
217
224
  // Generic spellings accepted since this concern shipped.
218
225
  "output",
219
226
  "result",
@@ -70,9 +70,13 @@ cat > "$HOOKS_DIR/pre-push" << 'EOF'
70
70
  # belongs here; resolution belongs to a step run with the result in front of
71
71
  # you. When this hook refuses for staleness, the thing that fixes it is
72
72
  #
73
- # task push-ready # fetch -> integrate the base SET -> regenerate
74
- # # -> verify -> re-check freshness -> push
75
- # task push-ready DRY=1 # the same six steps, read-only
73
+ # task push-ready BASE=<base> # fetch -> integrate the base SET -> regenerate
74
+ # # -> verify -> re-check freshness -> push
75
+ # task push-ready DRY=1 BASE=<base> # the same six steps, read-only
76
+ #
77
+ # `<base>` is the base the refusal names. Without BASE the base comes from the
78
+ # open pull request (gh pr view), and is the default branch only when there is
79
+ # no open pull request or no gh.
76
80
  #
77
81
  # The base is a SET: a branch targeting a release line or a stacked parent may
78
82
  # also have to integrate the default branch, per the branch-convergence policy
@@ -141,23 +145,47 @@ fail=0
141
145
  # no useful second finding to collect from a tree that is about to move.
142
146
  #
143
147
  # It never merges. `check_branch_freshness` asks the REMOTE (one `ls-remote`,
144
- # measured 4.5s) and returns 1 only on a VERIFIED behind state; offline, in CI,
145
- # on a detached HEAD, or standing on the base itself it returns 0 and says so.
146
- # So an unreachable network cannot block a push, and a stale local tracking ref
147
- # cannot fake a green.
148
+ # measured 4.5s) and returns 1 on a VERIFIED behind state, or when the remote
149
+ # answered without the base at all (a misspelled or deleted base); offline, in
150
+ # CI, on a detached HEAD, or standing on the base itself it returns 0 and says
151
+ # so. So an unreachable network cannot block a push, and a stale local tracking
152
+ # ref cannot fake a green. The refusal below names which of the two it was, read
153
+ # from the gate's own lines, so a typo is never reported as staleness.
148
154
  echo "🔍 Base freshness — is this branch behind the base it will merge into?"
149
155
  if [ "${AGENT_CONFIG_SKIP_PREPUSH_FRESHNESS:-}" = "1" ]; then
150
156
  echo "⏭️ skipped via AGENT_CONFIG_SKIP_PREPUSH_FRESHNESS=1"
151
157
  elif [ ! -x ./scripts-run ]; then
152
158
  echo "⚠️ ./scripts-run not found — skipping the freshness check for this push."
153
- elif ! ./scripts-run src/scripts/check_branch_freshness --quiet; then
154
- echo ""
155
- echo " Push blocked — the branch is behind its base, and the gates you just"
156
- echo " passed were answered against a base that no longer exists."
159
+ else
160
+ fresh_rc=0
161
+ fresh_out=$(./scripts-run src/scripts/check_branch_freshness --quiet 2>&1) || fresh_rc=$?
162
+ [ -z "$fresh_out" ] || printf '%s\n' "$fresh_out"
163
+ fi
164
+ if [ "${fresh_rc:-0}" -ne 0 ]; then
165
+ # The gate prints the base in the spelling `task push-ready` accepts.
166
+ base=$(printf '%s\n' "$fresh_out" | sed -n 's/^ *task push-ready BASE=\([^ ]*\).*/\1/p' | head -n 1)
167
+ absent=$(printf '%s\n' "$fresh_out" | sed -n 's/.*base `\([^`]*\)` does not exist on \([^ ]*\) .*/\2\/\1/p' | head -n 1)
157
168
  echo ""
158
- echo " task push-ready # fetch → integrate the base SET → regenerate"
159
- echo " # → verify → re-check freshness, then push"
160
- echo " task push-ready DRY=1 # the same steps, read-only"
169
+ if [ -n "$base" ]; then
170
+ echo " Push blocked — the branch is behind its base, and the gates you just"
171
+ echo " passed were answered against a base that no longer exists."
172
+ echo ""
173
+ echo " task push-ready BASE=$base # fetch → integrate the base SET"
174
+ echo " # → regenerate → verify → re-check"
175
+ echo " task push-ready DRY=1 BASE=$base # the same steps, read-only"
176
+ elif printf '%s\n' "$fresh_out" | grep -q 'branch is BEHIND'; then
177
+ # A strategy that does not merge gets no push-ready line; its remedy
178
+ # is printed by the gate itself.
179
+ echo " Push blocked — the branch is behind its base. The remedy for this"
180
+ echo " project's update strategy is printed above."
181
+ elif [ -n "$absent" ]; then
182
+ echo " Push blocked — the base $absent does not exist on the remote: a"
183
+ echo " misspelled or deleted base, not a stale branch. Name a branch the"
184
+ echo " remote has (--base main and --base origin/main are the same branch)."
185
+ else
186
+ echo " Push blocked — the freshness gate refused without a verdict line;"
187
+ echo " its output is above."
188
+ fi
161
189
  echo ""
162
190
  echo " This hook refuses; it never merges. Bypass a genuine WIP push with"
163
191
  echo " AGENT_CONFIG_SKIP_PREPUSH_FRESHNESS=1."