@event4u/agent-config 16.3.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 (486) 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 +251 -0
  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/estimate-ticket.md +1 -1
  16. package/dist/agent-src/commands/feature/explore.md +3 -3
  17. package/dist/agent-src/commands/feature/plan.md +1 -1
  18. package/dist/agent-src/commands/fix/ci.md +17 -3
  19. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  20. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  21. package/dist/agent-src/commands/implement-ticket.md +3 -3
  22. package/dist/agent-src/commands/memory/add.md +4 -16
  23. package/dist/agent-src/commands/memory/load.md +5 -6
  24. package/dist/agent-src/commands/memory/promote.md +3 -16
  25. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  26. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  27. package/dist/agent-src/commands/optimize/deep.md +4 -2
  28. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  29. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  30. package/dist/agent-src/commands/pr/create.md +42 -34
  31. package/dist/agent-src/commands/pr/merge.md +136 -9
  32. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  33. package/dist/agent-src/commands/project/analyze.md +7 -35
  34. package/dist/agent-src/commands/refine-ticket.md +1 -1
  35. package/dist/agent-src/commands/review/changes.md +14 -19
  36. package/dist/agent-src/commands/roadmap/next.md +10 -1
  37. package/dist/agent-src/commands/roadmap/process-full.md +52 -38
  38. package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
  39. package/dist/agent-src/commands/worktree/create.md +7 -3
  40. package/dist/agent-src/commands/worktree/verify.md +2 -1
  41. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  42. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  43. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  44. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  45. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  46. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  47. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  48. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  49. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  50. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  51. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
  52. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  53. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  54. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  55. package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
  56. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  57. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  58. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  59. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  60. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  61. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  62. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  63. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  64. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  65. package/dist/agent-src/guidelines/php/git.md +15 -2
  66. package/dist/agent-src/rules/active-remediation.md +0 -1
  67. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  68. package/dist/agent-src/rules/architecture.md +0 -1
  69. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  70. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  71. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  72. package/dist/agent-src/rules/autonomous-execution.md +0 -1
  73. package/dist/agent-src/rules/brand-consistency.md +0 -1
  74. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  75. package/dist/agent-src/rules/broken-access-control.md +0 -1
  76. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  77. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  78. package/dist/agent-src/rules/code-provenance.md +0 -1
  79. package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
  80. package/dist/agent-src/rules/commit-conventions.md +1 -2
  81. package/dist/agent-src/rules/communication-through-line.md +1 -2
  82. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  83. package/dist/agent-src/rules/context-hygiene.md +5 -5
  84. package/dist/agent-src/rules/copilot-routing.md +1 -2
  85. package/dist/agent-src/rules/council-availability.md +4 -4
  86. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  87. package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
  88. package/dist/agent-src/rules/delegation-policy.md +2 -3
  89. package/dist/agent-src/rules/design-fidelity.md +0 -1
  90. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  91. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  92. package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
  93. package/dist/agent-src/rules/docker-commands.md +0 -1
  94. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  95. package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
  96. package/dist/agent-src/rules/domain-safety-pii.md +0 -1
  97. package/dist/agent-src/rules/domain-safety-retention.md +0 -1
  98. package/dist/agent-src/rules/downstream-changes.md +0 -1
  99. package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
  100. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  101. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  102. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
  103. package/dist/agent-src/rules/finance-safety-floor.md +0 -1
  104. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  105. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  106. package/dist/agent-src/rules/git-history-discipline.md +1 -2
  107. package/dist/agent-src/rules/guidelines.md +0 -1
  108. package/dist/agent-src/rules/history-discipline.md +0 -1
  109. package/dist/agent-src/rules/icon-consistency.md +0 -1
  110. package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
  111. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  112. package/dist/agent-src/rules/invite-challenge.md +0 -1
  113. package/dist/agent-src/rules/laravel-routing.md +1 -2
  114. package/dist/agent-src/rules/laravel-translations.md +0 -1
  115. package/dist/agent-src/rules/legal-safety-floor.md +0 -1
  116. package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
  117. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  118. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
  119. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  120. package/dist/agent-src/rules/media-governance-routing.md +1 -2
  121. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  122. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  123. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  124. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  125. package/dist/agent-src/rules/model-recommendation.md +0 -1
  126. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  127. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  128. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  129. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  130. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  131. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  132. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  133. package/dist/agent-src/rules/output-discipline.md +0 -1
  134. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  135. package/dist/agent-src/rules/persona-governance.md +2 -3
  136. package/dist/agent-src/rules/php-coding.md +0 -1
  137. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  138. package/dist/agent-src/rules/preservation-guard.md +0 -1
  139. package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
  140. package/dist/agent-src/rules/question-not-instruction.md +0 -1
  141. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  142. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  143. package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
  144. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  145. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  146. package/dist/agent-src/rules/runtime-safety.md +0 -1
  147. package/dist/agent-src/rules/scale-discipline.md +0 -1
  148. package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
  149. package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
  150. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  151. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  152. package/dist/agent-src/rules/session-canary.md +0 -1
  153. package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
  154. package/dist/agent-src/rules/size-enforcement.md +0 -1
  155. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  156. package/dist/agent-src/rules/skill-quality.md +0 -1
  157. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  158. package/dist/agent-src/rules/source-confidentiality.md +0 -1
  159. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  160. package/dist/agent-src/rules/source-of-truth.md +0 -1
  161. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  162. package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
  163. package/dist/agent-src/rules/symfony-routing.md +1 -2
  164. package/dist/agent-src/rules/think-before-action.md +0 -1
  165. package/dist/agent-src/rules/token-budget-discipline.md +12 -46
  166. package/dist/agent-src/rules/token-efficiency.md +0 -1
  167. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  168. package/dist/agent-src/rules/tool-safety.md +0 -1
  169. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  170. package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
  171. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  172. package/dist/agent-src/rules/user-interaction.md +0 -1
  173. package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
  174. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  175. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  176. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  177. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  178. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  179. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  180. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  181. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  182. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  183. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  184. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  185. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  186. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  187. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  188. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  189. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  190. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  191. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  192. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  193. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  194. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  195. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  196. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  197. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  198. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
  199. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  200. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
  201. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  202. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  203. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  204. package/dist/agent-src/templates/AGENTS.md +1 -1
  205. package/dist/agent-src/templates/agent-settings.md +46 -129
  206. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  207. package/dist/agent-src/templates/command.md +2 -2
  208. package/dist/agent-src/templates/roadmaps.md +6 -1
  209. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  210. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  211. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  212. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  213. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  214. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  215. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  216. package/dist/agent-src/templates/skill.md +1 -1
  217. package/dist/cli/registry.js +1 -0
  218. package/dist/cli-delegate/check_update_banner.js +195 -119
  219. package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
  220. package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
  221. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  222. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  223. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  224. package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-AED2VQGM.js} +65 -11
  225. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  226. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  227. package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
  228. package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
  229. package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
  230. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  231. package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
  232. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  233. package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
  234. package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-MSUL5NYP.js} +5 -5
  235. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  236. package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
  237. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  238. package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
  239. package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
  240. package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
  241. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  242. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  243. package/dist/cli-delegate/cmd_conformance.js +105 -35
  244. package/dist/cli-delegate/cmd_converge.js +3 -3
  245. package/dist/cli-delegate/cmd_doctor.js +15 -12
  246. package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
  247. package/dist/cli-delegate/cmd_explain.js +43 -19
  248. package/dist/cli-delegate/cmd_export.js +10 -10
  249. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  250. package/dist/cli-delegate/cmd_handoff.js +40 -21
  251. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  252. package/dist/cli-delegate/cmd_migrate.js +3 -3
  253. package/dist/cli-delegate/cmd_packs_active.js +4 -3
  254. package/dist/cli-delegate/cmd_prune.js +10 -10
  255. package/dist/cli-delegate/cmd_route_audit.js +7 -7
  256. package/dist/cli-delegate/cmd_route_explain.js +5 -5
  257. package/dist/cli-delegate/cmd_session_recycle.js +9 -7
  258. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  259. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  260. package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
  261. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  262. package/dist/cli-delegate/cmd_sync.js +10 -10
  263. package/dist/cli-delegate/cmd_uninstall.js +10 -10
  264. package/dist/cli-delegate/cmd_update.js +7 -7
  265. package/dist/cli-delegate/cmd_upgrade.js +7 -7
  266. package/dist/cli-delegate/cmd_validate.js +10 -10
  267. package/dist/cli-delegate/cmd_versions.js +5 -5
  268. package/dist/cli-delegate/gate_budget.js +1 -1
  269. package/dist/cli-delegate/gate_execute.js +2 -2
  270. package/dist/cli-delegate/roadmap_gates.js +2 -2
  271. package/dist/discovery/deprecation-report.md +1 -1
  272. package/dist/discovery/discovery-manifest.json +129 -90
  273. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  274. package/dist/discovery/discovery-manifest.summary.md +3 -3
  275. package/dist/discovery/dormancy-report.md +1 -1
  276. package/dist/discovery/orphan-report.md +1 -1
  277. package/dist/discovery/packs.json +24 -9
  278. package/dist/discovery/trust-report.md +3 -3
  279. package/dist/discovery/workspaces.json +5 -4
  280. package/dist/hooks/dispatch.js +2151 -1820
  281. package/dist/hooks/dispatch.sha256 +1 -1
  282. package/dist/install/install.mjs +462 -431
  283. package/dist/install/installThinLayer.js +40 -12
  284. package/dist/install/installedRuleLinks.js +105 -19
  285. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  286. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  287. package/dist/mcp/registry-manifest.json +5 -5
  288. package/dist/mcp/server.json +2 -2
  289. package/dist/mcp/server.mjs +2702 -1995
  290. package/dist/router.json +1 -1
  291. package/dist/scripts/_lib/agent_settings.js +15 -120
  292. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  293. package/dist/scripts/_lib/git_convention.js +232 -0
  294. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  295. package/dist/scripts/_lib/installed_layer.js +344 -18
  296. package/dist/scripts/_lib/package_root.js +68 -0
  297. package/dist/scripts/_lib/rule_law_section.js +1 -1
  298. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  299. package/dist/scripts/_lib/thin_rules.js +80 -3
  300. package/dist/server/app.js +2 -1
  301. package/dist/server/gitKeysGate.js +105 -0
  302. package/dist/server/routes/settings.js +67 -8
  303. package/dist/server/routes/wizard.js +4 -0
  304. package/dist/server/schemas/settings.js +23 -81
  305. package/dist/shared/skillRanking.js +30 -4
  306. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  307. package/dist/ui/index.html +1 -1
  308. package/docs/MIGRATION.md +72 -1
  309. package/docs/contracts/settings-classes.md +35 -65
  310. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  311. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  312. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  313. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  314. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  315. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  316. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  317. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  318. package/docs/guidelines/php/git.md +15 -2
  319. package/package.json +1 -1
  320. package/src/agent-src/scripts/gate_budget.ts +47 -23
  321. package/src/agent-src/scripts/gate_execute.ts +12 -4
  322. package/src/agent-src/templates/AGENTS.md +1 -1
  323. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  324. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  325. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  326. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  327. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  328. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  329. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  330. package/src/config/agent-settings.template.yml +79 -312
  331. package/src/config/agents-paths.yml +16 -0
  332. package/src/config/assurance-capability-registry.json +7 -3
  333. package/src/config/ci-local-parity.yml +3 -0
  334. package/src/config/continuity-surface.json +3 -3
  335. package/src/config/discovery/packs.yml +17 -1
  336. package/src/config/evaluator-budgets.json +19 -6
  337. package/src/config/gate-coverage.yml +65 -23
  338. package/src/config/gate-violation-baselines.json +53 -13
  339. package/src/config/gitignore-block.txt +19 -0
  340. package/src/config/hook-bundle-budget.json +1 -1
  341. package/src/config/release-gate-locality.yml +2 -1
  342. package/src/config/routing-coverage-seed.json +48 -6
  343. package/src/config/rule-law-ceilings.json +12 -6
  344. package/src/config/rule-obligations.json +833 -0
  345. package/src/install/installThinLayer.ts +76 -10
  346. package/src/install/installedRuleLinks.ts +105 -17
  347. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  348. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  349. package/src/scripts/_cli/cmd_doctor.ts +10 -10
  350. package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
  351. package/src/scripts/_cli/cmd_explain.ts +72 -14
  352. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  353. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  354. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  355. package/src/scripts/_cli/doctor_execution.ts +72 -1
  356. package/src/scripts/_dispatch.bash +37 -2
  357. package/src/scripts/_lib/agent_settings.ts +15 -124
  358. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  359. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  360. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  361. package/src/scripts/_lib/git_base_ref.ts +92 -0
  362. package/src/scripts/_lib/git_convention.ts +291 -0
  363. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  364. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  365. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  366. package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
  367. package/src/scripts/_lib/graph_feeder_record.ts +236 -13
  368. package/src/scripts/_lib/installed_layer.ts +448 -23
  369. package/src/scripts/_lib/knowledge_global.ts +14 -1
  370. package/src/scripts/_lib/module_reach.ts +456 -0
  371. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  372. package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
  373. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  374. package/src/scripts/_lib/ratification_subject.ts +92 -0
  375. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  376. package/src/scripts/_lib/release_highlights.ts +5 -0
  377. package/src/scripts/_lib/rule_law_section.ts +1 -1
  378. package/src/scripts/_lib/rule_obligations.ts +205 -0
  379. package/src/scripts/_lib/self_repair.ts +1 -1
  380. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  381. package/src/scripts/_lib/test_red_state.ts +5 -0
  382. package/src/scripts/_lib/thin_rules.ts +83 -3
  383. package/src/scripts/_lib/touched_file_quality.ts +142 -6
  384. package/src/scripts/_lib/worker_budget.ts +1 -1
  385. package/src/scripts/adr/regenerate_index.ts +16 -1
  386. package/src/scripts/ai_council/config.ts +7 -7
  387. package/src/scripts/ai_council/modification_review.ts +100 -0
  388. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  389. package/src/scripts/ai_council/orchestrator.ts +5 -5
  390. package/src/scripts/ai_council/spend_gate.ts +18 -7
  391. package/src/scripts/ai_team/config.ts +11 -16
  392. package/src/scripts/audit_user_type_axis.ts +20 -8
  393. package/src/scripts/bench_ab_clone.ts +1 -2
  394. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  395. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  396. package/src/scripts/check_agent_artifact_location.ts +36 -0
  397. package/src/scripts/check_branch_freshness.ts +147 -24
  398. package/src/scripts/check_enforcement_coverage.ts +130 -0
  399. package/src/scripts/check_evaluator_budgets.ts +4 -0
  400. package/src/scripts/check_finding_dispositions.ts +88 -25
  401. package/src/scripts/check_gate_coverage.ts +4 -3
  402. package/src/scripts/check_gate_reachability.ts +48 -1
  403. package/src/scripts/check_generator_sync.ts +48 -0
  404. package/src/scripts/check_hook_bundle_composition.ts +107 -0
  405. package/src/scripts/check_kernel_edit_ratified.ts +86 -6
  406. package/src/scripts/check_pack_size.ts +1 -1
  407. package/src/scripts/check_release_manifest_content.ts +189 -0
  408. package/src/scripts/check_standing_rule_delivery.ts +96 -0
  409. package/src/scripts/check_suppression_hygiene.ts +2 -5
  410. package/src/scripts/ci_settle.ts +42 -5
  411. package/src/scripts/classify_merge_risk.ts +320 -0
  412. package/src/scripts/closure_scan.ts +91 -1
  413. package/src/scripts/command_suggester/settings.ts +8 -108
  414. package/src/scripts/command_suggester/types.ts +4 -5
  415. package/src/scripts/consumer_matrix.ts +102 -0
  416. package/src/scripts/context_hygiene_hook.ts +13 -23
  417. package/src/scripts/cost/preflight.mjs +12 -1
  418. package/src/scripts/council_cli.ts +7 -7
  419. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  420. package/src/scripts/explain_run.ts +8 -13
  421. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  422. package/src/scripts/generate_host_cost_table.ts +20 -3
  423. package/src/scripts/handoff_context_hook.ts +86 -37
  424. package/src/scripts/hook_manifest.json +1 -1
  425. package/src/scripts/hook_manifest.yaml +25 -6
  426. package/src/scripts/hooks/block_config_weakening.ts +48 -5
  427. package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
  428. package/src/scripts/hooks/concern_registry.ts +2 -0
  429. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  430. package/src/scripts/hooks/evidence_independence.ts +12 -4
  431. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  432. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  433. package/src/scripts/hooks/rule_inject_hook.ts +44 -3
  434. package/src/scripts/hooks/state_io.ts +8 -4
  435. package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
  436. package/src/scripts/hooks/turn_end_gate_hook.ts +1 -0
  437. package/src/scripts/install-hooks.sh +42 -14
  438. package/src/scripts/install.ts +7 -31
  439. package/src/scripts/lint_blocker_citations.ts +198 -0
  440. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  441. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  442. package/src/scripts/lint_pack_boundaries.ts +406 -28
  443. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  444. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  445. package/src/scripts/lint_rule_law_section.ts +151 -21
  446. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  447. package/src/scripts/lint_settings_classes.ts +1 -1
  448. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  449. package/src/scripts/lint_workflow_security.ts +12 -1
  450. package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
  451. package/src/scripts/model_rule_injection.ts +3 -3
  452. package/src/scripts/onboarding_gate_hook.ts +7 -6
  453. package/src/scripts/print_required_checks.ts +15 -3
  454. package/src/scripts/probe_host_compliance.ts +33 -5
  455. package/src/scripts/probe_turnaround.ts +183 -3
  456. package/src/scripts/ratification_header.ts +77 -0
  457. package/src/scripts/refusal_envelope.ts +138 -0
  458. package/src/scripts/release_publication.ts +29 -3
  459. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  460. package/src/scripts/report_installed_rule_links.ts +118 -1
  461. package/src/scripts/report_module_reach.ts +212 -0
  462. package/src/scripts/report_obligation_mechanism.ts +16 -18
  463. package/src/scripts/report_parked_blockers.ts +222 -0
  464. package/src/scripts/report_required_checks_drift.ts +196 -0
  465. package/src/scripts/report_skill_ranker_confusion.ts +103 -2
  466. package/src/scripts/report_standing_payload_by_host.ts +1 -1
  467. package/src/scripts/routing_doctor.ts +2 -2
  468. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  469. package/src/scripts/schemas/command.schema.json +1 -1
  470. package/src/scripts/schemas/skill.schema.json +1 -1
  471. package/src/scripts/self_review_gate.ts +39 -2
  472. package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
  473. package/src/scripts/sync_pr_branch.ts +403 -132
  474. package/src/scripts/trigger_eval_grandfather.json +0 -16
  475. package/src/server/schemas/settings.ts +33 -177
  476. package/src/shared/skillRanking.ts +53 -4
  477. package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
  478. package/src/scripts/_lib/config_chain.ts +0 -477
  479. package/src/scripts/_lib/conformance_report.ts +0 -403
  480. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  481. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  482. package/src/scripts/_lib/file_slicer.ts +0 -117
  483. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  484. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  485. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  486. package/src/scripts/_lib/role_split.ts +0 -338
