@event4u/agent-config 16.3.0 → 16.5.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 (532) 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 +178 -78
  5. package/README.md +2 -2
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +10 -7
  8. package/dist/agent-src/commands/bug/investigate.md +1 -1
  9. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  10. package/dist/agent-src/commands/commit.md +72 -33
  11. package/dist/agent-src/commands/condense.md +2 -8
  12. package/dist/agent-src/commands/council/debate.md +11 -7
  13. package/dist/agent-src/commands/council/default.md +10 -9
  14. package/dist/agent-src/commands/council.md +1 -1
  15. package/dist/agent-src/commands/design.md +1 -1
  16. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  17. package/dist/agent-src/commands/feature/explore.md +3 -3
  18. package/dist/agent-src/commands/feature/plan.md +1 -1
  19. package/dist/agent-src/commands/fix/ci.md +17 -3
  20. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  21. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  22. package/dist/agent-src/commands/implement-ticket.md +3 -3
  23. package/dist/agent-src/commands/memory/add.md +4 -16
  24. package/dist/agent-src/commands/memory/load.md +5 -6
  25. package/dist/agent-src/commands/memory/promote.md +3 -16
  26. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  27. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  28. package/dist/agent-src/commands/optimize/deep.md +4 -2
  29. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  30. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  31. package/dist/agent-src/commands/pr/create.md +42 -34
  32. package/dist/agent-src/commands/pr/merge.md +136 -9
  33. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  34. package/dist/agent-src/commands/project/analyze.md +7 -35
  35. package/dist/agent-src/commands/refine-ticket.md +1 -1
  36. package/dist/agent-src/commands/review/changes.md +14 -19
  37. package/dist/agent-src/commands/roadmap/next.md +10 -1
  38. package/dist/agent-src/commands/roadmap/process-full.md +52 -38
  39. package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
  40. package/dist/agent-src/commands/worktree/create.md +7 -3
  41. package/dist/agent-src/commands/worktree/verify.md +2 -1
  42. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  43. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  44. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  45. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  46. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  47. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  48. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  49. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  50. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  51. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  52. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
  53. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  54. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  55. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  56. package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
  57. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  58. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  59. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  60. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  61. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  62. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  63. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  64. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  65. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  66. package/dist/agent-src/guidelines/design-antipatterns.md +1 -1
  67. package/dist/agent-src/guidelines/php/git.md +15 -2
  68. package/dist/agent-src/rules/active-remediation.md +0 -1
  69. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  70. package/dist/agent-src/rules/architecture.md +0 -1
  71. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  72. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  73. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  74. package/dist/agent-src/rules/autonomous-execution.md +0 -1
  75. package/dist/agent-src/rules/brand-consistency.md +0 -1
  76. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  77. package/dist/agent-src/rules/broken-access-control.md +0 -1
  78. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  79. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  80. package/dist/agent-src/rules/code-provenance.md +0 -1
  81. package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
  82. package/dist/agent-src/rules/commit-conventions.md +1 -2
  83. package/dist/agent-src/rules/communication-through-line.md +1 -2
  84. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  85. package/dist/agent-src/rules/context-hygiene.md +5 -5
  86. package/dist/agent-src/rules/copilot-routing.md +1 -2
  87. package/dist/agent-src/rules/council-availability.md +4 -4
  88. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  89. package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
  90. package/dist/agent-src/rules/delegation-policy.md +2 -3
  91. package/dist/agent-src/rules/design-fidelity.md +0 -1
  92. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  93. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  94. package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
  95. package/dist/agent-src/rules/docker-commands.md +0 -1
  96. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  97. package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
  98. package/dist/agent-src/rules/domain-safety-pii.md +0 -1
  99. package/dist/agent-src/rules/domain-safety-retention.md +0 -1
  100. package/dist/agent-src/rules/downstream-changes.md +0 -1
  101. package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
  102. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  103. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  104. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
  105. package/dist/agent-src/rules/finance-safety-floor.md +0 -1
  106. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  107. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  108. package/dist/agent-src/rules/git-history-discipline.md +1 -2
  109. package/dist/agent-src/rules/guidelines.md +0 -1
  110. package/dist/agent-src/rules/history-discipline.md +0 -1
  111. package/dist/agent-src/rules/icon-consistency.md +0 -1
  112. package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
  113. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  114. package/dist/agent-src/rules/invite-challenge.md +0 -1
  115. package/dist/agent-src/rules/laravel-routing.md +1 -2
  116. package/dist/agent-src/rules/laravel-translations.md +0 -1
  117. package/dist/agent-src/rules/legal-safety-floor.md +0 -1
  118. package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
  119. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  120. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
  121. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  122. package/dist/agent-src/rules/media-governance-routing.md +1 -2
  123. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  124. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  125. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  126. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  127. package/dist/agent-src/rules/model-recommendation.md +0 -1
  128. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  129. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  130. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  131. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  132. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  133. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  134. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  135. package/dist/agent-src/rules/output-discipline.md +0 -1
  136. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  137. package/dist/agent-src/rules/persona-governance.md +2 -3
  138. package/dist/agent-src/rules/php-coding.md +0 -1
  139. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  140. package/dist/agent-src/rules/preservation-guard.md +0 -1
  141. package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
  142. package/dist/agent-src/rules/question-not-instruction.md +0 -1
  143. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  144. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  145. package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
  146. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  147. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  148. package/dist/agent-src/rules/runtime-safety.md +0 -1
  149. package/dist/agent-src/rules/scale-discipline.md +0 -1
  150. package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
  151. package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
  152. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  153. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  154. package/dist/agent-src/rules/session-canary.md +0 -1
  155. package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
  156. package/dist/agent-src/rules/size-enforcement.md +0 -1
  157. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  158. package/dist/agent-src/rules/skill-quality.md +0 -1
  159. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  160. package/dist/agent-src/rules/source-confidentiality.md +0 -1
  161. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  162. package/dist/agent-src/rules/source-of-truth.md +0 -1
  163. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  164. package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
  165. package/dist/agent-src/rules/symfony-routing.md +1 -2
  166. package/dist/agent-src/rules/think-before-action.md +0 -1
  167. package/dist/agent-src/rules/token-budget-discipline.md +14 -48
  168. package/dist/agent-src/rules/token-efficiency.md +0 -1
  169. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  170. package/dist/agent-src/rules/tool-safety.md +0 -1
  171. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  172. package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
  173. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  174. package/dist/agent-src/rules/user-interaction.md +0 -1
  175. package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
  176. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  177. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  178. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +2 -0
  179. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  180. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  181. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  182. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  183. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  184. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  185. package/dist/agent-src/skills/canvas-design/SKILL.md +4 -2
  186. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  187. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  188. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  189. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  190. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  191. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  192. package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +13 -10
  193. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  194. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  195. package/dist/agent-src/skills/fe-design/references/design-patterns.md +49 -2
  196. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  197. package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
  198. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  199. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  200. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  201. package/dist/agent-src/skills/iconography/SKILL.md +4 -2
  202. package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
  203. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  204. package/dist/agent-src/skills/logo-generation/SKILL.md +12 -8
  205. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  206. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  207. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  208. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  209. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
  210. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  211. package/dist/agent-src/skills/svg-authoring/SKILL.md +318 -0
  212. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
  213. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  214. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  215. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  216. package/dist/agent-src/skills/wireframe/SKILL.md +5 -2
  217. package/dist/agent-src/templates/AGENTS.md +1 -1
  218. package/dist/agent-src/templates/agent-settings.md +46 -129
  219. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  220. package/dist/agent-src/templates/command.md +2 -2
  221. package/dist/agent-src/templates/roadmaps.md +6 -1
  222. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  223. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  224. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  225. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  226. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  227. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  228. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  229. package/dist/agent-src/templates/skill.md +1 -1
  230. package/dist/cli/commands/uiRender.js +201 -4
  231. package/dist/cli/commands/uiRenderAsset.js +1308 -0
  232. package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
  233. package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
  234. package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
  235. package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
  236. package/dist/cli/commands/uiRenderAssetTypes.js +145 -0
  237. package/dist/cli/main.js +47 -1
  238. package/dist/cli/registry.js +2 -1
  239. package/dist/cli-delegate/check_update_banner.js +195 -119
  240. package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-4DBG5K7M.js} +5 -5
  241. package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
  242. package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
  243. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  244. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  245. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  246. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  247. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  248. package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
  249. package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
  250. package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
  251. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  252. package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
  253. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  254. package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
  255. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  256. package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
  257. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  258. package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
  259. package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-TMWYUOK4.js} +75 -12
  260. package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
  261. package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
  262. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  263. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  264. package/dist/cli-delegate/cmd_conformance.js +489 -238
  265. package/dist/cli-delegate/cmd_converge.js +3 -3
  266. package/dist/cli-delegate/cmd_doctor.js +15 -12
  267. package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
  268. package/dist/cli-delegate/cmd_explain.js +43 -19
  269. package/dist/cli-delegate/cmd_export.js +10 -10
  270. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  271. package/dist/cli-delegate/cmd_handoff.js +40 -21
  272. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  273. package/dist/cli-delegate/cmd_migrate.js +3 -3
  274. package/dist/cli-delegate/cmd_packs_active.js +4 -3
  275. package/dist/cli-delegate/cmd_prune.js +10 -10
  276. package/dist/cli-delegate/cmd_route_audit.js +7 -7
  277. package/dist/cli-delegate/cmd_route_explain.js +5 -5
  278. package/dist/cli-delegate/cmd_session_recycle.js +9 -7
  279. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  280. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  281. package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
  282. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  283. package/dist/cli-delegate/cmd_sync.js +10 -10
  284. package/dist/cli-delegate/cmd_uninstall.js +10 -10
  285. package/dist/cli-delegate/cmd_update.js +7 -7
  286. package/dist/cli-delegate/cmd_upgrade.js +7 -7
  287. package/dist/cli-delegate/cmd_validate.js +10 -10
  288. package/dist/cli-delegate/cmd_versions.js +5 -5
  289. package/dist/cli-delegate/gate_budget.js +1 -1
  290. package/dist/cli-delegate/gate_execute.js +2 -2
  291. package/dist/cli-delegate/roadmap_gates.js +2 -2
  292. package/dist/discovery/deprecation-report.md +1 -1
  293. package/dist/discovery/discovery-manifest.json +171 -107
  294. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  295. package/dist/discovery/discovery-manifest.summary.md +7 -7
  296. package/dist/discovery/dormancy-report.md +1 -1
  297. package/dist/discovery/orphan-report.md +1 -1
  298. package/dist/discovery/packs.json +41 -22
  299. package/dist/discovery/trust-report.md +3 -3
  300. package/dist/discovery/workspaces.json +16 -11
  301. package/dist/hooks/dispatch.js +2520 -1924
  302. package/dist/hooks/dispatch.sha256 +1 -1
  303. package/dist/hooks/svg_rules.chunk.cjs +1626 -0
  304. package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
  305. package/dist/install/install.mjs +462 -431
  306. package/dist/install/installThinLayer.js +40 -12
  307. package/dist/install/installedRuleLinks.js +105 -19
  308. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  309. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  310. package/dist/mcp/registry-manifest.json +5 -5
  311. package/dist/mcp/server.json +2 -2
  312. package/dist/mcp/server.mjs +3063 -2160
  313. package/dist/router.json +1 -1
  314. package/dist/scripts/_lib/agent_settings.js +15 -120
  315. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  316. package/dist/scripts/_lib/git_convention.js +232 -0
  317. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  318. package/dist/scripts/_lib/installed_layer.js +344 -18
  319. package/dist/scripts/_lib/package_root.js +68 -0
  320. package/dist/scripts/_lib/rule_law_section.js +1 -1
  321. package/dist/scripts/_lib/scan_scope.js +105 -0
  322. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  323. package/dist/scripts/_lib/svg_dom.js +284 -0
  324. package/dist/scripts/_lib/svg_geometry.js +477 -0
  325. package/dist/scripts/_lib/svg_motion.js +179 -0
  326. package/dist/scripts/_lib/svg_rules.js +1337 -0
  327. package/dist/scripts/_lib/svg_urls.js +67 -0
  328. package/dist/scripts/_lib/thin_rules.js +80 -3
  329. package/dist/scripts/lint_svg_asset.js +324 -0
  330. package/dist/server/app.js +2 -1
  331. package/dist/server/gitKeysGate.js +105 -0
  332. package/dist/server/routes/settings.js +67 -8
  333. package/dist/server/routes/wizard.js +4 -0
  334. package/dist/server/schemas/settings.js +23 -81
  335. package/dist/shared/skillRanking.js +30 -4
  336. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  337. package/dist/ui/index.html +1 -1
  338. package/docs/MIGRATION.md +72 -1
  339. package/docs/contracts/settings-classes.md +35 -65
  340. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  341. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  342. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  343. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  344. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  345. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  346. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  347. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  348. package/docs/guidelines/design-antipatterns.md +1 -1
  349. package/docs/guidelines/php/git.md +15 -2
  350. package/package.json +4 -3
  351. package/src/agent-src/scripts/gate_budget.ts +47 -23
  352. package/src/agent-src/scripts/gate_execute.ts +12 -4
  353. package/src/agent-src/templates/AGENTS.md +1 -1
  354. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  355. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  356. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  357. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  358. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  359. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  360. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  361. package/src/config/agent-settings.template.yml +79 -312
  362. package/src/config/agents-paths.yml +16 -0
  363. package/src/config/assurance-capability-registry.json +7 -3
  364. package/src/config/ci-local-parity.yml +3 -0
  365. package/src/config/continuity-surface.json +3 -3
  366. package/src/config/discovery/packs.yml +17 -1
  367. package/src/config/evaluator-budgets.json +19 -6
  368. package/src/config/gate-coverage.yml +65 -23
  369. package/src/config/gate-violation-baselines.json +56 -16
  370. package/src/config/gitignore-block.txt +19 -0
  371. package/src/config/hook-bundle-budget.json +1 -1
  372. package/src/config/release-gate-locality.yml +2 -1
  373. package/src/config/routing-coverage-seed.json +55 -6
  374. package/src/config/rule-law-ceilings.json +12 -6
  375. package/src/config/rule-obligations.json +833 -0
  376. package/src/install/installThinLayer.ts +76 -10
  377. package/src/install/installedRuleLinks.ts +105 -17
  378. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  379. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  380. package/src/scripts/_cli/cmd_doctor.ts +10 -10
  381. package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
  382. package/src/scripts/_cli/cmd_explain.ts +72 -14
  383. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  384. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  385. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  386. package/src/scripts/_cli/doctor_execution.ts +72 -1
  387. package/src/scripts/_dispatch.bash +37 -2
  388. package/src/scripts/_lib/agent_settings.ts +15 -124
  389. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  390. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  391. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  392. package/src/scripts/_lib/git_base_ref.ts +92 -0
  393. package/src/scripts/_lib/git_convention.ts +291 -0
  394. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  395. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  396. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  397. package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
  398. package/src/scripts/_lib/graph_feeder_record.ts +236 -13
  399. package/src/scripts/_lib/installed_layer.ts +448 -23
  400. package/src/scripts/_lib/knowledge_global.ts +14 -1
  401. package/src/scripts/_lib/module_reach.ts +456 -0
  402. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  403. package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
  404. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  405. package/src/scripts/_lib/ratification_subject.ts +92 -0
  406. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  407. package/src/scripts/_lib/release_highlights.ts +5 -0
  408. package/src/scripts/_lib/rule_law_section.ts +1 -1
  409. package/src/scripts/_lib/rule_obligations.ts +205 -0
  410. package/src/scripts/_lib/self_repair.ts +1 -1
  411. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  412. package/src/scripts/_lib/svg_dom.ts +318 -0
  413. package/src/scripts/_lib/svg_geometry.ts +480 -0
  414. package/src/scripts/_lib/svg_motion.ts +208 -0
  415. package/src/scripts/_lib/svg_rules.ts +1453 -0
  416. package/src/scripts/_lib/svg_urls.ts +72 -0
  417. package/src/scripts/_lib/test_red_state.ts +5 -0
  418. package/src/scripts/_lib/thin_rules.ts +83 -3
  419. package/src/scripts/_lib/touched_file_quality.ts +142 -6
  420. package/src/scripts/_lib/verification_command.ts +59 -0
  421. package/src/scripts/_lib/verify_clause.ts +27 -17
  422. package/src/scripts/_lib/worker_budget.ts +1 -1
  423. package/src/scripts/adr/regenerate_index.ts +16 -1
  424. package/src/scripts/ai_council/config.ts +7 -7
  425. package/src/scripts/ai_council/modification_review.ts +100 -0
  426. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  427. package/src/scripts/ai_council/orchestrator.ts +5 -5
  428. package/src/scripts/ai_council/spend_gate.ts +18 -7
  429. package/src/scripts/ai_team/config.ts +11 -16
  430. package/src/scripts/audit_user_type_axis.ts +20 -8
  431. package/src/scripts/bench_ab_clone.ts +1 -2
  432. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  433. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  434. package/src/scripts/check_agent_artifact_location.ts +36 -0
  435. package/src/scripts/check_branch_freshness.ts +147 -24
  436. package/src/scripts/check_enforcement_coverage.ts +130 -0
  437. package/src/scripts/check_evaluator_budgets.ts +4 -0
  438. package/src/scripts/check_finding_dispositions.ts +88 -25
  439. package/src/scripts/check_gate_coverage.ts +4 -3
  440. package/src/scripts/check_gate_reachability.ts +48 -1
  441. package/src/scripts/check_generator_sync.ts +48 -0
  442. package/src/scripts/check_hook_bundle_composition.ts +107 -0
  443. package/src/scripts/check_kernel_edit_ratified.ts +86 -6
  444. package/src/scripts/check_pack_size.ts +1 -1
  445. package/src/scripts/check_release_manifest_content.ts +189 -0
  446. package/src/scripts/check_standing_rule_delivery.ts +96 -0
  447. package/src/scripts/check_suppression_hygiene.ts +2 -5
  448. package/src/scripts/ci_settle.ts +42 -5
  449. package/src/scripts/classify_merge_risk.ts +320 -0
  450. package/src/scripts/closure_scan.ts +91 -1
  451. package/src/scripts/command_suggester/settings.ts +8 -108
  452. package/src/scripts/command_suggester/types.ts +4 -5
  453. package/src/scripts/consumer_matrix.ts +102 -0
  454. package/src/scripts/context_hygiene_hook.ts +13 -23
  455. package/src/scripts/cost/preflight.mjs +12 -1
  456. package/src/scripts/council_cli.ts +7 -7
  457. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  458. package/src/scripts/explain_run.ts +8 -13
  459. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  460. package/src/scripts/generate_host_cost_table.ts +20 -3
  461. package/src/scripts/handoff_context_hook.ts +86 -37
  462. package/src/scripts/hook_manifest.json +1 -1
  463. package/src/scripts/hook_manifest.yaml +25 -6
  464. package/src/scripts/hooks/block_config_weakening.ts +48 -5
  465. package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
  466. package/src/scripts/hooks/block_speaking_inbox_dir.ts +16 -1
  467. package/src/scripts/hooks/concern_registry.ts +2 -0
  468. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  469. package/src/scripts/hooks/design_pass_hook.ts +157 -3
  470. package/src/scripts/hooks/evidence_independence.ts +12 -4
  471. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  472. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  473. package/src/scripts/hooks/rule_inject_hook.ts +44 -3
  474. package/src/scripts/hooks/state_io.ts +8 -4
  475. package/src/scripts/hooks/svg_obligation.ts +497 -0
  476. package/src/scripts/hooks/svg_rules_loader.ts +133 -0
  477. package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
  478. package/src/scripts/hooks/turn_end_gate_hook.ts +6 -3
  479. package/src/scripts/install-hooks.sh +42 -14
  480. package/src/scripts/install.ts +7 -31
  481. package/src/scripts/lint_blocker_citations.ts +198 -0
  482. package/src/scripts/lint_consolidation_lineage.ts +6 -3
  483. package/src/scripts/lint_design_quality.ts +60 -12
  484. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  485. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  486. package/src/scripts/lint_motion_authority_drift.ts +27 -0
  487. package/src/scripts/lint_pack_boundaries.ts +406 -28
  488. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  489. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  490. package/src/scripts/lint_rule_law_section.ts +151 -21
  491. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  492. package/src/scripts/lint_settings_classes.ts +1 -1
  493. package/src/scripts/lint_svg_asset.ts +365 -0
  494. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  495. package/src/scripts/lint_workflow_security.ts +12 -1
  496. package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
  497. package/src/scripts/model_rule_injection.ts +3 -3
  498. package/src/scripts/onboarding_gate_hook.ts +7 -6
  499. package/src/scripts/print_required_checks.ts +15 -3
  500. package/src/scripts/probe_host_compliance.ts +33 -5
  501. package/src/scripts/probe_turnaround.ts +183 -3
  502. package/src/scripts/ratification_header.ts +77 -0
  503. package/src/scripts/refusal_envelope.ts +138 -0
  504. package/src/scripts/release_publication.ts +29 -3
  505. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  506. package/src/scripts/report_installed_rule_links.ts +118 -1
  507. package/src/scripts/report_module_reach.ts +212 -0
  508. package/src/scripts/report_obligation_mechanism.ts +16 -18
  509. package/src/scripts/report_parked_blockers.ts +222 -0
  510. package/src/scripts/report_required_checks_drift.ts +196 -0
  511. package/src/scripts/report_skill_ranker_confusion.ts +103 -2
  512. package/src/scripts/report_standing_payload_by_host.ts +1 -1
  513. package/src/scripts/routing_doctor.ts +2 -2
  514. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  515. package/src/scripts/schemas/command.schema.json +1 -1
  516. package/src/scripts/schemas/skill.schema.json +1 -1
  517. package/src/scripts/self_review_gate.ts +39 -2
  518. package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
  519. package/src/scripts/sync_pr_branch.ts +403 -132
  520. package/src/scripts/trigger_eval_grandfather.json +0 -16
  521. package/src/server/schemas/settings.ts +33 -177
  522. package/src/shared/skillRanking.ts +53 -4
  523. package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
  524. package/src/scripts/_lib/config_chain.ts +0 -477
  525. package/src/scripts/_lib/conformance_report.ts +0 -403
  526. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  527. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  528. package/src/scripts/_lib/file_slicer.ts +0 -117
  529. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  530. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  531. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  532. package/src/scripts/_lib/role_split.ts +0 -338
