@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
@@ -0,0 +1,173 @@
1
+ /**
2
+ * The registry of DELETED settings keys, and the once-per-run notice a leftover
3
+ * value gets. Extracted from `agent_settings.ts`, which sits at the 1500-line
4
+ * source ceiling — every retirement batch adds entries here, and here they cost
5
+ * no ratchet. `agent_settings.ts` re-exports `REMOVED_KEYS` so existing
6
+ * importers (the loader, `lint_settings_classes`) are unchanged.
7
+ */
8
+
9
+ type SettingsDict = Record<string, unknown>;
10
+
11
+ /**
12
+ * Settings keys this package has DELETED. A leftover value from an older
13
+ * install is ignored — never applied by any reader — and surfaced with ONE
14
+ * deprecation line per key per process run (stderr; the exit code never
15
+ * changes).
16
+ *
17
+ * The map carries a per-key REASON rather than one shared sentence, because
18
+ * the list now spans more than one deletion doctrine and a single blanket
19
+ * phrase would mis-attribute every future entry. A reader who hits the line
20
+ * should learn why the key went, not just that it did.
21
+ *
22
+ * `subagents.*` — the always-on-orchestration doctrine
23
+ * (road-to-always-on-orchestration Phase 1): the layer has no per-layer
24
+ * on/off setting any more. `ai_team.enabled` joined in Step 1.3 — the
25
+ * `/team` family's availability is a codex-CLI/auth FACT
26
+ * (`src/scripts/ai_team/availability.ts`), not a flag; the `ai_team` config
27
+ * loader (`src/scripts/ai_team/config.ts`) separately accepts a leftover
28
+ * `enabled` key without failing closed, so this warning is the only surfaced
29
+ * signal of that deletion.
30
+ *
31
+ * `hooks.turn_end_gate.*` — the turn-end gate is always armed (2026-08-12).
32
+ * A default-off safety gate cannot soak, so the switch protecting the soak
33
+ * made the soak impossible; whether the gate fires is now decided by each
34
+ * detector's own trigger conditions. See `turn_end_gate_hook.ts` § "Always
35
+ * armed".
36
+ *
37
+ * The five `derivable` leaves below (2026-08-12, road-to-zero-settings Phase
38
+ * 2.1) are a different case from every entry above them, and the difference is
39
+ * the whole safety argument: no code path ever *consulted* them. Each appeared
40
+ * in the template, the schema and the reference page, and several in the setup
41
+ * wizard, while the decision they looked like they governed was taken
42
+ * elsewhere. A key nothing reads cannot change a default by leaving — so this
43
+ * is the one deletion batch that needs no replacement mechanism, only the
44
+ * per-key statement of what already decides.
45
+ *
46
+ * A sixth unread key, `screenshots.data_bearing_gate`, was found in the same
47
+ * pass and deliberately NOT deleted — it is `consent`, and the open question is
48
+ * whether the repair is to build its missing reader or to delete a promise a
49
+ * Hard Floor can never honour. See `settings-classes.md` § The six unread keys.
50
+ *
51
+ * `worktrees.mode` (2026-08-13, ADR-229) is a third doctrine again: not
52
+ * always-on, not unread. It WAS read, and the reader honoured all three values —
53
+ * the deletion says the decision was never the agent's to make. `ask` bought a
54
+ * round trip per spawn, `on` let the agent start parallel work unprompted, and
55
+ * `off` described the wanted behavior, so `off` became the hardcoded rule and
56
+ * the switch went. What decides instead is the user's own sentence in the chat.
57
+ *
58
+ * The 2026-10-09 batch (road-to-settings-classes-derivable-surface-stagnation
59
+ * Phase 2) is a fourth doctrine: `derivable` keys whose shipped default is the
60
+ * only behavior the package supports. Each WAS read — by code or by rule and
61
+ * command prose — and every reader was rewritten to state the old default as
62
+ * fixed behavior in the same change, so retiring the key changes no effective
63
+ * default; what a consumer who had set a non-default value loses is named by
64
+ * the reason.
65
+ *
66
+ * Every reason string must name what decides INSTEAD, never just "removed".
67
+ * Exported so `lint_settings_classes` can check the deletion side of the
68
+ * surface: a reason that names no replacement, or an entry whose key is live in
69
+ * the template again, is a contradiction the loader itself cannot notice.
70
+ */
71
+ export const REMOVED_KEYS: ReadonlyMap<string, string> = new Map([
72
+ ['subagents.enabled', 'always-on orchestration'],
73
+ ['subagents.auto', 'always-on orchestration'],
74
+ ['subagents.host_capabilities', 'always-on orchestration'],
75
+ ['subagents.budget_routing', 'always-on orchestration'],
76
+ ['ai_team.enabled', 'always-on orchestration'],
77
+ ['hooks.turn_end_gate.enabled', 'the turn-end gate is always armed'],
78
+ ['hooks.turn_end_gate.promissory', 'the turn-end gate is always armed'],
79
+ ['hooks.turn_end_gate.language', 'the turn-end gate is always armed'],
80
+ ['hooks.turn_end_gate.verification', 'the turn-end gate is always armed'],
81
+ ['telegraph.speak_scope', 'the rule body states its own scope; compile_time_toggles decides whether the rule ships'],
82
+ ['chat_history.max_size_kb', 'the rotate command takes --max-kb from argv; session-count pruning bounds the file'],
83
+ ['chat_history.on_overflow', 'the overflow mode comes from the rotate command --mode argv'],
84
+ ['quality.wait_for_remote_ci', 'whether to poll follows from the push plus a detectable remote pipeline'],
85
+ ['legal_review_prep.consented_at', 'the provenance sidecar settings:set writes and consentVerdict reads'],
86
+ ['worktrees.mode', 'the user asking for a worktree in the chat; creation is instruction-only and hardcoded'],
87
+ // 2026-10-09 — output and tone
88
+ ['personal.minimal_output', 'direct-answers Iron Law 3 mandates terse replies; there is no verbose mode'],
89
+ ['personal.play_by_play', 'direct-answers: no narration unless the user asks for it in the turn'],
90
+ ['personal.pr_comment_bot_icon', 'no-decorative-emojis-in-git-surfaces forbids the 🤖 prefix'],
91
+ ['verbosity.intent_announcements', 'direct-answers: act and emit the result, no "Let me…" openers'],
92
+ ['verbosity.preview_artifacts', 'generated content is used directly; preview-on-error and the Iron-Law gates decide when a preview shows'],
93
+ ['verbosity.routine_confirmations', 'the no-cheap-questions Pre-Send Self-Check; Iron-Law gates always ask'],
94
+ ['verbosity.post_action_reports', 'direct-answers Iron Law 3: a one-line confirmation and one end-summary'],
95
+ ['telegraph.speak', 'the telegraph-speak predicate in compile_time_toggles.ts; the bench verdict is package-level (ADR telegraph/0002)'],
96
+ ['tokens.rich_skills', "the skill's own token_budget_class: rich plus the lint_token_budget_discipline ceiling"],
97
+ // 2026-10-09 — reasoning protocol switches
98
+ ['reasoning.auto_gate', 'the RDP gate task signal plus the host self-assessment in rdp-gate.md'],
99
+ ['reasoning.components.orchestrator', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
100
+ ['reasoning.components.notes_first', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
101
+ ['reasoning.components.grounding', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
102
+ ['reasoning.components.intent', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
103
+ ['reasoning.components.complexity_first', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
104
+ ['reasoning.components.verifier_default', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
105
+ ['reasoning.components.prediction_tracking', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
106
+ ['reasoning.components.decision_ledger', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
107
+ ['reasoning.components.uncertainty_budget', 'the RDP gate task and host signals decide per component; reasoning.enabled stays the hard off'],
108
+ // 2026-10-09 — roadmap cadence
109
+ ['roadmap.skip_pre_run_gate', 'the command name names the scope; only an ambiguous roadmap or an unresolvable conflict shows the gate'],
110
+ ['roadmap.dashboard_regen_cadence', 'a fixed cadence: every 5th closed step, every phase boundary, reply end and any file-shape touch'],
111
+ // 2026-10-09 — command suggestion and PR creation
112
+ ['commands.auto_detect', "an orchestrator's own auto_detect front-matter and the --no-auto-detect flag"],
113
+ ['commands.suggestion.enabled', 'the suggester match-score floor and cooldown; /command-suggestion-off silences one conversation'],
114
+ ['commands.suggestion.confidence_floor', "the suggester's fixed 0.6 floor; a command's own suggestion frontmatter can tighten it"],
115
+ ['commands.suggestion.cooldown_seconds', "the suggester's fixed 600-second cooldown; a command's own suggestion frontmatter can lengthen it"],
116
+ ['commands.suggestion.max_options', 'the fixed cap of 4 suggestions plus the always-present as-is option'],
117
+ ['commands.create_pr.api_examples', "/create-pr's grounding rule: an example only from a real source, otherwise a one-line pointer"],
118
+ ['commands.create_pr.ui_paths', "/create-pr's light frontend heuristic, which fails open"],
119
+ ['commands.create_pr.api_paths', "/create-pr's light API-endpoint heuristic, which fails open"],
120
+ // 2026-10-09 — memory and knowledge sharing
121
+ ['memory.cadence', 'a fixed cadence: the memory line renders whenever a memory type was asked; memory.visibility: off still silences it'],
122
+ ['memory.review_threshold', "/memory load's fixed preview threshold of 10 unreviewed intake signals"],
123
+ ['knowledge.global_sharing.redaction.enabled', 'the write-time redaction scan, which always runs before a card goes global'],
124
+ ['knowledge.global_sharing.redaction.halt_on_trigger', 'the redaction gate, which always halts on a confidential-pattern hit'],
125
+ ['knowledge.global_sharing.auto_promote_threshold', 'the fixed two-repo sighting count that triggers a promotion suggestion'],
126
+ ['knowledge.global_sharing.freshness.hypothesis_after_days', "the card's age over last_verified against the fixed 90-day lead-only window"],
127
+ ['knowledge.global_sharing.freshness.stale_after_days', "the card's age over last_verified against the fixed 180-day skip window"],
128
+ // 2026-10-09 — hooks and engine
129
+ ['hooks.concern_budget.max_per_event', "the concern-budget gate's own constant of 8 per (platform, event) cell"],
130
+ ['hooks.concern_budget.hard_fail', "the concern-budget gate's --strict argv; without it the gate warns"],
131
+ ['decision_engine.surface_traces', 'nothing: the per-phase decision trace stays off, the old default'],
132
+ ['decision_engine.on_block_fallback', 'the fail-safe: an on_block ask that times out always stops'],
133
+ ['explain.enable_last', 'the presence of a work-state trace; explain last always renders it'],
134
+ // 2026-10-09 — remaining
135
+ ['project.pr_template', '/create-pr, which reads .github/pull_request_template.md'],
136
+ ['pipelines.skill_improvement', 'the skill-improvement-trigger rule; the capture is a proposal the user confirms'],
137
+ ['consistency.cross_source', 'the cross-source-consistency rule, always on; batching and the no-cheap-questions floor bound the noise'],
138
+ ['subagents.downshift', 'the model_tier each sub-task declares; downshift is always on'],
139
+ ['ai_team.suppress_setup_hint', 'nothing: the one-line team-mode setup hint is always shown'],
140
+ ]);
141
+
142
+ /** Keys already warned about in THIS process — the "once per run" dedupe. */
143
+ const _warnedRemovedKeys = new Set<string>();
144
+
145
+ /** Read one dotted path out of a merged settings tree; `undefined` when absent. */
146
+ function _readDotted(root: SettingsDict, dotted: string): unknown {
147
+ let node: unknown = root;
148
+ for (const part of dotted.split('.')) {
149
+ if (typeof node !== 'object' || node === null || Array.isArray(node)) {
150
+ return undefined;
151
+ }
152
+ node = (node as SettingsDict)[part];
153
+ }
154
+ return node;
155
+ }
156
+
157
+ /**
158
+ * Warn once per process, on stderr, for every {@link REMOVED_KEYS} entry still
159
+ * present in a resolved settings tree. Never throws, never changes what the
160
+ * caller does with `merged` — a pure notification side effect.
161
+ */
162
+ export function warnRemovedKeys(merged: SettingsDict): void {
163
+ for (const [key, reason] of REMOVED_KEYS) {
164
+ if (_warnedRemovedKeys.has(key)) {
165
+ continue;
166
+ }
167
+ if (_readDotted(merged, key) === undefined) {
168
+ continue;
169
+ }
170
+ _warnedRemovedKeys.add(key);
171
+ process.stderr.write(`${key} was removed (${reason}); ignored.\n`);
172
+ }
173
+ }
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Who put a ranked skill on disk, and whether its body has been looked at.
3
+ *
4
+ * SPLIT OUT OF `neighbour_census.ts` FOR ONE CONCRETE REASON. The ranker
5
+ * (`skill_tools/score_skill_relevance`) needs these primitives, and the ranker
6
+ * runs inside the shared hook bundle on `user_prompt_submit`. The census module
7
+ * reaches the host-hook merger, the secret detector and the install-ownership
8
+ * reader; every byte of that would be inlined into one bundle that every concern
9
+ * loads on every dispatch, under a ceiling `check_hook_bundle_composition` holds.
10
+ * So the primitives live here, importing only the manifest reader, and the census
11
+ * re-exports them — one definition, two call sites, no second module graph.
12
+ *
13
+ * ORIGIN IS READ FROM A CLAIM RECORD, NEVER INFERRED FROM A ROOT. The temptation
14
+ * is to call `~/.claude/skills` foreign and the workspace ours. That is wrong in
15
+ * both directions: `agent-config install` writes this package's own skills into
16
+ * the host-global root, and a consumer's hand-written skills sit in the project
17
+ * root. The one artifact that records what this package actually wrote is the
18
+ * installed-tools manifest, so the manifest is the authority and the root is only
19
+ * a tie-break between the two NON-package labels.
20
+ */
21
+ import { createHash } from 'node:crypto';
22
+ import * as fs from 'node:fs';
23
+ import * as os from 'node:os';
24
+ import * as path from 'node:path';
25
+
26
+ import { parse as parseYaml } from 'yaml';
27
+
28
+ import { manifest_path } from './installed_tools.js';
29
+
30
+ /**
31
+ * Where a RANKED skill came from — a question about AUTHORSHIP.
32
+ *
33
+ * Deliberately not the census's `origin` id segment, which is WHERE a file was
34
+ * found (`project`, `user`, `cursor`, …). Location does not answer authorship in
35
+ * either direction, which is the whole reason this type exists beside that one.
36
+ *
37
+ * `home` is spelled `home` rather than the census's `user` because this value is
38
+ * printed on a ROUTE LINE beside a skill name, where it has to read as a place a
39
+ * reader can go and look.
40
+ */
41
+ export type SkillOrigin = 'package' | 'project' | 'home';
42
+
43
+ /** One `compat` label per neighbour skill. Order decided in {@link classifyCompat}. */
44
+ export type Compat = 'shadowed' | 'overlapping' | 'unscanned' | 'unclassified';
45
+
46
+ /** The authored source tree, relative to a maintainer checkout's root. */
47
+ export const AUTHORED_SKILL_ROOT = path.join('src', 'skills');
48
+
49
+ /** Where the scan verdicts the ranker reads are written, relative to the root. */
50
+ export const SCAN_CACHE_RELATIVE = path.join('agents', 'reports', 'neighbour-scan.json');
51
+
52
+ /** Default scan-cache path for a project root. */
53
+ export function scanCachePath(projectRoot: string): string {
54
+ return path.join(projectRoot, SCAN_CACHE_RELATIVE);
55
+ }
56
+
57
+ /**
58
+ * What a route line prints: bare for ours, `origin:name` for a neighbour.
59
+ *
60
+ * One function, so the ranker, the census and every report agree on the
61
+ * spelling. Two spellings of one name is how a collision stops being visible,
62
+ * which is the defect this whole step exists to close.
63
+ */
64
+ export function qualifiedSkillName(name: string, origin: SkillOrigin): string {
65
+ return origin === 'package' ? name : `${origin}:${name}`;
66
+ }
67
+
68
+ /** Split a qualified name back apart. A bare name resolves to `package`. */
69
+ export function splitQualifiedName(qualified: string): { origin: SkillOrigin; name: string } {
70
+ const m = /^(project|home):([\s\S]*)$/.exec(qualified);
71
+ if (m) return { origin: m[1] as SkillOrigin, name: m[2] as string };
72
+ return { origin: 'package', name: qualified };
73
+ }
74
+
75
+ /**
76
+ * Every absolute path this package's installed-tools manifest claims, or `null`
77
+ * when there is no manifest to claim anything.
78
+ *
79
+ * `null` and an empty set are different answers and callers must keep them
80
+ * apart. An empty set means the manifest was read and claims nothing; `null`
81
+ * means nothing recorded a claim at all, which is a tree that has never run an
82
+ * install — this repository, for one.
83
+ *
84
+ * WHY THIS PARSES THE MANIFEST ITSELF, which is a thing to justify rather than
85
+ * do quietly. Three readers of this file already exist and none answers this
86
+ * question at a cost this path can pay. `installed_tools.read_manifest` drops
87
+ * the nested `tools[].files[]` rows by design — its own header says so, and
88
+ * those rows are the entire input here. `install_drift.collect_drift` and
89
+ * `recordedOwnership.readRecordedHashes` both parse the YAML directly FOR THAT
90
+ * REASON, so parsing it directly is the established answer rather than a new
91
+ * idea; what is new is the fourth question — the PATHS only, with no sha, no
92
+ * tool grouping and no hash map. `readRecordedHashes` would have answered it
93
+ * and was measured costing 1,706 bytes of the shared hook bundle, which is the
94
+ * budget this whole module was split out to protect. The `~` expansion below is
95
+ * the same one all three use.
96
+ */
97
+ export function packageClaimedPaths(projectRoot: string): ReadonlySet<string> | null {
98
+ const manifest = manifest_path(projectRoot);
99
+ let doc: unknown;
100
+ try {
101
+ doc = parseYaml(fs.readFileSync(manifest, 'utf-8'), { version: '1.1' });
102
+ } catch {
103
+ // Unreadable and absent are the same answer: nothing recorded a claim.
104
+ return null;
105
+ }
106
+ if (doc === null || typeof doc !== 'object' || Array.isArray(doc)) return null;
107
+ const tools = (doc as Record<string, unknown>)['tools'];
108
+ const out = new Set<string>();
109
+ if (!Array.isArray(tools)) return out;
110
+ for (const tool of tools) {
111
+ if (tool === null || typeof tool !== 'object' || Array.isArray(tool)) continue;
112
+ const files = (tool as Record<string, unknown>)['files'];
113
+ if (!Array.isArray(files)) continue;
114
+ for (const entry of files) {
115
+ if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) continue;
116
+ const raw = (entry as Record<string, unknown>)['path'];
117
+ if (typeof raw !== 'string' || raw === '') continue;
118
+ out.add(path.resolve(projectRoot, _expanduser(raw)));
119
+ }
120
+ }
121
+ return out;
122
+ }
123
+
124
+ /** Expand a leading `~`, matching the three sibling manifest readers. */
125
+ function _expanduser(p: string): string {
126
+ if (p === '~') return os.homedir();
127
+ if (p.startsWith('~/') || (process.platform === 'win32' && p.startsWith('~\\'))) {
128
+ return path.join(os.homedir(), p.slice(2));
129
+ }
130
+ return p;
131
+ }
132
+
133
+ export interface SkillOriginOptions {
134
+ /** Pre-read claim set, to avoid a second manifest read. `null` = no manifest. */
135
+ claims?: ReadonlySet<string> | null;
136
+ /** Maintainer checkout root whose `src/skills` is the authored tree. */
137
+ packageRoot?: string;
138
+ }
139
+
140
+ /**
141
+ * Resolve one `SKILL.md` path to the origin of the skill it defines.
142
+ *
143
+ * NO CLAIM RECORD MEANS NO QUALIFIER. With no manifest, nothing on disk carries
144
+ * evidence that any skill is foreign, so everything resolves to `package`, the
145
+ * ranker qualifies nothing, and its output is exactly what it was before this
146
+ * function existed. That is deliberate rather than a gap being tolerated: a
147
+ * `home:` prefix asserted without a claim record is a guess printed in the shape
148
+ * of a fact, and a reader cannot tell the two apart. The cost is stated rather
149
+ * than hidden — where no manifest exists a foreign skill is invisible here, and
150
+ * the thing that fixes it is running an install, not loosening this rule.
151
+ *
152
+ * The authored tree is the one exception, and it is a construction rather than a
153
+ * guess: `<root>/src/skills` exists only in a maintainer checkout of THIS
154
+ * package and holds its source of truth, so nothing foreign can be under it.
155
+ */
156
+ export function makeSkillOriginResolver(
157
+ projectRoot: string,
158
+ opts: SkillOriginOptions = {},
159
+ ): (skillMdPath: string) => SkillOrigin {
160
+ const claims = opts.claims !== undefined ? opts.claims : packageClaimedPaths(projectRoot);
161
+ const root = path.resolve(projectRoot);
162
+ const authored = path.join(path.resolve(opts.packageRoot ?? projectRoot), AUTHORED_SKILL_ROOT);
163
+ const under = (abs: string, dir: string): boolean =>
164
+ abs === dir || abs.startsWith(dir + path.sep);
165
+ return (skillMdPath: string): SkillOrigin => {
166
+ const abs = path.resolve(skillMdPath);
167
+ if (under(abs, authored)) return 'package';
168
+ if (claims === null) return 'package';
169
+ if (claims.has(abs)) return 'package';
170
+ return under(abs, root) ? 'project' : 'home';
171
+ };
172
+ }
173
+
174
+ /**
175
+ * The one label, and the order it is decided in.
176
+ *
177
+ * `unscanned` — the shape scan refused the body. FIRST, because an overlap
178
+ * score is derived FROM a body this census declined to read,
179
+ * and publishing it would be the refusal cancelling itself.
180
+ * `shadowed` — one of ours carries the same bare name. Name-derived, so it
181
+ * stays true under `unscanned`; it loses the slot only
182
+ * because `unscanned` is the stronger call to action.
183
+ * `overlapping` — content similarity against one of ours at or above the
184
+ * threshold `audit_skill_overlap` already calibrates.
185
+ * `unclassified` — none of the above fired. Not a clearance.
186
+ */
187
+ export function classifyCompat(args: {
188
+ unscanned: string | null;
189
+ shadows: readonly string[];
190
+ overlaps: readonly string[];
191
+ }): Compat {
192
+ if (args.unscanned !== null) return 'unscanned';
193
+ if (args.shadows.length > 0) return 'shadowed';
194
+ if (args.overlaps.length > 0) return 'overlapping';
195
+ return 'unclassified';
196
+ }
197
+
198
+ /** One recorded scan verdict. `unscanned` is `null` when every shape passed. */
199
+ export interface ScanRecord {
200
+ qualified: string;
201
+ digest: string;
202
+ unscanned: string | null;
203
+ }
204
+
205
+ export interface ScanCache {
206
+ schema_version: 1;
207
+ entries: ScanRecord[];
208
+ }
209
+
210
+ /** Read the scan cache, or `null` when it is absent or unreadable. */
211
+ export function readScanCache(file: string): ScanCache | null {
212
+ let parsed: unknown;
213
+ try {
214
+ parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
215
+ } catch {
216
+ return null;
217
+ }
218
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return null;
219
+ const entries = (parsed as Record<string, unknown>)['entries'];
220
+ if (!Array.isArray(entries)) return null;
221
+ return { schema_version: 1, entries: entries as ScanRecord[] };
222
+ }
223
+
224
+ /** sha256 of a file's bytes, or `null` when it cannot be read. */
225
+ export function fileDigest(file: string): string | null {
226
+ try {
227
+ return createHash('sha256').update(fs.readFileSync(file)).digest('hex');
228
+ } catch {
229
+ return null;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Whether a neighbour body may be indexed, and why not when it may not.
235
+ *
236
+ * THREE REFUSALS, REPORTED SEPARATELY, because they ask the maintainer for three
237
+ * different things: run the census, re-run it, or read the finding. A missing
238
+ * record is a refusal and not a pass — a gate that passes on missing evidence is
239
+ * satisfied by deleting the evidence, which is the opposite of a floor. The
240
+ * digest compare is what "a changed digest rescans first" means from the reading
241
+ * side: a body edited after its scan is unscanned again until the census runs.
242
+ */
243
+ export function scanVerdict(
244
+ cache: ScanCache | null,
245
+ qualified: string,
246
+ digest: string | null,
247
+ ): { ok: true } | { ok: false; kind: string } {
248
+ if (cache === null) return { ok: false, kind: 'no-scan-record' };
249
+ const rec = cache.entries.find((e) => e.qualified === qualified);
250
+ if (rec === undefined) return { ok: false, kind: 'no-scan-record' };
251
+ if (digest === null || rec.digest !== digest) return { ok: false, kind: 'digest-changed' };
252
+ if (rec.unscanned !== null) return { ok: false, kind: rec.unscanned };
253
+ return { ok: true };
254
+ }
@@ -15,45 +15,74 @@
15
15
  *
16
16
  * What is observed, and what is a shape guess — the line is drawn explicitly.
17
17
  *
18
- * `STRUCTURED_ASK_SHAPES` is **empty**. No host in this repository's registry
19
- * carries an observed structured-ask tool, so there is no per-host tool name to
20
- * match on, and inventing one from a vendor's documentation is exactly what
21
- * `host-capability-manifest.md` § Observation protocol forbids.
18
+ * `STRUCTURED_ASK_SHAPES` carries **one** row, for `claude`, written from an
19
+ * observation under `host-capability-manifest.md` § Observation protocol —
20
+ * 48 `AskUserQuestion` `tool_use` blocks across host versions 2.1.252 to
21
+ * 2.1.284, 2026-09-01 to 2026-10-02. Artifact:
22
+ * `agents/evidence/analysis/structured-ask-host-observation-2026-10.md`. code-comment-allow provenance-comment -- the observation protocol declares a row inadmissible without its artifact citation, so this pointer is part of the contract the row satisfies, not evidence duplicated from a roadmap
23
+ * Every other host has no row, which is "never looked", and inventing one from
24
+ * a vendor's documentation is exactly what that protocol forbids.
22
25
  *
23
- * `STRUCTURED_ASK_TOOL_NAME_RE` is therefore a **name-shape pattern, not a host
24
- * fact**. It exists so that if such a tool ever appears in a transcript, the
25
- * probe MEASURES it rather than missing it — and so the number it reports today
26
- * (zero) is a measurement rather than an absence of instrumentation. A reader
27
- * must not read a match as evidence that a named host ships that tool; the only
28
- * thing that establishes that is an observation written into
26
+ * `STRUCTURED_ASK_TOOL_NAME_RE` is a **name-shape pattern, not a host fact**,
27
+ * and stays one even now that a host fact exists beside it: the pattern is what
28
+ * every caller passing no host id still matches on. It exists so that a picker
29
+ * appearing in a transcript is MEASURED rather than missed. A reader must not
30
+ * read a match as evidence that a named host ships that tool; the only thing
31
+ * that establishes that is an observation written into
29
32
  * `STRUCTURED_ASK_SHAPES` with the protocol's four-part citation.
30
33
  *
31
- * Consequence, stated rather than discovered later: `native` is expected to be
32
- * **0** on every corpus this repo can scan today. That is the honest reading of
33
- * a capability nobody has observed, not a broken detector.
34
+ * Consequence, stated rather than discovered later: `native` is **0** on every
35
+ * corpus this repo can scan today — and the 2026-10 observation does NOT change
36
+ * that, which is worth stating because it looks like it should.
37
+ * `probe_unblocked_ask` partitions hand-back ask turns, and a picker call is
38
+ * answered by a `tool_result` rather than by a free user turn, so it was never
39
+ * in that probe's denominator. The zero means "no prose hand-back used a picker
40
+ * instead"; it never meant "no picker exists".
41
+ *
42
+ * That makes the zero DEFINITIONAL for this probe, not a measurement of
43
+ * scarcity, and the earlier wording claimed the opposite on both halves: it
44
+ * called the zero a measurement, and attributed it to the capability being
45
+ * unobserved. The capability is observed and the zero is unchanged, which is
46
+ * the cleanest available proof that the two were never connected.
34
47
  */
35
48
 
36
49
  /** The per-host shape of a structured-ask tool, once one has been OBSERVED. */
37
50
  export interface StructuredAskShape {
38
51
  /** The tool name as it appears in a transcript's `tool_use` block. */
39
52
  readonly tool: string;
40
- /** How many questions one call may carry. `1` is the shape this repo wants. */
53
+ /**
54
+ * The largest question count OBSERVED in one call, never a host ceiling the
55
+ * host was asked for and refused. `1` is also the shape this repo wants.
56
+ */
41
57
  readonly max_questions: number;
42
- /** How many options one question may offer. */
58
+ /** The largest option count OBSERVED on one question — same caveat. */
43
59
  readonly max_options_per_question: number;
44
- /** Whether the host's picker admits a free-text answer alongside the options. */
60
+ /**
61
+ * Whether the host's picker admits a free-text answer alongside the options.
62
+ * The WEAKEST of the four to establish, because it is read by negation — an
63
+ * answer carrying none of the offered labels. A cancelled ask looks the same
64
+ * from the outside, so a `true` here is "observed at least once", never a
65
+ * count. The citing artifact carries the per-row basis.
66
+ */
45
67
  readonly free_text: boolean;
46
68
  }
47
69
 
48
70
  /**
49
71
  * Observed per-host structured-ask shapes.
50
72
  *
51
- * EMPTY, deliberately. A row is written only from an observation in a real
52
- * session under `contexts/execution/host-capability-manifest.md` § Observation
53
- * protocol — host · host version · transcript reference · date. Never from a
54
- * host's documentation, and never by analogy to another host.
73
+ * A row is written only from an observation in a real session under
74
+ * `contexts/execution/host-capability-manifest.md` § Observation protocol —
75
+ * host · host version · transcript reference · date. Never from a host's
76
+ * documentation, and never by analogy to another host.
77
+ *
78
+ * `claude`'s row is the first, and the two numeric fields are **observed
79
+ * maxima over 48 calls, not host ceilings**: no call carried two questions, so
80
+ * the host was never asked to accept two. The guard's threshold does not rest
81
+ * on them — one question per call is this repo's own rule either way.
55
82
  */
56
- export const STRUCTURED_ASK_SHAPES: Readonly<Record<string, StructuredAskShape>> = {};
83
+ export const STRUCTURED_ASK_SHAPES: Readonly<Record<string, StructuredAskShape>> = {
84
+ claude: { tool: 'AskUserQuestion', max_questions: 1, max_options_per_question: 4, free_text: true },
85
+ };
57
86
 
58
87
  /** The observed shape for `hostId`, or `undefined` when none has been observed. */
59
88
  export function structuredAskShape(
@@ -77,6 +106,20 @@ export const STRUCTURED_ASK_TOOL_NAME_RE = /^(ask[_-]?user[_-]?question|user[_-]
77
106
  * An observed per-host shape wins outright — that is a fact about the host. The
78
107
  * name-shape pattern is the fallback, and it is why the probe can report a
79
108
  * measured zero instead of nothing at all.
109
+ *
110
+ * KNOWN ASYMMETRY, named rather than left for the next reader to hit. With a
111
+ * row present, this returns `name === shape.tool`: ONE observed name becomes an
112
+ * exclusive allowlist, so every other picker name is answered `false` on that
113
+ * host — a universal negative from a single positive observation, which is the
114
+ * shape of inference the observation protocol refuses elsewhere. It is left as
115
+ * it is because the alternative (union of the row and the pattern) would make
116
+ * an observed row buy nothing, and because no caller is affected today. There
117
+ * are TWO production callers, both host-blind, enumerated rather than recalled:
118
+ * `hooks/one_question_per_ask_hook.ts:103` and `probe_unblocked_ask.ts:184`,
119
+ * each calling `isStructuredAskTool(name)` with no second argument. A caller
120
+ * that does start passing one inherits the asymmetry, and
121
+ * `tests/scripts/ask_surface.test.ts` pins it so the inheritance is visible
122
+ * rather than silent.
80
123
  */
81
124
  export function isStructuredAskTool(name: string, hostId?: string | null): boolean {
82
125
  const shape = structuredAskShape(hostId);
@@ -10,6 +10,11 @@
10
10
  * This module is that emission, so the registry entry moves in the same change
11
11
  * rather than being left describing a gap that closed.
12
12
  *
13
+ * DATED 2026-10-06. The emission exists and is tested, but nothing calls it:
14
+ * this writer has no production caller, so the registry row was corrected back
15
+ * to `degraded` the same day. The caller belongs to the stub that owns it —
16
+ * whoever lands it sets the row back to `available`.
17
+ *
13
18
  * WHAT IT IS NOT. It is not a test runner, and it does not decide whether a
14
19
  * failure is a legitimate RED. The failure CLASSES belong to the TDD skill
15
20
  * (`src/skills/test-driven-development/SKILL.md`, Test-Red row) and this module