@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
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * `lint_skill_trigger_corpus` — the routing-matrix corpus DISCIPLINE, applied
4
+ * to the skill corpus that already exists.
5
+ *
6
+ * `road-to-routing-assurance` Phase 2.1, as re-scoped by the AI council
7
+ * (2/2 convergent, recorded at the step): the roadmap's literal text said "one
8
+ * YAML per skill", which would have created a THIRD corpus surface next to the
9
+ * 74 `queries`-shaped and 2 `should_trigger`-shaped JSON files already in the
10
+ * tree. The step's *verify* condition is format-agnostic — "a corpus file
11
+ * failing the discipline is rejected by a schema check, not by review" — so the
12
+ * discipline is enforced on the existing JSON and the amendment is recorded
13
+ * rather than performed silently.
14
+ *
15
+ * ## Three separate contracts, and this gate owns exactly one
16
+ *
17
+ * The council's sharpest point: serialization, case semantics, and coverage are
18
+ * three different questions and choosing JSON answers only the first.
19
+ *
20
+ * - **Coverage** — how many skills have a corpus at all — is
21
+ * `check_routing_coverage`'s ratio, and stays there.
22
+ * - **Discipline** — is each covered skill's corpus adequate — is this gate.
23
+ * - **Semantics** — is a `trigger: false` case a genuine NEAR-MISS rather
24
+ * than an unrelated negative — is NOT machine-decidable and this gate does
25
+ * not pretend otherwise. It counts negatives; whether they are near enough
26
+ * to be informative stays a human read, and saying so is cheaper than a
27
+ * heuristic that would be wrong quietly.
28
+ *
29
+ * ## Why language is metadata, never detection
30
+ *
31
+ * The discipline asks for at least one German positive. A gate that *detected*
32
+ * German would be a heuristic in a file called a schema check: it would pass a
33
+ * German-looking English sentence and fail a short German one, and its
34
+ * failures would be unactionable. So German is declared — `"language": "de"`
35
+ * on the case — and declaration is checked. Forward-only, because zero of the
36
+ * 76 existing files carry the field: requiring it everywhere today would red
37
+ * 76 files for a field that did not exist when they were written.
38
+ *
39
+ * ## Forward-only, in two different senses
40
+ *
41
+ * The COUNT discipline (>=3 positives, >=2 near-misses) applies to every file
42
+ * today: exactly two files fail it, and both are listed as grandfathered by
43
+ * name rather than by a numeric baseline, so a third failure cannot hide inside
44
+ * a count. The LANGUAGE discipline applies only to files the diff adds or
45
+ * changes.
46
+ *
47
+ * Exit codes: 0 = clean · 1 = a discipline violation · 2 = dead scope.
48
+ */
49
+ import { execFileSync } from 'node:child_process';
50
+ import * as fs from 'node:fs';
51
+ import * as path from 'node:path';
52
+ import process from 'node:process';
53
+ import { fileURLToPath } from 'node:url';
54
+
55
+ import { GateLedger } from './_lib/gate_ledger.js';
56
+ import { type SelfTestCase, runGateCli, runSelfTest } from './_lib/gate_self_test.js';
57
+ import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
58
+
59
+ const HERE = fileURLToPath(import.meta.url);
60
+ const REAL_REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
61
+ const REPO_ROOT = process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'] ?? REAL_REPO_ROOT;
62
+
63
+ export const MIN_POSITIVES = 3;
64
+ export const MIN_NEAR_MISSES = 2;
65
+
66
+ /**
67
+ * The two corpus files that predate the discipline, named rather than counted.
68
+ *
69
+ * A numeric baseline would let a third failure arrive while the number stayed
70
+ * put if one of these were fixed in the same change. Names cannot do that.
71
+ */
72
+ export const GRANDFATHERED = new Set(['brand-asset-generation', 'estimate-ticket']);
73
+
74
+ export interface CorpusStats {
75
+ unit: string;
76
+ positives: number;
77
+ nearMisses: number;
78
+ germanPositives: number;
79
+ /** True when at least one case declares a language at all. */
80
+ declaresLanguage: boolean;
81
+ }
82
+
83
+ export interface Violation {
84
+ unit: string;
85
+ rule: 'positives' | 'near-misses' | 'german' | 'malformed';
86
+ message: string;
87
+ }
88
+
89
+ interface RawCase {
90
+ q?: string;
91
+ trigger?: boolean;
92
+ language?: string;
93
+ }
94
+
95
+ /** Read one corpus file into counts, across both shapes that exist. */
96
+ export function statsFor(unit: string, file: string): CorpusStats {
97
+ const doc = JSON.parse(fs.readFileSync(file, 'utf-8')) as {
98
+ queries?: RawCase[];
99
+ should_trigger?: string[];
100
+ should_not_trigger?: string[];
101
+ };
102
+ const queries = doc.queries ?? [];
103
+ let positives = queries.filter((q) => q.trigger === true).length;
104
+ let nearMisses = queries.filter((q) => q.trigger === false).length;
105
+ positives += (doc.should_trigger ?? []).length;
106
+ nearMisses += (doc.should_not_trigger ?? []).length;
107
+ return {
108
+ unit,
109
+ positives,
110
+ nearMisses,
111
+ germanPositives: queries.filter((q) => q.trigger === true && q.language === 'de').length,
112
+ declaresLanguage: queries.some((q) => typeof q.language === 'string'),
113
+ };
114
+ }
115
+
116
+ export function judge(s: CorpusStats, requireLanguage: boolean): Violation[] {
117
+ const out: Violation[] = [];
118
+ if (GRANDFATHERED.has(s.unit)) return out;
119
+ if (s.positives < MIN_POSITIVES) {
120
+ out.push({
121
+ unit: s.unit,
122
+ rule: 'positives',
123
+ message: `${String(s.positives)} positive(s), the discipline asks for ${String(MIN_POSITIVES)}`,
124
+ });
125
+ }
126
+ if (s.nearMisses < MIN_NEAR_MISSES) {
127
+ out.push({
128
+ unit: s.unit,
129
+ rule: 'near-misses',
130
+ message: `${String(s.nearMisses)} near-miss(es), the discipline asks for ${String(MIN_NEAR_MISSES)}`,
131
+ });
132
+ }
133
+ if (requireLanguage && s.germanPositives < 1) {
134
+ out.push({
135
+ unit: s.unit,
136
+ rule: 'german',
137
+ message:
138
+ 'no positive declares `"language": "de"`. Declared, never detected — ' +
139
+ 'a detector would pass German-looking English and fail short German',
140
+ });
141
+ }
142
+ return out;
143
+ }
144
+
145
+ /** Corpus files the diff added or modified, relative to a base ref. */
146
+ export function changedUnits(root: string, base: string): Set<string> {
147
+ let out = '';
148
+ try {
149
+ out = execFileSync('git', ['diff', '--name-only', `${base}...HEAD`], {
150
+ cwd: root,
151
+ encoding: 'utf-8',
152
+ // Silenced deliberately: outside a repo (a self-test fixture, a
153
+ // tarball install) git prints its whole usage text to stderr, and
154
+ // a gate that dumps a manual page on a path it already handles is
155
+ // noise a reader has to learn to ignore.
156
+ stdio: ['ignore', 'pipe', 'ignore'],
157
+ });
158
+ } catch {
159
+ return new Set();
160
+ }
161
+ const units = new Set<string>();
162
+ for (const line of out.split('\n')) {
163
+ const m = /^src\/skills\/([^/]+)\/evals\/triggers\.json$/.exec(line.trim());
164
+ if (m?.[1] !== undefined) units.add(m[1]);
165
+ }
166
+ return units;
167
+ }
168
+
169
+ export interface Result {
170
+ violations: Violation[];
171
+ scanned: number;
172
+ ledger: GateLedger;
173
+ }
174
+
175
+ export function evaluate(root = REPO_ROOT, base = 'origin/main'): Result {
176
+ const dir = path.join(root, 'src', 'skills');
177
+ let entries: fs.Dirent[];
178
+ try {
179
+ entries = fs.readdirSync(dir, { withFileTypes: true });
180
+ } catch {
181
+ throw new DeadScopeError(
182
+ 'lint_skill_trigger_corpus',
183
+ 'src/skills is unreadable — a corpus gate with no corpus passes every tree.',
184
+ );
185
+ }
186
+ const changed = changedUnits(root, base);
187
+ const ledger = new GateLedger('lint_skill_trigger_corpus');
188
+ const violations: Violation[] = [];
189
+ let scanned = 0;
190
+ for (const e of entries) {
191
+ if (!e.isDirectory()) continue;
192
+ const file = path.join(dir, e.name, 'evals', 'triggers.json');
193
+ if (!fs.existsSync(file)) continue;
194
+ scanned += 1;
195
+ ledger.plan(e.name);
196
+ let own: Violation[];
197
+ try {
198
+ own = judge(statsFor(e.name, file), changed.has(e.name));
199
+ } catch {
200
+ own = [{ unit: e.name, rule: 'malformed', message: 'is not parseable JSON' }];
201
+ }
202
+ if (own.length === 0) ledger.complete(e.name);
203
+ else ledger.fail(e.name, own.map((v) => `[${v.rule}] ${v.message}`).join(' · '));
204
+ violations.push(...own);
205
+ }
206
+ if (scanned === 0) {
207
+ throw new DeadScopeError(
208
+ 'lint_skill_trigger_corpus',
209
+ 'zero corpus files found under src/skills/*/evals/triggers.json — 76 exist ' +
210
+ 'in the shipped tree, so an empty scan is a moved root, not a clean one.',
211
+ );
212
+ }
213
+ return { violations, scanned, ledger };
214
+ }
215
+
216
+ export function selfTest(): number {
217
+ const os = process.env['TMPDIR'] ?? '/tmp';
218
+ const tmp = fs.mkdtempSync(path.join(os, 'lstc-'));
219
+ const mkRoot = (unit: string, body: unknown): string => {
220
+ const root = fs.mkdtempSync(path.join(tmp, 'repo-'));
221
+ const d = path.join(root, 'src', 'skills', unit, 'evals');
222
+ fs.mkdirSync(d, { recursive: true });
223
+ fs.writeFileSync(path.join(d, 'triggers.json'), JSON.stringify(body));
224
+ return root;
225
+ };
226
+ const run = (root: string): number => {
227
+ process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'] = root;
228
+ try {
229
+ return runGateCli(REAL_REPO_ROOT, 'src/scripts/lint_skill_trigger_corpus.ts', [], root);
230
+ } finally {
231
+ delete process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'];
232
+ }
233
+ };
234
+ const good = {
235
+ queries: [
236
+ { q: 'a', trigger: true },
237
+ { q: 'b', trigger: true },
238
+ { q: 'c', trigger: true },
239
+ { q: 'd', trigger: false },
240
+ { q: 'e', trigger: false },
241
+ ],
242
+ };
243
+ const cases: SelfTestCase[] = [
244
+ {
245
+ name: 'a compliant corpus is accepted',
246
+ expect: 'accept',
247
+ run: () => run(mkRoot('probe', good)),
248
+ },
249
+ {
250
+ name: 'the should_trigger shape is read, not silently skipped',
251
+ expect: 'accept',
252
+ run: () =>
253
+ run(
254
+ mkRoot('probe', {
255
+ should_trigger: ['a', 'b', 'c'],
256
+ should_not_trigger: ['d', 'e'],
257
+ }),
258
+ ),
259
+ },
260
+ {
261
+ name: 'a grandfathered unit stays accepted at zero cases',
262
+ expect: 'accept',
263
+ run: () => run(mkRoot('estimate-ticket', { queries: [] })),
264
+ },
265
+ {
266
+ name: 'too few positives is rejected',
267
+ expect: 'reject',
268
+ run: () => run(mkRoot('probe', { queries: good.queries.slice(1) })),
269
+ },
270
+ {
271
+ name: 'too few near-misses is rejected',
272
+ expect: 'reject',
273
+ run: () => run(mkRoot('probe', { queries: good.queries.slice(0, 4) })),
274
+ },
275
+ {
276
+ name: 'a malformed corpus file is rejected, not skipped',
277
+ expect: 'reject',
278
+ run: () => {
279
+ const root = mkRoot('probe', good);
280
+ fs.writeFileSync(
281
+ path.join(root, 'src', 'skills', 'probe', 'evals', 'triggers.json'),
282
+ '{ not json',
283
+ );
284
+ return run(root);
285
+ },
286
+ },
287
+ {
288
+ name: 'a scan root with no corpus at all exits 2 rather than reporting clean',
289
+ expect: 'reject',
290
+ run: () => {
291
+ const root = fs.mkdtempSync(path.join(tmp, 'empty-'));
292
+ fs.mkdirSync(path.join(root, 'src', 'skills'), { recursive: true });
293
+ return run(root);
294
+ },
295
+ },
296
+ ];
297
+ try {
298
+ return runSelfTest({
299
+ gate: 'lint_skill_trigger_corpus',
300
+ cases,
301
+ minCases: 7,
302
+ minRejectCases: 4,
303
+ });
304
+ } finally {
305
+ fs.rmSync(tmp, { recursive: true, force: true });
306
+ }
307
+ }
308
+
309
+ export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
310
+ if (argv.includes('--self-test')) return selfTest();
311
+ const quiet = argv.includes('--quiet');
312
+ let r: Result;
313
+ try {
314
+ r = evaluate(root);
315
+ reportScanned({
316
+ gate: 'lint_skill_trigger_corpus',
317
+ scanned: r.scanned,
318
+ units: 'skill corpus file(s)',
319
+ roots: ['src/skills/*/evals/triggers.json'],
320
+ });
321
+ } catch (e) {
322
+ if (e instanceof DeadScopeError) {
323
+ process.stderr.write(`${e.message}\n`);
324
+ return 2;
325
+ }
326
+ throw e;
327
+ }
328
+ r.ledger.report(quiet ? () => undefined : process.stdout.write.bind(process.stdout));
329
+ if (r.violations.length === 0) {
330
+ process.stdout.write(
331
+ `lint_skill_trigger_corpus: ${String(r.scanned)} corpus file(s) hold the discipline ` +
332
+ `(>=${String(MIN_POSITIVES)} positives, >=${String(MIN_NEAR_MISSES)} near-misses; ` +
333
+ `${String(GRANDFATHERED.size)} grandfathered by name).\n`,
334
+ );
335
+ return 0;
336
+ }
337
+ for (const v of r.violations) {
338
+ process.stderr.write(` ${v.unit}: [${v.rule}] ${v.message}\n`);
339
+ }
340
+ process.stderr.write(
341
+ `${String(r.violations.length)} discipline violation(s). Add the missing cases — ` +
342
+ 'widening GRANDFATHERED is a defect, not a fix.\n',
343
+ );
344
+ return 1;
345
+ }
346
+
347
+ if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
348
+ process.exit(main());
349
+ }
@@ -4,7 +4,19 @@
4
4
  * ("NEVER BULK-DUMP CONTEXT INTO A SUBAGENT") deterministic
