@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
@@ -39,11 +39,16 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
39
39
  // a second copy (road-to-skill-delivery-over-mcp risk 6). Everything below is
40
40
  // the disk half — globbing, frontmatter, the CLI — which stays here.
41
41
  import {
42
- scoreSkill,
42
+ buildTermStats,
43
+ compareRanked,
44
+ rawSkillScore,
45
+ roundHalfToEven,
43
46
  skillTerms as _sharedSkillTerms,
44
47
  tokenize as _sharedTokenize,
45
48
  triggerTextFromFlatLines,
49
+ widensTermSource,
46
50
  type RankOptions,
51
+ type TermStats,
47
52
  } from '../../shared/skillRanking.js';
48
53
 
49
54
  const _HERE = fileURLToPath(import.meta.url);
@@ -67,6 +72,20 @@ export const ROOT = path.resolve(path.dirname(_HERE), '..', '..', '..');
67
72
  * CLI turns that into a distinct exit code rather than an empty list.
68
73
  */
69
74
  import { DEFAULT_CATALOGUE_ROOTS, resolveSkillCatalogueRoots } from '../_lib/skill_catalogue.js';
75
+ // Authorship + scan primitives only. Deliberately NOT `neighbour_census.js`,
76
+ // whose module graph reaches the host-hook merger, the secret detector and the
77
+ // install-ownership reader — this module is inlined into the shared hook bundle,
78
+ // where every byte is paid by every concern on every dispatch.
79
+ import {
80
+ fileDigest,
81
+ makeSkillOriginResolver,
82
+ qualifiedSkillName,
83
+ readScanCache,
84
+ scanCachePath,
85
+ scanVerdict,
86
+ type ScanCache,
87
+ type SkillOrigin,
88
+ } from '../_lib/skill_origin.js';
70
89
 