@@ -1,16 +1,17 @@
1
1
  /**
2
- * Read `commands.suggestion.*` from `.agent-settings.yml` into `Settings`.
2
+ * Read `commands.suggestion.blocklist` from `.agent-settings.yml` into `Settings`.
3
3
  *
4
4
  * Ported from the retired Python `src/scripts/command_suggester/settings.py`
5
5
  * (ADR-200 py2ts). Mirror of the chat-history pattern:
6
6
  *
7
- * - Default-permissive: a missing file or missing section returns
8
- * `Settings()` defaults (suggestion layer enabled). Only an explicit
9
- * `enabled: false` flips the master switch off.
7
+ * - The blocklist is the only suggestion key a project still sets. The
8
+ * master switch, floor, cooldown and option cap are engine constants in
9
+ * `Settings`: their keys were retired with those defaults as the fixed
10
+ * behavior, so a leftover value is warned about by the loader and never
11
+ * read here.
10
12
  * - Malformed YAML / unreadable file → defaults; the suggester degrades
11
13
  * silently rather than crashing the turn.
12
- * - Type-coerces with bounded fallbacks (floors clamped 0.0-1.0, ints
13
- * non-negative, blocklist forced to an array of strings).
14
+ * - The blocklist is forced to an array of non-empty strings.
14
15
  *
15
16
  * The Python module reads the YAML via the shared `agent_settings`
16
17
  * loader; this twin delegates to the ported `agent_settings.ts`.
@@ -61,54 +62,7 @@ function _read_section(path: string): Record<string, unknown> | null {
61
62
  }
62
63
 
63
64
  function _settings_from_raw(raw: Record<string, unknown>): Settings {
64
- return new Settings({
65
- enabled: _coerce_bool(raw.enabled, _DEFAULT.enabled),
66
- confidence_floor: _coerce_floor(raw.confidence_floor, _DEFAULT.confidence_floor),
67
- cooldown_seconds: _coerce_nonneg_int(raw.cooldown_seconds, _DEFAULT.cooldown_seconds),
68
- max_options: _coerce_nonneg_int(raw.max_options, _DEFAULT.max_options),
69
- blocklist: _coerce_str_tuple(raw.blocklist),
70
- });
71
- }
72
-
73
- function _coerce_bool(value: unknown, defaultValue: boolean): boolean {
74
- if (typeof value === 'boolean') {
75
- return value;
76
- }
77
- if (value === null || value === undefined) {
78
- return defaultValue;
79
- }
80
- if (typeof value === 'string') {
81
- const s = value.trim().toLowerCase();
82
- if (['true', 'yes', 'on', '1'].includes(s)) {
83
- return true;
84
- }
85
- if (['false', 'no', 'off', '0'].includes(s)) {
86
- return false;
87
- }
88
- }
89
- return defaultValue;
90
- }
91
-
92
- function _coerce_floor(value: unknown, defaultValue: number): number {
93
- const f = _pyFloat(value);
94
- if (f === null) {
95
- return defaultValue;
96
- }
97
- if (f < 0.0) {
98
- return 0.0;
99
- }
100
- if (f > 1.0) {
101
- return 1.0;
102
- }
103
- return f;
104
- }
105
-
106
- function _coerce_nonneg_int(value: unknown, defaultValue: number): number {
107
- const i = _pyInt(value);
108
- if (i === null) {
109
- return defaultValue;
110
- }
111
- return i >= 0 ? i : defaultValue;
65
+ return new Settings({ blocklist: _coerce_str_tuple(raw.blocklist) });
112
66
  }
113
67
 
114
68
  function _coerce_str_tuple(value: unknown): string[] {
@@ -127,60 +81,6 @@ function _coerce_str_tuple(value: unknown): string[] {
127
81
  return out;
128
82
  }
129
83
 
130
- /**
131
- * Mirror of Python `float(value)`, returning null where Python raises
132
- * `TypeError` / `ValueError` (the coercion catches those and falls
133
- * back to the default).
134
- */
135
- function _pyFloat(value: unknown): number | null {
136
- if (typeof value === 'boolean') {
137
- return value ? 1.0 : 0.0;
138
- }
139
- if (typeof value === 'number') {
140
- return value;
141
- }
142
- if (typeof value === 'string') {
143
- const s = value.trim();
144
- if (s === '') {
145
- return null;
146
- }
147
- const n = Number(s);
148
- return Number.isNaN(n) ? null : n;
149
- }
150
- return null;
151
- }
152
-
153
- /**
154
- * Mirror of Python `int(value)` for the YAML scalar types, returning
155
- * null where Python raises.
156
- *
157
- * - bool → 1 / 0.
158
- * - int → itself.
159
- * - float → truncated toward zero (Python `int(3.9) == 3`).
160
- * - string → `int(str, 10)` semantics: an optional sign + digits,
161
- * surrounding whitespace allowed; a float-shaped string raises in
162
- * Python, so it maps to null.
163
- */
164
- function _pyInt(value: unknown): number | null {
165
- if (typeof value === 'boolean') {
166
- return value ? 1 : 0;
167
- }
168
- if (typeof value === 'number') {
169
- if (Number.isNaN(value) || !Number.isFinite(value)) {
170
- return null;
171
- }
172
- return Math.trunc(value);
173
- }
174
- if (typeof value === 'string') {
175
- const s = value.trim();
176
- if (!/^[+-]?\d+$/.test(s)) {
177
- return null;
178
- }
179
- return parseInt(s, 10);
180
- }
181
- return null;
182
- }
183
-
184
84
  function _isPlainObject(value: unknown): value is Record<string, unknown> {
185
85
  return typeof value === 'object' && value !== null && !Array.isArray(value);
186
86
  }