5
5
  * (road-to-lean-agent-init Phase 3).
6
6
  *
7
- * Scans two surfaces for spawn-brief-shaped payloads: (a) JSON fixtures
7
+ * WIDENED 2026-08-23 (road-to-review-independence step 0.4) to a THIRD surface: the
8
+ * SHIPPED prompt templates under `src/skills/subagent-orchestration/prompts/`. The gate
9
+ * made the "NEVER BULK-DUMP CONTEXT INTO A SUBAGENT" Iron Law deterministic over test
10
+ * fixtures and golden transcripts — i.e. over the places a violation is *simulated* —
11
+ * while the templates that actually construct a spawn brief in production sat outside
12
+ * it. Eight diff-payload placeholder sites across five of those files, plus two further
13
+ * placeholder shapes in two more, were unscanned.
14
+ *
15
+ * Still WARN-ONLY, exactly as before: this surface is prose with placeholders, and a
16
+ * placeholder is not yet a payload. What the widening buys is that a template growing a
17
+ * bulk-dump shape is now visible rather than invisible.
18
+ *
19
+ * Scans three surfaces for spawn-brief-shaped payloads: (a) JSON fixtures
8
20
  * matching `tests/fixtures/**\/*spawn*.json`; (b) fenced code blocks in
9
21
  * `tests/reasoning-layer-eval/golden-transcripts/*.md` that either parse as