71
90
  /**
72
91
  * Every readable catalogue root, in precedence order — possibly empty.
@@ -100,7 +119,17 @@ export interface Frontmatter {
100
119
  export function _parse_frontmatter(filePath: string): Frontmatter {
101
120
  // text.read_text(errors="replace") — Node `utf-8` decode replaces the same
102
121
  // way for the inputs these tools see (well-formed SKILL.md files).
103
- const text = fs.readFileSync(filePath, 'utf-8');
122
+ return _parse_frontmatter_text(fs.readFileSync(filePath, 'utf-8'));
123
+ }
124
+
125
+ /**
126
+ * The same reader over text already in hand.
127
+ *
128
+ * The loader needs the body as well as the frontmatter, and reading each
129
+ * SKILL.md twice to get them would double the per-call I/O of a ranker that
130
+ * runs on a hook path.
131
+ */
132
+ export function _parse_frontmatter_text(text: string): Frontmatter {
104
133
  if (!text.startsWith('---')) {
105
134
  return {};
106
135
  }
@@ -164,38 +193,204 @@ function _rstrip(s: string): string {
164
193
 
165
194
  export interface Skill {
166
195
  name: string;
196
+ /**
197
+ * Where the skill came from — `package` for ours, `project` / `home` for a
198
+ * neighbour another installer put in a root this ranker unions in.
199
+ */
200
+ origin: SkillOrigin;
201
+ /** What a route line prints: `name` for ours, `origin:name` otherwise. */
202
+ qualified: string;
203
+ /**
204
+ * Finding kind when a neighbour body did not pass the shape scan, else
205
+ * `null`. Such a skill is still ranked — by its NAME only; see
206
+ * {@link _load_skills}.
207
+ */
208
+ unscanned: string | null;
167
209
  description: string;
168
210
  personas: string[];
169
211
  terms: Set<string>;
170
212
  /** `triggers[].keyword` / `.phrase` prose. Indexed only under keyword-v2. */
171
213
  triggerText: string[];
214
+ /** The body's `## When to use` section. Indexed only behind its own flag. */
215
+ whenToUseText: string;
216
+ /** The body's `##` / `###` heading lines. Indexed only behind its own flag. */
217
+ headingText: string[];
218
+ }
219
+
220
+ /** Everything after the frontmatter block, or the whole text when there is none. */
221
+ export function _body_of(text: string): string {
222
+ if (!text.startsWith('---')) return text;
223
+ const end = text.indexOf('\n---', 3);
224
+ if (end === -1) return text;
225
+ return text.slice(end + 4);
172
226
  }
173
227
 
174
228
  /**
175
- * Load one root, or several with the FIRST occurrence of a name winning.
229
+ * The `## When to use` section, and every `##` / `###` heading, out of a body.
230
+ *
231
+ * Line-oriented, and bounded in two ways that a first version got wrong in the
232
+ * same direction — it indexed something other than what this block describes,
233
+ * which makes a measurement of the FLAG a measurement of the PARSER:
234
+ *
235
+ * - the section ends at the next heading of the SAME OR A HIGHER level, so a
236
+ * `###` subsection of `## When to use` stays inside it. Ending at any
237
+ * heading truncated the capture at the first subsection;
238
+ * - a line inside a fenced code block is never a heading. These skills are
239
+ * documentation and routinely fence markdown samples, so a `## …` line in a
240
+ * fence was both harvested as a topic and used to terminate the section.
176
241
  *
177
- * Precedence by name, never by root: every root is read, and a collision
178
- * resolves to the earliest root that carries it — `resolveSkillCatalogueRoots`
179
- * owns what that order means. Reading only the first root is the defect this
180
- * replaced; silently ranking one name twice would be the next one.
242
+ * Without the first bound a skill whose whole file is one section could still
243
+ * not put its procedure into an index whose flag says "when to use", because a
244
+ * sibling `##` ends it.
181
245
  */
182
- function _load_skills_across(roots: readonly string[]): Skill[] {
246
+ export function _body_signals(body: string): { whenToUse: string; headings: string[] } {
247
+ const headings: string[] = [];
248
+ const when: string[] = [];
249
+ let whenLevel = 0;
250
+ let fenceMark: string | null = null;
251
+ let fenceLen = 0;
252
+ for (const raw of body.split('\n')) {
253
+ const line = raw.trimEnd();
254
+ const f = /^\s*(`{3,}|~{3,})(.*)$/.exec(line);
255
+ if (f) {
256
+ const run = f[1] as string;
257
+ const mark = run[0] as string;
258
+ if (fenceMark === null) {
259
+ fenceMark = mark;
260
+ fenceLen = run.length;
261
+ // The DELIMITER and its info string are not prose. Pushing them
262
+ // put the language tag of every fenced sample (`bash`, `yaml`)
263
+ // into the index, which is the parser leaking into the signal in
264
+ // the opposite direction from the truncation this block fixed.
265
+ continue;
266
+ }
267
+ // A closing fence has to be at least as long as the opening one and
268
+ // use the same marker; otherwise a ``` inside a ```` block would
269
+ // close it early.
270
+ if (mark === fenceMark && run.length >= fenceLen && (f[2] as string).trim() === '') {
271
+ fenceMark = null;
272
+ fenceLen = 0;
273
+ }
274
+ continue;
275
+ }
276
+ if (fenceMark !== null) {
277
+ if (whenLevel > 0) when.push(raw);
278
+ continue;
279
+ }
280
+ // `#{1,6}`, not `#{2,6}`: a level-1 heading is strictly HIGHER than the
281
+ // section and must close it. Matching only `##`+ let a `# New Section`
282
+ // and everything after it leak into an open capture.
283
+ const h = /^(#{1,6})\s+(.*)$/.exec(line);
284
+ if (h) {
285
+ const level = (h[1] as string).length;
286
+ const title = (h[2] as string).trim();
287
+ if (level >= 2 && level <= 3) headings.push(title);
288
+ if (whenLevel > 0 && level <= whenLevel) {
289
+ whenLevel = 0;
290
+ } else if (whenLevel > 0) {
291
+ // A SUBSECTION TITLE inside `## When to use` is part of that
292
+ // section's text. Skipping it indexed the prose under a `### Do
293
+ // NOT use when` while dropping the words that say what it is.
294
+ when.push(title);
295
+ }
296
+ // Only OPEN a section when none is open. Assigning unconditionally
297
+ // let a `### When to use it on a monorepo` overwrite the outer
298
+ // level 2 with 3, after which the next sibling `###` satisfied
299
+ // `level <= whenLevel` and closed the section early — silently
300
+ // dropping everything from that sibling to the real end.
301
+ if (whenLevel === 0 && /^when to use\b/i.test(title)) whenLevel = level;
302
+ continue;
303
+ }
304
+ if (whenLevel > 0) when.push(raw);
305
+ }
306
+ return { whenToUse: when.join(' ').trim(), headings };
307
+ }
308
+
309
+ /**
310
+ * Everything a load needs to know about who owns a file and whether its body was
311
+ * scanned. Built once per `rank` call, never per file.
312
+ */
313
+ export interface NeighbourContext {
314
+ origin: (skillMdPath: string) => SkillOrigin;
315
+ scans: ScanCache | null;
316
+ }
317
+
318
+ /**
319
+ * The context for a workspace: manifest-backed origins plus the scan cache.
320
+ *
321
+ * Built once per `rank` call rather than per file — one manifest read and one
322
+ * cache read for a catalogue of several hundred entries.
323
+ */
324
+ export function defaultNeighbourContext(workspaceRoot: string = ROOT): NeighbourContext {
325
+ return {
326
+ origin: makeSkillOriginResolver(workspaceRoot, { packageRoot: ROOT }),
327
+ scans: readScanCache(scanCachePath(workspaceRoot)),
328
+ };
329
+ }
330
+
331
+ /**
332
+ * Load one root, or several, with the FIRST occurrence of a QUALIFIED name winning.
333
+ *
334
+ * **It used to dedupe on the bare name, and that was the defect.** Every root is
335
+ * read, so a second package's `design-system` in `~/.claude/skills` and ours both
336
+ * reached this loop — and whichever root came second was dropped, silently, with
337
+ * the surviving row printing one bare name. The reader could not tell which skill
338
+ * the route line meant, and in the direction where the neighbour came first, ours
339
+ * was simply gone.
340
+ *
341
+ * Deduping on the qualified name keeps the only collision that is genuinely a
342
+ * duplicate — the same PACKAGE skill reached through two roots, which is the
343
+ * authored tree beside its own projection — and lets a collision between two
344
+ * different owners rank twice, which is the thing a reader needs to see. A
345
+ * no-manifest tree labels everything `package` (`makeOriginResolver`), so there
346
+ * the behavior is byte-identical to the bare-name dedupe it replaced.
347
+ */
348
+ function _load_skills_across(
349
+ roots: readonly string[],
350
+ opts: RankOptions = {},
351
+ ctx?: NeighbourContext,
352
+ ): Skill[] {
353
+ const context = ctx ?? defaultNeighbourContext();
183
354
  const out: Skill[] = [];
184
355
  const seen = new Set<string>();
185
356
  for (const root of roots) {
186
- for (const s of _load_skills(root)) {
187
- if (seen.has(s.name)) continue;
188
- seen.add(s.name);
357
+ for (const s of _load_skills(root, opts, context)) {
358
+ if (seen.has(s.qualified)) continue;
359
+ seen.add(s.qualified);
189
360
  out.push(s);
190
361
  }
191
362
  }
192
363
  return out;
193
364
  }
194
365
 
195
- function _load_skills(skillsDir: string): Skill[] {
366
+ /**
367
+ * One root's skills.
368
+ *
369
+ * A NEIGHBOUR whose body did not pass the shape scan is loaded with every term
370
+ * source but its name emptied — description, triggers, `## When to use`,
371
+ * headings and personas — so it ranks by name and nothing from the file can
372
+ * reach the index or, through it, the injected route line. It is NOT dropped:
373
+ * a skill hidden for a finding is a skill the reader cannot weigh, and the
374
+ * finding kind rides along on `unscanned` instead.
375
+ *
376
+ * "Did not pass" includes "was never scanned". `scanVerdict` refuses a missing
377
+ * census record and a stale digest as firmly as a real finding, which is what
378
+ * makes this a floor rather than a preference — a gate that passes on missing
379
+ * evidence is satisfied by deleting the evidence.
380
+ */
381
+ function _load_skills(
382
+ skillsDir: string,
383
+ opts: RankOptions = {},
384
+ ctx: NeighbourContext = defaultNeighbourContext(),
385
+ ): Skill[] {
386
+ // The body is parsed only when a flag indexes it. Under keyword-v1 the
387
+ // loader's work is exactly what it always was, which is what keeps the
388
+ // default path's per-prompt cost comparable to the pre-flag reading.
389
+ const wantsBody = Boolean(opts.includeWhenToUse || opts.includeHeadings);
196
390
  const skills: Skill[] = [];
197
391
  for (const skillMd of _globSkillMd(skillsDir)) {
198
- const fm = _parse_frontmatter(skillMd);
392
+ const text = fs.readFileSync(skillMd, 'utf-8');
393
+ const fm = _parse_frontmatter_text(text);
199
394
  const rawName = fm['name'];
200
395
  const name = _truthyStr(rawName) ? String(rawName) : path.basename(path.dirname(skillMd));
201
396
  const rawDesc = fm['description'];
@@ -209,12 +404,41 @@ function _load_skills(skillsDir: string): Skill[] {
209
404
  const triggerText = Array.isArray(rawTriggers)
210
405
  ? triggerTextFromFlatLines(rawTriggers as string[])
211
406
  : [];
407
+ const { whenToUse, headings } = wantsBody
408
+ ? _body_signals(_body_of(text))
409
+ : { whenToUse: '', headings: [] as string[] };
410
+ const origin = ctx.origin(skillMd);
411
+ const qualified = qualifiedSkillName(name, origin);
412
+ const verdict =
413
+ origin === 'package'
414
+ ? ({ ok: true } as const)
415
+ : scanVerdict(ctx.scans, qualified, fileDigest(skillMd));
416
+ if (!verdict.ok) {
417
+ skills.push({
418
+ name,
419
+ origin,
420
+ qualified,
421
+ unscanned: verdict.kind,
422
+ description: '',
423
+ personas: [],
424
+ terms: _tokenize(name),
425
+ triggerText: [],
426
+ whenToUseText: '',
427
+ headingText: [],
428
+ });
429
+ continue;
430
+ }
212
431
  skills.push({
213
432
  name,
433
+ origin,
434
+ qualified,
435
+ unscanned: null,
214
436
  description: desc,
215
437
  personas: personaList,
216
438
  terms: _tokenize(name + ' ' + desc),
217
439
  triggerText,
440
+ whenToUseText: whenToUse,
441
+ headingText: headings,
218
442
  });
219
443
  }
220
444
  return skills;
@@ -234,7 +458,7 @@ function _truthyStr(v: string | string[] | undefined): boolean {
234
458
  * Python sorts `Path` objects component-wise. Since every match is
235
459
  * `<dir>/SKILL.md`, sorting by the directory component reproduces that order.
236
460
  */
237
- function _globSkillMd(root: string): string[] {
461
+ export function _globSkillMd(root: string): string[] {
238
462
  let names: string[];
239
463
  try {
240
464
  names = fs.readdirSync(root);
@@ -257,54 +481,104 @@ function _globSkillMd(root: string): string[] {
257
481
  return dirs.map((name) => path.join(root, name, 'SKILL.md'));
258
482
  }
259
483
 
260
- function _score(taskTerms: Set<string>, skill: Skill, opts: RankOptions = {}): number {
261
- // Single-sourced in `src/shared/skillRanking.ts`. Under keyword-v1 (the
262
- // default) `skill.terms` is already `tokenize(name + ' ' + description)`, so
263
- // the precomputed set is reused unchanged; keyword-v2 re-derives the term
264
- // set with the skill's trigger prose folded in.
265
- const rankable = {
484
+ function _rankable(skill: Skill): {
485
+ name: string;
486
+ description: string;
487
+ personas: string[];
488
+ triggerText: string[];
489
+ whenToUseText: string;
490
+ headingText: string[];
491
+ } {
492
+ return {
266
493
  name: skill.name,
267
494
  description: skill.description,
268
495
  personas: skill.personas,
269
496
  triggerText: skill.triggerText,
497
+ whenToUseText: skill.whenToUseText,
498
+ headingText: skill.headingText,
270
499
  };
271
- const terms = opts.includeTriggers ? _sharedSkillTerms(rankable, opts) : skill.terms;
272
- return scoreSkill(taskTerms, rankable, terms);
500
+ }
501
+
502
+ /**
503
+ * The indexed term set for one skill.
504
+ *
505
+ * With no term-source flag set, `skill.terms` is already
506
+ * `tokenize(name + ' ' + description)` and the precomputed set is reused
507
+ * unchanged; a flag that widens the source re-derives it with that source
508
+ * folded in. Separated from `_score` so the caller can build each set ONCE and
509
+ * share it between the document-frequency pass and the scoring loop.
510
+ */
511
+ function _terms(skill: Skill, opts: RankOptions): ReadonlySet<string> {
512
+ return widensTermSource(opts) ? _sharedSkillTerms(_rankable(skill), opts) : skill.terms;
513
+ }
514
+
515
+ function _rawScore(
516
+ taskTerms: Set<string>,
517
+ skill: Skill,
518
+ terms: ReadonlySet<string>,
519
+ opts: RankOptions = {},
520
+ stats?: TermStats,
521
+ ): number {
522
+ // Single-sourced in `src/shared/skillRanking.ts`; `scoreSkill` rounds this.
523
+ return rawSkillScore(taskTerms, _rankable(skill), terms, opts, stats);
273
524
  }
274
525
 
275
526
  export type RankRow = [string, number, string[]];
276
527
 
277
528
  /**
278
529
  * @param skillsDir one root, or several to rank across (see `_load_skills_across`).
530
+ * @param ctx origin + scan context; omitted, it is built from {@link ROOT}.
531
+ *
532
+ * Row names are QUALIFIED (`project:design-system`) for a neighbour and bare for
533
+ * ours, so two same-named skills are two distinguishable rows rather than one
534
+ * ambiguous one. On a tree with no installed-tools manifest every skill resolves
535
+ * to `package` and every row is bare, which is what it was before.
279
536
  */
280
537
  export function rank(
281
538
  task: string,
282
539
  skillsDir: string | readonly string[],
283
540
  opts: RankOptions = {},
541
+ ctx?: NeighbourContext,
284
542
  ): RankRow[] {
543
+ return rankDetailed(task, skillsDir, opts, ctx).rows;
544
+ }
545
+
546
+ /**
547
+ * {@link rank}, plus each ranked skill's unrounded score. The tie metrics of
548
+ * `report_skill_ranker_confusion` need the second half to tell a tie the
549
+ * ordering key still cannot break from one the unrounded score already broke.
550
+ */
551
+ export function rankDetailed(
552
+ task: string,
553
+ skillsDir: string | readonly string[],
554
+ opts: RankOptions = {},
555
+ ctx?: NeighbourContext,
556
+ ): { rows: RankRow[]; raw: ReadonlyMap<string, number> } {
285
557
  const taskTerms = _tokenize(task);
286
- const skills = _load_skills_across(typeof skillsDir === 'string' ? [skillsDir] : skillsDir);
558
+ const skills = _load_skills_across(
559
+ typeof skillsDir === 'string' ? [skillsDir] : skillsDir,
560
+ opts,
561
+ ctx,
562
+ );
563
+ // ONE term set per skill, shared between the document-frequency pass and the
564
+ // scoring loop — the two used to tokenize the whole catalogue separately.
565
+ const termSets = skills.map((s) => _terms(s, opts));
566
+ const stats = opts.idfWeighting ? buildTermStats(skills.map(_rankable), termSets) : undefined;
287
567
  const rows: RankRow[] = [];
288
- for (const s of skills) {
289
- const score = _score(taskTerms, s, opts);
568
+ const raw = new Map<string, number>();
569
+ for (let i = 0; i < skills.length; i += 1) {
570
+ const s = skills[i] as Skill;
571
+ const unrounded = _rawScore(taskTerms, s, termSets[i] as ReadonlySet<string>, opts, stats);
572
+ const score = roundHalfToEven(unrounded);
290
573
  if (score > 0) {
291
- rows.push([s.name, score, [...s.personas]]);
574
+ rows.push([s.qualified, score, [...s.personas]]);
575
+ raw.set(s.qualified, unrounded);
292
576
  }
293
577
  }
294
- // rows.sort(key=lambda r: (-r[1], r[0])) — Python stable tuple sort.
295
- rows.sort((a, b) => {
296
- if (b[1] !== a[1]) {
297
- return b[1] - a[1];
298
- }
299
- if (a[0] < b[0]) {
300
- return -1;
301
- }
302
- if (a[0] > b[0]) {
303
- return 1;
304
- }
305
- return 0;
306
- });
307
- return rows;
578
+ // rows.sort(key=lambda r: (-r[1], r[0])) — Python stable tuple sort, with
579
+ // the opt-in unrounded tie-break between the two keys.
580
+ rows.sort((a, b) => compareRanked(a[0], a[1], b[0], b[1], opts, raw));
581
+ return { rows, raw };
308
582
  }
309
583
 
310
584
  /** Mirror Python `f"{s:<{w}}"` (left-justify) over code-point width. */
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * sweep_skill_ranker_signals — every candidate signal, alone, on both slices.
4
+ *
5
+ * `road-to-a-ranker-that-routes` 2.2 asks for top-1, top-3 and MRR with
6
+ * intervals for each candidate flag measured ALONE, and the flags are a table in
7
+ * `measure_skill_ranker_baseline.RANKER_LABELS`. This script is the thing that
8
+ * produces that table, and it exists as a committed script rather than a
9
+ * one-off because a number nobody can regenerate is a claim rather than a
10
+ * measurement.
11
+ *
12
+ * IT PRINTS BOTH SLICES, and the two are read for different purposes. The
13
+ * TUNING reading is what a signal may be CHOSEN on. The SEALED reading is the
14
+ * only one a lift may be CLAIMED on. Printing only the sealed column would
15
+ * invite choosing on it, which is the one thing the partition exists to stop;
16
+ * printing only the tuning column would leave the claim unsupported.
17
+ *
18
+ * Usage:
19
+ * ./scripts-run src/scripts/sweep_skill_ranker_signals
20
+ * ./scripts-run src/scripts/sweep_skill_ranker_signals keyword-v1 idf
21
+ * ./scripts-run src/scripts/sweep_skill_ranker_signals --json
22
+ */
23
+
24
+ import * as path from 'node:path';
25
+ import { fileURLToPath } from 'node:url';
26
+
27
+ import { wilsonInterval } from './_lib/capture_rate.js';
28
+ import {
29
+ RANKER_LABELS,
30
+ REPO,
31
+ SKILLS_DIR,
32
+ type SliceName,
33
+ isKnownRanker,
34
+ partitionBySlice,
35
+ readMatrixLabelledPrompts,
36
+ } from './measure_skill_ranker_baseline.js';
37
+ import { meanReciprocalRank, readRows } from './report_skill_ranker_confusion.js';
38
+
39
+ export interface SweepRow {
40
+ label: string;
41
+ slice: SliceName;
42
+ n: number;
43
+ top1: number;
44
+ top1_ci95: { lower: number; upper: number };
45
+ top3: number;
46
+ top3_ci95: { lower: number; upper: number };
47
+ mrr: number;
48
+ }
49
+
50
+ function round3(n: number): number {
51
+ return Math.round(n * 1000) / 1000;
52
+ }
53
+
54
+ function ci(successes: number, trials: number): { lower: number; upper: number } {
55
+ const raw = wilsonInterval(successes, trials);
56
+ return { lower: round3(raw.lower), upper: round3(raw.upper) };
57
+ }
58
+
59
+ /**
60
+ * Every configuration on both slices, ONE ranking pass per prompt.
61
+ *
62
+ * `rank()` re-globs and re-reads the whole SKILL.md catalogue on every call, so
63
+ * it is the dominant cost by a wide margin and ranking each prompt twice doubles
64
+ * the whole sweep. The earlier shape took top-1/top-3 from `measureAccuracy` and
65
+ * MRR from a second pass in `readRows`, which also derived the row set from two
66
+ * independent corpus reads — so a future divergence between them would have been
67
+ * silent rather than loud. All three rates now come off the same readings of the
68
+ * same rows.
69
+ */
70
+ export function sweep(labels: readonly string[], repo = REPO, skillsDir = SKILLS_DIR): SweepRow[] {
71
+ const whole = readMatrixLabelledPrompts(repo);
72
+ const out: SweepRow[] = [];
73
+ for (const label of labels) {
74
+ for (const slice of ['tuning', 'sealed'] as const) {
75
+ const rows = partitionBySlice(whole, slice);
76
+ const readings = readRows(rows, skillsDir, label);
77
+ const n = readings.length;
78
+ const t1 = readings.filter((r) => r.rankOfExpected === 1).length;
79
+ const t3 = readings.filter((r) => r.rankOfExpected >= 1 && r.rankOfExpected <= 3).length;
80
+ out.push({
81
+ label,
82
+ slice,
83
+ n,
84
+ top1: n ? round3(t1 / n) : 0,
85
+ top1_ci95: ci(t1, n),
86
+ top3: n ? round3(t3 / n) : 0,
87
+ top3_ci95: ci(t3, n),
88
+ mrr: round3(meanReciprocalRank(readings)),
89
+ });
90
+ }
91
+ }
92
+ return out;
93
+ }
94
+
95
+ export function renderTable(rows: readonly SweepRow[]): string {
96
+ const L = ['| configuration | slice | n | top-1 | 95 % CI | top-3 | 95 % CI | MRR |', '|---|---|---:|---:|---|---:|---|---:|'];
97
+ for (const r of rows) {
98
+ L.push(
99
+ `| \`${r.label}\` | ${r.slice} | ${String(r.n)} | ${r.top1.toFixed(3)} | ` +
100
+ `${r.top1_ci95.lower.toFixed(3)} – ${r.top1_ci95.upper.toFixed(3)} | ${r.top3.toFixed(3)} | ` +
101
+ `${r.top3_ci95.lower.toFixed(3)} – ${r.top3_ci95.upper.toFixed(3)} | ${r.mrr.toFixed(3)} |`,
102
+ );
103
+ }
104
+ return `${L.join('\n')}\n`;
105
+ }
106
+
107
+ export function main(argv: readonly string[]): number {
108
+ const json = argv.includes('--json');
109
+ const named = argv.filter((a) => !a.startsWith('--'));
110
+ const labels = named.length > 0 ? named : Object.keys(RANKER_LABELS);
111
+ // `isKnownRanker` (Object.hasOwn), not `in`: `in` walks the prototype chain,
112
+ // so `constructor` and `toString` would pass here while `Object.keys` below
113
+ // prints a set that does not contain them — two answers to one question.
114
+ const unknown = labels.filter((l) => !isKnownRanker(l));
115
+ if (unknown.length > 0) {
116
+ process.stderr.write(
117
+ `sweep_skill_ranker_signals: unknown configuration(s) ${unknown.join(', ')}; ` +
118
+ `known: ${Object.keys(RANKER_LABELS).join(', ')}\n`,
119
+ );
120
+ return 2;
121
+ }
122
+ const rows = sweep(labels);
123
+ process.stdout.write(json ? `${JSON.stringify(rows, null, 2)}\n` : renderTable(rows));
124
+ return 0;
125
+ }
126
+
127
+ if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
128
+ process.exit(main(process.argv.slice(2)));
129
+ }