@@ -50,6 +50,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
50
50
  import * as path from 'node:path';
51
51
 
52
52
  import { parse as _rtParse } from '../sync_yaml_rt.js';
53
+ import { GIT_CONVENTION_KEYS, fileSource, readGitConventionKey } from '../_lib/git_convention.js';
53
54
 
54
55
  const DEFAULT_PATH = '.agent-settings.yml';
55
56
 
@@ -203,7 +204,8 @@ const _PRESCAN_RULES: readonly PrescanRule[] = [
203
204
  ];
204
205
 
205
206
  interface Finding {
206
- line: number;
207
+ /** null when no single line can be named, printed as `line:-`. */
208
+ line: number | null;
207
209
  kind: string;
208
210
  verdict: string;
209
211
  hint: string;
@@ -254,9 +256,53 @@ function _scan_text(text: string): Finding[] {
254
256
  return findings;
255
257
  }
256
258
 
259
+ /**
260
+ * The schema enum and the branch-pattern alphabet, through the same reader
261
+ * `git:convention show` and `sync_pr_branch` use, so a value those refuse
262
+ * fails here first.
263
+ */
264
+ function _git_convention_findings(target: string, text: string): Finding[] {
265
+ const findings: Finding[] = [];
266
+ const lines = _splitlines(text);
267
+ for (const key of GIT_CONVENTION_KEYS) {
268
+ const reading = readGitConventionKey(key, fileSource({ developer: [target] }), {});
269
+ if (reading.state !== 'invalid' && reading.state !== 'malformed') continue;
270
+ // `malformed` is a fact about the whole file, so it is one finding, not one per key.
271
+ if (reading.state === 'malformed') {
272
+ if (!findings.some((f) => f.verdict === 'malformed')) {
273
+ findings.push({ line: null, kind: 'git.*', verdict: 'malformed', hint: reading.detail ?? reading.state });
274
+ }
275
+ continue;
276
+ }
277
+ findings.push({
278
+ line: _gitKeyLine(lines, key),
279
+ kind: `git.${key}`,
280
+ verdict: reading.state,
281
+ hint: reading.detail ?? reading.state,
282
+ });
283
+ }
284
+ return findings;
285
+ }
286
+
287
+ /**
288
+ * The 1-based line of `key` inside a block-style `git:` section, or null: a
289
+ * same-named key elsewhere is not it, and an inline `git:` value has no line
290
+ * of its own to name.
291
+ */
292
+ function _gitKeyLine(lines: readonly string[], key: string): number | null {
293
+ const start = lines.findIndex((l) => /^git\s*:\s*(#.*)?$/.test(l));
294
+ if (start === -1) return null;
295
+ for (let i = start + 1; i < lines.length; i++) {
296
+ const l = lines[i] as string;
297
+ if (/^\S/.test(l) && !l.startsWith('#')) return null;
298
+ if (new RegExp(`^\\s+${key}\\s*:`).test(l)) return i + 1;
299
+ }
300
+ return null;
301
+ }
302
+
257
303
  function _format(finding: Finding): string {
258
304
  return (
259
- ` ❌ line:${_ljust(String(finding.line), 4)} ` +
305
+ ` ❌ line:${_ljust(finding.line === null ? '-' : String(finding.line), 4)} ` +
260
306
  `${_ljust(finding.kind, 22)} ${_ljust(finding.verdict, 14)} ${finding.hint}`
261
307
  );
262
308
  }
@@ -370,7 +416,13 @@ export function main(argv: string[] | null = null, options: MainOptions = {}): n
370
416
  }
371
417
  }
372
418
 
373
- if (findings.length === 0) {
419
+ // A parser finding already reports a file that does not parse; a `malformed`
420
+ // git reading would only repeat it. A pre-scan finding is not a parse
421
+ // failure, so it hides nothing.
422
+ const unparsed = findings.some((f) => f.kind === 'parser');
423
+ const git = _git_convention_findings(target, text).filter((f) => !(unparsed && f.verdict === 'malformed'));
424
+
425
+ if (findings.length === 0 && git.length === 0) {
374
426
  if (!opts.quiet) {
375
427
  _print(
376
428
  out,
@@ -380,12 +432,18 @@ export function main(argv: string[] | null = null, options: MainOptions = {}): n
380
432
  }
381
433
  return 0;
382
434
  }
383
- _print(err, `❌ ${target}: ${findings.length} finding(s) outside the supported subset.`);
384
- for (const finding of findings) {
385
- _print(err, _format(finding));
435
+ if (findings.length > 0) {
436
+ _print(err, `❌ ${target}: ${findings.length} finding(s) outside the supported subset.`);
437
+ for (const finding of findings) _print(err, _format(finding));
438
+ _print(err, '');
439
+ _print(err, ' Contract: docs/contracts/settings-sync-yaml-subset.md');
440
+ }
441
+ if (git.length > 0) {
442
+ _print(err, `❌ ${target}: ${git.length} git.* value(s) the convention refuses.`);
443
+ for (const finding of git) _print(err, _format(finding));
444
+ _print(err, '');
445
+ _print(err, ' Contract: docs/decisions/ADR-283-git-convention-carrier.md (the git section of agent-settings.schema.json)');
386
446
  }
387
- _print(err, '');
388
- _print(err, ' Contract: docs/contracts/settings-sync-yaml-subset.md');
389
447
  return 1;
390
448
  }
391
449
 
@@ -48,6 +48,7 @@ import {
48
48
  iter_setting_overrides,
49
49
  load_agent_settings,
50
50
  MERGEABLE_KEYS,
51
+ settings_layer_states,
51
52
  user_global_settings_paths,
52
53
  USER_GLOBAL_FILENAME,
53
54
  } from '../_lib/agent_settings.js';
@@ -179,7 +180,7 @@ export function missionResolutionFor(
179
180
  * file the user actually edited — telling somebody their value was dropped
180
181
  * without telling them which file it was dropped from is half an answer.
181
182
  */
182
- export function userGlobalDrop(key: string): { dropped: boolean; file: string } {
183
+ export function userGlobalDrop(key: string, templateDefault?: unknown): { dropped: boolean; file: string } {
183
184
  // Probe EVERY user-global layer the loader reads, not just the flat file.
184
185
  // `user_global_settings_paths()` returns the flat `agent-settings.yml` AND
185
186
  // the canonical `settings/.agent-settings.yml` the setup wizard writes, and
@@ -200,7 +201,13 @@ export function userGlobalDrop(key: string): { dropped: boolean; file: string }
200
201
  } catch {
201
202
  continue;
202
203
  }
203
- if (getSettingsLeaf(raw, key) !== undefined) return { dropped: true, file: candidate };
204
+ const value = getSettingsLeaf(raw, key);
205
+ if (value === undefined) continue;
206
+ // `upgrade` inserts template defaults into the user-global file, so a
207
+ // dropped default is not something the user set and loses nothing. A
208
+ // lower layer can still hold a value the user did set.
209
+ if (templateDefault !== undefined && JSON.stringify(value) === JSON.stringify(templateDefault)) continue;
210
+ return { dropped: true, file: candidate };
204
211
  }
205
212
  return { dropped: false, file };
206
213
  }
@@ -234,8 +241,16 @@ export function runSettingsGet(opts: SettingsGetOptions): SettingsGetResult {
234
241
  const cls = _classFor(opts.packageRoot, opts.key);
235
242
  const fallback = templateDefault(opts.packageRoot, opts.key);
236
243
  const carveOut = carveOutFor(opts.key);
237
- const drop = userGlobalDrop(opts.key);
244
+ const drop = userGlobalDrop(opts.key, fallback);
238
245
  const mission = missionResolutionFor(opts.key, merged);
246
+ // The loader reads a layer that does not parse as absent, so "not set" can
247
+ // be false; the exit code stays 0 because the read itself still answered.
248
+ const malformed = settings_layer_states({ cwd: opts.cwd }).filter((l) => l.state === 'malformed');
249
+ if (malformed.length > 0) {
250
+ err.push(
251
+ `⚠️ settings:get: ${malformed.map((l) => l.path).join(', ')} does not parse; every value it sets is read as absent.`,
252
+ );
253
+ }
239
254
 
240
255
  if (opts.json) {
241
256
  out.push(
@@ -19,6 +19,7 @@ import {
19
19
  resolveExecutionPosture,
20
20
  } from '../../shared/missionExecution.js';
21
21
  import {
22
+ UNREAD_FORGE,
22
23
  forgeProtectionRows,
23
24
  protectionActions,
24
25
  type ForgeReading,
@@ -81,7 +82,11 @@ export function executionJson(overrides: () => OverrideStream): Dict {
81
82
  * `actions` carries the human ACTION lines — the step's own words are that a
82
83
  * missing row is a blocker entry and NOT a halt, so this reports and returns.
83
84
  */
84
- export function forgeProtectionJson(reading: ForgeReading, repo: string | null = null): Dict {
85
+ export function forgeProtectionJson(
86
+ reading: ForgeReading,
87
+ repo: string | null = null,
88
+ not_checked: NotCheckedReason = null,
89
+ ): Dict {
85
90
  const rows = forgeProtectionRows(reading);
86
91
  const readFromForge = rows.some((r) => r.state !== 'unread');
87
92
  // **The slug is reported only when something was actually read, and that
@@ -107,6 +112,11 @@ export function forgeProtectionJson(reading: ForgeReading, repo: string | null =
107
112
  })),
108
113
  actions: protectionActions(rows).map(name),
109
114
  read_from_forge: readFromForge,
115
+ // Present on every run, `null` when the read happened. A key that
116
+ // appeared only on the skipped path would make its absence carry the
117
+ // meaning, and absence is exactly what a schema-validating consumer
118
+ // reads as "this build does not report it".
119
+ not_checked,
110
120
  };
111
121
  }
112
122
 
@@ -147,6 +157,64 @@ export interface ForgeDeps {
147
157
  readonly env?: Readonly<Record<string, string | undefined>>;
148
158
  /** The subprocess runner for both `git` and `gh`. */
149
159
  readonly run?: Runner;
160
+ /**
161
+ * Skip the read before anything spawns. The block keeps its shape: five
162
+ * `unread` rows, exactly what a failed read produces.
163
+ */
164
+ readonly offline?: boolean;
165
+ /**
166
+ * WHY the read was skipped, or `null` when it happened.
167
+ *
168
+ * Five `unread` rows and no failures is what "everything is fine" looks
169
+ * like to a consumer summing row states, so `read_from_forge: false` alone
170
+ * did not carry the distinction. This names it, which is the condition the
171
+ * council attached to making offline the default.
172
+ */
173
+ readonly not_checked?: NotCheckedReason;
174
+ }
175
+
176
+ /**
177
+ * Why a `doctor` run did not read the forge. `null` means it did.
178
+ *
179
+ * Three reasons rather than a boolean, because the repairs differ: pass
180
+ * `--online`, drop `--no-forge`, or run without `--check`.
181
+ */
182
+ export type NotCheckedReason = 'online_not_requested' | 'offline_flag' | 'single_check' | null;
183
+
184
+ /**
185
+ * Whether a `doctor` run reads the forge — and why not, when it does not.
186
+ *
187
+ * **OFFLINE IS THE DEFAULT since 2026-10-09.** Blocker
188
+ * `doctor-network-default` of `road-to-findings-that-get-a-disposition`,
189
+ * option (a): AI council 2026-10-07 (anthropic + openai, 2/2), adopted
190
+ * 2026-10-08 under the owner's delegation of council-decidable questions. The
191
+ * recorded reasoning is that a health command reaching the network on every
192
+ * run — including a single-check run — is the surprising default, and that
193
+ * `--online` costs one word to anyone who wants the read.
194
+ *
195
+ * Phase 3.1 shipped the opt-OUT and this function's earlier header said the
196
+ * default "is an owner decision, so this function does not decide it". That is
197
+ * now decided, and the header says so rather than leaving the next reader to
198
+ * infer it from the expression.
199
+ *
200
+ * Precedence is narrowest-first, so the reason names the repair: a `--check`
201
+ * run reads no forge row at all, an explicit `--no-forge` beats `--online`
202
+ * because it is the more specific instruction, and the bare default is last.
203
+ */
204
+ export function forgeDepsFor(opts: {
205
+ readonly online?: boolean;
206
+ readonly no_forge?: boolean;
207
+ readonly check: string | null;
208
+ }): ForgeDeps {
209
+ const not_checked: NotCheckedReason =
210
+ opts.check !== null
211
+ ? 'single_check'
212
+ : opts.no_forge === true
213
+ ? 'offline_flag'
214
+ : opts.online === true
215
+ ? null
216
+ : 'online_not_requested';
217
+ return { offline: not_checked !== null, not_checked };
150
218
  }
151
219
 
152
220
  export function forgeProtectionJsonFor(root: string, deps: ForgeDeps = {}): Dict {
@@ -155,6 +223,9 @@ export function forgeProtectionJsonFor(root: string, deps: ForgeDeps = {}): Dict
155
223
  // binding were asserted one layer down against fakes while a regression in
156
224
  // the real wiring stayed invisible. `deps` is that seam; production passes
157
225
  // nothing and gets `process.env` plus the real spawn.
226
+ if (deps.offline === true) {
227
+ return forgeProtectionJson(UNREAD_FORGE, null, deps.not_checked ?? null);
228
+ }
158
229
  const env = deps.env ?? process.env;
159
230
  const run = deps.run;
160
231
  const remaining = budgetOf(FORGE_TOTAL_BUDGET_MS);
@@ -283,6 +283,36 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
283
283
  settings:get Read one setting: its value, the file it came from, its
284
284
  class, and whether "absent" differs from the default.
285
285
  Usage: settings:get <key> [--json]
286
+ git:convention The git convention (git.commit_format, git.branch_pattern,
287
+ git.update_strategy): value in force, source and state
288
+ (valid|absent|malformed|invalid|discarded|unresolvable),
289
+ read from a committed .git-convention.yml over the
290
+ settings files; this checkout's differing value is shown
291
+ as a candidate, and any repository commit-message
292
+ validator that also runs at commit. Exit 1 when a key in
293
+ force is malformed, invalid, discarded or unresolvable;
294
+ a candidate in one of these states is a warning, exit 0.
295
+ --key limits show to the named keys (repeatable).
296
+ update_strategy is read at --base, else the default
297
+ branch: a pull request passes --base origin/<its base>.
298
+ subject checks subjects on stdin against the convention in
299
+ force; ticket reads the ticket out of a branch name; branch
300
+ renders a name from git.branch_pattern; measure proposes
301
+ a convention from the history (subject family, branch
302
+ pattern, observed update style) and writes nothing;
303
+ init --yes creates .git-convention.yml once on the
304
+ user's yes (never over one, never committed);
305
+ show and subject print "no convention established" when
306
+ no declaration, approved card or commitlint config exists; sync brings the
307
+ branch up to --base (else the default branch) per
308
+ git.update_strategy (exit 1 base unresolved, 3 behind
309
+ under rebase, 4 strategy unreadable).
310
+ Usage: git:convention show [--json] [--base REF] [--key K]
311
+ git:convention subject [--format F|--family F]
312
+ git:convention ticket [BRANCH] [--keys K]
313
+ git:convention branch --slug S [--type T] [--ticket K]
314
+ git:convention measure [--limit N] [--family F]
315
+ git:convention sync [--base REF] [--dry-run]
286
316
  settings:set Set one setting in the global file. Refuses every class-C
287
317
  (guarded) key from docs/contracts/settings-classes.md, and
288
318
  refuses everything when that contract is unreadable.
@@ -362,9 +392,9 @@ Tier 2 — maintenance / internal (hooks, MCP, memory, telemetry):
362
392
  roadmap-progress:hook PostToolUse hook entry point (read JSON from stdin)
363
393
  Regenerates roadmaps-progress.md when a tool wrote under agents/roadmaps/
364
394
  onboarding-gate:hook Hook entry point (drains stdin)
365
- Writes .augment/state/onboarding-gate.json from .agent-settings.yml
395
+ Writes agents/state/onboarding-gate.json from .agent-settings.yml
366
396
  context-hygiene:hook PostToolUse hook entry point (read JSON from stdin)
367
- Maintains .augment/state/context-hygiene.json (turn count, loop, freshness)
397
+ Maintains agents/state/context-hygiene.json (turn count, loop, freshness)
368
398
  dispatch:hook Universal hook dispatcher (Phase 7, hook-architecture-v1.md)
369
399
  Usage: dispatch:hook --platform <name> --event <event> [--native-event <native>]
370
400
  Reads scripts/hook_manifest.yaml and runs the resolved concern chain.
@@ -796,6 +826,10 @@ cmd_settings_get() {
796
826
  exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_settings_get.ts" "$@"
797
827
  }
798
828
 
829
+ cmd_git_convention() {
830
+ exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_git_convention.ts" "$@"
831
+ }
832
+
799
833
  cmd_mcp_available() {
800
834
  exec_ts "$PACKAGE_ROOT/src/scripts/_cli/cmd_mcp_available.ts" "$@"
801
835
  }
@@ -1561,6 +1595,7 @@ main() {
1561
1595
  session:recycle) cmd_session_recycle "$@" ;;
1562
1596
  packs:active) cmd_packs_active "$@" ;;
1563
1597
  settings:get) cmd_settings_get "$@" ;;
1598
+ git:convention) cmd_git_convention "$@" ;;
1564
1599
  mcp:available) cmd_mcp_available "$@" ;;
1565
1600
  brand:status) cmd_brand_status "$@" ;;
1566
1601
  roadmap:context) cmd_roadmap_context "$@" ;;
@@ -49,11 +49,13 @@ import { createRequire } from 'node:module';
49
49
  import * as fs from 'node:fs';
50
50
  import * as os from 'node:os';
51
51
  import * as path from 'node:path';
52
- import { fileURLToPath } from 'node:url';
52
+ import { resolvePackageRoot } from './package_root.js';
53
53
 
54
54
  import * as user_global_paths from './user_global_paths.js';
55
55
  import { carveOutKeys } from '../../shared/settingsCarveOut.js';
56
56
  import { applyRenamedKeys } from './settings_renamed_keys.js';
57
+ import { warnRemovedKeys } from './settings_removed_keys.js';
58
+ export { REMOVED_KEYS } from './settings_removed_keys.js';
57
59
  import type * as YamlModule from 'yaml';
58
60
 
59
61
  // ESM has no `require`; `createRequire(import.meta.url)` restores it so the
@@ -264,13 +266,13 @@ function _resolve_user_global_file(): string {
264
266
  * the user-global file. Adding a key requires an ADR.
265
267
  */
266
268
  export const MERGEABLE_KEYS: readonly string[] = [
267
- // `name`, `ide` and `personal.bot_icon` are the PRE-MIGRATION spellings.
268
- // `install.ts` migrates `ide` → `personal.ide` and `pr_comment_bot_icon`
269
- // into its `personal.` home, and this list was never moved with them — so
270
- // the whitelist named keys the template does not have while the keys it
271
- // does have were filtered out silently. A user setting either preference
272
- // user-globally got no error, no warning, and no effect
273
- // (road-to-capability-answerability 4.3, ADR-219).
269
+ // `name` and `ide` are the PRE-MIGRATION spellings. `install.ts` migrates
270
+ // `ide` → `personal.ide`, and this list was never moved with it — so the
271
+ // whitelist named a key the template does not have while the key it does
272
+ // have was filtered out silently (road-to-capability-answerability 4.3,
273
+ // ADR-219). `personal.bot_icon` / `personal.pr_comment_bot_icon` left with
274
+ // the key itself (2026-10-09): a whitelisted key nothing reads would carry a
275
+ // user-global value into a tree that ignores it.
274
276
  //
275
277
  // Both spellings are listed rather than replaced: a legacy file that still
276
278
  // uses the old name keeps working, and nothing that resolved before
@@ -280,20 +282,12 @@ export const MERGEABLE_KEYS: readonly string[] = [
280
282
  'ide',
281
283
  'personal.ide',
282
284
  'rule_loading_tier',
283
- 'memory.cadence',
284
- 'personal.bot_icon',
285
- 'personal.pr_comment_bot_icon',
286
285
  'personal.autonomy',
287
286
  // Knowledge-card global cross-project sharing is a USER-GLOBAL setting
288
287
  // (ADR-100 / road-to-structure-grounding-v2). Whitelisted so the
289
288
  // ~/.event4u/agent-config/agent-settings.yml values are honoured.
290
289
  'knowledge.global_sharing.enabled',
291
290
  'knowledge.global_sharing.allowed_tiers',
292
- 'knowledge.global_sharing.redaction.enabled',
293
- 'knowledge.global_sharing.redaction.halt_on_trigger',
294
- 'knowledge.global_sharing.auto_promote_threshold',
295
- 'knowledge.global_sharing.freshness.hypothesis_after_days',
296
- 'knowledge.global_sharing.freshness.stale_after_days',
297
291
  // `design.fidelity_mode` is a per-DEVELOPER working preference, not a
298
292
  // per-project one: whether an agent may deviate from a handed-over design
299
293
  // is a property of how that person works, and a designer who sets it once
@@ -322,11 +316,11 @@ export const MERGEABLE_KEYS: readonly string[] = [
322
316
  const TEMPLATE_RELATIVE = path.join('src', 'config', 'agent-settings.template.yml');
323
317
 
324
318
  /**
325
- * Package root: `src/scripts/_lib/agent_settings.ts` → three levels up.
326
- * Same idiom as `cli_wrapper.ts:28`, and it holds in an installed consumer
327
- * too because `src/config/` ships (`package.json` `files[]`).
319
+ * Package root, anchored on the package marker rather than on hop counts: this
320
+ * module is also inlined into `dist/cli-delegate/`, two levels below the root,
321
+ * where three hops land outside the package and every default is lost.
328
322
  */
329
- const _PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
323
+ const _PACKAGE_ROOT = resolvePackageRoot(import.meta.url);
330
324
 
331
325
  /** Default template path — overridable per call for tests. */
332
326
  export function default_template_path(): string {
@@ -975,114 +969,11 @@ export function load_agent_settings(
975
969
  _deep_merge(merged, layer);
976
970
  }
977
971
  }
978
- _warn_removed_always_on_keys(merged);
972
+ warnRemovedKeys(merged);
979
973
  return merged;
980
974
  }
981
975
 
982
976
 
983
- /**
984
- * Settings keys this package has DELETED. A leftover value from an older
985
- * install is ignored — never applied by any reader — and surfaced with ONE
986
- * deprecation line per key per process run (stderr; the exit code never
987
- * changes).
988
- *
989
- * The map carries a per-key REASON rather than one shared sentence, because
990
- * the list now spans more than one deletion doctrine and a single blanket
991
- * phrase would mis-attribute every future entry. A reader who hits the line
992
- * should learn why the key went, not just that it did.
993
- *
994
- * `subagents.*` — the always-on-orchestration doctrine
995
- * (road-to-always-on-orchestration Phase 1): the layer has no per-layer
996
- * on/off setting any more. `ai_team.enabled` joined in Step 1.3 — the
997
- * `/team` family's availability is a codex-CLI/auth FACT
998
- * (`src/scripts/ai_team/availability.ts`), not a flag; the `ai_team` config
999
- * loader (`src/scripts/ai_team/config.ts`) separately accepts a leftover
1000
- * `enabled` key without failing closed, so this warning is the only surfaced
1001
- * signal of that deletion.
1002
- *
1003
- * `hooks.turn_end_gate.*` — the turn-end gate is always armed (2026-08-12).
1004
- * A default-off safety gate cannot soak, so the switch protecting the soak
1005
- * made the soak impossible; whether the gate fires is now decided by each
1006
- * detector's own trigger conditions. See `turn_end_gate_hook.ts` § "Always
1007
- * armed".
1008
- *
1009
- * The five `derivable` leaves below (2026-08-12, road-to-zero-settings Phase
1010
- * 2.1) are a different case from every entry above them, and the difference is
1011
- * the whole safety argument: no code path ever *consulted* them. Each appeared
1012
- * in the template, the schema and the reference page, and several in the setup
1013
- * wizard, while the decision they looked like they governed was taken
1014
- * elsewhere. A key nothing reads cannot change a default by leaving — so this
1015
- * is the one deletion batch that needs no replacement mechanism, only the
1016
- * per-key statement of what already decides.
1017
- *
1018
- * A sixth unread key, `screenshots.data_bearing_gate`, was found in the same
1019
- * pass and deliberately NOT deleted — it is `consent`, and the open question is
1020
- * whether the repair is to build its missing reader or to delete a promise a
1021
- * Hard Floor can never honour. See `settings-classes.md` § The six unread keys.
1022
- *
1023
- * `worktrees.mode` (2026-08-13, ADR-229) is a third doctrine again: not
1024
- * always-on, not unread. It WAS read, and the reader honoured all three values —
1025
- * the deletion says the decision was never the agent's to make. `ask` bought a
1026
- * round trip per spawn, `on` let the agent start parallel work unprompted, and
1027
- * `off` described the wanted behaviour, so `off` became the hardcoded rule and
1028
- * the switch went. What decides instead is the user's own sentence in the chat.
1029
- *
1030
- * Every reason string must name what decides INSTEAD, never just "removed".
1031
- * Exported so `lint_settings_classes` can check the deletion side of the
1032
- * surface: a reason that names no replacement, or an entry whose key is live in
1033
- * the template again, is a contradiction the loader itself cannot notice.
1034
- */
1035
- export const REMOVED_KEYS: ReadonlyMap<string, string> = new Map([
1036
- ['subagents.enabled', 'always-on orchestration'],
1037
- ['subagents.auto', 'always-on orchestration'],
1038
- ['subagents.host_capabilities', 'always-on orchestration'],
1039
- ['subagents.budget_routing', 'always-on orchestration'],
1040
- ['ai_team.enabled', 'always-on orchestration'],
1041
- ['hooks.turn_end_gate.enabled', 'the turn-end gate is always armed'],
1042
- ['hooks.turn_end_gate.promissory', 'the turn-end gate is always armed'],
1043
- ['hooks.turn_end_gate.language', 'the turn-end gate is always armed'],
1044
- ['hooks.turn_end_gate.verification', 'the turn-end gate is always armed'],
1045
- ['telegraph.speak_scope', 'the rule body states its own scope; compile_router gates on telegraph.speak alone'],
1046
- ['chat_history.max_size_kb', 'the rotate command takes --max-kb from argv; session-count pruning bounds the file'],
1047
- ['chat_history.on_overflow', 'the overflow mode comes from the rotate command --mode argv'],
1048
- ['quality.wait_for_remote_ci', 'whether to poll follows from the push plus a detectable remote pipeline'],
1049
- ['legal_review_prep.consented_at', 'the provenance sidecar settings:set writes and consentVerdict reads'],
1050
- ['worktrees.mode', 'the user asking for a worktree in the chat; creation is instruction-only and hardcoded'],
1051
- ]);
1052
-
1053
- /** Keys already warned about in THIS process — the "once per run" dedupe. */
1054
- const _warnedRemovedKeys = new Set<string>();
1055
-
1056
- /** Read one dotted path out of a merged settings tree; `undefined` when absent. */
1057
- function _readDottedSettingsPath(root: SettingsDict, dotted: string): SettingsValue {
1058
- let node: SettingsValue = root;
1059
- for (const part of dotted.split('.')) {
1060
- if (typeof node !== 'object' || node === null || Array.isArray(node)) {
1061
- return undefined;
1062
- }
1063
- node = (node as SettingsDict)[part];
1064
- }
1065
- return node;
1066
- }
1067
-
1068
- /**
1069
- * Warn once per process, on stderr, for every {@link REMOVED_KEYS} entry still
1070
- * present in a resolved settings tree. Never throws, never changes what the
1071
- * caller does with `merged` — a pure notification side effect.
1072
- */
1073
- function _warn_removed_always_on_keys(merged: SettingsDict): void {
1074
- for (const [key, reason] of REMOVED_KEYS) {
1075
- if (_warnedRemovedKeys.has(key)) {
1076
- continue;
1077
- }
1078
- if (_readDottedSettingsPath(merged, key) === undefined) {
1079
- continue;
1080
- }
1081
- _warnedRemovedKeys.add(key);
1082
- process.stderr.write(`${key} was removed (${reason}); ignored.\n`);
1083
- }
1084
- }
1085
-
1086
977
  /**
1087
978
  * Return the merged `modules:` configuration with defaults applied.
1088
979
  *
@@ -50,7 +50,7 @@ export interface BlockedByMarker {
50
50
  * unreadable, which is a migration, not a fix.
51
51
  */
52
52
  export const BLOCKED_BY_MARKER_RE =
53
- /<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[—-][ \t]*([^>]*?))?[ \t]*)?-->/i;
53
+ /<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+(?:#[a-z0-9-]+)?)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[—-][ \t]*([^>]*?))?[ \t]*)?-->/i;
54
54
 
55
55
  /** Parse one marker, or `null` when the text carries none. */
56
56
  export function parseBlockedByMarker(text: string): BlockedByMarker | null {
@@ -14,8 +14,8 @@
14
14
  * as "project instructions", never having consulted the router.
15
15
  *
16
16
  * Two surfaces, one switch. Sharing the definition is what lets the projector honour
17
- * it, so `speak: false` means what the ADR assumed instead of the ADR being weakened
18
- * to match a partial implementation.
17
+ * it, so dormancy means what the ADR assumed instead of the ADR being weakened to
18
+ * match a partial implementation.
19
19
  */
20
20
 
21
21
  /**
@@ -51,25 +51,16 @@ export type ToggleSettings = Record<string, unknown>;
51
51
  /** rule-id → predicate. A rule is emitted (router AND projection) only when its
52
52
  * predicate returns true. A rule absent from this map is always emitted. */
53
53
  export const COMPILE_TIME_TOGGLES: Record<string, (s: ToggleSettings) => boolean> = {
54
- // `speak` defaults FALSE (dormant) per docs/adrs/telegraph/0002 — the absent-key
55
- // fallback used to be `true`, which silently contradicted ADR 0001 (accepted,
56
- // "default off until bench"). Measured basis: median vs_terse −9.27% (API) /
57
- // −5.47% (exact cl100k_base) — telegraph emits MORE than a plain "be terse".
58
- // Opt back in with an explicit `telegraph.speak: true` once an output-side bench
59
- // clears the kill-criterion bar. `enabled` keeps its true default: it is the
60
- // family master switch, and flipping it would silence sibling telegraph settings
61
- // that were never measured negative.
62
- //
63
- // The predicate gates on `telegraph.speak` because that is the only lever that
64
- // removes the rule's ~982-token body from the router and the projection. A knob
65
- // that merely narrowed the grammar at runtime would leave the token cost in place
66
- // — the trap the measurement exposed.
67
- 'telegraph-speak': (s: ToggleSettings): boolean => {
68
- const tg = (s['telegraph'] as ToggleSettings | undefined) ?? {};
69
- const enabled = tg['enabled'] === undefined ? true : tg['enabled'];
70
- const speak = tg['speak'] === undefined ? false : tg['speak'];
71
- return Boolean(enabled) && Boolean(speak);
72
- },
54
+ // DORMANT, unconditionally. `speak` defaulted FALSE per docs/adrs/telegraph/0002
55
+ // (measured basis: median vs_terse −9.27% API / −5.47% exact cl100k_base —
56
+ // telegraph emits MORE than a plain "be terse"), and on 2026-10-09 the
57
+ // `telegraph.speak` key was retired with that default as the fixed value
58
+ // (road-to-settings-classes-derivable-surface-stagnation Phase 2.1). Whether
59
+ // the rule ships is the kill-criterion bench verdict, a package-level decision
60
+ // rather than a per-install one, so re-enabling it is a change to this
61
+ // predicate, made when an output-side bench clears the bar — never a setting.
62
+ // A leftover `telegraph.speak: true` is warned about by the loader and ignored.
63
+ 'telegraph-speak': (): boolean => false,
73
64
  };
74
65
 
75
66
  /** True when the rule may be emitted. Unknown ids are always emitted — the map is an