10
22
  * JSON with both a `task` and a `knowledge_refs` key, or are introduced by
@@ -41,7 +53,7 @@ import * as fs from 'node:fs';
41
53
  import * as path from 'node:path';
42
54
  import { fileURLToPath, pathToFileURL } from 'node:url';
43
55
 
44
- import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
56
+ import { reportScanned, DeadScopeError } from './_lib/scan_scope.js';
45
57
 
46
58
  const _HERE = path.dirname(fileURLToPath(import.meta.url));
47
59
  const REPO_ROOT = path.resolve(_HERE, '..', '..');
@@ -219,6 +231,22 @@ function scanRepo(repoRoot: string): Finding[] {
219
231
  }
220
232
  }
221
233
 
234
+ // The shipped templates — step 0.4's surface. Counted the same way as the other two
235
+ // (the walk, not the filter), so "no violations" and "no files read" stay
236
+ // distinguishable; that distinction is why `scanned` is incremented before any
237
+ // content test in all three loops.
238
+ const templatesDir = path.join(repoRoot, 'src', 'skills', 'subagent-orchestration', 'prompts');
239
+ if (fs.existsSync(templatesDir)) {
240
+ for (const entry of fs.readdirSync(templatesDir, { withFileTypes: true })) {
241
+ if (entry.isFile() && entry.name.endsWith('.md')) {
242
+ scanned += 1;
243
+ findings.push(
244
+ ...scanMarkdownTranscript(path.join(templatesDir, entry.name), repoRoot),
245
+ );
246
+ }
247
+ }
248
+ }
249
+
222
250
  const transcriptsDir = path.join(repoRoot, 'tests', 'reasoning-layer-eval', 'golden-transcripts');
