@event4u/agent-config 14.10.0 → 14.12.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 (667) 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 +161 -208
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/design.md +88 -0
  7. package/dist/agent-src/commands/project/analyze.md +47 -0
  8. package/dist/agent-src/commands/review/changes.md +67 -6
  9. package/dist/agent-src/commands/roadmap/create.md +49 -0
  10. package/dist/agent-src/commands/roadmap/next.md +27 -11
  11. package/dist/agent-src/commands/roadmap/process-full.md +14 -0
  12. package/dist/agent-src/commands/video/from-script.md +60 -3
  13. package/dist/agent-src/commands/video/stitch.md +14 -0
  14. package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
  15. package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
  16. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
  17. package/dist/agent-src/rules/active-remediation.md +3 -3
  18. package/dist/agent-src/rules/code-provenance.md +2 -2
  19. package/dist/agent-src/rules/context-hygiene.md +13 -33
  20. package/dist/agent-src/rules/council-availability.md +2 -2
  21. package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
  22. package/dist/agent-src/rules/design-fidelity.md +18 -0
  23. package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
  24. package/dist/agent-src/rules/evaluator-independence.md +56 -44
  25. package/dist/agent-src/rules/fix-what-you-see.md +9 -1
  26. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  27. package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
  28. package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
  29. package/dist/agent-src/rules/playbook-precedence.md +105 -0
  30. package/dist/agent-src/rules/recurring-criticism.md +3 -1
  31. package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
  32. package/dist/agent-src/rules/scale-discipline.md +24 -0
  33. package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
  34. package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
  35. package/dist/agent-src/rules/ui-audit-gate.md +27 -15
  36. package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
  37. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
  38. package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
  39. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
  40. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
  41. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
  42. package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
  43. package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
  44. package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
  45. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
  46. package/dist/agent-src/skills/brand/SKILL.md +3 -0
  47. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
  48. package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
  49. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
  50. package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
  51. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
  52. package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
  53. package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
  54. package/dist/agent-src/skills/code-review/SKILL.md +75 -5
  55. package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
  56. package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
  57. package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
  58. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
  60. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
  61. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
  62. package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
  63. package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
  64. package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
  65. package/dist/agent-src/skills/design-review/SKILL.md +79 -1
  66. package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
  67. package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
  68. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
  69. package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
  70. package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
  71. package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
  72. package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
  73. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
  74. package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
  75. package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
  76. package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
  77. package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
  78. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
  79. package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
  80. package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
  81. package/dist/agent-src/skills/iconography/SKILL.md +3 -0
  82. package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
  83. package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
  84. package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
  85. package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
  86. package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
  87. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
  88. package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
  89. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
  90. package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
  91. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
  92. package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
  93. package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
  94. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
  95. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
  96. package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
  97. package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
  98. package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
  99. package/dist/agent-src/skills/override-management/SKILL.md +3 -0
  100. package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
  101. package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
  102. package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
  103. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
  104. package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
  105. package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
  106. package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
  107. package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
  108. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
  109. package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
  110. package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
  111. package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
  112. package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
  113. package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
  114. package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
  115. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  116. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  117. package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
  118. package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
  119. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
  120. package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
  121. package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
  122. package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
  123. package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
  124. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
  125. package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
  126. package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
  127. package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
  128. package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
  129. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
  130. package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
  131. package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
  132. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  133. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
  134. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
  135. package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
  136. package/dist/agent-src/skills/terraform/SKILL.md +3 -0
  137. package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
  138. package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
  139. package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
  140. package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
  141. package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
  142. package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
  143. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
  144. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
  145. package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
  146. package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
  147. package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
  148. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  149. package/dist/agent-src/templates/playbook.md +75 -0
  150. package/dist/agent-src/templates/roadmaps.md +37 -0
  151. package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  152. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  153. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  154. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  155. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  156. package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  157. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  158. package/dist/cli/commands/uiAudit.js +221 -0
  159. package/dist/cli/commands/uiRender.js +206 -0
  160. package/dist/cli/main.js +22 -1
  161. package/dist/cli/mcp/content.js +64 -1
  162. package/dist/cli/mcp/dispatch.js +175 -10
  163. package/dist/cli/registry.js +3 -0
  164. package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
  165. package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
  166. package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
  167. package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
  168. package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
  169. package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
  170. package/dist/cli-delegate/cmd_brand_status.js +8 -6
  171. package/dist/cli-delegate/cmd_conformance.js +3 -3
  172. package/dist/cli-delegate/cmd_doctor.js +3 -3
  173. package/dist/cli-delegate/cmd_export.js +4 -4
  174. package/dist/cli-delegate/cmd_handoff.js +1 -1
  175. package/dist/cli-delegate/cmd_preflight.js +2 -2
  176. package/dist/cli-delegate/cmd_prune.js +4 -4
  177. package/dist/cli-delegate/cmd_session_recycle.js +70 -9
  178. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  179. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  180. package/dist/cli-delegate/cmd_sync.js +4 -4
  181. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  182. package/dist/cli-delegate/cmd_validate.js +4 -4
  183. package/dist/discovery/deprecation-report.md +1 -1
  184. package/dist/discovery/discovery-manifest.json +362 -127
  185. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  186. package/dist/discovery/discovery-manifest.summary.md +4 -4
  187. package/dist/discovery/dormancy-report.md +1 -1
  188. package/dist/discovery/orphan-report.md +1 -1
  189. package/dist/discovery/packs.json +18 -8
  190. package/dist/discovery/trust-report.md +3 -3
  191. package/dist/discovery/workspaces.json +16 -6
  192. package/dist/hooks/dispatch.js +2575 -1472
  193. package/dist/install/install.mjs +800 -708
  194. package/dist/mcp/registry-manifest.json +3 -3
  195. package/dist/mcp/server.json +2 -2
  196. package/dist/mcp/server.mjs +1685 -1250
  197. package/dist/router.json +1 -1
  198. package/dist/scripts/_lib/lean_projection_mode.js +40 -0
  199. package/dist/scripts/_lib/scoped_projection.js +84 -0
  200. package/dist/scripts/_lib/ui_surface.js +89 -0
  201. package/dist/scripts/condense.js +6 -10
  202. package/dist/scripts/project_thin_rules.js +40 -2
  203. package/dist/server/schemas/settings.js +6 -0
  204. package/dist/shared/skillRanking.js +159 -0
  205. package/docs/contracts/provider-lifecycle.md +47 -18
  206. package/docs/contracts/settings-classes.md +35 -5
  207. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
  208. package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  209. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  210. package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
  211. package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  212. package/docs/guidelines/code-clarity.md +21 -0
  213. package/docs/guidelines/design-antipatterns.md +4 -2
  214. package/docs/guidelines/design-asset-discipline.md +38 -0
  215. package/docs/guidelines/design-fidelity-mechanics.md +45 -29
  216. package/docs/guidelines/design-handover-extraction.md +35 -5
  217. package/docs/guidelines/design-modes.md +41 -1
  218. package/docs/guidelines/monorepo-antipatterns.md +141 -0
  219. package/docs/guidelines/redundancy-taxonomy.md +180 -0
  220. package/llms.txt +50 -39
  221. package/package.json +6 -2
  222. package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  223. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  224. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  225. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  226. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  227. package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  228. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  229. package/src/config/agent-settings.template.yml +44 -0
  230. package/src/config/assurance-capability-registry.json +223 -0
  231. package/src/config/assurance-threshold-budget.json +65 -0
  232. package/src/config/budgets.yml +19 -0
  233. package/src/config/ci-local-parity.yml +29 -0
  234. package/src/config/discovery/prompt-patterns.yml +56 -0
  235. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  236. package/src/config/dispatch-economy-metrics.json +4 -2
  237. package/src/config/estate-count-budget.json +8 -3
  238. package/src/config/evaluator-budgets.json +14 -14
  239. package/src/config/gate-coverage.yml +392 -8
  240. package/src/config/gate-violation-baselines.json +76 -72
  241. package/src/config/hook-latency-budget.json +1 -0
  242. package/src/config/hook-token-budget.json +137 -125
  243. package/src/config/pack-size-budget.json +39 -10
  244. package/src/config/preamble-payload-budget.json +97 -71
  245. package/src/config/quorum-attendance-budget.json +12 -4
  246. package/src/config/routing-coverage-seed.json +29 -0
  247. package/src/config/rule-activation-census.json +7 -3
  248. package/src/config/rule-enforcement-baseline.json +0 -1
  249. package/src/config/rule-stub-ceilings.json +112 -91
  250. package/src/config/suggestion-capture.json +28 -0
  251. package/src/config/surface-matrix.yml +21 -2
  252. package/src/config/web-launch-readiness.json +188 -0
  253. package/src/scripts/_cli/cmd_doctor.ts +15 -16
  254. package/src/scripts/_cli/doctor_install_mode.ts +49 -0
  255. package/src/scripts/_cli/doctor_overrides.ts +154 -0
  256. package/src/scripts/_dispatch.bash +17 -0
  257. package/src/scripts/_lib/as_of.ts +412 -0
  258. package/src/scripts/_lib/exec_evidence.ts +7 -0
  259. package/src/scripts/_lib/gate_baseline.ts +150 -1
  260. package/src/scripts/_lib/hook_settings.ts +33 -0
  261. package/src/scripts/_lib/host_listing_model.ts +192 -0
  262. package/src/scripts/_lib/lean_projection_mode.ts +44 -0
  263. package/src/scripts/_lib/mcp_bridge.ts +199 -0
  264. package/src/scripts/_lib/review_independence.ts +62 -10
  265. package/src/scripts/_lib/rule_injection.ts +239 -0
  266. package/src/scripts/_lib/run_checkpoint.ts +54 -1
  267. package/src/scripts/_lib/scoped_projection.ts +96 -0
  268. package/src/scripts/_lib/session_register.ts +44 -2
  269. package/src/scripts/_lib/skill_catalogue.ts +38 -2
  270. package/src/scripts/_lib/skill_estate.ts +115 -0
  271. package/src/scripts/_lib/transcript_reads.ts +207 -0
  272. package/src/scripts/_lib/ui_authority.ts +343 -0
  273. package/src/scripts/ai-video/adapters/fal.sh +8 -3
  274. package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
  275. package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
  276. package/src/scripts/ai-video/adapters/kling.sh +10 -0
  277. package/src/scripts/ai-video/adapters/sora.sh +10 -0
  278. package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
  279. package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
  280. package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
  281. package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
  282. package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
  283. package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
  284. package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
  285. package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
  286. package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
  287. package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
  288. package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
  289. package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
  290. package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
  291. package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
  292. package/src/scripts/ai-video/smoke-trace.sh +450 -2
  293. package/src/scripts/ai-video/stitch.sh +191 -10
  294. package/src/scripts/ai-video/test-pipeline.sh +84 -6
  295. package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
  296. package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
  297. package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
  298. package/src/scripts/ai_council/clients.ts +3 -2
  299. package/src/scripts/ai_council/consensus.ts +63 -6
  300. package/src/scripts/ai_council/events_log.ts +46 -1
  301. package/src/scripts/ai_council/orchestrator.ts +103 -108
  302. package/src/scripts/ai_council/orchestrator_results.ts +166 -0
  303. package/src/scripts/ai_council/prompts.ts +12 -5
  304. package/src/scripts/ai_council/quorum.ts +82 -1
  305. package/src/scripts/ai_council/quorum_wiring.ts +82 -5
  306. package/src/scripts/ai_council/stance_tally.ts +22 -0
  307. package/src/scripts/bench_hook_latency.ts +62 -0
  308. package/src/scripts/build_proof.ts +12 -1
  309. package/src/scripts/capture_skill_catalogue.ts +21 -0
  310. package/src/scripts/check_always_budget.ts +2 -1
  311. package/src/scripts/check_augmentignore.ts +2 -1
  312. package/src/scripts/check_beta_review_markers.ts +2 -1
  313. package/src/scripts/check_bundle_path_leakage.ts +162 -7
  314. package/src/scripts/check_command_examples.ts +557 -0
  315. package/src/scripts/check_composite_arming.ts +364 -0
  316. package/src/scripts/check_corpus_staleness.ts +2 -1
  317. package/src/scripts/check_council_pin_staleness.ts +3 -1
  318. package/src/scripts/check_enforcement_coverage.ts +116 -3
  319. package/src/scripts/check_enforcement_denominator.ts +365 -0
  320. package/src/scripts/check_estate_count.ts +122 -3
  321. package/src/scripts/check_gate_coverage.ts +2 -1
  322. package/src/scripts/check_hook_bundle_freshness.ts +13 -1
  323. package/src/scripts/check_knowledge_cards.ts +2 -1
  324. package/src/scripts/check_knowledge_pages.ts +3 -2
  325. package/src/scripts/check_memory.ts +2 -1
  326. package/src/scripts/check_no_automerge_key.ts +287 -0
  327. package/src/scripts/check_pack_conformance_fixture.ts +565 -0
  328. package/src/scripts/check_preamble_payload_budget.ts +30 -3
  329. package/src/scripts/check_proposal.ts +2 -1
  330. package/src/scripts/check_reach_staleness.ts +2 -1
  331. package/src/scripts/check_release_adjacent_health.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +5 -0
  333. package/src/scripts/check_review_schema.ts +34 -1
  334. package/src/scripts/check_roadmap_trackable.ts +48 -3
  335. package/src/scripts/check_routing_coverage.ts +352 -0
  336. package/src/scripts/check_score_contract.ts +505 -0
  337. package/src/scripts/check_skill_admissions.ts +514 -0
  338. package/src/scripts/check_source_size_budget.ts +2 -1
  339. package/src/scripts/check_standing_payload_delta.ts +505 -0
  340. package/src/scripts/check_trigger_evals.ts +2 -1
  341. package/src/scripts/check_web_launch_readiness.ts +705 -0
  342. package/src/scripts/classify_change_risk.ts +281 -0
  343. package/src/scripts/compute_skill_tiers.ts +186 -0
  344. package/src/scripts/condense.ts +8 -13
  345. package/src/scripts/council_attendance_metrics.ts +183 -0
  346. package/src/scripts/council_cli.ts +10 -8
  347. package/src/scripts/council_parse_rate.ts +116 -0
  348. package/src/scripts/derive_playbooks.ts +406 -0
  349. package/src/scripts/description_route_check.ts +494 -0
  350. package/src/scripts/design_slop_rules.ts +56 -2
  351. package/src/scripts/dispatch_r2_reviewer.ts +16 -0
  352. package/src/scripts/frontend_corpus_hash.ts +116 -0
  353. package/src/scripts/grade_target_readiness.ts +478 -0
  354. package/src/scripts/hook_manifest.json +1 -1
  355. package/src/scripts/hook_manifest.yaml +124 -16
  356. package/src/scripts/hooks/concern_registry.ts +6 -0
  357. package/src/scripts/hooks/design_pass_hook.ts +356 -0
  358. package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
  359. package/src/scripts/hooks/rule_inject_hook.ts +318 -0
  360. package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
  361. package/src/scripts/hot_context_hook.ts +74 -7
  362. package/src/scripts/install.ts +40 -89
  363. package/src/scripts/lint_adapter_tier.ts +663 -0
  364. package/src/scripts/lint_archived_skills.ts +93 -0
  365. package/src/scripts/lint_budget_ownership.ts +56 -5
  366. package/src/scripts/lint_deterministic_time.ts +470 -0
  367. package/src/scripts/lint_framework_leakage.ts +5 -0
  368. package/src/scripts/lint_handoffs.ts +525 -1
  369. package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
  370. package/src/scripts/lint_marketplace.ts +88 -0
  371. package/src/scripts/lint_media_policy_linkage.ts +140 -1
  372. package/src/scripts/lint_one_off_age.ts +6 -1
  373. package/src/scripts/lint_override_kernel_guard.ts +87 -5
  374. package/src/scripts/lint_roadmap_complexity.ts +56 -0
  375. package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
  376. package/src/scripts/lint_rule_norm_pin.ts +321 -0
  377. package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
  378. package/src/scripts/lint_spawn_payload.ts +42 -5
  379. package/src/scripts/lint_symptom_intake.ts +2 -1
  380. package/src/scripts/mcp_parity_smoke.ts +30 -4
  381. package/src/scripts/mcp_render.ts +66 -1
  382. package/src/scripts/mcp_tool_fingerprint.ts +241 -0
  383. package/src/scripts/measure_risk_class_drift.ts +140 -0
  384. package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
  385. package/src/scripts/media/lib/adapter-common.sh +211 -1
  386. package/src/scripts/media/lib/adapter-contract.md +74 -6
  387. package/src/scripts/model_rule_injection.ts +907 -0
  388. package/src/scripts/pack_install_smoke.ts +363 -0
  389. package/src/scripts/pr_conflict_census.ts +187 -0
  390. package/src/scripts/project_thin_rules.ts +45 -2
  391. package/src/scripts/release.ts +66 -860
  392. package/src/scripts/release_drill.ts +59 -3
  393. package/src/scripts/release_env.ts +298 -0
  394. package/src/scripts/release_publication.ts +720 -0
  395. package/src/scripts/report_pack_delta.ts +204 -0
  396. package/src/scripts/roadmap_context.ts +778 -0
  397. package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
  398. package/src/scripts/schemas/rule.schema.json +24 -2
  399. package/src/scripts/schemas/skill.schema.json +39 -0
  400. package/src/scripts/schemas/ui-authority.schema.json +114 -0
  401. package/src/scripts/select_analysis_mode.ts +112 -0
  402. package/src/scripts/session_register_hook.ts +29 -3
  403. package/src/scripts/sessions_cli.ts +67 -3
  404. package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
  405. package/src/scripts/sync_pr_branch.ts +40 -1
  406. package/src/scripts/token_sink_report.ts +239 -0
  407. package/src/scripts/trigger_coverage.ts +122 -3
  408. package/src/scripts/update_counts.ts +7 -3
  409. package/src/scripts/validate_frontmatter.ts +66 -0
  410. package/src/server/schemas/settings.ts +10 -0
  411. package/src/shared/skillRanking.ts +183 -0
  412. package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
  413. package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
  414. package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
  415. package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
  416. package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
  417. package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
  418. package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
  419. package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
  420. package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
  421. package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
  422. package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
  423. package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
  424. package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
  425. package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
  426. package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
  427. package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
  428. package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
  429. package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
  430. package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
  431. package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
  432. package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
  433. package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
  434. package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
  435. package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
  436. package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
  437. package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
  438. package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
  439. package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
  440. package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
  441. package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
  442. package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
  443. package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
  444. package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
  445. package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
  446. package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
  447. package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
  448. package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
  449. package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
  450. package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
  451. package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
  452. package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
  453. package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
  454. package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
  455. package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
  456. package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
  457. package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -55
  458. package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
  459. package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
  460. package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
  461. package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
  462. package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
  463. package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
  464. package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
  465. package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
  466. package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
  467. package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
  468. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
  469. package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
  470. package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
  471. package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
  472. package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
  473. package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
  474. package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
  475. package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
  476. package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
  477. package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
  478. package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
  479. package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
  480. package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
  481. package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
  482. package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
  483. package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
  484. package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
  485. package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
  486. package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
  487. package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
  488. package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
  489. package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
  490. package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
  491. package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
  492. package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
  493. package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
  494. package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
  495. package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
  496. package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
  497. package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
  498. package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
  499. package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
  500. package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
  501. package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
  502. package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
  503. package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
  504. package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
  505. package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
  506. package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
  507. package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
  508. package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
  509. package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
  510. package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
  511. package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
  512. package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
  513. package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
  514. package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
  515. package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
  516. package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
  517. package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
  518. package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
  519. package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
  520. package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
  521. package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
  522. package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
  523. package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
  524. package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
  525. package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
  526. package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
  527. package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
  528. package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
  529. package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
  530. package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
  531. package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
  532. package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
  533. package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
  534. package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
  535. package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
  536. package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
  537. package/dist/cli/agent-config.js.map +0 -1
  538. package/dist/cli/bash/runBash.js.map +0 -1
  539. package/dist/cli/commands/commands.js.map +0 -1
  540. package/dist/cli/commands/config.js.map +0 -1
  541. package/dist/cli/commands/doctorShell.js.map +0 -1
  542. package/dist/cli/commands/mcpServer.js.map +0 -1
  543. package/dist/cli/commands/packs.js.map +0 -1
  544. package/dist/cli/commands/profiles.js.map +0 -1
  545. package/dist/cli/commands/recordTriggerEval.js.map +0 -1
  546. package/dist/cli/commands/rtkDetect.js.map +0 -1
  547. package/dist/cli/commands/settings.js.map +0 -1
  548. package/dist/cli/commands/uiServe.js.map +0 -1
  549. package/dist/cli/commands/versions.js.map +0 -1
  550. package/dist/cli/commands/workspaces.js.map +0 -1
  551. package/dist/cli/configRoot.js.map +0 -1
  552. package/dist/cli/discovery/loadManifest.js.map +0 -1
  553. package/dist/cli/firstRunNotice.js.map +0 -1
  554. package/dist/cli/help.js.map +0 -1
  555. package/dist/cli/initRouting.js.map +0 -1
  556. package/dist/cli/log/logger.js.map +0 -1
  557. package/dist/cli/main.js.map +0 -1
  558. package/dist/cli/mcp/content.js.map +0 -1
  559. package/dist/cli/mcp/dispatch.js.map +0 -1
  560. package/dist/cli/mcp/stdio.js.map +0 -1
  561. package/dist/cli/paths.js.map +0 -1
  562. package/dist/cli/python/knowledge_ingest.js.map +0 -1
  563. package/dist/cli/python/workspace_analytics.js.map +0 -1
  564. package/dist/cli/python/workspace_crypto.js.map +0 -1
  565. package/dist/cli/python/workspace_documents.js.map +0 -1
  566. package/dist/cli/python/workspace_drive.js.map +0 -1
  567. package/dist/cli/python/workspace_drive_health.js.map +0 -1
  568. package/dist/cli/python/workspace_explain.js.map +0 -1
  569. package/dist/cli/python/workspace_hosts.js.map +0 -1
  570. package/dist/cli/python/workspace_inbox.js.map +0 -1
  571. package/dist/cli/python/workspace_render.js.map +0 -1
  572. package/dist/cli/python/workspace_roles.js.map +0 -1
  573. package/dist/cli/python/workspace_secrets.js.map +0 -1
  574. package/dist/cli/python/workspace_sessions.js.map +0 -1
  575. package/dist/cli/python/workspace_skills.js.map +0 -1
  576. package/dist/cli/registry.js.map +0 -1
  577. package/dist/install/agentSwitchDetection.js.map +0 -1
  578. package/dist/install/agentSwitchProfile.js.map +0 -1
  579. package/dist/install/atomic.js.map +0 -1
  580. package/dist/install/claudePathsPlan.js.map +0 -1
  581. package/dist/install/conflict.js.map +0 -1
  582. package/dist/install/detect.js.map +0 -1
  583. package/dist/install/emit_host_rules_cli.js.map +0 -1
  584. package/dist/install/globalRuleLayers.js.map +0 -1
  585. package/dist/install/hostLayerFingerprint.js.map +0 -1
  586. package/dist/install/partitionEligibility.js.map +0 -1
  587. package/dist/install/paths.js.map +0 -1
  588. package/dist/install/plan.js.map +0 -1
  589. package/dist/install/preflight.js.map +0 -1
  590. package/dist/install/rtkDetection.js.map +0 -1
  591. package/dist/install/ruleInScope.js.map +0 -1
  592. package/dist/install/ruleLayerPartition.js.map +0 -1
  593. package/dist/install/rule_scope.js.map +0 -1
  594. package/dist/install/rule_scope_cli.js.map +0 -1
  595. package/dist/install/selectedTools.js.map +0 -1
  596. package/dist/install/toolDetection.js.map +0 -1
  597. package/dist/install/txlog.js.map +0 -1
  598. package/dist/install/types.js.map +0 -1
  599. package/dist/install/wizard-plan.js.map +0 -1
  600. package/dist/install/wizardDismissals.js.map +0 -1
  601. package/dist/scripts/_lib/agent_settings.js.map +0 -1
  602. package/dist/scripts/_lib/agent_src.js.map +0 -1
  603. package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
  604. package/dist/scripts/_lib/claude_plugin.js.map +0 -1
  605. package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
  606. package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
  607. package/dist/scripts/_lib/environment_detector.js.map +0 -1
  608. package/dist/scripts/_lib/host_launch.js.map +0 -1
  609. package/dist/scripts/_lib/install_layout.js.map +0 -1
  610. package/dist/scripts/_lib/installed_lock.js.map +0 -1
  611. package/dist/scripts/_lib/model_tier.js.map +0 -1
  612. package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
  613. package/dist/scripts/_lib/scoped_projection.js.map +0 -1
  614. package/dist/scripts/_lib/script_output.js.map +0 -1
  615. package/dist/scripts/_lib/spawn_env.js.map +0 -1
  616. package/dist/scripts/_lib/surface_tiers.js.map +0 -1
  617. package/dist/scripts/_lib/token_count.js.map +0 -1
  618. package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
  619. package/dist/scripts/_lib/user_global_paths.js.map +0 -1
  620. package/dist/scripts/ai_council/modes.js.map +0 -1
  621. package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
  622. package/dist/scripts/condense.js.map +0 -1
  623. package/dist/scripts/project_thin_rules.js.map +0 -1
  624. package/dist/server/app.js.map +0 -1
  625. package/dist/server/io/atomicMultiWrite.js.map +0 -1
  626. package/dist/server/io/atomicWrite.js.map +0 -1
  627. package/dist/server/io/sharedWriteCheck.js.map +0 -1
  628. package/dist/server/io/substituteTemplate.js.map +0 -1
  629. package/dist/server/io/yamlIO.js.map +0 -1
  630. package/dist/server/nicknameResolver.js.map +0 -1
  631. package/dist/server/port.js.map +0 -1
  632. package/dist/server/routes/discovery.js.map +0 -1
  633. package/dist/server/routes/install.js.map +0 -1
  634. package/dist/server/routes/ping.js.map +0 -1
  635. package/dist/server/routes/schema.js.map +0 -1
  636. package/dist/server/routes/settings.js.map +0 -1
  637. package/dist/server/routes/settingsChanges.js.map +0 -1
  638. package/dist/server/routes/userMd.js.map +0 -1
  639. package/dist/server/routes/wizard.js.map +0 -1
  640. package/dist/server/routes/workspace.js.map +0 -1
  641. package/dist/server/schemas/settings.js.map +0 -1
  642. package/dist/server/serverInfo.js.map +0 -1
  643. package/dist/server/token.js.map +0 -1
  644. package/dist/server/writeRoot.js.map +0 -1
  645. package/dist/shared/capabilities.js.map +0 -1
  646. package/dist/shared/interactiveContext.js.map +0 -1
  647. package/dist/shared/nicknamePrefill.js.map +0 -1
  648. package/dist/shared/settingsAsks.js.map +0 -1
  649. package/dist/shared/settingsCarveOut.js.map +0 -1
  650. package/dist/shared/settingsClasses.js.map +0 -1
  651. package/dist/shared/settingsConsent.js.map +0 -1
  652. package/dist/shared/settingsSurface.js.map +0 -1
  653. package/dist/shared/userMd/formAdapter.js.map +0 -1
  654. package/dist/shared/userMd/schema.js.map +0 -1
  655. package/dist/shared/userMd/utils.js.map +0 -1
  656. package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
  657. package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
  658. package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
  659. package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
  660. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
  661. package/src/scripts/_lib/secret_detector.test.ts +0 -108
  662. package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
  663. package/src/scripts/_lib/untrusted_content.test.ts +0 -175
  664. package/src/scripts/check_secret_leak.test.ts +0 -90
  665. package/src/scripts/design_slop_rules.test.ts +0 -239
  666. package/src/scripts/self_review_gate.test.ts +0 -296
  667. package/src/shared/capabilities.test.ts +0 -43
