@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
@@ -4,6 +4,15 @@ import {
4
4
  entryCommands,
5
5
  isManagedEntry
6
6
  } from "./chunk-DEIV7XP7.js";
7
+ import {
8
+ manifest_path,
9
+ readRecordedHashes
10
+ } from "./chunk-OKJUIAPS.js";
11
+ import {
12
+ COUNCIL_CONFIG_ENV,
13
+ load_council_config,
14
+ resolve_config_path
15
+ } from "./chunk-WQWXGIWB.js";
7
16
  import {
8
17
  scanText
9
18
  } from "./chunk-KB5FZ655.js";
@@ -21,32 +30,32 @@ import {
21
30
  report_child_scanned,
22
31
  scan_file
23
32
  } from "./chunk-JQOM7TTM.js";
24
- import {
25
- manifest_path,
26
- readRecordedHashes
27
- } from "./chunk-OKJUIAPS.js";
28
33
  import {
29
34
  DeadScopeError,
30
35
  assertScanned
31
36
  } from "./chunk-I3EIN2YG.js";
37
+ import {
38
+ readHookStdin
39
+ } from "./chunk-F7DQWYR5.js";
32
40
  import {
33
41
  require_dist
34
42
  } from "./chunk-OY53J6II.js";
35
- import {
36
- resolvePackageRoot
37
- } from "./chunk-MCJYCQPF.js";
38
43
  import {
39
44
  SRC_SKILLS
40
45
  } from "./chunk-YCU3TIXH.js";
46
+ import {
47
+ resolvePackageRoot
48
+ } from "./chunk-MCJYCQPF.js";
41
49
  import {
42
50
  __toESM
43
51
  } from "./chunk-J55WI3RR.js";
44
52
 
45
53
  // src/scripts/_cli/cmd_doctor_neighbours.ts
46
54
  var YAML = __toESM(require_dist(), 1);
47
- import * as fs9 from "node:fs";
48
- import * as path9 from "node:path";
49
- import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL5 } from "node:url";
55
+ import { spawnSync } from "node:child_process";
56
+ import * as fs11 from "node:fs";
57
+ import * as path10 from "node:path";
58
+ import { fileURLToPath as fileURLToPath6, pathToFileURL as pathToFileURL6 } from "node:url";
50
59
 
51
60
  // src/scripts/_lib/neighbour_census.ts
52
61
  import { createHash as createHash2 } from "node:crypto";
@@ -1235,20 +1244,335 @@ function writeScanCache(file, entries) {
1235
1244
  }
1236
1245
  }
1237
1246
 
1238
- // src/scripts/audit_skill_overlap.ts
1239
- var import_yaml2 = __toESM(require_dist(), 1);
1240
- import { createHash as createHash3 } from "node:crypto";
1247
+ // src/scripts/_lib/neighbour_contradictions.ts
1241
1248
  import * as fs8 from "node:fs";