223
251
  if (fs.existsSync(transcriptsDir)) {
224
252
  for (const entry of fs.readdirSync(transcriptsDir, { withFileTypes: true })) {
@@ -229,11 +257,20 @@ function scanRepo(repoRoot: string): Finding[] {
229
257
  }
230
258
  }
231
259
 
232
- assertScanned({
260
+ // `reportScanned`, not `assertScanned`: step 0.4's verify compares the scanned count
261
+ // against the pre-change one, and a count the gate never prints cannot be compared.
262
+ // The helper's own docstring makes the same point — "a count only visible without
263
+ // `--quiet` is not a count, since CI passes `--quiet`" — so the line goes to stdout
264
+ // unconditionally.
265
+ reportScanned({
233
266
  gate: 'lint_spawn_payload',
234
267
  scanned,
235
- units: 'fixture / transcript file(s)',
236
- roots: ['tests/fixtures', 'tests/reasoning-layer-eval/golden-transcripts'],
268
+ units: 'fixture / transcript / template file(s)',
269
+ roots: [
270
+ 'tests/fixtures',
271
+ 'tests/reasoning-layer-eval/golden-transcripts',
272
+ 'src/skills/subagent-orchestration/prompts',
273
+ ],
237
274
  });
238
275
  return findings;
239
276
  }
@@ -30,6 +30,7 @@ import * as fs from 'node:fs';
30
30
  import * as path from 'node:path';
31
31
  import { fileURLToPath, pathToFileURL } from 'node:url';
32
32
 
33
+ import { asOf } from './_lib/as_of.js';
33
34
  import { GateLedger } from './_lib/gate_ledger.js';
34
35
  import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
35
36
 
@@ -132,7 +133,7 @@ function _now(): Date {
132
133
  const parsed = Date.parse(`${flag.slice('--now='.length)}T00:00:00Z`);
133
134
  if (!Number.isNaN(parsed)) return new Date(parsed);
134
135
  }
135
- return new Date();
136
+ return asOf();
136
137
  }
137
138
 
138
139
  function main(): number {
@@ -420,6 +420,15 @@ async function _run_http_leg(target: string): Promise<number> {
420
420
  return failed;
421
421
  }
422
422
 
423
+ /**
424
+ * The turnkey stdio surface's tool names, code-point sorted and joined.
425
+ * Kept as a literal rather than imported from `src/cli/` so this maintainer
426
+ * script does not take a build dependency on the CLI bundle; the CLI-side
427
+ * source of truth is `LITE_TOOLS` in `src/cli/mcp/dispatch.ts`, and
428
+ * `tests/scripts/mcp_lite_tools.test.ts` pins that side.
429
+ */
430
+ const LITE_TOOL_NAMES_EXPECTED = 'read_skill,suggest_skill_for_task';
431
+
423
432
  /** ALL skill+command prompt metas (uncapped — for full-set parity). */
424
433
  function _local_prompts_all(): Record<string, unknown>[] {
425
434
  const [prompts] = load_all_prompts();
@@ -438,7 +447,8 @@ function _local_resources_all(): Record<string, unknown>[] {
438
447
  * Compares the FULL SUBSET the turnkey surface serves (skill/command prompts,
439
448
  * rule/guideline resources — contexts excluded by design) via cursor
440
449
  * pagination, on name/kind/uri keys, and asserts the read-only boundary
441
- * (`tools/list` empty). Skips with a note if the binary isn't built.
450
+ * (the two read-only discovery tools and nothing else). Skips with a note if
451
+ * the binary isn't built.
442
452
  */
443
453
  function _run_node_leg(cli: string): number {
444
454
  if (!_exists(cli)) {
@@ -473,13 +483,29 @@ function _run_node_leg(cli: string): number {
473
483
  _subset_resources(_normalize_resources({ resources: _local_resources_all() })),
474
484
  _subset_resources(_normalize_resources({ resources: nodeResources })),
475
485
  );
476
- if (nodeTools.length > 0) {
486
+ // Phase 1.1 of `road-to-skill-delivery-over-mcp`: the turnkey surface now
487
+ // serves exactly two read-only discovery tools, and this leg is where risk 6
488
+ // ("two implementations diverge silently") stops being a claim. Both names
489
+ // are checked, not counted — a count would pass on the wrong pair.
490
+ //
491
+ // `suggest_skill_for_task` is shared with the kernel and both now compute
492
+ // their score through the single `src/shared/skillRanking.ts` formula.
493
+ // `read_skill` is lite-only and deliberately NARROWER than the kernel's
494
+ // `read_resource_body`: it resolves a skill NAME through the content tree's
495
+ // uri map and can reach nothing else.
496
+ const nodeToolNames = nodeTools
497
+ .map((t) => String(t.name ?? ''))
498
+ .sort(_cmpCodePoints)
499
+ .join(',');
500
+ if (nodeToolNames !== LITE_TOOL_NAMES_EXPECTED) {
477
501
  process.stdout.write(
478
- `❌ node tools/list: expected empty (read-only), got ${nodeTools.length}\n`,
502
+ `❌ node tools/list: expected exactly [${LITE_TOOL_NAMES_EXPECTED}], got [${nodeToolNames}]\n`,
479
503
  );
480
504
  failed += 1;
481
505
  } else {
482
- process.stdout.write('✅ node tools/list: empty (read-only, ADR-085)\n');
506
+ process.stdout.write(
507
+ `✅ node tools/list: ${LITE_TOOL_NAMES_EXPECTED} (read-only discovery, ADR-085 + Phase 1.1)\n`,
508
+ );
483
509
  }
484
510
  process.stdout.write(
485
511
  `${`${failed ? '' : 'node-stdio parity OK '}(${path.basename(cli)})`.trim()}\n`,
@@ -13,6 +13,15 @@
13
13
  * .windsurf/mcp.json (in-project)
14
14
  * ~/.config/claude-desktop/claude_desktop_config.json (user, opt-in)
15
15
  *
16
+ * `.mcp.json` — Claude Code's project-scope config — is a CHECK-ONLY target
17
+ * (Phase 1.3 of `road-to-skill-delivery-over-mcp`). It is deliberately not
18
+ * rendered: the installer writes it with `merge_json_file`, which touches only
19
+ * this package's own server key and records it in `agents/installed-tools.lock`
20
+ * so uninstall subtracts exactly that key. Rendering it here would overwrite a
21
+ * file the consumer also edits and silently delete servers they added by hand.
22
+ * `--check` therefore asserts CONTAINMENT of our entry rather than equality with
23
+ * a rendering, and says so on the same line.
24
+ *
16
25
  * All targets use the same `mcpServers` top-level key. The source file uses
17
26
  * `servers` to keep our internal schema stable if a downstream format ever
18
27
  * diverges.
@@ -40,6 +49,36 @@ export function default_project_root(): string {
40
49
  return fs.realpathSync(process.cwd());
41
50
  }
42
51
 
52
+ /** The one entry `.mcp.json` must contain. Mirrors `install.ts:MCP_SERVER_KEY`. */
53
+ export const MCP_JSON_SERVER_KEY = 'agent-config';
54
+
55
+ /** Claude Code's project-scope MCP config. Checked here, written by the installer. */
56
+ export function claude_code_mcp_target(projectRoot: string): string {
57
+ return path.join(projectRoot, '.mcp.json');
58
+ }
59
+
60
+ /**
61
+ * Does `.mcp.json` carry this package's server entry?
62
+ *
63
+ * `absent` is a distinct verdict from `missing-entry` on purpose: absent means
64
+ * the installer has not run for `claude-code` here, which is a hint; a file that
65
+ * exists WITHOUT our key means something removed it, which is a failure.
66
+ */
67
+ export function check_mcp_json(projectRoot: string): 'absent' | 'ok' | 'missing-entry' | 'unreadable' {
68
+ const target = claude_code_mcp_target(projectRoot);
69
+ if (!fs.existsSync(target)) return 'absent';
70
+ let parsed: unknown;
71
+ try {
72
+ parsed = JSON.parse(fs.readFileSync(target, 'utf-8'));
73
+ } catch {
74
+ return 'unreadable';
75
+ }
76
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return 'unreadable';
77
+ const servers = (parsed as Record<string, unknown>)['mcpServers'];
78
+ if (servers === null || typeof servers !== 'object' || Array.isArray(servers)) return 'missing-entry';
79
+ return MCP_JSON_SERVER_KEY in (servers as Record<string, unknown>) ? 'ok' : 'missing-entry';
80
+ }
81
+
43
82
  export function in_project_targets(projectRoot: string): Record<string, string> {
44
83
  return {
45
84
  cursor: path.join(projectRoot, '.cursor', 'mcp.json'),
@@ -274,7 +313,33 @@ function cmd_check(args: ParsedArgs): number {
274
313
  return 1;
275
314
  }
276
315
  process.stdout.write('✅ All MCP targets match source.\n');
277
- return 0;
316
+ return _report_mcp_json(projectRoot);
317
+ }
318
+
319
+ /**
320
+ * The `.mcp.json` leg of `--check`. Additive: it can only turn a green run red
321
+ * when the file EXISTS and has lost our entry, never on a fresh tree where the
322
+ * installer has not run.
323
+ */
324
+ function _report_mcp_json(projectRoot: string): number {
325
+ const verdict = check_mcp_json(projectRoot);
326
+ const rel = path.relative(projectRoot, claude_code_mcp_target(projectRoot)) || '.mcp.json';
327
+ if (verdict === 'ok') {
328
+ process.stdout.write(`✅ ${rel} carries the \`${MCP_JSON_SERVER_KEY}\` server (containment, not equality).\n`);
329
+ return 0;
330
+ }
331
+ if (verdict === 'absent') {
332
+ process.stdout.write(
333
+ `ℹ️ ${rel} not present — written by \`agent-config install\` for the ` +
334
+ 'claude-code tool, never rendered from mcp.json.\n',
335
+ );
336
+ return 0;
337
+ }
338
+ process.stderr.write(
339
+ `❌ ${rel} exists but does not carry the \`${MCP_JSON_SERVER_KEY}\` server ` +
340
+ `(${verdict}). Re-run \`agent-config install\`.\n`,
341
+ );
342
+ return 1;
278
343
  }
279
344
 
280
345
  class ArgError extends Error {}