@@ -338,14 +338,18 @@ interface ParsedArgs {
338
338
  json: boolean;
339
339
  /** `rule` keeps the pinned byte-identical contract; `skill` is additive. */
340
340
  scope: 'rule' | 'skill';
341
+ /** `--ratchet`: compare the skill scope against its published baseline. */
342
+ ratchet: boolean;
341
343
  }
342
344
 
343
345
  function parse_args(argv: string[]): ParsedArgs {
344
- const out: ParsedArgs = { json: false, scope: 'rule' };
346
+ const out: ParsedArgs = { json: false, scope: 'rule', ratchet: false };
345
347
  for (let i = 0; i < argv.length; i += 1) {
346
348
  const a = argv[i]!;
347
349
  if (a === '--json') {
348
350
  out.json = true;
351
+ } else if (a === '--ratchet') {
352
+ out.ratchet = true;
349
353
  } else if (a === '--scope') {
350
354
  const v = argv[i + 1];
351
355
  if (v !== 'rule' && v !== 'skill') {
@@ -355,7 +359,9 @@ function parse_args(argv: string[]): ParsedArgs {
355
359
  out.scope = v;
356
360
  i += 1;
357
361
  } else if (a === '-h' || a === '--help') {
358
- process.stdout.write('usage: trigger_coverage [-h] [--json] [--scope rule|skill]\n');
362
+ process.stdout.write(
363
+ 'usage: trigger_coverage [-h] [--json] [--scope rule|skill] [--ratchet]\n',
364
+ );
359
365
  process.exit(0);
360
366
  }
361
367
  }
@@ -372,6 +378,113 @@ function parse_args(argv: string[]): ParsedArgs {
372
378
  * its own change, not against a number invented on the day the instrument
373
379
  * shipped.
374
380
  */
381
+ /** The published skill-coverage baseline `--ratchet` compares against. */
382
+ export const SKILL_RATCHET_BASELINE = path.join(
383
+ REPO_ROOT,
384
+ 'agents',
385
+ 'evidence',
386
+ 'metrics',
387
+ 'skill-trigger-coverage-baseline.json',
388
+ );
389
+
390
+ export interface SkillRatchetBaseline {
391
+ skills_with_triggers: number;
392
+ activations: number;
393
+ }
394
+
395
+ /** Read the baseline, or `null` when none is published yet. */
396
+ export function loadSkillRatchetBaseline(file = SKILL_RATCHET_BASELINE): SkillRatchetBaseline | null {
397
+ if (!fs.existsSync(file)) return null;
398
+ try {
399
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf-8')) as Record<string, unknown>;
400
+ const c = parsed['skills_with_triggers'];
401
+ const a = parsed['activations'];
402
+ if (typeof c !== 'number' || typeof a !== 'number') return null;
403
+ return { skills_with_triggers: c, activations: a };
404
+ } catch {
405
+ return null;
406
+ }
407
+ }
408
+
409
+ export interface RatchetVerdict {
410
+ ok: boolean;
411
+ lines: string[];
412
+ }
413
+
414
+ /**
415
+ * The Phase-3.2 ratchet, as a pure function of two readings.
416
+ *
417
+ * TWO directions, and only one of them is a floor. Coverage
418
+ * (`skills_with_triggers`) may only RISE — a tranche that removes triggers is
419
+ * the regression this exists to catch. Activations over the matrix may only
420
+ * FALL OR HOLD — that is the noise ceiling, and it is the half that makes
421
+ * seeding safe rather than merely measurable.
422
+ *
423
+ * A missing baseline is NOT a pass. It is `ok: false` with a line saying to
424
+ * publish one, because a ratchet that silently no-ops when its baseline is gone
425
+ * is the failure mode a ratchet exists to prevent.
426
+ */
427
+ export function ratchetVerdict(
428
+ current: SkillRatchetBaseline,
429
+ baseline: SkillRatchetBaseline | null,
430
+ ): RatchetVerdict {
431
+ if (baseline === null) {
432
+ return {
433
+ ok: false,
434
+ lines: [
435
+ '❌ no published baseline — cannot ratchet.',
436
+ ` Publish one: {"skills_with_triggers": ${current.skills_with_triggers}, ` +
437
+ `"activations": ${current.activations}}`,
438
+ ` at agents/evidence/metrics/skill-trigger-coverage-baseline.json`,
439
+ ],
440
+ };
441
+ }
442
+ const lines: string[] = [];
443
+ let ok = true;
444
+ if (current.skills_with_triggers < baseline.skills_with_triggers) {
445
+ ok = false;
446
+ lines.push(
447
+ `❌ coverage fell: ${baseline.skills_with_triggers} → ${current.skills_with_triggers} ` +
448
+ 'skills declaring triggers. The ratchet only turns one way.',
449
+ );
450
+ } else {
451
+ lines.push(
452
+ `✅ coverage ${baseline.skills_with_triggers} → ${current.skills_with_triggers} ` +
453
+ 'skills declaring triggers.',
454
+ );
455
+ }
456
+ if (current.activations > baseline.activations) {
457
+ ok = false;
458
+ lines.push(
459
+ `❌ matrix activations rose: ${baseline.activations} → ${current.activations}. ` +
460
+ 'A tranche may raise coverage only without raising noise.',
461
+ );
462
+ } else {
463
+ lines.push(`✅ matrix activations ${baseline.activations} → ${current.activations}.`);
464
+ }
465
+ return { ok, lines };
466
+ }
467
+
468
+ function runSkillRatchetCli(json: boolean): number {
469
+ const report = runSkillScope(loadSkillTriggers(SKILLS_DIR), loadMatrixPrompts(MATRIX_DIR));
470
+ const current = {
471
+ skills_with_triggers: report.skills_with_triggers,
472
+ activations: report.activations,
473
+ };
474
+ const verdict = ratchetVerdict(current, loadSkillRatchetBaseline());
475
+ if (json) {
476
+ process.stdout.write(_jsonDumps({ current, ok: verdict.ok, lines: verdict.lines }) + '\n');
477
+ return verdict.ok ? 0 : 1;
478
+ }
479
+ for (const line of verdict.lines) process.stdout.write(`${line}\n`);
480
+ process.stdout.write(
481
+ verdict.ok
482
+ ? '\nskill-trigger ratchet: OK\n'
483
+ : '\nskill-trigger ratchet: FAILED\n',
484
+ );
485
+ return verdict.ok ? 0 : 1;
486
+ }
487
+
375
488
  function runSkillScopeCli(json: boolean): number {
376
489
  const report = runSkillScope(loadSkillTriggers(SKILLS_DIR), loadMatrixPrompts(MATRIX_DIR));
377
490
  if (json) {
@@ -405,7 +518,13 @@ function runSkillScopeCli(json: boolean): number {
405
518
 
406
519
  export function main(argv: string[] | null = null): number {
407
520
  const args = parse_args(argv ?? process.argv.slice(2));
408
- if (args.scope === 'skill') return runSkillScopeCli(args.json);
521
+ if (args.ratchet && args.scope !== 'skill') {
522
+ process.stderr.write('error: --ratchet requires --scope skill\n');
523
+ return 2;
524
+ }
525
+ if (args.scope === 'skill') {
526
+ return args.ratchet ? runSkillRatchetCli(args.json) : runSkillScopeCli(args.json);
527
+ }
409
528
 
410
529
  let isFile = false;
411
530
  try {
@@ -281,9 +281,13 @@ export const TARGETS: ReadonlyArray<[string, ReadonlyArray<[string, string]>]> =
281
281
  // claim names as its own method.
282
282
  ['(installs ships )(\\d+)( of )', 'skills_scoped'],
283
283
  ['( of )(\\d+)( skills \\(untagged core)', 'skills'],
284
- // "14 of 111 governed rules" — the total was scanner-checked and
285
- // generator-blind for the same reason.
286
- ['( of )(\\d+)( governed rules \\()', 'rules'],
284
+ // The "N of M governed rules" position was retired on 2026-08-23:
285
+ // the `enforcement-coverage-resolved` entry no longer restates any
286
+ // enforcement figure, because five hand-written numbers for one
287
+ // property is the defect `check_enforcement_denominator` now reds
288
+ // on. The denominator lives in ONE place — the resolver's own output,
289
+ // projected into docs/proof.md § 4b — so there is no longer a
290
+ // literal here for a generator to keep in sync.
287
291
  ],
288
292
  ],
289
293
  [
@@ -872,6 +872,69 @@ export function check_obligation_frequency(
872
872
  ];
873
873
  }
874
874
 
875
+ /**
876
+ * Shape check for a skill's optional `scope:` write-scope declaration.
877
+ *
878
+ * WHAT IT CHECKS, and only this: when `scope:` is present it carries exactly ONE
879
+ * of `verification_command` / `verification_reason`. The `access` enum, the
880
+ * `pattern` shape and the closed key set are `skill.schema.json`'s and are
881
+ * already enforced by {@link validate} — including through `skill_linter`, which
882
+ * calls the same validator. This covers the one constraint JSON Schema cannot
883
+ * express in the subset implemented here: **exactly one of two optional
884
+ * siblings**. `oneOf` / `anyOf` / `not` are not implemented (nor are
885
+ * `minProperties` / `maxProperties`), so a schema-only attempt would be silently
886
+ * inert — which is worse than absent, because it reads as enforced.
887
+ *
888
+ * WHY EXACTLY ONE. Neither branch is a formality. A declaration with NEITHER is a
889
+ * scope claim nobody can check and nobody has excused, which is the pro-forma
890
+ * field the whole shape exists to avoid. A declaration with BOTH reads as
891
+ * "verified, with an excuse attached" — and the excuse is the half a reader would
892
+ * act on, so the pair is strictly less informative than either alone.
893
+ *
894
+ * WHY IT LIVES HERE AND NOT IN `skill_linter.ts`. It was written there and
895
+ * `check_source_size_budget` refused it: `skill_linter.ts` is 4,742 lines, the
896
+ * ratchet sums lines ABOVE 1,500 per file, and 63 added lines were 63 new
897
+ * violations against a shrink-only baseline. Extracting the body to `_lib` still
898
+ * left the import plus the call, i.e. +2, and a ratchet turns one way. This file
899
+ * is 1,120 lines, so the same code costs zero — and it sits beside
900
+ * {@link check_obligation_frequency}, the existing precedent for an
901
+ * artefact-specific check that the generic validator cannot express.
902
+ *
903
+ * WHAT IT DOES NOT CHECK, stated plainly: whether the declared paths are the
904
+ * paths the skill actually writes. Nothing observes a skill's writes, so that
905
+ * half is model-carried and `scope:` is a declaration, not a control.
906
+ */
907
+ export function check_scope_declaration(data: Record<string, YamlValue>): SchemaError[] {
908
+ const scope = data['scope'];
909
+ if (scope === null || typeof scope !== 'object' || Array.isArray(scope)) return [];
910
+ const keys = scope as Record<string, YamlValue>;
911
+ const hasCommand = typeof keys['verification_command'] === 'string';
912
+ const hasReason = typeof keys['verification_reason'] === 'string';
913
+ if (hasCommand && hasReason) {
914
+ return [
915
+ new SchemaError(
916
+ '$.scope',
917
+ 'scope-verification-both',
918
+ 'declares BOTH verification_command and verification_reason — exactly one. A reason ' +
919
+ 'beside a command reads as a verified claim with an excuse attached, and the excuse ' +
920
+ 'is the half a reader would act on.',
921
+ ),
922
+ ];
923
+ }
924
+ if (!hasCommand && !hasReason) {
925
+ return [
926
+ new SchemaError(
927
+ '$.scope',
928
+ 'scope-verification-missing',
929
+ 'declares neither verification_command nor verification_reason — exactly one. A scope ' +
930
+ 'claim with no command and no stated reason is unfalsifiable, which is the ' +
931
+ 'pro-forma field this declaration exists to avoid.',
932
+ ),
933
+ ];
934
+ }
935
+ return [];
936
+ }
937
+
875
938
  // --- CLI entry point -------------------------------------------------------
876
939
 
877
940
  /** Yield `[artefact_type, path]` pairs for all lintable artefacts. */
@@ -999,6 +1062,9 @@ export function _main(argv: string[]): number {
999
1062
  if (artefactType === 'rule') {
1000
1063
  errors.push(...check_obligation_frequency(p, text, data));
1001
1064
  }
1065
+ if (artefactType === 'skill') {
1066
+ errors.push(...check_scope_declaration(data));
1067
+ }
1002
1068
  const fatal = errors.filter((e) => e.severity === 'error');
1003
1069
  const warnings = errors.filter((e) => e.severity === 'warning');
1004
1070
  if (fatal.length > 0) {
@@ -511,6 +511,11 @@ export const settingsSchema = z.object({
511
511
  'PreToolUse anti-slop nudge (road-to-anti-slop-detector Phase 3). Default off. When on, runs the lint_design_slop registry against about-to-be-written UI content and WARNS (never blocks) on P0/P1 aesthetic tells (side-stripe, gradient-text, magic z-index, …). Flags are rebuttable via DESIGN.md / design-slop-disable. Anti-loop: a file::rule signature surfaced 3x goes silent. Host-limited convenience layer; the universal gate is the lint_design_slop linter/CI.',
512
512
  ),
513
513
  }).default({}),
514
+ design_pass: z.object({
515
+ enabled: z.boolean().default(false).describe(
516
+ 'PostToolUse + stop design pass (road-to-frontend-power E1.1/E1.2/E1.3). Default off. One concern on two slots: on post_tool_use a write to a UI surface delivers the design findings as context and never blocks; on stop the same pass runs over every UI file touched this session, deduped against what the post pass surfaced, and a P0 objective floor (contrast, font size, heading skip, focus) blocks with a continuation. P1-P3 never block. post_tool_use rather than pre_tool_use for two measured reasons: pre_tool_use is declared by three hosts and honoured by one while post_tool_use is declared by six, and _lib/ui_surface.ts is a path predicate, so a pre-write gate cannot fire on the first write of a new surface. A pass that could not fully run reports verification: degraded with a reason rather than passing silently. Does not replace design_slop: two design keys is the honest state until the tiering experiment has a number.',
517
+ ),
518
+ }).default({}),
514
519
  ui_route_nudge: z.object({
515
520
  enabled: z.boolean().default(false).describe(
516
521
  'PreToolUse UI-route nudge (road-to-frontend-skill-application Phase 4). Default off. When on, a Write/Edit to a UI surface with no design consultation latched this session WARNS (never blocks) naming the route — run existing-ui-audit, then the fe-design loop. A read or search touching fe-design / existing-ui-audit / design-review / design-intelligence latches consultation and silences it for the session. Anti-loop: at most 2 nudges per session. It does not read the rules: the UI-surface decision comes from _lib/ui_surface.ts and no code parses rule frontmatter, so this runs parallel to the two UI rules rather than consuming their triggers, and a test keeps the sets from drifting. It is a nudge, so their enforced_by: none stays accurate.',
@@ -521,6 +526,11 @@ export const settingsSchema = z.object({
521
526
  'PreToolUse code-graph nudge (ADR-124 Phase 4). Default off. When on AND a native code-graph cache or a consumer-shipped graph.json/SCIP index is present, warns once per session (never blocks) as the agent is about to Grep/Glob or Read a source file — query the graph first for who-calls/where-used/impact questions (or rebuild if stale, build if absent). Source G’s strict block-first-read mode is deliberately un-ported.',
522
527
  ),
523
528
  }).default({}),
529
+ suggestion_capture: z.object({
530
+ enabled: z.boolean().default(false).describe(
531
+ 'Suggestion-block capture (road-to-suggestion-block-capture Phase 2). Default off. Two slots: `stop` reads `last_assistant_message` — a payload field, so no transcript file is read — and latches that the assistant turn carried a numbered-options block; `user_prompt_submit` CONSUMES that latch and classifies the answering turn as option_n / as_is / other / stale_block. Consume-once is the correctness guard: the latch is deleted on read, so a bare "1" three turns later meets no latch and classifies `other`, and a latch past its TTL or unparseable is `stale_block` rather than a guess. Writes COUNTS ONLY to agents/runtime/state/audit/suggestion-capture.jsonl — the record type has no field able to hold a prompt, an option label or a command name, and a test asserts the written key set against src/config/suggestion-capture.json. Off by default because this is an INSTRUMENT rather than a feature: it exists so a capture rate can be measured on a maintainer workspace over a fixed soak window, and there is nothing in it for a consumer to gain.',
532
+ ),
533
+ }).default({}),
524
534
  // `turn_end_gate` is deliberately ABSENT. The stop-slot turn-end gate is
525
535
  // always armed (2026-08-12) and has no settings surface: whether it
526
536
  // fires is decided by each detector's own trigger conditions, not by a
@@ -0,0 +1,183 @@
1
+ /**
2
+ * skillRanking — the ONE definition of "how relevant is this skill to this task".
3
+ *
4
+ * WHY IT LIVES HERE. Two callers need the identical answer and were about to
5
+ * grow two implementations of it:
6
+ *
7
+ * - `src/scripts/skill_tools/score_skill_relevance.ts` — the disk-reading
8
+ * ranker behind the kernel MCP server's `suggest_skill_for_task` and the
9
+ * `skill-route` hook.
10
+ * - `src/cli/mcp/dispatch.ts` — the turnkey stdio server, which must stay a
11
+ * pure function of its in-memory content tree and therefore cannot call a
12
+ * module that walks the file system.
13
+ *
14
+ * `road-to-skill-delivery-over-mcp` risk 6 names that fork by name: "two
15
+ * implementations of `suggest_skill_for_task` diverge silently". The fix is to
16
+ * put the formula in one Node-free module both can import, which is what this
17
+ * is. `src/shared/` is the only directory in the tree that both `src/scripts/`
18
+ * and `src/cli/` already import from, and it is required to stay Node-free —
19
+ * exactly the constraint the pure dispatcher needs.
20
+ *
21
+ * THE FORMULA IS UNCHANGED. It is the Python-parity scorer ported in ADR-200,
22
+ * moved rather than rewritten: `score = round(term_overlap * 70 + persona_hit *
23
+ * 30)`, half-to-even, over tokens of the skill's `name + description`. The
24
+ * `score_skill_relevance` CLI's argparse-parity suite is the check that the move
25
+ * changed nothing.
26
+ *
27
+ * THE ONE ADDITION is `triggerTerms`, off by default. Phase 3.1 of the same
28
+ * roadmap indexes `triggers.keyword` / `triggers.phrase` text; it is an opt-in
29
+ * parameter rather than a second function so the two rankers can be measured
30
+ * against each other on one corpus.
31
+ *
32
+ * Pure — no imports, no I/O, no clock.
33
+ */
34
+
35
+ // re.compile(r"[a-z][a-z0-9]+") — applied to the lowercased text.
36
+ const TOKEN_RE = /[a-z][a-z0-9]+/g;
37
+
38
+ /** Ported verbatim from the Python scorer. Order is irrelevant; membership is not. */
39
+ export const STOPWORDS: ReadonlySet<string> = new Set([
40
+ 'the', 'a', 'an', 'and', 'or', 'but', 'of', 'for', 'with', 'to', 'in',
41
+ 'on', 'at', 'by', 'from', 'as', 'is', 'are', 'was', 'were', 'be', 'been',
42
+ 'this', 'that', 'these', 'those', 'it', 'its', 'use', 'when', 'even',
43
+ 'via', 'via:', 'into', 'onto', 'use:', 'skill', 'skills', 'task', 'tasks',
44
+ 'code', 'file', 'files', 'doing', 'make', 'do', 'go', 'get', 'set',
45
+ 'not', 'no', 'yes', 'any', 'some', 'all', 'one', 'two', 'new', 'old',
46
+ 'user', 'users', 'our', 'your', 'their', 'they', 'we', 'you', 'i', 'me',
47
+ ]);
48
+
49
+ /** Mirror Python `len(str)` — count Unicode code points, not UTF-16 units. */
50
+ function pyLen(s: string): number {
51
+ let n = 0;
52
+ for (const _ of s) n++;
53
+ return n;
54
+ }
55
+
56
+ /** Mirror Python `round(x)` — half-to-even. Exact for integral ndigits. */
57
+ export function roundHalfToEven(x: number): number {
58
+ if (!Number.isFinite(x)) return x;
59
+ const floor = Math.floor(x);
60
+ const frac = x - floor;
61
+ if (frac < 0.5) return floor;
62
+ if (frac > 0.5) return floor + 1;
63
+ return floor % 2 === 0 ? floor : floor + 1;
64
+ }
65
+
66
+ /** Lowercase, extract `[a-z][a-z0-9]+`, drop stopwords and tokens of ≤2 code points. */
67
+ export function tokenize(text: string): Set<string> {
68
+ const out = new Set<string>();
69
+ const matches = text.toLowerCase().match(TOKEN_RE) ?? [];
70
+ for (const t of matches) {
71
+ if (!STOPWORDS.has(t) && pyLen(t) > 2) out.add(t);
72
+ }
73
+ return out;
74
+ }
75
+
76
+ /**
77
+ * Which `triggers[]` keys carry INDEXABLE PROSE.
78
+ *
79
+ * `file_pattern`, `path_prefix` and `command` are match *mechanisms*, not text a
80
+ * prompt is compared against: folding a glob in would put tokens like `blade` and
81
+ * `php` on every skill that merely watches a path. `reason` documents the trigger
82
+ * for a human and is not part of what it matches. The policy lives here because
83
+ * two different readers apply it to two different input shapes — parsed YAML
84
+ * objects in `src/cli/mcp/content.ts`, flat `key: "value"` lines in the
85
+ * frontmatter reader of `score_skill_relevance.ts` — and only the DECISION is
86
+ * shared, not the parsing.
87
+ */
88
+ export const INDEXED_TRIGGER_KEYS: readonly string[] = ['keyword', 'phrase'];
89
+
90
+ /**
91
+ * Trigger prose out of flat `key: "value"` frontmatter lines.
92
+ *
93
+ * The stdlib-only frontmatter reader in `score_skill_relevance.ts` flattens
94
+ * triggers:
95
+ * - phrase: "authorization check"
96
+ * to the single string `phrase: "authorization check"`, so this takes that shape
97
+ * rather than an object. Anything whose key is not indexable is dropped.
98
+ */
99
+ export function triggerTextFromFlatLines(lines: readonly string[]): string[] {
100
+ const out: string[] = [];
101
+ for (const line of lines) {
102
+ const m = /^([a-zA-Z_][\w-]*)\s*:\s*(.*)$/.exec(String(line).trim());
103
+ if (!m) continue;
104
+ if (!INDEXED_TRIGGER_KEYS.includes(m[1]!)) continue;
105
+ const value = m[2]!.trim().replace(/^["']|["']$/g, '');
106
+ if (value) out.push(value);
107
+ }
108
+ return out;
109
+ }
110
+
111
+ /** A skill as the ranker sees it. Deliberately not the body — see `rankSkills`. */
112
+ export interface RankableSkill {
113
+ name: string;
114
+ description: string;
115
+ personas?: readonly string[];
116
+ /** `triggers[].keyword` / `triggers[].phrase` text. Indexed only on request. */
117
+ triggerText?: readonly string[];
118
+ }
119
+
120
+ export interface RankOptions {
121
+ /** Phase 3.1: fold `triggerText` into the indexed terms. Default false (keyword-v1). */
122
+ includeTriggers?: boolean;
123
+ }
124
+
125
+ /** The indexed term set for one skill, under the given options. */
126
+ export function skillTerms(skill: RankableSkill, opts: RankOptions = {}): Set<string> {
127
+ const parts = [skill.name, skill.description];
128
+ if (opts.includeTriggers && skill.triggerText) parts.push(...skill.triggerText);
129
+ return tokenize(parts.join(' '));
130
+ }
131
+
132
+ /**
133
+ * The score. `taskTerms` is `tokenize(task)`; `terms` is `skillTerms(skill)`.
134
+ *
135
+ * Both are passed in rather than derived here so a caller ranking N skills
136
+ * tokenizes the task once and each skill once, which is what makes this usable
137
+ * on a per-prompt hook path.
138
+ */
139
+ export function scoreSkill(
140
+ taskTerms: ReadonlySet<string>,
141
+ skill: RankableSkill,
142
+ terms: ReadonlySet<string>,
143
+ ): number {
144
+ if (taskTerms.size === 0) return 0;
145
+ let inter = 0;
146
+ for (const t of taskTerms) if (terms.has(t)) inter++;
147
+ const overlap = inter / Math.max(taskTerms.size, 1);
148
+ let personaHit = 0;
149
+ const taskLower = [...taskTerms].join(' ');
150
+ for (const persona of skill.personas ?? []) {
151
+ const slug = String(persona).toLowerCase();
152
+ if (taskLower.includes(slug) || slug.split('-').some((part) => taskTerms.has(part))) {
153
+ personaHit = 1;
154
+ break;
155
+ }
156
+ }
157
+ return roundHalfToEven(overlap * 70 + personaHit * 30);
158
+ }
159
+
160
+ export interface RankedSkill {
161
+ name: string;
162
+ score: number;
163
+ personas: string[];
164
+ }
165
+
166
+ /**
167
+ * Rank an in-memory skill set. Zero scores are dropped; ties break on name, so
168
+ * the result is a total order and two callers with the same input agree.
169
+ */
170
+ export function rankSkills(
171
+ task: string,
172
+ skills: readonly RankableSkill[],
173
+ opts: RankOptions = {},
174
+ ): RankedSkill[] {
175
+ const taskTerms = tokenize(task);
176
+ const rows: RankedSkill[] = [];
177
+ for (const skill of skills) {
178
+ const score = scoreSkill(taskTerms, skill, skillTerms(skill, opts));
179
+ if (score > 0) rows.push({ name: skill.name, score, personas: [...(skill.personas ?? [])] });
180
+ }
181
+ rows.sort((a, b) => (b.score - a.score) || (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
182
+ return rows;
183
+ }
@@ -1,15 +0,0 @@
1
- {
2
- "skill": "accessibility-auditor",
3
- "_calibration": "Behavioural fixtures (road-to-skill-eval-coverage Phase 2, rich set). Deterministic `contains` asserts a real WCAG audit property (the standard is cited); finding_floor n=2 is a conservative floor (an icon-button with no name + a placeholder-only input surface ≥2 issues), not a calibrated per-host number; the rubric names the specific missing control as a pinned-judge known-limit.",
4
- "scenarios": [
5
- {
6
- "id": "audit-icon-button-and-placeholder-input",
7
- "prompt": "Audit this UI for accessibility and list each issue as its own bullet point:\n```html\n<button onclick=\"save()\"><svg width=\"16\" height=\"16\"></svg></button>\n<input type=\"text\" placeholder=\"Email address\">\n```",
8
- "assertions": [
9
- { "kind": "finding_floor", "n": 2, "pattern": "(?m)^\\s*[-*+]\\s+" },
10
- { "kind": "contains", "value": "WCAG" },
11
- { "kind": "rubric", "criterion": "Names the icon-only button's missing accessible name (aria-label / visible label) AND the placeholder-not-a-label problem on the input." }
12
- ]
13
- }
14
- ]
15
- }
@@ -1,52 +0,0 @@
1
- {
2
- "skill": "agent-security-review",
3
- "last_eval": "2026-06-16",
4
- "description": "5 should-trigger + 5 should-not-trigger queries. Should-trigger covers DE + EN phrasings for adversarial review of an agent's CONFIG/behaviour (rules, skills, MCP, hooks, permissions). Should-not-trigger covers the near-miss neighbours (code threat-model, code security-audit, the static config-audit command, privacy review, dependency CVE scan) whose vocabulary overlaps.",
5
- "queries": [
6
- {
7
- "q": "red-team my agent setup — could someone weaponise my CLAUDE.md or MCP servers?",
8
- "trigger": true
9
- },
10
- {
11
- "q": "do an adversarial security review of this agent config and its skills",
12
- "trigger": true
13
- },
14
- {
15
- "q": "is this third-party skill pack safe to install, attacker's view?",
16
- "trigger": true
17
- },
18
- {
19
- "q": "prüfe meine Agent-Konfiguration adversarial auf Angriffsketten",
20
- "trigger": true
21
- },
22
- {
23
- "q": "what could an attacker do with my rules files, hooks and tool permissions?",
24
- "trigger": true
25
- },
26
- {
27
- "q": "threat-model this new payments endpoint before I build it",
28
- "trigger": false,
29
- "note": "code change threat model → threat-modeling"
30
- },
31
- {
32
- "q": "find vulnerabilities in my application code",
33
- "trigger": false,
34
- "note": "code vulnerability hunt → security-audit"
35
- },
36
- {
37
- "q": "give me an A-F score for my agent config",
38
- "trigger": false,
39
- "note": "static scored audit → /security-audit-config command, not the adversarial skill"
40
- },
41
- {
42
- "q": "are we GDPR compliant with this data flow?",
43
- "trigger": false,
44
- "note": "regulatory-regime read → privacy-review"
45
- },
46
- {
47
- "q": "scan my dependencies for known CVEs",
48
- "trigger": false,
49
- "note": "dependency CVE audit → security-audit dependency pass"
50
- }
51
- ]
52
- }
@@ -1,52 +0,0 @@
1
- {
2
- "skill": "ai-code-blindspots",
3
- "last_eval": "2026-07-09",
4
- "description": "5 should-trigger + 5 should-not-trigger queries. Should-trigger covers DE + EN phrasings for the pre-ship 'what invisible cross-cutting controls did the AI omit?' checklist across code surfaces. Should-not-trigger covers near-miss neighbours (deep single-surface skills, prose/docs edits, adversarial config review) whose vocabulary overlaps.",
5
- "queries": [
6
- {
7
- "q": "I just wrote this endpoint — what invisible controls did I forget before I call it done?",
8
- "trigger": true
9
- },
10
- {
11
- "q": "run the senior pre-ship checklist over this diff for cross-cutting controls",
12
- "trigger": true
13
- },
14
- {
15
- "q": "what does AI-generated code usually omit here — authz, tenant scope, validation?",
16
- "trigger": true
17
- },
18
- {
19
- "q": "prüf meinen Code auf die unsichtbaren Kontrollen, die die KI weglässt",
20
- "trigger": true
21
- },
22
- {
23
- "q": "before I finish this migration and query, what am I blind to?",
24
- "trigger": true
25
- },
26
- {
27
- "q": "review this React component specifically for XSS and client secrets",
28
- "trigger": false,
29
- "note": "single frontend surface → frontend-render-security"
30
- },
31
- {
32
- "q": "is this npm package safe to add?",
33
- "trigger": false,
34
- "note": "dependency intake → supply-chain-intake"
35
- },
36
- {
37
- "q": "threat-model this new payments endpoint before I build it",
38
- "trigger": false,
39
- "note": "pre-build threat model → threat-modeling / security-sensitive-stop"
40
- },
41
- {
42
- "q": "fix the typo in this README",
43
- "trigger": false,
44
- "note": "prose/docs edit — no code surface"
45
- },
46
- {
47
- "q": "red-team my agent's CLAUDE.md and MCP config",
48
- "trigger": false,
49
- "note": "agent-config adversarial review → agent-security-review"
50
- }
51
- ]
52
- }
@@ -1,13 +0,0 @@
1
- {
2
- "skill": "analysis-skill-router",
3
- "_calibration": "Behavioural fixtures (road-to-skill-eval-coverage Phase 2, router set). Deterministic `contains` asserts the router picks the NARROWEST matching project-analysis-* skill (the whole routing contract) — a mis-route names the wrong or a generic skill.",
4
- "scenarios": [
5
- {
6
- "id": "route-laravel-slow-queries",
7
- "prompt": "Analyze why our Laravel app's database queries are slow. Which analysis skill should handle this?",
8
- "assertions": [
9
- { "kind": "contains", "value": "project-analysis-laravel" }
10
- ]
11
- }
12
- ]
13
- }
@@ -1,17 +0,0 @@
1
- {
2
- "skill": "brand",
3
- "last_eval": "2026-06-16",
4
- "description": "5 should-trigger + 5 should-not-trigger. Should-trigger covers grounding a brand decision against the corpus (archetype, voice, colour, naming, archetype->type). Should-not-trigger covers near-miss neighbors: UI style grounding (design-intelligence), token authoring (design-tokens), generating a logo asset (logo-generation), validation of emitted artifacts (brand-consistency), and font-pairing lookup without a brand frame (typography-system style path).",
5
- "queries": [
6
- {"q": "which brand archetype fits a rugged outdoor gear company?", "trigger": true},
7
- {"q": "ground the voice and tone for a challenger fintech brand", "trigger": true},
8
- {"q": "what colour direction does the corpus suggest for a children's education brand?", "trigger": true},
9
- {"q": "which naming pattern suits a coined-word tech startup brand?", "trigger": true},
10
- {"q": "what type pairing-filter does a luxury law firm archetype imply?", "trigger": true},
11
- {"q": "which UI style and palette fit a fintech dashboard?", "trigger": false, "note": "frontend style grounding → design-intelligence, not brand strategy"},
12
- {"q": "emit the brand colours as DTCG CSS variables", "trigger": false, "note": "token authoring/emission → design-tokens / brand-to-tokens"},
13
- {"q": "generate a logo image for this bakery", "trigger": false, "note": "asset generation → logo-generation, not brand grounding"},
14
- {"q": "check whether this landing page copy is on-brand", "trigger": false, "note": "post-action validation → brand-consistency rule"},
15
- {"q": "what's a good serif font pairing for a magazine?", "trigger": false, "note": "font-pairing lookup with no brand frame → typography-system style path"}
16
- ]
17
- }
@@ -1,17 +0,0 @@
1
- {
2
- "last_eval": "2026-06-16",
3
- "should_trigger": [
4
- "Generate a banner for our product launch — use the brand colors from .tokens.json",
5
- "Create a social card for the Open Graph meta tag, 1200×630, matching our brand palette",
6
- "Make a LinkedIn cover image using our brand typography and voice",
7
- "Generate a CIP header element for the website hero section with brand-token injection",
8
- "Produce a branded social media image for the campaign — we have pack-brand installed"
9
- ],
10
- "should_not_trigger": [
11
- "Design a logo for our new startup",
12
- "Generate a product photo of a coffee mug on a white background",
13
- "Which image provider should I use for text-heavy images?",
14
- "Write a prompt for Midjourney to create a realistic landscape",
15
- "Create a brand strategy document outlining our positioning and target audience"
16
- ]
17
- }