1249
+ var RANK_PROJECT = 3;
1250
+ var RANK_SUITE = 4;
1251
+ var RANK_NEIGHBOUR_ALWAYS_ON = 6;
1252
+ var RANK_NEIGHBOUR_SKILL = 7;
1253
+ var RANK_LABEL = {
1254
+ [RANK_PROJECT]: "project instruction file",
1255
+ [RANK_SUITE]: "this suite's routed guidance",
1256
+ [RANK_NEIGHBOUR_ALWAYS_ON]: "neighbour's always-on text",
1257
+ [RANK_NEIGHBOUR_SKILL]: "neighbour skill body (discoverable)"
1258
+ };
1259
+ var NEGATION = /\b(never|don't|do not|must not|mustn't|should not|shouldn't|avoid|stop)\b/iu;
1260
+ var DIRECTIVE_WORD = /\b(always|must|should|never|don't|do not|avoid)\b/iu;
1261
+ var NON_IMPERATIVE_START = /* @__PURE__ */ new Set([
1262
+ "the",
1263
+ "a",
1264
+ "an",
1265
+ "this",
1266
+ "that",
1267
+ "these",
1268
+ "those",
1269
+ "it",
1270
+ "its",
1271
+ "we",
1272
+ "you",
1273
+ "i",
1274
+ "our",
1275
+ "they",
1276
+ "there",
1277
+ "when",
1278
+ "if",
1279
+ "see",
1280
+ "for",
1281
+ "in",
1282
+ "on",
1283
+ "as",
1284
+ "by",
1285
+ "with",
1286
+ "from"
1287
+ ]);
1288
+ var STOP = /* @__PURE__ */ new Set([
1289
+ "always",
1290
+ "never",
1291
+ "must",
1292
+ "should",
1293
+ "avoid",
1294
+ "stop",
1295
+ "don",
1296
+ "with",
1297
+ "without",
1298
+ "that",
1299
+ "this",
1300
+ "they",
1301
+ "them",
1302
+ "then",
1303
+ "than",
1304
+ "into",
1305
+ "from",
1306
+ "your",
1307
+ "when",
1308
+ "what",
1309
+ "will",
1310
+ "each",
1311
+ "every",
1312
+ "only",
1313
+ "also",
1314
+ "here",
1315
+ "there",
1316
+ "have",
1317
+ "been",
1318
+ "more",
1319
+ "some",
1320
+ "such",
1321
+ "like",
1322
+ "just"
1323
+ ]);
1324
+ function stem(word) {
1325
+ let w = word.toLowerCase().replace(/[^a-z]/gu, "");
1326
+ for (const suffix of ["ing", "ed", "es", "s"]) {
1327
+ if (w.length > suffix.length + 3 && w.endsWith(suffix)) {
1328
+ w = w.slice(0, -suffix.length);
1329
+ break;
1330
+ }
1331
+ }
1332
+ return w;
1333
+ }
1334
+ function isDirective(text) {
1335
+ if (DIRECTIVE_WORD.test(text)) return true;
1336
+ const first = (text.split(/\s+/u)[0] ?? "").toLowerCase().replace(/[^a-z']/gu, "");
1337
+ return first.length > 0 && !NON_IMPERATIVE_START.has(first);
1338
+ }
1339
+ function extractInstructions(source, body) {
1340
+ let text;
1341
+ try {
1342
+ text = body ?? fs8.readFileSync(source.file, "utf-8");
1343
+ } catch {
1344
+ return [];
1345
+ }
1346
+ const out = [];
1347
+ let fenced = false;
1348
+ let frontmatter = false;
1349
+ text.split("\n").forEach((raw, i) => {
1350
+ const line = raw.trim();
1351
+ if (i === 0 && line === "---") {
1352
+ frontmatter = true;
1353
+ return;
1354
+ }
1355
+ if (frontmatter) {
1356
+ if (line === "---") frontmatter = false;
1357
+ return;
1358
+ }
1359
+ if (line.startsWith("```") || line.startsWith("~~~")) {
1360
+ fenced = !fenced;
1361
+ return;
1362
+ }
1363
+ if (fenced || line === "" || line.startsWith("#") || line.startsWith("|") || line.startsWith(">")) return;
1364
+ const clean = line.replace(/^([-*+]|\d+\.)\s+/u, "").replace(/[*_`]/gu, "");
1365
+ if (clean.split(/\s+/u).length < 3 || !isDirective(clean)) return;
1366
+ const stems = new Set(
1367
+ clean.split(/\s+/u).map(stem).filter((s) => s.length >= 4 && !STOP.has(s))
1368
+ );
1369
+ out.push({ source, line: i + 1, text: clean, negative: NEGATION.test(clean), stems });
1370
+ });
1371
+ return out;
1372
+ }
1373
+ function where(l) {
1374
+ return `${l.source.label}:${l.line}`;
1375
+ }
1376
+ function modalityPairs(lines, cap = 20) {
1377
+ const out = [];
1378
+ for (let i = 0; i < lines.length && out.length < cap; i += 1) {
1379
+ for (let j = i + 1; j < lines.length && out.length < cap; j += 1) {
1380
+ const x = lines[i];
1381
+ const y = lines[j];
1382
+ if (x.source.rank === y.source.rank || x.negative === y.negative) continue;
1383
+ const shared = [...x.stems].filter((s) => y.stems.has(s)).sort();
1384
+ if (shared.length === 0) continue;
1385
+ const [hi, lo] = x.source.rank <= y.source.rank ? [x, y] : [y, x];
1386
+ out.push({
1387
+ kind: "opposite-modality",
1388
+ a: { label: where(hi), rank: hi.source.rank, text: hi.text },
1389
+ b: { label: where(lo), rank: lo.source.rank, text: lo.text },
1390
+ subject: shared[0]
1391
+ });
1392
+ }
1393
+ }
1394
+ return out;
1395
+ }
1396
+ function collisionPair(neighbourQualified, ourName) {
1397
+ return {
1398
+ kind: "name-collision",
1399
+ a: { label: `suite:${ourName}`, rank: RANK_SUITE, text: `this suite's skill \`${ourName}\`` },
1400
+ b: {
1401
+ label: neighbourQualified,
1402
+ rank: RANK_NEIGHBOUR_SKILL,
1403
+ text: `neighbour skill \`${neighbourQualified}\``
1404
+ },
1405
+ subject: ourName
1406
+ };
1407
+ }
1408
+ function winnerBy21(p) {
1409
+ const w = p.a.rank <= p.b.rank ? p.a : p.b;
1410
+ return `${w.label} (rank ${w.rank}, ${RANK_LABEL[w.rank] ?? "unranked"})`;
1411
+ }
1412
+ function seatPrompt(pairs, rubric) {
1413
+ const rows = pairs.map(
1414
+ (p, i) => `PAIR ${i + 1} (${p.kind}, subject "${p.subject}")
1415
+ A [${p.a.label}]: ${p.a.text}
1416
+ B [${p.b.label}]: ${p.b.text}`
1417
+ );
1418
+ return [
1419
+ "# Neighbour contradiction review",
1420
+ "",
1421
+ "For each pair, decide whether A and B give an agent instructions that cannot both be followed.",
1422
+ "Answer one line per pair, exactly `PAIR <n>: contradiction`, `PAIR <n>: compatible` or `PAIR <n>: unclear`,",
1423
+ "then at most one sentence of reason on the same line. The rubric for which source wins is below; you do not",
1424
+ "need to restate it.",
1425
+ "",
1426
+ "## Rubric \u2014 neighbour-precedence",
1427
+ "",
1428
+ rubric.trim(),
1429
+ "",
1430
+ "## Pairs",
1431
+ "",
1432
+ ...rows,
1433
+ ""
1434
+ ].join("\n");
1435
+ }
1436
+ function parseVerdicts(text, count) {
1437
+ const out = Array.from({ length: count }, () => "unclear");
1438
+ for (const m of text.matchAll(/PAIR\s+(\d+)\s*:\s*(contradiction|compatible|unclear)/giu)) {
1439
+ const n = Number(m[1]) - 1;
1440
+ if (n >= 0 && n < count) out[n] = (m[2] ?? "unclear").toLowerCase();
1441
+ }
1442
+ return out;
1443
+ }
1444
+ function reviewRows(pairs, verdicts) {
1445
+ return pairs.map((p, i) => ({
1446
+ pair: `${p.a.label} "${p.a.text}" \xD7 ${p.b.label} "${p.b.text}"`,
1447
+ verdict: verdicts[i] ?? "unclear",
1448
+ wins: winnerBy21(p)
1449
+ }));
1450
+ }
1451
+ function renderReview(rows) {
1452
+ if (rows.length === 0) return [" no candidate pairs \u2014 nothing to review"];
1453
+ return [" pair | verdict | which wins by 2.1", ...rows.map((r) => ` ${r.pair} | ${r.verdict} | ${r.wins}`)];
1454
+ }
1455
+
1456
+ // src/scripts/council_availability_hook.ts
1457
+ import * as fs9 from "node:fs";
1242
1458
  import * as path8 from "node:path";
1243
1459
  import { fileURLToPath as fileURLToPath4, pathToFileURL as pathToFileURL4 } from "node:url";
1244
- var _HERE = fileURLToPath4(import.meta.url);
1245
- var ROOT2 = path8.resolve(path8.dirname(_HERE), "..", "..");
1246
- var REPORT_DIR = path8.join(ROOT2, "agents", "reports");
1460
+ var EXIT_ALLOW = 0;
1461
+ function resolveAvailability(cwd, env) {
1462
+ let p;
1463
+ try {
1464
+ p = String(resolve_config_path(cwd, { env }));
1465
+ } catch {
1466
+ return null;
1467
+ }
1468
+ const exists = fs9.existsSync(p);
1469
+ const provenance = env[COUNCIL_CONFIG_ENV] ? "env-override" : "user-global";
1470
+ if (!exists) {
1471
+ return { configured: false, path: p, exists: false, provenance, membersEnabled: 0, memberNames: [] };
1472
+ }
1473
+ try {
1474
+ const cfg = load_council_config(p);
1475
+ const enabled = [...cfg.members.entries()].filter(([, m]) => m.enabled).map(([n]) => n);
1476
+ return {
1477
+ configured: cfg.enabled && enabled.length > 0,
1478
+ path: p,
1479
+ exists: true,
1480
+ provenance,
1481
+ membersEnabled: enabled.length,
1482
+ memberNames: enabled
1483
+ };
1484
+ } catch {
1485
+ return { configured: false, path: p, exists: true, provenance, membersEnabled: 0, memberNames: [] };
1486
+ }
1487
+ }
1488
+ function buildFact(a) {
1489
+ const head = a.configured ? `An AI council IS configured: ${String(a.membersEnabled)} enabled member(s) \u2014 ${a.memberNames.join(", ")}.` : a.exists ? "An AI council config exists but is NOT usable (unreadable, disabled, or no enabled member)." : "No AI council is configured on this machine.";
1490
+ return [
1491
+ "<council-availability>",
1492
+ head,
1493
+ `Resolved from ${a.provenance}: ${a.path}`,
1494
+ "The project tree is NEVER searched for council config (ADR-104), and the",
1495
+ "config has not lived in `.agent-settings.yml` since the Phase-0 migration.",
1496
+ "So do NOT infer council availability from any project file, in either",
1497
+ "direction \u2014 this line is the answer, and `agent-config council:status`",
1498
+ "re-checks it on demand without spending anything.",
1499
+ a.configured ? "Never announce that no council is configured, and never substitute a weaker path on that basis." : "A substitute is legitimate here \u2014 say which one you are using and why.",
1500
+ "</council-availability>"
1501
+ ].join("\n");
1502
+ }
1503
+ function _workspaceRoot(env) {
1504
+ for (const key of ["project_dir", "projectDir", "cwd", "workspace_root"]) {
1505
+ const v = env[key];
1506
+ if (typeof v === "string" && v.trim() !== "") {
1507
+ return v;
1508
+ }
1509
+ }
1510
+ return process.cwd();
1511
+ }
1512
+ function run(stdin, options = {}) {
1513
+ let envelope = {};
1514
+ if (stdin.trim() !== "") {
1515
+ try {
1516
+ const parsed = JSON.parse(stdin);
1517
+ if (parsed !== null && typeof parsed === "object") {
1518
+ envelope = parsed;
1519
+ }
1520
+ } catch {
1521
+ return EXIT_ALLOW;
1522
+ }
1523
+ }
1524
+ const event = envelope["event"];
1525
+ const slot = typeof event === "string" && event !== "" ? event : "session_start";
1526
+ if (slot !== "session_start") {
1527
+ return EXIT_ALLOW;
1528
+ }
1529
+ const a = resolveAvailability(_workspaceRoot(envelope), options.env ?? process.env);
1530
+ if (a === null) {
1531
+ return EXIT_ALLOW;
1532
+ }
1533
+ process.stdout.write(
1534
+ `${JSON.stringify({
1535
+ decision: "allow",
1536
+ reason: `council-availability: ${a.configured ? "configured" : "not configured"}`,
1537
+ context: buildFact(a)
1538
+ })}
1539
+ `
1540
+ );
1541
+ return EXIT_ALLOW;
1542
+ }
1543
+ function main4(argv) {
1544
+ const args = argv ?? process.argv.slice(2);
1545
+ let env = process.env;
1546
+ void args;
1547
+ return run(readHookStdin(), { env });
1548
+ }
1549
+ function _isCliEntry4() {
1550
+ if (true) {
1551
+ return false;
1552
+ }
1553
+ if (process.argv[1] === void 0) {
1554
+ return false;
1555
+ }
1556
+ return import.meta.url === pathToFileURL4(path8.resolve(process.argv[1])).href;
1557
+ }
1558
+ if (_isCliEntry4()) {
1559
+ process.exit(main4());
1560
+ }
1561
+
1562
+ // src/scripts/audit_skill_overlap.ts
1563
+ var import_yaml2 = __toESM(require_dist(), 1);
1564
+ import { createHash as createHash3 } from "node:crypto";
1565
+ import * as fs10 from "node:fs";
1566
+ import * as path9 from "node:path";
1567
+ import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL5 } from "node:url";
1568
+ var _HERE = fileURLToPath5(import.meta.url);
1569
+ var ROOT2 = path9.resolve(path9.dirname(_HERE), "..", "..");
1570
+ var REPORT_DIR = path9.join(ROOT2, "agents", "reports");
1247
1571
  var OUT_JSON_NAME = "skill-overlap.json";
1248
1572
  var OUT_MD_NAME = "skill-overlap.md";
1249
- var OUT_JSON = path8.join(REPORT_DIR, OUT_JSON_NAME);
1250
- var OUT_MD = path8.join(REPORT_DIR, OUT_MD_NAME);
1251
- var ALLOWLIST = path8.join(ROOT2, "src", "scripts", "audit_skill_overlap_allowlist.json");
1573
+ var OUT_JSON = path9.join(REPORT_DIR, OUT_JSON_NAME);
1574
+ var OUT_MD = path9.join(REPORT_DIR, OUT_MD_NAME);
1575
+ var ALLOWLIST = path9.join(ROOT2, "src", "scripts", "audit_skill_overlap_allowlist.json");
1252
1576
  var CROSS_CACHE_NAME = "neighbour-overlap.json";
1253
1577
  var ALLOWLIST_CAP = 20;
1254
1578
  var FM_RE = /^---\n([\s\S]*?)\n---/m;
@@ -1320,14 +1644,14 @@ var STOPWORDS = /* @__PURE__ */ new Set([
1320
1644
  ]);
1321
1645
  function _isDir(p) {
1322
1646
  try {
1323
- return fs8.statSync(p).isDirectory();
1647
+ return fs10.statSync(p).isDirectory();
1324
1648
  } catch {
1325
1649
  return false;
1326
1650
  }
1327
1651
  }
1328
1652
  function _isFile(p) {
1329
1653
  try {
1330
- return fs8.statSync(p).isFile();
1654
+ return fs10.statSync(p).isFile();
1331
1655
  } catch {
1332
1656
  return false;
1333
1657
  }
@@ -1375,7 +1699,7 @@ function _cosine(a, b) {
1375
1699
  return da && db ? num / (da * db) : 0;
1376
1700
  }
1377
1701
  function _parse(md, field = "body") {
1378
- const text = fs8.readFileSync(md, "utf-8");
1702
+ const text = fs10.readFileSync(md, "utf-8");
1379
1703
  let fm = {};
1380
1704
  let body = text;
1381
1705
  const m = FM_RE.exec(text);
@@ -1393,27 +1717,27 @@ function _parse(md, field = "body") {
1393
1717
  const descVal = isObj ? fm["description"] : null;
1394
1718
  const source = field === "description" ? descVal ? String(descVal) : "" : body;
1395
1719
  return {
1396
- name: name ? String(name) : path8.basename(path8.dirname(md)),
1720
+ name: name ? String(name) : path9.basename(path9.dirname(md)),
1397
1721
  relpath: _relPosix(md, ROOT2),
1398
- abspath: path8.resolve(md),
1722
+ abspath: path9.resolve(md),
1399
1723
  packs: Array.isArray(packsVal) ? new Set(packsVal.map((x) => String(x))) : /* @__PURE__ */ new Set(),
1400
1724
  vector: _keyword_vector(source)
1401
1725
  };
1402
1726
  }
1403
1727
  function _relPosix(child, root) {
1404
- return path8.relative(root, child).split(path8.sep).join("/");
1728
+ return path9.relative(root, child).split(path9.sep).join("/");
1405
1729
  }
1406
1730
  function _rglobSkillMd(root) {
1407
1731
  const out = [];
1408
1732
  const walk = (dir) => {
1409
1733
  let entries;
1410
1734
  try {
1411
- entries = fs8.readdirSync(dir, { withFileTypes: true });
1735
+ entries = fs10.readdirSync(dir, { withFileTypes: true });
1412
1736
  } catch {
1413
1737
  return;
1414
1738
  }
1415
1739
  for (const ent of entries) {
1416
- const full = path8.join(dir, ent.name);
1740
+ const full = path9.join(dir, ent.name);
1417
1741
  if (ent.name === "SKILL.md") {
1418
1742
  out.push(full);
1419
1743
  }
@@ -1427,8 +1751,8 @@ function _rglobSkillMd(root) {
1427
1751
  return out;
1428
1752
  }
1429
1753
  function _pathlibCompare(a, b) {
1430
- const pa = a.split(path8.sep);
1431
- const pb = b.split(path8.sep);
1754
+ const pa = a.split(path9.sep);
1755
+ const pb = b.split(path9.sep);
1432
1756
  const n = Math.min(pa.length, pb.length);
1433
1757
  for (let i = 0; i < n; i++) {
1434
1758
  const x = pa[i];
@@ -1443,10 +1767,10 @@ function collect(root = _default_skill_root(), field = "body") {
1443
1767
  const skills = [];
1444
1768
  const seen = /* @__PURE__ */ new Set();
1445
1769
  for (const md of _rglobSkillMd(root)) {
1446
- if (md.split(path8.sep).includes("_archive")) {
1770
+ if (md.split(path9.sep).includes("_archive")) {
1447
1771
  continue;
1448
1772
  }
1449
- const key = path8.basename(path8.dirname(md));
1773
+ const key = path9.basename(path9.dirname(md));
1450
1774
  if (seen.has(key)) {
1451
1775
  continue;
1452
1776
  }
@@ -1500,7 +1824,7 @@ function find_pairs(skills, threshold) {
1500
1824
  return stableSort(pairs, (p) => [p.same_domain ? 0 : 1, -p.similarity]);
1501
1825
  }
1502
1826
  function skillMdsUnder(root) {
1503
- return _rglobSkillMd(root).filter((md) => !md.split(path8.sep).includes("_archive"));
1827
+ return _rglobSkillMd(root).filter((md) => !md.split(path9.sep).includes("_archive"));
1504
1828
  }
1505
1829
  function crossPairsForFiles(neighbourFiles, ourRoot, threshold = OVERLAP_THRESHOLD, field = "body") {
1506
1830
  const theirs = [];
@@ -1554,11 +1878,11 @@ ${field}
1554
1878
  for (const md of side) {
1555
1879
  let bytes;
1556
1880
  try {
1557
- bytes = fs8.readFileSync(md);
1881
+ bytes = fs10.readFileSync(md);
1558
1882
  } catch {
1559
1883
  continue;
1560
1884
  }
1561
- h.update(path8.resolve(md));
1885
+ h.update(path9.resolve(md));
1562
1886
  h.update("\0");
1563
1887
  h.update(createHash3("sha256").update(bytes).digest("hex"));
1564
1888
  h.update("\n");
@@ -1569,7 +1893,7 @@ ${field}
1569
1893
  function cachedCrossRootPairs(neighbourFiles, ourRoot, cacheFile, threshold = OVERLAP_THRESHOLD, field = "body") {
1570
1894
  const digest = censusDigest(neighbourFiles, ourRoot, threshold, field);
1571
1895
  try {
1572
- const parsed = JSON.parse(fs8.readFileSync(cacheFile, "utf-8"));
1896
+ const parsed = JSON.parse(fs10.readFileSync(cacheFile, "utf-8"));
1573
1897
  if (parsed.digest === digest && Array.isArray(parsed.pairs)) {
1574
1898
  return { pairs: parsed.pairs, digest, cached: true };
1575
1899
  }
@@ -1578,8 +1902,8 @@ function cachedCrossRootPairs(neighbourFiles, ourRoot, cacheFile, threshold = OV
1578
1902
  const pairs = crossPairsForFiles(neighbourFiles, ourRoot, threshold, field);
1579
1903
  const payload = { schema_version: 1, digest, threshold, pairs };
1580
1904
  try {
1581
- fs8.mkdirSync(path8.dirname(cacheFile), { recursive: true });
1582
- fs8.writeFileSync(cacheFile, `${JSON.stringify(payload, null, 2)}
1905
+ fs10.mkdirSync(path9.dirname(cacheFile), { recursive: true });
1906
+ fs10.writeFileSync(cacheFile, `${JSON.stringify(payload, null, 2)}
1583
1907
  `, "utf-8");
1584
1908
  } catch {
1585
1909
  }
@@ -1703,7 +2027,7 @@ var FloatTag = class {
1703
2027
  }
1704
2028
  value;
1705
2029
  };
1706
- function main4(argv = null) {
2030
+ function main5(argv = null) {
1707
2031
  const args = parse_args4(argv ?? process.argv.slice(2));
1708
2032
  const root = args.root ?? _default_skill_root();
1709
2033
  if (args.neighbourRoot !== void 0) {
@@ -1729,16 +2053,16 @@ function main4(argv = null) {
1729
2053
  `);
1730
2054
  const pairs = find_pairs(skills, args.threshold);
1731
2055
  const outDir = args.outDir ?? REPORT_DIR;
1732
- const outJson = path8.join(outDir, OUT_JSON_NAME);
1733
- const outMd = path8.join(outDir, OUT_MD_NAME);
1734
- fs8.mkdirSync(outDir, { recursive: true });
2056
+ const outJson = path9.join(outDir, OUT_JSON_NAME);
2057
+ const outMd = path9.join(outDir, OUT_MD_NAME);
2058
+ fs10.mkdirSync(outDir, { recursive: true });
1735
2059
  const jsonObj = {
1736
2060
  threshold: new FloatTag(args.threshold),
1737
2061
  skills_scanned: skills.length,
1738
2062
  pairs: pairs.map(_pairToJson)
1739
2063
  };
1740
- fs8.writeFileSync(outJson, _dumpsWithFloats(jsonObj), "utf-8");
1741
- fs8.writeFileSync(outMd, render_md(skills, pairs, args.threshold, args.field), "utf-8");
2064
+ fs10.writeFileSync(outJson, _dumpsWithFloats(jsonObj), "utf-8");
2065
+ fs10.writeFileSync(outMd, render_md(skills, pairs, args.threshold, args.field), "utf-8");
1742
2066
  const merge = pairs.filter((p) => p.same_domain);
1743
2067
  if (!args.quiet) {
1744
2068
  process.stdout.write(
@@ -1796,7 +2120,7 @@ function main4(argv = null) {
1796
2120
  function _mainCrossRoot(args, ourRoot) {
1797
2121
  const neighbourRoot = args.neighbourRoot;
1798
2122
  const outDir = args.outDir ?? REPORT_DIR;
1799
- const cacheFile = args.crossCache ?? path8.join(outDir, CROSS_CACHE_NAME);
2123
+ const cacheFile = args.crossCache ?? path9.join(outDir, CROSS_CACHE_NAME);
1800
2124
  const { pairs, digest, cached } = cachedCrossRootPairs(
1801
2125
  skillMdsUnder(neighbourRoot),
1802
2126
  ourRoot,
@@ -1835,7 +2159,7 @@ function _loadAllowlist(file) {
1835
2159
  if (!_isFile(file)) {
1836
2160
  return /* @__PURE__ */ new Set();
1837
2161
  }
1838
- const data = JSON.parse(fs8.readFileSync(file, "utf-8"));
2162
+ const data = JSON.parse(fs10.readFileSync(file, "utf-8"));
1839
2163
  const entries = Array.isArray(data.entries) ? data.entries : [];
1840
2164
  if (entries.length > ALLOWLIST_CAP) {
1841
2165
  throw new Error(
@@ -1921,7 +2245,7 @@ function parse_args4(argv) {
1921
2245
  args.strict = true;
1922
2246
  } else if (a === "--allowlist" || a.startsWith("--allowlist=")) {
1923
2247
  const inline = a.startsWith("--allowlist=") ? a.slice("--allowlist=".length) : void 0;
1924
- args.allowlist = path8.resolve(ROOT2, takeValue("--allowlist", inline, () => argv[++i]));
2248
+ args.allowlist = path9.resolve(ROOT2, takeValue("--allowlist", inline, () => argv[++i]));
1925
2249
  } else if (a === "--descriptions") {
1926
2250
  args.field = "description";
1927
2251
  } else if (a === "--print-table") {
@@ -1931,19 +2255,19 @@ function parse_args4(argv) {
1931
2255
  args.threshold = Number(takeValue("--threshold", inline, () => argv[++i]));
1932
2256
  } else if (a === "--neighbour-root" || a.startsWith("--neighbour-root=")) {
1933
2257
  const inline = a.startsWith("--neighbour-root=") ? a.slice("--neighbour-root=".length) : void 0;
1934
- args.neighbourRoot = path8.resolve(
2258
+ args.neighbourRoot = path9.resolve(
1935
2259
  ROOT2,
1936
2260
  takeValue("--neighbour-root", inline, () => argv[++i])
1937
2261
  );
1938
2262
  } else if (a === "--cross-cache" || a.startsWith("--cross-cache=")) {
1939
2263
  const inline = a.startsWith("--cross-cache=") ? a.slice("--cross-cache=".length) : void 0;
1940
- args.crossCache = path8.resolve(ROOT2, takeValue("--cross-cache", inline, () => argv[++i]));
2264
+ args.crossCache = path9.resolve(ROOT2, takeValue("--cross-cache", inline, () => argv[++i]));
1941
2265
  } else if (a === "--root" || a.startsWith("--root=")) {
1942
2266
  const inline = a.startsWith("--root=") ? a.slice("--root=".length) : void 0;
1943
- args.root = path8.resolve(ROOT2, takeValue("--root", inline, () => argv[++i]));
2267
+ args.root = path9.resolve(ROOT2, takeValue("--root", inline, () => argv[++i]));
1944
2268
  } else if (a === "--out-dir" || a.startsWith("--out-dir=")) {
1945
2269
  const inline = a.startsWith("--out-dir=") ? a.slice("--out-dir=".length) : void 0;
1946
- args.outDir = path8.resolve(ROOT2, takeValue("--out-dir", inline, () => argv[++i]));
2270
+ args.outDir = path9.resolve(ROOT2, takeValue("--out-dir", inline, () => argv[++i]));
1947
2271
  } else {
1948
2272
  process.stderr.write(`unrecognized arguments: ${a}
1949
2273
  `);
@@ -1952,32 +2276,32 @@ function parse_args4(argv) {
1952
2276
  }
1953
2277
  return args;
1954
2278
  }
1955
- function _isCliEntry4() {
2279
+ function _isCliEntry5() {
1956
2280
  if (process.argv[1] === void 0) {
1957
2281
  return false;
1958
2282
  }
1959
- const argvUrl = pathToFileURL4(path8.resolve(process.argv[1])).href;
2283
+ const argvUrl = pathToFileURL5(path9.resolve(process.argv[1])).href;
1960
2284
  if (import.meta.url === argvUrl) {
1961
2285
  return true;
1962
2286
  }
1963
2287
  try {
1964
- const here = fs8.realpathSync(fileURLToPath4(import.meta.url));
1965
- const argv = fs8.realpathSync(path8.resolve(process.argv[1]));
2288
+ const here = fs10.realpathSync(fileURLToPath5(import.meta.url));
2289
+ const argv = fs10.realpathSync(path9.resolve(process.argv[1]));
1966
2290
  return here === argv;
1967
2291
  } catch {
1968
2292
  return false;
1969
2293
  }
1970
2294
  }
1971
- var _isMain = _isCliEntry4();
2295
+ var _isMain = _isCliEntry5();
1972
2296
  if (_isMain) {
1973
- process.exitCode = main4();
2297
+ process.exitCode = main5();
1974
2298
  }
1975
2299
 
1976
2300
  // src/scripts/_cli/cmd_doctor_neighbours.ts
1977
2301
  function gatedEvents(packageRoot) {
1978
2302
  try {
1979
- const file = path9.join(packageRoot, "src", "scripts", "hook_manifest.yaml");
1980
- const doc = YAML.parse(fs9.readFileSync(file, "utf-8"));
2303
+ const file = path10.join(packageRoot, "src", "scripts", "hook_manifest.yaml");
2304
+ const doc = YAML.parse(fs11.readFileSync(file, "utf-8"));
1981
2305
  return gatedEventsFrom(doc, doc.native_event_aliases ?? {});
1982
2306
  } catch {
1983
2307
  return /* @__PURE__ */ new Set();
@@ -1986,7 +2310,7 @@ function gatedEvents(packageRoot) {
1986
2310
  function ourSkillNames(packageRoot) {
1987
2311
  try {
1988
2312
  return new Set(
1989
- fs9.readdirSync(path9.join(packageRoot, "src", "skills"), { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name)
2313
+ fs11.readdirSync(path10.join(packageRoot, "src", "skills"), { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name)
1990
2314
  );
1991
2315
  } catch {
1992
2316
  return /* @__PURE__ */ new Set();
@@ -2003,21 +2327,21 @@ function runCensus(projectRoot, packageRoot, homeRoot) {
2003
2327
  };
2004
2328
  const base = {
2005
2329
  gatedEvents: gatedEvents(packageRoot),
2006
- templatesRoot: path9.join(packageRoot, "src", "agent-src", "templates"),
2330
+ templatesRoot: path10.join(packageRoot, "src", "agent-src", "templates"),
2007
2331
  ourSkillNames: ourSkillNames(packageRoot),
2008
2332
  packageRoot,
2009
2333
  scan,
2010
2334
  ...homeRoot === void 0 ? {} : { homeRoot }
2011
2335
  };
2012
2336
  const first = census(projectRoot, base);
2013
- const ourRoot = path9.join(packageRoot, "src", "skills");
2337
+ const ourRoot = path10.join(packageRoot, "src", "skills");
2014
2338
  let overlaps = /* @__PURE__ */ new Map();
2015
- if (first.skills.length > 0 && fs9.existsSync(ourRoot)) {
2339
+ if (first.skills.length > 0 && fs11.existsSync(ourRoot)) {
2016
2340
  try {
2017
2341
  const { pairs } = cachedCrossRootPairs(
2018
2342
  first.skills.map((s) => s.source),
2019
2343
  ourRoot,
2020
- path9.join(projectRoot, "agents", "reports", CROSS_CACHE_NAME),
2344
+ path10.join(projectRoot, "agents", "reports", CROSS_CACHE_NAME),
2021
2345
  OVERLAP_THRESHOLD
2022
2346
  );
2023
2347
  overlaps = crossRootOverlapMap(pairs);
@@ -2038,6 +2362,79 @@ function runCensus(projectRoot, packageRoot, homeRoot) {
2038
2362
  );
2039
2363
  return full;
2040
2364
  }
2365
+ function contradictionCandidates(projectRoot, packageRoot, homeRoot) {
2366
+ const ours = ourSkillNames(packageRoot);
2367
+ const c = census(projectRoot, {
2368
+ gatedEvents: gatedEvents(packageRoot),
2369
+ templatesRoot: path10.join(packageRoot, "src", "agent-src", "templates"),
2370
+ ourSkillNames: ours,
2371
+ packageRoot,
2372
+ scan: (p) => scanNeighbourBody(p).kind,
2373
+ ...homeRoot === void 0 ? {} : { homeRoot }
2374
+ });
2375
+ const sources = [];
2376
+ for (const name of ["CLAUDE.md", "AGENTS.md"]) {
2377
+ const file = path10.join(projectRoot, name);
2378
+ if (fs11.existsSync(file)) sources.push({ label: name, file, rank: RANK_PROJECT });
2379
+ }
2380
+ for (const r of c.rule_files) {
2381
+ if (scanNeighbourBody(r.source).kind === null) {
2382
+ sources.push({ label: r.id, file: r.source, rank: RANK_NEIGHBOUR_ALWAYS_ON });
2383
+ }
2384
+ }
2385
+ for (const s of c.skills) {
2386
+ if (s.unscanned === null) sources.push({ label: s.qualified, file: s.source, rank: RANK_NEIGHBOUR_SKILL });
2387
+ }
2388
+ const pairs = modalityPairs(sources.flatMap((src) => extractInstructions(src)));
2389
+ for (const s of c.skills) {
2390
+ const name = s.qualified.split(":").slice(1).join(":") || s.qualified;
2391
+ if (ours.has(name)) pairs.push(collisionPair(s.qualified, name));
2392
+ }
2393
+ return pairs;
2394
+ }
2395
+ function councilSeat(projectRoot) {
2396
+ return (prompt) => {
2397
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/gu, "-");
2398
+ const q = path10.join(projectRoot, "agents", "runtime", "council", "questions", `neighbour-contradictions-${stamp}.md`);
2399
+ const out = path10.join(projectRoot, "agents", "runtime", "council", "responses", `neighbour-contradictions-${stamp}.md`);
2400
+ try {
2401
+ fs11.mkdirSync(path10.dirname(q), { recursive: true });
2402
+ fs11.writeFileSync(q, prompt, "utf-8");
2403
+ const args = ["council", "run", q, "--single", "--prompt-mode", "analysis", "--output", out, "--confirm", "--invocation", "user_explicit"];
2404
+ const res = spawnSync("agent-config", args, { cwd: projectRoot, encoding: "utf-8" });
2405
+ if (res.status !== 0) return null;
2406
+ const doc = JSON.parse(fs11.readFileSync(out, "utf-8"));
2407
+ return doc.responses?.map((r) => r.text ?? "").join("\n") ?? null;
2408
+ } catch {
2409
+ return null;
2410
+ }
2411
+ };
2412
+ }
2413
+ function runContradictions(projectRoot, packageRoot, opts = {}) {
2414
+ const configured = opts.configured ?? resolveAvailability(projectRoot, process.env)?.configured ?? false;
2415
+ const pairs = contradictionCandidates(projectRoot, packageRoot, opts.homeRoot);
2416
+ if (!configured) {
2417
+ return {
2418
+ lines: [` contradictions: n/a \u2014 no council configured (${pairs.length} candidate pair(s) formed, none reviewed)`],
2419
+ rows: null
2420
+ };
2421
+ }
2422
+ if (pairs.length === 0) return { lines: renderReview([]), rows: [] };
2423
+ let rubric = "";
2424
+ for (const rel of [["dist", "agent-src", "rules"], ["src", "rules"]]) {
2425
+ try {
2426
+ rubric = fs11.readFileSync(path10.join(packageRoot, ...rel, "neighbour-precedence.md"), "utf-8");
2427
+ break;
2428
+ } catch {
2429
+ }
2430
+ }
2431
+ const answer = (opts.seat ?? councilSeat(projectRoot))(seatPrompt(pairs, rubric));
2432
+ if (answer === null) {
2433
+ return { lines: [` contradictions: n/a \u2014 the council seat did not answer (${pairs.length} candidate pair(s) formed)`], rows: null };
2434
+ }
2435
+ const rows = reviewRows(pairs, parseVerdicts(answer, pairs.length));
2436
+ return { lines: renderReview(rows), rows };
2437
+ }
2041
2438
  function summaryLine(c) {
2042
2439
  const counts = [
2043
2440
  `${c.hook_groups.length} hook group(s)`,
@@ -2102,12 +2499,14 @@ function renderText(c) {
2102
2499
  out.push(" it cannot say what ran first, and no label here refuses anything.");
2103
2500
  return out;
2104
2501
  }
2105
- function main5(argv = process.argv.slice(2)) {
2502
+ function main6(argv = process.argv.slice(2)) {
2106
2503
  let json = false;
2504
+ let contradictions = false;
2107
2505
  let root = process.cwd();
2108
2506
  let home;
2109
2507
  for (let i = 0; i < argv.length; i += 1) {
2110
2508
  if (argv[i] === "--json") json = true;
2509
+ else if (argv[i] === "--contradictions") contradictions = true;
2111
2510
  else if (argv[i] === "--project") {
2112
2511
  root = argv[i + 1] ?? root;
2113
2512
  i += 1;
@@ -2122,7 +2521,15 @@ function main5(argv = process.argv.slice(2)) {
2122
2521
  return 2;
2123
2522
  }
2124
2523
  }
2125
- const c = runCensus(path9.resolve(root), resolvePackageRoot(import.meta.url), home);
2524
+ if (contradictions) {
2525
+ const r = runContradictions(path10.resolve(root), resolvePackageRoot(import.meta.url), home === void 0 ? {} : { homeRoot: home });
2526
+ if (json) process.stdout.write(`${JSON.stringify({ contradictions: r.rows })}
2527
+ `);
2528
+ else for (const line of r.lines) process.stdout.write(`${line}
2529
+ `);
2530
+ return 0;
2531
+ }
2532
+ const c = runCensus(path10.resolve(root), resolvePackageRoot(import.meta.url), home);
2126
2533
  if (json) {
2127
2534
  process.stdout.write(`${JSON.stringify(c)}
2128
2535
  `);
@@ -2132,29 +2539,31 @@ function main5(argv = process.argv.slice(2)) {
2132
2539
  }
2133
2540
  return 0;
2134
2541
  }
2135
- function _isCliEntry5() {
2542
+ function _isCliEntry6() {
2136
2543
  const bundled = true;
2137
2544
  const cliDelegate = true;
2138
2545
  if (bundled && !cliDelegate) return false;
2139
2546
  if (process.argv[1] === void 0) return false;
2140
- if (cliDelegate && path9.basename(process.argv[1], ".js") === "cmd_doctor_neighbours") {
2547
+ if (cliDelegate && path10.basename(process.argv[1], ".js") === "cmd_doctor_neighbours") {
2141
2548
  return true;
2142
2549
  }
2143
- const argvUrl = pathToFileURL5(path9.resolve(process.argv[1])).href;
2550
+ const argvUrl = pathToFileURL6(path10.resolve(process.argv[1])).href;
2144
2551
  if (import.meta.url === argvUrl) return true;
2145
2552
  try {
2146
- return fs9.realpathSync(fileURLToPath5(import.meta.url)) === fs9.realpathSync(path9.resolve(process.argv[1]));
2553
+ return fs11.realpathSync(fileURLToPath6(import.meta.url)) === fs11.realpathSync(path10.resolve(process.argv[1]));
2147
2554
  } catch {
2148
2555
  return false;
2149
2556
  }
2150
2557
  }
2151
- if (_isCliEntry5()) {
2152
- process.exit(main5());
2558
+ if (_isCliEntry6()) {
2559
+ process.exit(main6());
2153
2560
  }
2154
2561
 
2155
2562
  export {
2156
2563
  runCensus,
2564
+ contradictionCandidates,
2565
+ runContradictions,
2157
2566
  summaryLine,
2158
2567
  renderText,
2159
- main5 as main
2568
+ main6 as main
2160
2569
  };