@event4u/agent-config 16.2.0 → 16.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +337 -234
  5. package/README.md +15 -13
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +11 -8
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  9. package/dist/agent-src/commands/bug/fix.md +17 -2
  10. package/dist/agent-src/commands/bug/investigate.md +1 -1
  11. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  12. package/dist/agent-src/commands/commit.md +72 -33
  13. package/dist/agent-src/commands/condense.md +2 -8
  14. package/dist/agent-src/commands/council/debate.md +11 -7
  15. package/dist/agent-src/commands/council/default.md +10 -9
  16. package/dist/agent-src/commands/council.md +1 -1
  17. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  18. package/dist/agent-src/commands/feature/explore.md +3 -3
  19. package/dist/agent-src/commands/feature/plan.md +2 -2
  20. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  21. package/dist/agent-src/commands/fix/ci.md +18 -4
  22. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  23. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  24. package/dist/agent-src/commands/implement-ticket.md +4 -4
  25. package/dist/agent-src/commands/jira-ticket.md +1 -1
  26. package/dist/agent-src/commands/memory/add.md +4 -16
  27. package/dist/agent-src/commands/memory/load.md +5 -6
  28. package/dist/agent-src/commands/memory/promote.md +3 -16
  29. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  30. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  31. package/dist/agent-src/commands/optimize/deep.md +4 -2
  32. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  33. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  34. package/dist/agent-src/commands/pr/create.md +42 -34
  35. package/dist/agent-src/commands/pr/merge.md +136 -9
  36. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  37. package/dist/agent-src/commands/project/analyze.md +7 -35
  38. package/dist/agent-src/commands/refine-ticket.md +1 -1
  39. package/dist/agent-src/commands/review/changes.md +14 -19
  40. package/dist/agent-src/commands/roadmap/create.md +1 -1
  41. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  42. package/dist/agent-src/commands/roadmap/next.md +10 -1
  43. package/dist/agent-src/commands/roadmap/process-full.md +56 -42
  44. package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
  45. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  46. package/dist/agent-src/commands/roadmap.md +18 -4
  47. package/dist/agent-src/commands/tests/create.md +17 -3
  48. package/dist/agent-src/commands/tests/execute.md +22 -5
  49. package/dist/agent-src/commands/worktree/create.md +7 -3
  50. package/dist/agent-src/commands/worktree/verify.md +2 -1
  51. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  52. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  53. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  54. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  55. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  56. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  57. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
  58. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  59. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  60. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  61. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  62. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  63. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
  64. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  65. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  66. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  67. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  68. package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
  69. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  70. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  71. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  72. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  73. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  74. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  75. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  76. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  77. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  78. package/dist/agent-src/guidelines/php/git.md +15 -2
  79. package/dist/agent-src/rules/active-remediation.md +1 -2
  80. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  81. package/dist/agent-src/rules/architecture.md +0 -1
  82. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  83. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  84. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  85. package/dist/agent-src/rules/autonomous-execution.md +1 -1
  86. package/dist/agent-src/rules/brand-consistency.md +0 -1
  87. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  88. package/dist/agent-src/rules/broken-access-control.md +1 -1
  89. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  90. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  91. package/dist/agent-src/rules/code-provenance.md +0 -1
  92. package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
  93. package/dist/agent-src/rules/commit-conventions.md +1 -2
  94. package/dist/agent-src/rules/communication-through-line.md +1 -2
  95. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  96. package/dist/agent-src/rules/context-hygiene.md +6 -6
  97. package/dist/agent-src/rules/copilot-routing.md +1 -2
  98. package/dist/agent-src/rules/council-availability.md +4 -4
  99. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  100. package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
  101. package/dist/agent-src/rules/delegation-policy.md +2 -3
  102. package/dist/agent-src/rules/design-fidelity.md +12 -16
  103. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  104. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  105. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
  106. package/dist/agent-src/rules/docker-commands.md +0 -1
  107. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  108. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
  109. package/dist/agent-src/rules/domain-safety-pii.md +1 -1
  110. package/dist/agent-src/rules/domain-safety-retention.md +1 -1
  111. package/dist/agent-src/rules/downstream-changes.md +0 -1
  112. package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
  113. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  114. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  115. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  116. package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
  117. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  118. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  119. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  120. package/dist/agent-src/rules/git-history-discipline.md +2 -2
  121. package/dist/agent-src/rules/guidelines.md +0 -1
  122. package/dist/agent-src/rules/history-discipline.md +0 -1
  123. package/dist/agent-src/rules/icon-consistency.md +0 -1
  124. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
  125. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  126. package/dist/agent-src/rules/invite-challenge.md +0 -1
  127. package/dist/agent-src/rules/laravel-routing.md +1 -2
  128. package/dist/agent-src/rules/laravel-translations.md +0 -1
  129. package/dist/agent-src/rules/legal-safety-floor.md +3 -3
  130. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
  131. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  132. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
  133. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  134. package/dist/agent-src/rules/media-governance-routing.md +13 -17
  135. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  136. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  137. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  138. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  139. package/dist/agent-src/rules/model-recommendation.md +0 -1
  140. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  141. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  142. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  143. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  144. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  145. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  146. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  147. package/dist/agent-src/rules/output-discipline.md +0 -1
  148. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  149. package/dist/agent-src/rules/persona-governance.md +4 -5
  150. package/dist/agent-src/rules/php-coding.md +0 -1
  151. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  152. package/dist/agent-src/rules/preservation-guard.md +0 -1
  153. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
  154. package/dist/agent-src/rules/question-not-instruction.md +1 -1
  155. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  156. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  157. package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
  158. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  159. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  160. package/dist/agent-src/rules/runtime-safety.md +1 -1
  161. package/dist/agent-src/rules/scale-discipline.md +0 -1
  162. package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
  163. package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
  164. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  165. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  166. package/dist/agent-src/rules/session-canary.md +7 -62
  167. package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
  168. package/dist/agent-src/rules/size-enforcement.md +0 -1
  169. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  170. package/dist/agent-src/rules/skill-quality.md +0 -1
  171. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  172. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  173. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  174. package/dist/agent-src/rules/source-of-truth.md +0 -1
  175. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  176. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  177. package/dist/agent-src/rules/symfony-routing.md +1 -2
  178. package/dist/agent-src/rules/think-before-action.md +0 -1
  179. package/dist/agent-src/rules/token-budget-discipline.md +12 -46
  180. package/dist/agent-src/rules/token-efficiency.md +0 -1
  181. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  182. package/dist/agent-src/rules/tool-safety.md +1 -1
  183. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  184. package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
  185. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  186. package/dist/agent-src/rules/user-interaction.md +0 -1
  187. package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
  188. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  189. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  190. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  191. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  192. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  193. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  194. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  195. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  196. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  197. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  198. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  199. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  200. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  201. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  202. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  203. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  204. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  205. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  206. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  207. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  208. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  209. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  210. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
  211. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  212. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  213. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  214. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  215. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  216. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  217. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  218. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  219. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  220. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  221. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  222. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  223. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  224. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  225. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  226. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  227. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  228. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
  229. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  230. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  231. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
  232. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  233. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  234. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  235. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  236. package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
  237. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  238. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  239. package/dist/agent-src/templates/AGENTS.md +1 -1
  240. package/dist/agent-src/templates/agent-settings.md +46 -129
  241. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  242. package/dist/agent-src/templates/command.md +2 -2
  243. package/dist/agent-src/templates/roadmaps.md +6 -1
  244. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  245. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  246. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  247. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  248. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  249. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  250. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  251. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  252. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  253. package/dist/agent-src/templates/skill.md +1 -1
  254. package/dist/cli/registry.js +2 -1
  255. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  256. package/dist/cli-delegate/check_update_banner.js +207 -120
  257. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  258. package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
  259. package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
  260. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  261. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  262. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  263. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  264. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  265. package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
  266. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  267. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  268. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  269. package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
  270. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
  271. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
  272. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  273. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  274. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  275. package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
  276. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
  277. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  278. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
  279. package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
  280. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  281. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  282. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  283. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
  284. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  285. package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
  286. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  287. package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
  288. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
  289. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  290. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  291. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  292. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  293. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  294. package/dist/cli-delegate/cmd_conformance.js +1252 -249
  295. package/dist/cli-delegate/cmd_converge.js +3 -3
  296. package/dist/cli-delegate/cmd_doctor.js +19 -9
  297. package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
  298. package/dist/cli-delegate/cmd_explain.js +45 -21
  299. package/dist/cli-delegate/cmd_export.js +13 -10
  300. package/dist/cli-delegate/cmd_fleet.js +3 -3
  301. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  302. package/dist/cli-delegate/cmd_handoff.js +44 -22
  303. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  304. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  305. package/dist/cli-delegate/cmd_migrate.js +3 -3
  306. package/dist/cli-delegate/cmd_packs_active.js +5 -4
  307. package/dist/cli-delegate/cmd_preflight.js +6 -6
  308. package/dist/cli-delegate/cmd_prune.js +14 -11
  309. package/dist/cli-delegate/cmd_refresh.js +2 -1
  310. package/dist/cli-delegate/cmd_route_audit.js +10 -8
  311. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  312. package/dist/cli-delegate/cmd_session_recycle.js +10 -7
  313. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  314. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  315. package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
  316. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  317. package/dist/cli-delegate/cmd_sync.js +14 -11
  318. package/dist/cli-delegate/cmd_uninstall.js +15 -12
  319. package/dist/cli-delegate/cmd_update.js +7 -7
  320. package/dist/cli-delegate/cmd_upgrade.js +9 -8
  321. package/dist/cli-delegate/cmd_validate.js +15 -12
  322. package/dist/cli-delegate/cmd_versions.js +5 -5
  323. package/dist/cli-delegate/deferral_carry.js +16 -0
  324. package/dist/cli-delegate/gate_budget.js +1 -1
  325. package/dist/cli-delegate/gate_execute.js +3 -3
  326. package/dist/cli-delegate/roadmap_gates.js +6 -6
  327. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  328. package/dist/discovery/deprecation-report.md +1 -1
  329. package/dist/discovery/discovery-manifest.json +232 -141
  330. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  331. package/dist/discovery/discovery-manifest.summary.md +3 -3
  332. package/dist/discovery/dormancy-report.md +1 -1
  333. package/dist/discovery/orphan-report.md +1 -1
  334. package/dist/discovery/packs.json +26 -9
  335. package/dist/discovery/trust-report.md +3 -3
  336. package/dist/discovery/workspaces.json +7 -4
  337. package/dist/hooks/dispatch.js +5655 -6623
  338. package/dist/hooks/dispatch.sha256 +1 -1
  339. package/dist/install/claudePathsPlan.js +47 -6
  340. package/dist/install/claudeRuleRewrite.js +7 -0
  341. package/dist/install/emit_host_rules_cli.js +39 -36
  342. package/dist/install/globalRuleScope.js +87 -0
  343. package/dist/install/host_rule_ownership.js +160 -0
  344. package/dist/install/install.mjs +2336 -1249
  345. package/dist/install/installThinLayer.js +289 -0
  346. package/dist/install/installedRuleLinks.js +262 -0
  347. package/dist/install/wizard-plan.js +24 -0
  348. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  349. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  350. package/dist/mcp/registry-manifest.json +5 -5
  351. package/dist/mcp/server.json +2 -2
  352. package/dist/mcp/server.mjs +36504 -30986
  353. package/dist/router.json +1 -1
  354. package/dist/scripts/_lib/agent_settings.js +26 -120
  355. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  356. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  357. package/dist/scripts/_lib/git_convention.js +232 -0
  358. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  359. package/dist/scripts/_lib/installed_layer.js +704 -0
  360. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  361. package/dist/scripts/_lib/package_root.js +68 -0
  362. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  363. package/dist/scripts/_lib/rule_injection.js +67 -10
  364. package/dist/scripts/_lib/rule_law_section.js +122 -0
  365. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  366. package/dist/scripts/_lib/thin_rules.js +535 -0
  367. package/dist/scripts/_lib/windsurf_render.js +60 -0
  368. package/dist/scripts/condense.js +14 -26
  369. package/dist/scripts/project_thin_rules.js +14 -294
  370. package/dist/server/app.js +2 -1
  371. package/dist/server/gitKeysGate.js +105 -0
  372. package/dist/server/routes/settings.js +67 -8
  373. package/dist/server/routes/wizard.js +4 -0
  374. package/dist/server/schemas/settings.js +29 -81
  375. package/dist/shared/skillRanking.js +103 -16
  376. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  377. package/dist/ui/index.html +1 -1
  378. package/docs/MIGRATION.md +72 -1
  379. package/docs/contracts/settings-classes.md +39 -67
  380. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  381. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  382. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  383. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  384. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  385. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  386. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  387. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  388. package/docs/guidelines/php/git.md +15 -2
  389. package/package.json +1 -1
  390. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  391. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  392. package/src/agent-src/scripts/gate_budget.ts +47 -23
  393. package/src/agent-src/scripts/gate_execute.ts +12 -4
  394. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  395. package/src/agent-src/templates/AGENTS.md +1 -1
  396. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  397. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  398. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
  399. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  400. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  401. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  402. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  403. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  404. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  405. package/src/config/agent-settings.template.yml +141 -334
  406. package/src/config/agents-paths.yml +16 -0
  407. package/src/config/assurance-capability-registry.json +7 -3
  408. package/src/config/ci-local-parity.yml +3 -0
  409. package/src/config/continuity-surface.json +10 -3
  410. package/src/config/discovery/packs.yml +17 -1
  411. package/src/config/evaluator-budgets.json +23 -10
  412. package/src/config/gate-coverage.yml +138 -3
  413. package/src/config/gate-violation-baselines.json +64 -16
  414. package/src/config/gitignore-block.txt +19 -0
  415. package/src/config/hook-bundle-budget.json +25 -0
  416. package/src/config/hook-token-budget.json +6 -1
  417. package/src/config/host-instruction-limits.json +33 -0
  418. package/src/config/release-gate-locality.yml +2 -1
  419. package/src/config/routing-coverage-seed.json +67 -4
  420. package/src/config/rule-activation-census.json +7 -3
  421. package/src/config/rule-consequence-class.json +161 -0
  422. package/src/config/rule-law-ceilings.json +105 -0
  423. package/src/config/rule-obligations.json +833 -0
  424. package/src/install/claudePathsPlan.ts +46 -4
  425. package/src/install/claudeRuleRewrite.ts +10 -1
  426. package/src/install/emit_host_rules_cli.ts +43 -34
  427. package/src/install/globalRuleScope.ts +109 -0
  428. package/src/install/host_rule_ownership.ts +170 -0
  429. package/src/install/installThinLayer.ts +378 -0
  430. package/src/install/installedRuleLinks.ts +308 -0
  431. package/src/install/wizard-plan.ts +24 -0
  432. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  433. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  434. package/src/scripts/_cli/cmd_doctor.ts +33 -81
  435. package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
  436. package/src/scripts/_cli/cmd_explain.ts +72 -14
  437. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  438. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  439. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  440. package/src/scripts/_cli/doctor_execution.ts +72 -1
  441. package/src/scripts/_dispatch.bash +53 -4
  442. package/src/scripts/_lib/agent_settings.ts +26 -124
  443. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  444. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  445. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  446. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  447. package/src/scripts/_lib/estate_offsets.ts +241 -0
  448. package/src/scripts/_lib/exemption_shape.ts +143 -0
  449. package/src/scripts/_lib/fnv.ts +23 -0
  450. package/src/scripts/_lib/foreign_scan.ts +106 -0
  451. package/src/scripts/_lib/git_base_ref.ts +92 -0
  452. package/src/scripts/_lib/git_convention.ts +291 -0
  453. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  454. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  455. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  456. package/src/scripts/_lib/gitignore_block.ts +314 -0
  457. package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
  458. package/src/scripts/_lib/graph_feeder_record.ts +437 -0
  459. package/src/scripts/_lib/hook_settings.ts +73 -0
  460. package/src/scripts/_lib/host_capability.ts +40 -19
  461. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  462. package/src/scripts/_lib/installed_layer.ts +963 -0
  463. package/src/scripts/_lib/json_merge.ts +82 -0
  464. package/src/scripts/_lib/json_pointers.ts +93 -11
  465. package/src/scripts/_lib/knowledge_global.ts +14 -1
  466. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  467. package/src/scripts/_lib/machine_wake.ts +16 -3
  468. package/src/scripts/_lib/module_reach.ts +456 -0
  469. package/src/scripts/_lib/neighbour_census.ts +760 -0
  470. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  471. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  472. package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
  473. package/src/scripts/_lib/prompt_shape.ts +46 -0
  474. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  475. package/src/scripts/_lib/ratification_subject.ts +92 -0
  476. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  477. package/src/scripts/_lib/release_highlights.ts +5 -0
  478. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  479. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  480. package/src/scripts/_lib/review_coverage.ts +134 -0
  481. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  482. package/src/scripts/_lib/rule_injection.ts +130 -10
  483. package/src/scripts/_lib/rule_law_section.ts +147 -0
  484. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  485. package/src/scripts/_lib/rule_obligations.ts +205 -0
  486. package/src/scripts/_lib/self_repair.ts +1 -1
  487. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  488. package/src/scripts/_lib/skill_origin.ts +254 -0
  489. package/src/scripts/_lib/structured_ask.ts +64 -21
  490. package/src/scripts/_lib/test_red_state.ts +5 -0
  491. package/src/scripts/_lib/thin_rules.ts +620 -0
  492. package/src/scripts/_lib/touched_file_quality.ts +570 -0
  493. package/src/scripts/_lib/turn_end_refusals.ts +77 -2
  494. package/src/scripts/_lib/windsurf_render.ts +63 -0
  495. package/src/scripts/_lib/worker_budget.ts +1 -1
  496. package/src/scripts/adr/regenerate_index.ts +16 -1
  497. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  498. package/src/scripts/ai_council/clients.ts +26 -57
  499. package/src/scripts/ai_council/config.ts +8 -8
  500. package/src/scripts/ai_council/modification_review.ts +100 -0
  501. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  502. package/src/scripts/ai_council/orchestrator.ts +5 -5
  503. package/src/scripts/ai_council/spend_gate.ts +18 -7
  504. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  505. package/src/scripts/ai_team/config.ts +11 -16
  506. package/src/scripts/audit_skill_overlap.ts +261 -0
  507. package/src/scripts/audit_user_type_axis.ts +20 -8
  508. package/src/scripts/before_complete_hook.ts +243 -12
  509. package/src/scripts/bench_ab_clone.ts +1 -2
  510. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  511. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  512. package/src/scripts/bench_touched_file_quality.ts +238 -0
  513. package/src/scripts/check_agent_artifact_location.ts +36 -0
  514. package/src/scripts/check_branch_freshness.ts +147 -24
  515. package/src/scripts/check_enforcement_coverage.ts +130 -0
  516. package/src/scripts/check_enforcement_matrix.ts +377 -20
  517. package/src/scripts/check_estate_count.ts +130 -153
  518. package/src/scripts/check_evaluator_budgets.ts +4 -0
  519. package/src/scripts/check_finding_dispositions.ts +196 -21
  520. package/src/scripts/check_gate_coverage.ts +4 -3
  521. package/src/scripts/check_gate_reachability.ts +48 -1
  522. package/src/scripts/check_generator_sync.ts +48 -0
  523. package/src/scripts/check_hook_bundle_composition.ts +477 -0
  524. package/src/scripts/check_kernel_edit_ratified.ts +132 -14
  525. package/src/scripts/check_memory.ts +7 -1
  526. package/src/scripts/check_pack_size.ts +1 -1
  527. package/src/scripts/check_release_highlights.ts +10 -0
  528. package/src/scripts/check_release_manifest_content.ts +189 -0
  529. package/src/scripts/check_release_pr_shape.ts +38 -15
  530. package/src/scripts/check_standing_rule_delivery.ts +129 -13
  531. package/src/scripts/check_suppression_hygiene.ts +2 -5
  532. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  533. package/src/scripts/ci_settle.ts +42 -5
  534. package/src/scripts/classify_merge_risk.ts +320 -0
  535. package/src/scripts/closure_scan.ts +91 -1
  536. package/src/scripts/code_graph/detect.ts +127 -7
  537. package/src/scripts/code_graph/foreign.ts +194 -0
  538. package/src/scripts/code_graph/query.ts +217 -4
  539. package/src/scripts/code_graph/types.ts +26 -2
  540. package/src/scripts/code_graph/validate.ts +3 -1
  541. package/src/scripts/code_graph/verbs.ts +103 -0
  542. package/src/scripts/command_suggester/settings.ts +8 -108
  543. package/src/scripts/command_suggester/types.ts +4 -5
  544. package/src/scripts/compile_hook_manifest.ts +33 -1
  545. package/src/scripts/condense.ts +14 -27
  546. package/src/scripts/consumer_matrix.ts +102 -0
  547. package/src/scripts/context_hygiene_hook.ts +13 -23
  548. package/src/scripts/cost/preflight.mjs +12 -1
  549. package/src/scripts/council_cli.ts +7 -7
  550. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  551. package/src/scripts/estate_exemption_shape.ts +202 -0
  552. package/src/scripts/explain_run.ts +8 -13
  553. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  554. package/src/scripts/generate_host_cost_table.ts +21 -4
  555. package/src/scripts/handoff_context_hook.ts +86 -37
  556. package/src/scripts/hook_manifest.json +1 -1
  557. package/src/scripts/hook_manifest.yaml +175 -15
  558. package/src/scripts/hooks/block_config_weakening.ts +115 -7
  559. package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
  560. package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
  561. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  562. package/src/scripts/hooks/concern_registry.ts +2 -0
  563. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  564. package/src/scripts/hooks/dispatch_hook.ts +52 -52
  565. package/src/scripts/hooks/evidence_independence.ts +12 -4
  566. package/src/scripts/hooks/exit_codes.ts +2 -1
  567. package/src/scripts/hooks/host_lowering.json +1 -1
  568. package/src/scripts/hooks/host_lowering.ts +19 -1
  569. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  570. package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
  571. package/src/scripts/hooks/payload_stub.ts +10 -1
  572. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  573. package/src/scripts/hooks/rule_inject_hook.ts +795 -60
  574. package/src/scripts/hooks/state_io.ts +8 -4
  575. package/src/scripts/hooks/table_fingerprint.ts +21 -0
  576. package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
  577. package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
  578. package/src/scripts/hooks_status.ts +112 -0
  579. package/src/scripts/injection_scan_hook.ts +7 -0
  580. package/src/scripts/install-hooks.sh +42 -14
  581. package/src/scripts/install.ts +78 -215
  582. package/src/scripts/installed_layer_report.ts +103 -0
  583. package/src/scripts/language_mirror_hook.ts +15 -6
  584. package/src/scripts/learning_sidecar.ts +119 -8
  585. package/src/scripts/lint_blocker_citations.ts +198 -0
  586. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  587. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  588. package/src/scripts/lint_hook_manifest.ts +53 -0
  589. package/src/scripts/lint_major_migration_sections.ts +156 -26
  590. package/src/scripts/lint_pack_boundaries.ts +465 -29
  591. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  592. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  593. package/src/scripts/lint_rule_law_section.ts +647 -0
  594. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  595. package/src/scripts/lint_settings_classes.ts +1 -1
  596. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  597. package/src/scripts/lint_workflow_security.ts +173 -6
  598. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  599. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  600. package/src/scripts/measure_routing_signal.ts +54 -16
  601. package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
  602. package/src/scripts/memory_learn_hook.ts +91 -6
  603. package/src/scripts/model_rule_injection.ts +55 -8
  604. package/src/scripts/onboarding_gate_hook.ts +7 -6
  605. package/src/scripts/print_required_checks.ts +15 -3
  606. package/src/scripts/probe_host_compliance.ts +33 -5
  607. package/src/scripts/probe_turnaround.ts +183 -3
  608. package/src/scripts/project_thin_rules.ts +34 -327
  609. package/src/scripts/ratification_header.ts +77 -0
  610. package/src/scripts/refusal_envelope.ts +138 -0
  611. package/src/scripts/release_publication.ts +29 -3
  612. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  613. package/src/scripts/report_evidence_temperature.ts +657 -0
  614. package/src/scripts/report_installed_rule_links.ts +274 -0
  615. package/src/scripts/report_label_agreement.ts +233 -0
  616. package/src/scripts/report_module_reach.ts +212 -0
  617. package/src/scripts/report_obligation_mechanism.ts +228 -0
  618. package/src/scripts/report_parked_blockers.ts +222 -0
  619. package/src/scripts/report_required_checks_drift.ts +196 -0
  620. package/src/scripts/report_single_token_triggers.ts +277 -0
  621. package/src/scripts/report_skill_ranker_confusion.ts +543 -0
  622. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  623. package/src/scripts/report_verification_record_coverage.ts +306 -0
  624. package/src/scripts/routing_doctor.ts +2 -2
  625. package/src/scripts/rule_activation_census.ts +5 -2
  626. package/src/scripts/rule_trigger_eval.ts +9 -9
  627. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  628. package/src/scripts/schemas/command.schema.json +1 -1
  629. package/src/scripts/schemas/review-findings.schema.json +3 -2
  630. package/src/scripts/schemas/rule.schema.json +5 -0
  631. package/src/scripts/schemas/skill.schema.json +1 -1
  632. package/src/scripts/self_review_gate.ts +101 -9
  633. package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
  634. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  635. package/src/scripts/sync_gitignore.ts +29 -235
  636. package/src/scripts/sync_pr_branch.ts +403 -132
  637. package/src/scripts/trigger_eval_grandfather.json +0 -21
  638. package/src/server/schemas/settings.ts +42 -176
  639. package/src/shared/skillRanking.ts +169 -14
  640. package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
  641. package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
  642. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  643. package/src/scripts/_lib/config_chain.ts +0 -477
  644. package/src/scripts/_lib/conformance_report.ts +0 -403
  645. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  646. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  647. package/src/scripts/_lib/file_slicer.ts +0 -117
  648. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  649. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  650. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  651. package/src/scripts/_lib/role_split.ts +0 -338