@@ -98,11 +98,10 @@ export class Match {
98
98
  }
99
99
 
100
100
  /**
101
- * Runtime knobs read from `.agent-settings.yml`.
102
- *
103
- * Defaults match the "open decisions" leans in the roadmap.
104
- * Per-command frontmatter values override the global floor /
105
- * cooldown.
101
+ * Engine knobs. Only `blocklist` comes from `.agent-settings.yml`; the
102
+ * other four are fixed defaults (their settings keys were retired), still
103
+ * overridable by a caller that constructs `Settings` directly.
104
+ * Per-command frontmatter values override the floor / cooldown.
106
105
  *
107
106
  * Mirrors `@dataclass(frozen=True)`. The Python default `blocklist`
108
107
  * is an empty tuple; here it is a readonly string array, canonicalized
@@ -515,6 +515,107 @@ function legProjections(ctx: Ctx): string {
515
515
  return 'cursor + windsurf + claude projection trees present in global scope';
516
516
  }
517
517
 
518
+ // ── git-convention leg ─────────────────────────────────────────────
519
+ //
520
+ // A consumer project has neither `scripts-run` nor `node_modules`, so the only
521
+ // code an installed command can reach is the `agent-config` binary. `/pr:merge`
522
+ // reads the update strategy through `git:convention show`; this leg runs that
523
+ // verb from the packed install in a repository that commits a
524
+ // `.git-convention.yml` and pushes it to an `origin`, so the strategy resolves
525
+ // at a real target commit.
526
+
527
+ const GIT_CONVENTION_CARRIER = 'git:\n commit_format: ticket-conventional\n update_strategy: rebase\n';
528
+
529
+ /** The verdict on `git:convention show --json`; throws with the reason on any miss. */
530
+ export function checkGitConventionShow(status: number, stdout: string, stderr = ''): string {
531
+ if (status !== 0) throw new Error(`git:convention show exit ${status}: ${(stdout + stderr).slice(-400)}`);
532
+ let parsed: { keys?: Record<string, { value?: unknown; state?: unknown; source?: unknown }> };
533
+ try {
534
+ parsed = JSON.parse(stdout) as typeof parsed;
535
+ } catch {
536
+ throw new Error(`git:convention show --json printed output that is not JSON: ${stdout.slice(0, 200)}`);
537
+ }
538
+ const expected: Record<string, string> = { commit_format: 'ticket-conventional', update_strategy: 'rebase' };
539
+ for (const [key, value] of Object.entries(expected)) {
540
+ const r = parsed.keys?.[key];
541
+ const fromCarrier = typeof r?.source === 'string' && r.source.includes('.git-convention.yml');
542
+ if (r?.value !== value || r.state !== 'valid' || !fromCarrier) {
543
+ throw new Error(`git.${key} did not resolve from the committed carrier: ${JSON.stringify(r ?? null)}`);
544
+ }
545
+ }
546
+ return 'commit_format=ticket-conventional, update_strategy=rebase, both from the committed .git-convention.yml';
547
+ }
548
+
549
+ /**
550
+ * The verdict on `git:convention subject` from the packed install: a valid
551
+ * subject resolves (exit 0), and a ticket inside a compound scope is rejected
552
+ * (exit 1) under the committed `ticket-conventional`.
553
+ */
554
+ export function checkGitConventionSubject(
555
+ valid: { status: number; stdout: string; stderr?: string },
556
+ compound: { status: number; stdout: string; stderr?: string },
557
+ ): string {
558
+ if (valid.status !== 0) {
559
+ throw new Error(`git:convention subject rejected a valid subject, exit ${valid.status}: ${(valid.stdout + (valid.stderr ?? '')).slice(-400)}`);
560
+ }
561
+ if (compound.status !== 1 || !compound.stdout.includes('inside the scope')) {
562
+ throw new Error(`git:convention subject did not reject a ticket inside a compound scope, exit ${compound.status}: ${compound.stdout.slice(-400)}`);
563
+ }
564
+ return 'a valid subject resolves; a ticket inside a compound scope is rejected';
565
+ }
566
+
567
+ /**
568
+ * The verdict on `git:convention sync` from the packed install: the update
569
+ * `/pr:merge` § 2 runs. A current branch exits 0; a behind one is refused with
570
+ * exit 3 under the committed `rebase`, never merged.
571
+ */
572
+ export function checkGitConventionSync(
573
+ current: { status: number; stdout: string; stderr?: string },
574
+ behind: { status: number; stdout: string; stderr?: string },
575
+ ): string {
576
+ if (current.status !== 0) {
577
+ throw new Error(`git:convention sync did not pass a current branch, exit ${current.status}: ${(current.stdout + (current.stderr ?? '')).slice(-400)}`);
578
+ }
579
+ if (behind.status !== 3 || !behind.stdout.includes('git.update_strategy is `rebase`')) {
580
+ throw new Error(`git:convention sync did not refuse a behind branch under rebase, exit ${behind.status}: ${behind.stdout.slice(-400)}`);
581
+ }
582
+ return 'sync passes a current branch and refuses a behind one with exit 3';
583
+ }
584
+
585
+ function legGitConvention(ctx: Ctx): string {
586
+ const env = binEnv(ctx);
587
+ const remote = path.join(ctx.tmpRoot, 'git-convention-origin.git');
588
+ const repo = path.join(ctx.tmpRoot, 'git-convention-project');
589
+ const git = (cwd: string, ...args: string[]): void => {
590
+ const r = run('git', ['-c', 'user.name=matrix', '-c', 'user.email=matrix@example.com', '-c', 'commit.gpgsign=false', ...args], {
591
+ cwd,
592
+ env,
593
+ });
594
+ if (r.status !== 0) throw new Error(`git ${args[0] ?? ''} failed: ${r.stderr.slice(-300)}`);
595
+ };
596
+ git(ctx.tmpRoot, 'init', '-q', '--bare', '-b', 'main', remote);
597
+ git(ctx.tmpRoot, 'init', '-q', '-b', 'main', repo);
598
+ fs.writeFileSync(path.join(repo, '.git-convention.yml'), GIT_CONVENTION_CARRIER);
599
+ git(repo, 'add', '.git-convention.yml');
600
+ git(repo, 'commit', '-q', '-m', 'declare the git convention');
601
+ git(repo, 'remote', 'add', 'origin', remote);
602
+ git(repo, 'push', '-q', '-u', 'origin', 'main');
603
+ const r = run(ctx.bin, ['git:convention', 'show', '--json', '--base', 'origin/main'], { cwd: repo, env });
604
+ const shown = checkGitConventionShow(r.status, r.stdout, r.stderr);
605
+ const subject = (line: string) => run(ctx.bin, ['git:convention', 'subject'], { cwd: repo, env, input: `${line}\n` });
606
+ const subjects = checkGitConventionSubject(subject('DEV-1 feat(api): add x'), subject('DEV-1 feat(api,DEV-1): add x'));
607
+ const sync = () => run(ctx.bin, ['git:convention', 'sync', '--base', 'origin/main'], { cwd: repo, env });
608
+ git(repo, 'switch', '-q', '-c', 'feature');
609
+ const current = sync();
610
+ git(repo, 'switch', '-q', 'main');
611
+ fs.writeFileSync(path.join(repo, 'advance.txt'), 'advance\n');
612
+ git(repo, 'add', 'advance.txt');
613
+ git(repo, 'commit', '-q', '-m', 'advance main');
614
+ git(repo, 'push', '-q', 'origin', 'main');
615
+ git(repo, 'switch', '-q', 'feature');
616
+ return `${shown}; ${subjects}; ${checkGitConventionSync(current, sync())}`;
617
+ }
618
+
518
619
  function legUninstall(ctx: Ctx): string {
519
620
  const r = run(ctx.bin, ['uninstall', '--global', '--tools=claude-code,cursor,windsurf', '--force'], {
520
621
  cwd: ctx.projectDir,
@@ -570,6 +671,7 @@ const LEGS: Array<{ name: string; fn: (ctx: Ctx) => string | Promise<string> }>
570
671
  { name: 'hooks', fn: legHooks },
571
672
  { name: 'hook-lifecycle', fn: legHookLifecycle },
572
673
  { name: 'projections', fn: legProjections },
674
+ { name: 'git-convention', fn: legGitConvention },
573
675
  { name: 'uninstall', fn: legUninstall },
574
676
  { name: 'upgrade', fn: legUpgrade },
575
677
  ];
@@ -7,21 +7,25 @@
7
7
  * module exactly (snake_case kept deliberately — fidelity over TS idiom).
8
8
  *
9
9
  * Maintains a deterministic state file the rule body cites for the
10
- * freshness threshold, the 3-failure stop, and tool-loop detection. The
11
- * agent's job shrinks from "remember three counters" to "read this file
12
- * before responding".
10
+ * freshness threshold and the 3-failure stop. The agent's job shrinks from
11
+ * "remember counters" to "read this file before responding".
13
12
  *
14
13
  * Output: `agents/state/context-hygiene.json`
15
14
  * {
16
15
  * "tool_calls": <int>, // running PostToolUse count
17
- * "consecutive_same_tool": <int>, // includes the latest call
18
- * "last_tool": "<name>",
19
16
  * "tool_history": [..., last 5 names],
20
- * "loop_detected": <bool>, // ≥ 3 same tool in a row
21
17
  * "freshness_threshold": <int|null>, // 20/40/60 milestone hit
22
18
  * "checked_at": "<iso8601>"
23
19
  * }
24
20
  *
21
+ * No same-tool-repeat ("loop") field: a same-tool-name counter fires on
22
+ * ordinary, non-looping work (an enumerated sweep over distinct targets
23
+ * calls the same tool repeatedly by design — the rule's own text says
24
+ * "'similar parameters' is the load-bearing word"), reaches no model (its
25
+ * only emission was a verbose stderr line), and had two readers, one of
26
+ * which read a path nothing wrote. Removed rather than repaired —
27
+ * road-to-signals-that-mean-what-they-say D1.
28
+ *
25
29
  * Exit code is always 0.
26
30
  *
27
31
  * CLI:
@@ -33,8 +37,9 @@ import path from "node:path";
33
37
  import { fileURLToPath, pathToFileURL } from "node:url";
34
38
 
35
39
  // Re-use the shared atomic-write helper so concerns honour the single
36
- // `agents/runtime/state/.dispatcher.lock` discipline (hook-architecture-v1.md
37
- // § Concurrency, Phase 7.4).
40
+ // `agents/state/.dispatcher.lock` discipline (hook-architecture-v1.md,
41
+ // Concurrency, Phase 7.4) — the lock sits beside THIS hook's own target, not
42
+ // the fixed `agents/runtime/state/` path the discipline cites generally.
38
43
  import { atomic_write_json } from "./hooks/state_io.js";
39
44
  import { readHookStdin } from "./hooks/hook_stdin.js";
40
45
 
@@ -45,7 +50,6 @@ import { readHookStdin } from "./hooks/hook_stdin.js";
45
50
  export const STATE_DIR = path.join("agents", "state");
46
51
  export const STATE_FILE = path.join(STATE_DIR, "context-hygiene.json");
47
52
 
48
- export const LOOP_THRESHOLD = 3; // 3+ consecutive same-tool calls
49
53
  export const HISTORY_DEPTH = 5;
50
54
  export const FRESHNESS_MILESTONES = [20, 40, 60] as const;
51
55
 
@@ -56,10 +60,7 @@ type StateDict = Record<string, unknown>;
56
60
  function _empty_state(): StateDict {
57
61
  return {
58
62
  tool_calls: 0,
59
- consecutive_same_tool: 0,
60
- last_tool: null,
61
63
  tool_history: [],
62
- loop_detected: false,
63
64
  freshness_threshold: null,
64
65
  };
65
66
  }
@@ -134,14 +135,6 @@ function _update(state: StateDict, tool: string | null): StateDict {
134
135
  const curr_count = prev_count + 1;
135
136
  state["tool_calls"] = curr_count;
136
137
 
137
- const last = state["last_tool"];
138
- if (last === tool) {
139
- state["consecutive_same_tool"] = _asInt(state["consecutive_same_tool"]) + 1;
140
- } else {
141
- state["consecutive_same_tool"] = 1;
142
- }
143
- state["last_tool"] = tool;
144
-
145
138
  let hist = state["tool_history"];
146
139
  if (!Array.isArray(hist)) {
147
140
  hist = [];
@@ -149,8 +142,6 @@ function _update(state: StateDict, tool: string | null): StateDict {
149
142
  (hist as unknown[]).push(tool);
150
143
  state["tool_history"] = (hist as unknown[]).slice(-HISTORY_DEPTH);
151
144
 
152
- state["loop_detected"] = _asInt(state["consecutive_same_tool"]) >= LOOP_THRESHOLD;
153
-
154
145
  const ms = _milestone_hit(prev_count, curr_count);
155
146
  if (ms !== null) {
156
147
  state["freshness_threshold"] = ms;
@@ -211,7 +202,6 @@ export function run(
211
202
  if (verbose) {
212
203
  process.stderr.write(
213
204
  `context-hygiene-hook: tool_calls=${pyRepr(state["tool_calls"])} ` +
214
- `loop=${pyRepr(state["loop_detected"])} ` +
215
205
  `threshold=${pyRepr(state["freshness_threshold"])}\n`,
216
206
  );
217
207
  }
@@ -11,12 +11,23 @@
11
11
  // turn: `task cost:preflight` or `node scripts/cost/preflight.mjs`.
12
12
 
13
13
  import { spawnSync } from 'node:child_process';
14
+ import { fileURLToPath } from 'node:url';
15
+ import { dirname, join } from 'node:path';
14
16
 
15
17
  const QUIET = process.env.PREFLIGHT_QUIET === '1';
16
18
 
19
+ // budget.mjs is this file's SIBLING, so resolve it from here rather than from
20
+ // the working directory. A cwd-relative 'scripts/cost/budget.mjs' resolved to
21
+ // nothing in this tree (the scripts live under src/scripts/), spawnSync
22
+ // returned empty stdout, and empty stdout is read below as "no budget
23
+ // configured" — so the hard stop silently exited 0 on a spent budget from
24
+ // every working directory. Sibling resolution also survives the consumer
25
+ // install, where the pair lands under a different prefix together.
26
+ const BUDGET_SCRIPT = join(dirname(fileURLToPath(import.meta.url)), 'budget.mjs');
27
+
17
28
  function runBudgetCheck() {
18
29
  const env = { ...process.env, BUDGET_QUIET: '1' };
19
- const r = spawnSync('node', ['scripts/cost/budget.mjs', 'check'], { env, encoding: 'utf-8' });
30
+ const r = spawnSync('node', [BUDGET_SCRIPT, 'check'], { env, encoding: 'utf-8' });
20
31
  if (r.error) return { ok: false, fatal: true, msg: String(r.error) };
21
32
  const out = (r.stdout || '').trim();
22
33
  if (!out) return { ok: true, unbudgeted: true };
@@ -2127,7 +2127,7 @@ function _ljust(s: string, width: number): string {
2127
2127
 
2128
2128
  function _debate_refusal_cap(ai_cfg: Dict): number {
2129
2129
  const debate_block = (ai_cfg['debate'] as Dict) || {};
2130
- return _pyFloat(debate_block['max_cost_usd'] ?? 5.0, 5.0) || 0.0;
2130
+ return _pyFloat(debate_block['max_cost_usd'] ?? 0.0, 0.0) || 0.0; // 0 = no cap (ADR-279)
2131
2131
  }
2132
2132
 
2133
2133
  function _emit_shadow_slo_banner(): void {
@@ -2560,9 +2560,9 @@ function cmd_run(
2560
2560
 
2561
2561
  const cost_cfg = (ai_cfg['cost_budget'] as Dict) || {};
2562
2562
  const budget = new CostBudget({
2563
- max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 50_000, 50_000),
2564
- max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 20_000, 20_000),
2565
- max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10),
2563
+ max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
2564
+ max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
2565
+ max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10), // a call count, not money — kept
2566
2566
  max_total_usd: _pyFloat(cost_cfg['max_total_usd'] ?? 0.0, 0.0) || 0.0,
2567
2567
  // Rolling 24h cap. Unwired until now: the field existed on CostBudget and
2568
2568
  // gated the spend-ledger append, but no caller ever passed it, so the
@@ -3076,9 +3076,9 @@ function cmd_debate(
3076
3076
 
3077
3077
  const cost_cfg = (ai_cfg['cost_budget'] as Dict) || {};
3078
3078
  const budget = new CostBudget({
3079
- max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 50_000, 50_000),
3080
- max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 20_000, 20_000),
3081
- max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10),
3079
+ max_input_tokens: _pyInt(cost_cfg['max_input_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
3080
+ max_output_tokens: _pyInt(cost_cfg['max_output_tokens'] ?? 0, 0), // 0 = unbounded (ADR-279)
3081
+ max_calls: _pyInt(cost_cfg['max_calls'] ?? 10, 10), // a call count, not money — kept
3082
3082
  max_total_usd: _pyFloat(cost_cfg['max_total_usd'] ?? 0.0, 0.0) || 0.0,
3083
3083
  // Rolling 24h cap. Unwired until now: the field existed on CostBudget and
3084
3084
  // gated the spend-ledger append, but no caller ever passed it, so the
@@ -738,6 +738,29 @@ export const RETURN_ENVELOPE_POINTER =
738
738
  'write-to-disk-first rule: contexts/execution/subagent-response-contract.md. ' +
739
739
  'The findings table stays a file.';
740
740
 
741
+ /**
742
+ * Two-line header prepended, verbatim and at byte offset 0, to every
743
+ * `<slug>.review-input/roadmap.md` snapshot this dispatcher writes.
744
+ *
745
+ * Its NAMED job is `check_references`'s file-level skip marker
746
+ * (`check_references.ts` `FILE_SKIP_MARKER`): the snapshot sits under a
747
+ * tree that gate walks, while the LIVE roadmap layer is deliberately
748
+ * excluded from it — so a roadmap that legitimately quotes a nonexistent
749
+ * path (e.g. documenting a hallucinated council citation) would red CI
750
+ * through its own review snapshot.
751
+ *
752
+ * That is its only job. It used to carry a second, unnamed one — pushing the
753
+ * frontmatter fence off byte offset 0 kept `check_agent_artifact_location`
754
+ * from reading the snapshot as a misplaced roadmap. That gate now exempts the
755
+ * snapshot path by name (`isReviewInputRoadmapSnapshot`), so this header may
756
+ * change without that gate noticing. Tested in
757
+ * `check_agent_artifact_location.test.ts` (describe: "review-input snapshot
758
+ * convention").
759
+ */
760
+ export const REVIEW_INPUT_ROADMAP_HEADER =
761
+ '<!-- check-refs: skip -->\n' +
762
+ '<!-- verbatim roadmap snapshot for the R2 reviewer; the live roadmap layer is excluded from check_references, and a snapshot must not fail a gate its source is exempt from -->\n';
763
+
741
764
  function reviewerPrompt(args: {
742
765
  slug: string;
743
766
  headSha: string;
@@ -1288,19 +1311,9 @@ function runDispatch(args: Args): number {
1288
1311
 
1289
1312
  redactions += writeRedacted(path.join(inputDirAbs, 'diff.patch'), scopeDiffText, denyPatterns);
1290
1313
  if (roadmapText !== null) {
1291
- // The snapshot lands under agents/evidence/, which check_references
1292
- // walks, while the live roadmap layer is deliberately excluded from
1293
- // that gate — so a roadmap that legitimately quotes a nonexistent
1294
- // path (e.g. documenting a hallucinated council citation) would red
1295
- // CI through its own review snapshot. The header exemption keeps the
1296
- // snapshot verbatim below the marker; roadmap_hash binds the LIVE
1297
- // file and is unaffected. Found by the zcs-close CI run, 2026-08-09.
1298
- const snapshotHeader =
1299
- '<!-- check-refs: skip -->\n' +
1300
- '<!-- verbatim roadmap snapshot for the R2 reviewer; the live roadmap layer is excluded from check_references, and a snapshot must not fail a gate its source is exempt from -->\n';
1301
1314
  redactions += writeRedacted(
1302
1315
  path.join(inputDirAbs, 'roadmap.md'),
1303
- snapshotHeader + roadmapText,
1316
+ REVIEW_INPUT_ROADMAP_HEADER + roadmapText,
1304
1317
  denyPatterns,
1305
1318
  );
1306
1319
  }
@@ -27,7 +27,7 @@
27
27
  * honest "no telemetry record" line, never a fabricated estimate.
28
28
  * Sources: `_lib/judgment_ladder.ts::explainLadder` + the same
29
29
  * audit-log-v1 files as §4.
30
- * 5. Hook / loop / freshness state snapshot. Source:
30
+ * 5. Hook / freshness state snapshot. Source:
31
31
  * `agents/state/context-hygiene.json` (the code path the hook
32
32
  * actually writes — see `context_hygiene_hook.ts::STATE_FILE`) or
33
33
  * the doc-referenced `agents/runtime/state/context-hygiene.json`.
@@ -477,7 +477,7 @@ function renderSummarySection(
477
477
  out.push('- Session health: no state recorded.');
478
478
  } else {
479
479
  const s = hygiene.state;
480
- out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded, loop detected: ${String(s['loop_detected'] ?? '(unset)')}.`);
480
+ out.push(`- Session health: ${String(s['tool_calls'] ?? '(unset)')} tool call(s) recorded.`);
481
481
  }
482
482
  return out;
483
483
  }
@@ -686,7 +686,7 @@ function renderDecisionSection(
686
686
 
687
687
  function renderHygieneSection(hygiene: HygieneReadResult): string[] {
688
688
  const out: string[] = [];
689
- out.push('## Hook / loop state (context-hygiene)');
689
+ out.push('## Hook state (context-hygiene)');
690
690
  out.push(`_Source: tried ${hygiene.checkedPaths.map((p) => `\`${p}\``).join(', then ')}_`);
691
691
  out.push('');
692
692
  if (hygiene.state === null) {
@@ -697,9 +697,6 @@ function renderHygieneSection(hygiene: HygieneReadResult): string[] {
697
697
  out.push(`Found at \`${hygiene.path}\`.`);
698
698
  out.push('');
699
699
  out.push(`- tool_calls: ${String(s['tool_calls'] ?? '(unset)')}`);
700
- out.push(`- consecutive_same_tool: ${String(s['consecutive_same_tool'] ?? '(unset)')}`);
701
- out.push(`- last_tool: ${String(s['last_tool'] ?? '(unset)')}`);
702
- out.push(`- loop_detected: ${String(s['loop_detected'] ?? '(unset)')}`);
703
700
  out.push(`- freshness_threshold: ${String(s['freshness_threshold'] ?? '(unset)')}`);
704
701
  out.push(`- checked_at: ${String(s['checked_at'] ?? '(unset)')}`);
705
702
  return out;
@@ -718,14 +715,12 @@ function renderParkedSection(): string[] {
718
715
  ' thin-projector budget decision** — no on-disk record of "artefact',
719
716
  ' considered but dropped for budget" exists today. Revisit-if such a',
720
717
  ' record ships.',
721
- '3. **Which memory entry id influenced a specific answer**, when the run',
722
- ' did NOT opt into `decision_engine.surface_traces` — the',
718
+ '3. **Which memory entry id influenced a specific answer** — the',
723
719
  ' `🧠 Memory: n/m · ids=[...]` line is printed to stdout only, never',
724
- ' persisted. The durable form (`memory.ids` in',
725
- ' `agents/runtime/state/work/<id>/decision-trace-<phase>.json`) exists',
726
- ' ONLY when `decision_engine.surface_traces: true` (off by default) and',
727
- ' the run went through /work or /implement-ticket — see `explain last`',
728
- ' for that narrower, per-run case; not duplicated here.',
720
+ ' persisted. The per-phase decision-trace file that once carried',
721
+ ' `memory.ids` is no longer written: its opt-in key,',
722
+ ' `decision_engine.surface_traces`, was retired (2026-10-09) with its',
723
+ ' default (off) as the fixed behavior.',
729
724
  '4. **Why a given subagent primitive was/wasn\'t available on this host**',
730
725
  ' — the host-capability manifest is resolved in-session by the agent',
731
726
  ' from its own knowledge (+ an optional settings override) and is never',