@@ -22,8 +22,15 @@
22
22
  * auto-promoted) — it NEVER mutates the curated YAML truths. Deterministic:
23
23
  * byte-stable for a fixed `now` + a fixed intake set.
24
24
  *
25
+ * `--format status` is the third, human-facing view (road-to-learning-you-can-
26
+ * see Phase 2): the verdict counts, the top `preferred` lessons with their
27
+ * corroboration and age, and the sentence saying what a promotion requires. It
28
+ * is a FORMAT and not a verb (decision D2 cites ADR-041) — `memory:learn`
29
+ * passes argv straight through, so a format needs no registry row — and it is
30
+ * read-only to the point of refusing `--write` rather than ignoring it.
31
+ *
25
32
  * Usage: learning_sidecar.ts [--intake-dir DIR] [--out-dir DIR] [--now ISO]
26
- * [--write] [--format text|json]
33
+ * [--write] [--format text|json|status]
27
34
  * Exit codes: 0 ok, 2 usage error, 3 internal error.
28
35
  */
29
36
  import { createHash } from 'node:crypto';
@@ -48,7 +55,11 @@ export const SCHEMA_VERSION = 1;
48
55
  export type Polarity = 'preferred' | 'dead_end';
49
56
  export type Verdict = 'preferred' | 'contested' | 'dead_end';
50
57
 
51
- interface Signal {
58
+ /** The output formats. `status` is the one-screen human view (read-only). */
59
+ export const FORMATS = ['text', 'json', 'status'] as const;
60
+ export type Format = (typeof FORMATS)[number];
61
+
62
+ export interface Signal {
52
63
  id: string;
53
64
  ts: string;
54
65
  tsMs: number;
@@ -226,9 +237,21 @@ export function aggregate(signals: readonly Signal[], nowMs: number): Lesson[] {
226
237
  }
227
238
 
228
239
  export function buildSidecar(intakeDir: string, nowIso: string): Sidecar {
240
+ return buildSidecarFromSignals(readSignals(intakeDir), nowIso);
241
+ }
242
+
243
+ /**
244
+ * The half of `buildSidecar` that does not read the disk.
245
+ *
246
+ * Split out for a caller that needs BOTH the input count and the output
247
+ * lessons from one pass — the session-end dogfood ledger records `signals_in`
248
+ * beside `lessons_out`, and reading the intake twice to get them would make the
249
+ * two numbers describe two different reads under the 2 s budget they exist to
250
+ * measure.
251
+ */
252
+ export function buildSidecarFromSignals(signals: readonly Signal[], nowIso: string): Sidecar {
229
253
  const nowMs = _parseTsMs(nowIso) ?? 0;
230
- const lessons = aggregate(readSignals(intakeDir), nowMs);
231
- return { schema_version: SCHEMA_VERSION, generated_at: nowIso, lessons };
254
+ return { schema_version: SCHEMA_VERSION, generated_at: nowIso, lessons: aggregate(signals, nowMs) };
232
255
  }
233
256
 
234
257
  /** Render the human dead-ends + contested ledger. */
@@ -261,22 +284,98 @@ export function renderLessonsMd(sidecar: Sidecar): string {
261
284
  return L.join('\n');
262
285
  }
263
286
 
287
+ /** How many `preferred` lessons the status screen lists before it stops. */
288
+ export const STATUS_TOP_N = 5;
289
+
290
+ /**
291
+ * The human step. Printed as the LAST line of the status screen, because this
292
+ * tree writes no rule and no skill on its own: a lesson becomes a durable
293
+ * artefact only when a person carries it through `/memory:propose` or the
294
+ * `learning-to-rule-or-skill` skill. A list of preferred lessons is one flag
295
+ * away from `--apply`, and naming the hand-off on every screen is the cheapest
296
+ * standing answer to "why is there no button".
297
+ */
298
+ export const PROMOTION_HANDOFF =
299
+ 'Promote by hand: /memory:propose · src/skills/learning-to-rule-or-skill/SKILL.md';
300
+
301
+ /**
302
+ * One screen answering "what has this learned?" — verdict counts, the top
303
+ * `preferred` lessons with their corroboration and age, and what a promotion
304
+ * requires. READ ONLY by construction: it takes a built sidecar and returns a
305
+ * string, so there is no path from this function to the disk.
306
+ */
307
+ export function renderStatus(sidecar: Sidecar): string {
308
+ const byVerdict: Record<Verdict, number> = { preferred: 0, contested: 0, dead_end: 0 };
309
+ for (const l of sidecar.lessons) byVerdict[l.verdict] += 1;
310
+
311
+ const nowMs = _parseTsMs(sidecar.generated_at) ?? 0;
312
+ const L: string[] = [];
313
+ L.push(`${PROG}: ${String(sidecar.lessons.length)} lesson(s) as of ${sidecar.generated_at}`);
314
+ L.push(
315
+ `preferred: ${String(byVerdict.preferred)} · ` +
316
+ `contested: ${String(byVerdict.contested)} · ` +
317
+ `dead-end: ${String(byVerdict.dead_end)}`,
318
+ );
319
+ L.push('');
320
+
321
+ const preferred = sidecar.lessons
322
+ .filter((l) => l.verdict === 'preferred')
323
+ .sort((a, b) => b.score - a.score || (a.path < b.path ? -1 : 1))
324
+ .slice(0, STATUS_TOP_N);
325
+ L.push(`Top ${String(STATUS_TOP_N)} preferred:`);
326
+ if (preferred.length === 0) {
327
+ L.push(' (none — a lesson needs corroboration before it appears here)');
328
+ } else {
329
+ preferred.forEach((l, i) => {
330
+ // Age is floored, so a lesson seen hours ago reads `0d old` rather
331
+ // than rounding up into a day it has not lived.
332
+ const ageDays = Math.max(0, Math.floor((nowMs - (_parseTsMs(l.last_ts) ?? nowMs)) / 86400000));
333
+ L.push(
334
+ ` ${String(i + 1)}. ${l.entry_type} @ ${l.path} — ` +
335
+ `${String(l.corroborations)} origins, ${String(ageDays)}d old`,
336
+ );
337
+ L.push(` ${l.body}`);
338
+ });
339
+ }
340
+ L.push('');
341
+ L.push(
342
+ `A lesson is promoted at ${String(MIN_CORROBORATIONS)} distinct origins, ` +
343
+ `weighted by a ${String(HALF_LIFE_DAYS)}-day half-life; nothing here promotes itself.`,
344
+ );
345
+ L.push(PROMOTION_HANDOFF);
346
+ return `${L.join('\n')}\n`;
347
+ }
348
+
264
349
  export function main(argv: string[]): number {
265
350
  let intakeDir = path.join('agents', 'memory', 'intake');
266
351
  let outDir = path.join('agents', 'memory');
267
352
  let nowIso = '';
268
353
  let write = false;
269
- let format: 'text' | 'json' = 'text';
354
+ let format: Format = 'text';
270
355
  for (let i = 0; i < argv.length; i++) {
271
356
  const a = argv[i] as string;
272
357
  if (a === '--intake-dir') intakeDir = argv[++i] ?? intakeDir;
273
358
  else if (a === '--out-dir') outDir = argv[++i] ?? outDir;
274
359
  else if (a === '--now') nowIso = argv[++i] ?? '';
275
360
  else if (a === '--write') write = true;
276
- else if (a === '--format') format = (argv[++i] as 'text' | 'json') ?? 'text';
277
- else if (a === '-h' || a === '--help') {
361
+ else if (a === '--format') {
362
+ const raw = argv[++i] ?? '';
363
+ // Validated rather than cast. With two formats an unknown value
364
+ // fell through to `text` and looked like it had worked; with three,
365
+ // a typo in `status` would silently print the one-line text form
366
+ // and a reader would take that for the screen they asked for.
367
+ if (!(FORMATS as readonly string[]).includes(raw)) {
368
+ process.stderr.write(
369
+ `${PROG}: error: argument --format: invalid choice: '${raw}' ` +
370
+ `(choose from ${FORMATS.map((f) => `'${f}'`).join(', ')})\n`,
371
+ );
372
+ return 2;
373
+ }
374
+ format = raw as Format;
375
+ } else if (a === '-h' || a === '--help') {
278
376
  process.stdout.write(
279
- `usage: ${PROG} [--intake-dir DIR] [--out-dir DIR] [--now ISO] [--write] [--format text|json]\n`,
377
+ `usage: ${PROG} [--intake-dir DIR] [--out-dir DIR] [--now ISO] [--write] ` +
378
+ `[--format ${FORMATS.join('|')}]\n`,
280
379
  );
281
380
  return 0;
282
381
  } else {
@@ -284,6 +383,14 @@ export function main(argv: string[]): number {
284
383
  return 2;
285
384
  }
286
385
  }
386
+ if (format === 'status' && write) {
387
+ // Refused, not ignored. The acceptance criterion is that the screen
388
+ // leaves `git status` identical; ignoring the flag would honour that
389
+ // too, but it would do so silently, and a caller who asked for a write
390
+ // deserves to be told it did not happen.
391
+ process.stderr.write(`${PROG}: error: --format status is read-only; drop --write\n`);
392
+ return 2;
393
+ }
287
394
  if (!nowIso) {
288
395
  // Deterministic by contract: refuse to guess `now` from the clock when
289
396
  // writing, so output is reproducible. Callers pass --now explicitly.
@@ -310,6 +417,10 @@ export function main(argv: string[]): number {
310
417
  process.stdout.write(JSON.stringify(sidecar, null, 2) + '\n');
311
418
  return 0;
312
419
  }
420
+ if (format === 'status') {
421
+ process.stdout.write(renderStatus(sidecar));
422
+ return 0;
423
+ }
313
424
  const byVerdict = { preferred: 0, contested: 0, dead_end: 0 };
314
425
  for (const l of sidecar.lessons) byVerdict[l.verdict] += 1;
315
426
  process.stdout.write(
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Every `path:line` a roadmap blocker cites must still point at a line.
4
+ *
5
+ * A blocker's `What to do` and `Resolved when` lean on citations like
6
+ * `src/scripts/foo.ts:120-134`. Line numbers move with every edit above them,
7
+ * and nothing re-reads a citation once it is written — `check_references`
8
+ * resolves names, not line numbers. A cited range that now runs past the end
9
+ * of its file sends the reader of the blocker to nothing.
10
+ *
11
+ * Scope: the `## Blockers` section of every active roadmap and every stub.
12
+ * Checked: the file exists and the last cited line is within its length.
13
+ * Not checked: what the line says — a content check would red on every
14
+ * harmless edit above it.
15
+ *
16
+ * A citation is a repository-relative path with a file extension, `:`, a line
17
+ * number and an optional `-<line>` end. A bare `:354-359` with no path is
18
+ * relative to prose above it and is not read.
19
+ *
20
+ * Existing misses are ratcheted (`gate-violation-baselines.json`, gate
21
+ * `lint_blocker_citations`): line numbers drift, so a miss already in the tree
22
+ * is drift rather than a new defect, and the count may only fall.
23
+ *
24
+ * Exit codes: 0 within the ratchet · 1 above it · 2 usage error.
25
+ */
26
+ import * as fs from 'node:fs';
27
+ import * as path from 'node:path';
28
+ import { fileURLToPath, pathToFileURL } from 'node:url';
29
+
30
+ import { checkRatchet } from './_lib/gate_baseline.js';
31
+ import { reportScanned } from './_lib/scan_scope.js';
32
+
33
+ type MissKind = 'missing-file' | 'beyond-end';
34
+
35
+ interface Citation {
36
+ roadmap: string;
37
+ line: number;
38
+ target: string;
39
+ first: number;
40
+ last: number;
41
+ }
42
+
43
+ interface Miss extends Citation {
44
+ kind: MissKind;
45
+ length: number | null;
46
+ }
47
+
48
+ const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
49
+ const NEXT_H2_RE = /^##[ \t]+\S/m;
50
+ const CITATION_RE = /(?<![\w./:-])((?:[\w.-]+\/)*[\w-][\w.-]*\.[A-Za-z0-9]+):(\d+)(?:-(\d+))?(?!\d)/g;
51
+
52
+ /** Citations inside the `## Blockers` section, with their line in the roadmap. */
53
+ function citationsIn(text: string, roadmap: string): Citation[] {
54
+ const m = BLOCKERS_SECTION_RE.exec(text);
55
+ if (!m) {
56
+ return [];
57
+ }
58
+ const start = m.index + m[0].length;
59
+ const rest = text.slice(start);
60
+ const h2 = NEXT_H2_RE.exec(rest);
61
+ const section = h2 ? rest.slice(0, h2.index) : rest;
62
+ const lineOffset = text.slice(0, start).split('\n').length - 1;
63
+ const out: Citation[] = [];
64
+ section.split('\n').forEach((raw, i) => {
65
+ for (const c of raw.matchAll(CITATION_RE)) {
66
+ const first = Number(c[2]);
67
+ const last = c[3] === undefined ? first : Number(c[3]);
68
+ out.push({ roadmap, line: lineOffset + i + 1, target: c[1] as string, first, last });
69
+ }
70
+ });
71
+ return out;
72
+ }
73
+
74
+ /** Line count of the cited file, repo-relative first, then relative to the citing roadmap. */
75
+ function _lengthOf(root: string, c: Citation): number | null {
76
+ for (const abs of [path.join(root, c.target), path.join(root, path.dirname(c.roadmap), c.target)]) {
77
+ if (fs.existsSync(abs) && fs.statSync(abs).isFile()) {
78
+ return fs.readFileSync(abs, 'utf8').replace(/\n$/, '').split('\n').length;
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+
84
+ function checkCitation(root: string, c: Citation, lengths: Map<string, number | null>): Miss | null {
85
+ const key = `${path.dirname(c.roadmap)}\0${c.target}`;
86
+ let length = lengths.get(key);
87
+ if (length === undefined) {
88
+ length = _lengthOf(root, c);
89
+ lengths.set(key, length);
90
+ }
91
+ if (length === null) {
92
+ return { ...c, kind: 'missing-file', length };
93
+ }
94
+ return Math.max(c.first, c.last) > length ? { ...c, kind: 'beyond-end', length } : null;
95
+ }
96
+
97
+ function roadmapFiles(root: string): string[] {
98
+ const out: string[] = [];
99
+ for (const sub of ['', 'stubs']) {
100
+ const dir = path.join(root, 'agents', 'roadmaps', sub);
101
+ let names: string[];
102
+ try {
103
+ names = fs.readdirSync(dir);
104
+ } catch {
105
+ continue;
106
+ }
107
+ for (const n of names.sort()) {
108
+ const abs = path.join(dir, n);
109
+ if (n.endsWith('.md') && fs.statSync(abs).isFile()) {
110
+ out.push(path.relative(root, abs).split(path.sep).join('/'));
111
+ }
112
+ }
113
+ }
114
+ return out;
115
+ }
116
+
117
+ function scanTree(root: string): { misses: Miss[]; scanned: number; citations: number } {
118
+ const lengths = new Map<string, number | null>();
119
+ const files = roadmapFiles(root);
120
+ const misses: Miss[] = [];
121
+ let citations = 0;
122
+ for (const rel of files) {
123
+ for (const c of citationsIn(fs.readFileSync(path.join(root, rel), 'utf8'), rel)) {
124
+ citations += 1;
125
+ const miss = checkCitation(root, c, lengths);
126
+ if (miss) {
127
+ misses.push(miss);
128
+ }
129
+ }
130
+ }
131
+ return { misses, scanned: files.length, citations };
132
+ }
133
+
134
+ const _DEFAULT_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
135
+
136
+ function main(argv: string[] = process.argv.slice(2)): number {
137
+ let root = _DEFAULT_ROOT;
138
+ let baselineRoot = _DEFAULT_ROOT;
139
+ for (let i = 0; i < argv.length; i += 1) {
140
+ const arg = argv[i];
141
+ if (arg === '--root') {
142
+ const v = argv[i + 1];
143
+ if (v === undefined) {
144
+ process.stderr.write('lint_blocker_citations: --root requires a value\n');
145
+ return 2;
146
+ }
147
+ root = path.resolve(v);
148
+ baselineRoot = root;
149
+ i += 1;
150
+ } else {
151
+ process.stderr.write(`lint_blocker_citations: unknown argument: ${String(arg)}\n`);
152
+ return 2;
153
+ }
154
+ }
155
+ const { misses, scanned, citations } = scanTree(root);
156
+ reportScanned({
157
+ gate: 'lint_blocker_citations',
158
+ scanned,
159
+ units: 'roadmap file(s)',
160
+ roots: ['agents/roadmaps', 'agents/roadmaps/stubs'],
161
+ allowEmpty: 'EMPTY_VALID: a checkout with no active roadmap cites nothing',
162
+ });
163
+ const verdict = checkRatchet({ gate: 'lint_blocker_citations', actual: misses.length, repoRoot: baselineRoot });
164
+ const lines = misses.map(
165
+ (m) =>
166
+ ` ${m.roadmap}:${String(m.line)} · ${m.target}:${String(m.first)}${m.last !== m.first ? `-${String(m.last)}` : ''} · ` +
167
+ (m.kind === 'missing-file' ? 'file does not exist' : `file has ${String(m.length)} line(s)`),
168
+ );
169
+ if (!verdict.ok) {
170
+ process.stderr.write(`❌ ${verdict.message}\n`);
171
+ process.stderr.write(`${lines.join('\n')}\n`);
172
+ return 1;
173
+ }
174
+ process.stdout.write(
175
+ `✅ lint_blocker_citations: ${String(citations)} citation(s) in ${String(scanned)} roadmap file(s). ${verdict.message}\n`,
176
+ );
177
+ if (lines.length > 0) {
178
+ process.stdout.write(`${lines.join('\n')}\n`);
179
+ }
180
+ return 0;
181
+ }
182
+
183
+ if (process.argv[1] !== undefined) {
184
+ try {
185
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
186
+ const argv1 = fs.realpathSync(path.resolve(process.argv[1]));
187
+ if (here === argv1) {
188
+ process.exit(main());
189
+ }
190
+ } catch {
191
+ if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
192
+ process.exit(main());
193
+ }
194
+ }
195
+ }
196
+
197
+ export { citationsIn, checkCitation, scanTree, main };
198
+ export type { Citation, Miss };
@@ -50,6 +50,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
50
50
 
51
51
  import { GateLedger } from './_lib/gate_ledger.js';
52
52
  import { resolveBaseRef } from './_lib/ratchet_base_ref.js';
53
+ import { parseExecutionMode } from './_lib/repeated_run.js';
53
54
  import { reportScanned } from './_lib/scan_scope.js';
54
55
  import { parseHonestNull, parseMarkerLine, parseSkipDeclaration } from './check_completion_review.js';
55
56
 
@@ -257,6 +258,14 @@ export function checkFiles(root: string, files: readonly string[], ledger?: Gate
257
258
  });
258
259
  continue;
259
260
  }
261
+ // The contract's second axis (repeated-run / flaky), orthogonal to the
262
+ // type marker above — any artifact may declare it.
263
+ const mode = parseExecutionMode(contents);
264
+ if (mode.kind === 'invalid') {
265
+ ledger?.fail(rel, `invalid evidence-mode: ${mode.reason}`);
266
+ findings.push({ file: rel, reason: `evidence-mode: ${mode.reason}` });
267
+ continue;
268
+ }
260
269
  ledger?.complete(rel);
261
270
  }
262
271
  return findings;
@@ -52,8 +52,6 @@ function _load_manifest(p: string): Manifest {
52
52
  }
53
53
 
54
54
  interface SettingsBlock {
55
- max_per_event?: number;
56
- hard_fail?: boolean;
57
55
  tier1_concerns?: string[];
58
56
  }
59
57
 
@@ -66,9 +64,11 @@ function _isFile(p: string): boolean {
66
64
  }
67
65
 
68
66
  /**
69
- * Minimal YAML walk for `hooks.concern_budget.*`. Mirrors the Python
70
- * `_read_settings_block` line walker verbatim — no YAML dependency,
71
- * tolerant of missing keys / blocks.
67
+ * Minimal YAML walk for `hooks.concern_budget.tier1_concerns`. Mirrors the
68
+ * Python `_read_settings_block` line walker — no YAML dependency, tolerant of
69
+ * missing keys / blocks. `max_per_event` and `hard_fail` are not read: those
70
+ * keys were retired, the cap is {@link DEFAULT_MAX_PER_EVENT} and hard-fail is
71
+ * the `--strict` argv alone.
72
72
  */
73
73
  function _read_settings_block(settings_path: string): SettingsBlock {
74
74
  const out: SettingsBlock = {};
@@ -107,18 +107,7 @@ function _read_settings_block(settings_path: string): SettingsBlock {
107
107
  in_tier1 = false;
108
108
  }
109
109
  if (in_budget) {
110
- let m = /^\s{4}max_per_event\s*:\s*(\d+)/.exec(line);
111
- if (m) {
112
- out.max_per_event = Number.parseInt(m[1] as string, 10);
113
- in_tier1 = false;
114
- continue;
115
- }
116
- m = /^\s{4}hard_fail\s*:\s*(true|false)/.exec(line);
117
- if (m) {
118
- out.hard_fail = m[1] === 'true';
119
- in_tier1 = false;
120
- continue;
121
- }
110
+ let m: RegExpExecArray | null;
122
111
  if (/^\s{4}tier1_concerns\s*:\s*\[\s*\]/.test(line)) {
123
112
  out.tier1_concerns = [];
124
113
  in_tier1 = false;
@@ -173,8 +162,8 @@ function _check_concern_counts(
173
162
  if (count > max_per_event) {
174
163
  warnings.push(
175
164
  `platforms.${plat}.${event}: ${count} concerns ` +
176
- `(threshold ${max_per_event}). Trim or raise ` +
177
- 'hooks.concern_budget.max_per_event in .agent-settings.yml.',
165
+ `(threshold ${max_per_event}). Trim the cell; the cap is ` +
166
+ 'a fixed constant in lint_hook_concern_budget.ts.',
178
167
  );
179
168
  }
180
169
  }
@@ -230,9 +219,9 @@ export function lint(
230
219
  }
231
220
 
232
221
  const settings = _read_settings_block(settings_path);
233
- const max_per_event = settings.max_per_event ?? DEFAULT_MAX_PER_EVENT;
222
+ const max_per_event = DEFAULT_MAX_PER_EVENT;
234
223
  const tier1 = settings.tier1_concerns ?? DEFAULT_TIER1;
235
- const hard_fail = (settings.hard_fail ?? DEFAULT_HARD_FAIL) || strict;
224
+ const hard_fail = DEFAULT_HARD_FAIL || strict;
236
225
 
237
226
  const warnings: string[] = [];
238
227
  const errors: string[] = [];
@@ -52,6 +52,33 @@ const DEFAULT_MANIFEST = path.join(
52
52
  const HOOKS_DIR = path.join(REPO_ROOT, "src", "scripts", "hooks");
53
53
  const DEFAULT_HOST_LOWERING = path.join(HOOKS_DIR, "host_lowering.yaml");
54
54
 
55
+ /**
56
+ * What a concern does to a turn — the closed set `effect:` draws from.
57
+ *
58
+ * Read by the neighbour census, which needs to say what sharing an event with
59
+ * a foreign entry actually risks. A foreign entry's effect is `unknown` unless
60
+ * its output shape has been observed: no host exposes another package's hook
61
+ * execution, so the honest default is that the neighbour's effect cannot be
62
+ * read off its registration.
63
+ *
64
+ * - `permission` can refuse the thing it fires on
65
+ * - `context` puts text in front of the model
66
+ * - `verification` checks a claim or a shape and reports what it found
67
+ * - `telemetry` records state, a ledger, a counter
68
+ * - `memory` reads or writes the memory layer
69
+ * - `notification` tells the human something and changes nothing else
70
+ * - `formatting` reshapes a command or a generated file
71
+ */
72
+ export const CONCERN_EFFECTS: ReadonlySet<string> = new Set([
73
+ "permission",
74
+ "context",
75
+ "verification",
76
+ "telemetry",
77
+ "memory",
78
+ "notification",
79
+ "formatting",
80
+ ]);
81
+
55
82
  // Canonical event vocabulary — keep in lock-step with
56
83
  // docs/contracts/hook-architecture-v1.md and dispatch_hook.EVENT_VOCABULARY.
57
84
  const EVENT_VOCABULARY: ReadonlySet<string> = new Set([
@@ -159,6 +186,32 @@ function _check_concerns(manifest: YamlObject, errors: string[]): Set<string> {
159
186
  if (!_isFile(path.join(REPO_ROOT, script))) {
160
187
  errors.push(`concerns.${name}: script not found at '${script}'`);
161
188
  }
189
+ // `effect:` — what this concern DOES to a turn, from a closed set. It is
190
+ // what lets the neighbour census say "a foreign entry shares this event
191
+ // with something of ours that can refuse" rather than only "two entries".
192
+ // Required and enum-checked, which is a stricter rule than the optional
193
+ // keys below for one reason: a concern with no effect, or with a
194
+ // misspelled one, would silently drop out of every double-gate comparison
195
+ // — the warning would stay quiet and read as "no conflict", which is the
196
+ // wrong answer rather than a missing one. There is no unknown-key guard
197
+ // on this mapping, so nothing else would catch `effects:`.
198
+ const effect = spec["effect"];
199
+ if (typeof effect !== "string" || !CONCERN_EFFECTS.has(effect)) {
200
+ errors.push(
201
+ `concerns.${name}: 'effect' must be one of ` +
202
+ `${[...CONCERN_EFFECTS].sort().join(" | ")} (got ${JSON.stringify(effect)})`,
203
+ );
204
+ } else if ((spec["severity"] === "blocking") !== (effect === "permission")) {
205
+ // The two fields answer the same question from different sides, so a
206
+ // disagreement is a mistake in one of them, never a shade of meaning:
207
+ // `blocking` is the dispatcher's word for "this can refuse" and
208
+ // `permission` is the census's.
209
+ errors.push(
210
+ `concerns.${name}: 'effect: ${effect}' contradicts ` +
211
+ `'severity: ${String(spec["severity"])}' — a concern that can refuse ` +
212
+ `is 'permission', and only those are 'blocking'`,
213
+ );
214
+ }
162
215
  // `tools:` — the optional per-concern tool filter the dispatcher applies
163
216
  // in-process (`_concern_matches_tool`). Validated because the failure mode
164
217
  // is silent: the dispatcher fails toward RUNNING the concern on anything