@event4u/agent-config 14.11.0 → 14.13.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 (762) 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 +368 -516
  5. package/CONTRIBUTING.md +38 -0
  6. package/CREDITS.md +135 -0
  7. package/NOTICE +13 -0
  8. package/README.md +8 -6
  9. package/dist/agent-src/commands/analyze/inbox.md +109 -2
  10. package/dist/agent-src/commands/feature/dev.md +7 -2
  11. package/dist/agent-src/commands/ghostwriter/write.md +5 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  14. package/dist/agent-src/commands/orchestrate.md +2 -2
  15. package/dist/agent-src/commands/post-as/me.md +5 -1
  16. package/dist/agent-src/commands/pr/merge.md +19 -6
  17. package/dist/agent-src/commands/roadmap/process-full.md +19 -5
  18. package/dist/agent-src/commands/tdd/red.md +12 -2
  19. package/dist/agent-src/commands/work.md +1 -1
  20. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
  21. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
  22. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
  23. package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
  24. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
  25. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  26. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  27. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  28. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  29. package/dist/agent-src/rules/broken-access-control.md +4 -0
  30. package/dist/agent-src/rules/code-provenance.md +4 -0
  31. package/dist/agent-src/rules/design-fidelity.md +1 -1
  32. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  33. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  34. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  35. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  36. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  37. package/dist/agent-src/rules/laravel-routing.md +1 -1
  38. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  39. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  40. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  41. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  42. package/dist/agent-src/rules/symfony-routing.md +1 -1
  43. package/dist/agent-src/rules/token-efficiency.md +14 -0
  44. package/dist/agent-src/rules/tool-safety.md +4 -0
  45. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  46. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  47. package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
  48. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  49. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  50. package/dist/agent-src/scripts/stubs_due.ts +400 -0
  51. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  52. package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
  53. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  54. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  55. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  56. package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
  57. package/dist/agent-src/skills/code-review/SKILL.md +65 -6
  58. package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
  59. package/dist/agent-src/skills/database/SKILL.md +8 -0
  60. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  61. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  62. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  63. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +25 -2
  64. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  65. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  66. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  67. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  68. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  69. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  70. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  71. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  72. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  73. package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
  74. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +30 -13
  75. package/dist/agent-src/skills/skill-writing/references/procedure.md +29 -7
  76. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  77. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  78. package/dist/agent-src/skills/storybook-workshop/SKILL.md +9 -0
  79. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  80. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  81. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  82. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  83. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  84. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  85. package/dist/agent-src/skills/ui-component-architect/SKILL.md +53 -2
  86. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  87. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  88. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  89. package/dist/agent-src/templates/roadmaps.md +97 -3
  90. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  91. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  92. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  93. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  94. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  95. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  96. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  97. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  98. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  99. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  100. package/dist/cli/commands/uiAudit.js +124 -5
  101. package/dist/cli/registry.js +2 -0
  102. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  103. package/dist/cli-delegate/{chunk-L43NCYPB.js → chunk-4FS4WRXP.js} +10 -0
  104. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  105. package/dist/cli-delegate/{chunk-236PNQZK.js → chunk-AKJGUQNO.js} +466 -285
  106. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  107. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  108. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  109. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  110. package/dist/cli-delegate/cmd_conformance.js +42 -10
  111. package/dist/cli-delegate/cmd_doctor.js +3 -3
  112. package/dist/cli-delegate/cmd_export.js +3 -2
  113. package/dist/cli-delegate/cmd_fleet.js +2 -2
  114. package/dist/cli-delegate/cmd_handoff.js +1 -1
  115. package/dist/cli-delegate/cmd_preflight.js +2 -2
  116. package/dist/cli-delegate/cmd_prune.js +3 -2
  117. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  118. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  119. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  120. package/dist/cli-delegate/cmd_sync.js +3 -2
  121. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  122. package/dist/cli-delegate/cmd_validate.js +3 -2
  123. package/dist/discovery/deprecation-report.md +1 -1
  124. package/dist/discovery/discovery-manifest.json +62 -62
  125. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  126. package/dist/discovery/discovery-manifest.summary.md +1 -1
  127. package/dist/discovery/dormancy-report.md +1 -1
  128. package/dist/discovery/orphan-report.md +1 -1
  129. package/dist/discovery/packs.json +2 -2
  130. package/dist/discovery/trust-report.md +1 -1
  131. package/dist/discovery/workspaces.json +2 -2
  132. package/dist/hooks/dispatch.js +2413 -1087
  133. package/dist/install/claudeRuleRewrite.js +254 -0
  134. package/dist/install/detect.js +29 -16
  135. package/dist/install/detect_php_shape.js +159 -0
  136. package/dist/install/install.mjs +639 -428
  137. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  138. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  139. package/dist/mcp/registry-manifest.json +3 -3
  140. package/dist/mcp/server.json +3 -3
  141. package/dist/mcp/server.mjs +4818 -2645
  142. package/dist/server/schemas/settings.js +6 -0
  143. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  144. package/dist/ui/index.html +1 -1
  145. package/docs/MIGRATION.md +1 -1
  146. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  147. package/docs/contracts/provider-lifecycle.md +1 -1
  148. package/docs/contracts/settings-classes.md +30 -4
  149. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  150. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  151. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  152. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  153. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  154. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  155. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  156. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  157. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  158. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  159. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  160. package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  161. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  162. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  163. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  164. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  165. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  166. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  167. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  168. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  169. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  170. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  171. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  172. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  173. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  174. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  175. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  176. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  177. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  178. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  179. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  180. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  181. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  182. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  183. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  184. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  185. package/docs/guidelines/augment-portability-patterns.md +6 -4
  186. package/docs/guidelines/code-clarity.md +21 -0
  187. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  188. package/docs/guidelines/cross-role-handoff.md +2 -2
  189. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  190. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  191. package/docs/guidelines/php/database.md +90 -7
  192. package/docs/guidelines/prompt-templates.md +7 -7
  193. package/docs/guidelines/redundancy-taxonomy.md +180 -0
  194. package/llms.txt +2 -2
  195. package/package.json +10 -3
  196. package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  197. package/src/agent-src/scripts/guarded_baseline.ts +328 -0
  198. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  199. package/src/agent-src/scripts/stub_queue.ts +82 -0
  200. package/src/agent-src/scripts/stubs_due.ts +400 -0
  201. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  202. package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
  203. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  204. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  205. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  206. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  207. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  208. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  209. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  210. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  211. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  212. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  213. package/src/config/agent-settings.template.yml +48 -3
  214. package/src/config/assurance-capability-registry.json +21 -9
  215. package/src/config/budgets.yml +19 -0
  216. package/src/config/canonical-terms.yml +119 -0
  217. package/src/config/capability-native-outcome-bars.json +81 -0
  218. package/src/config/ci-local-parity.yml +95 -0
  219. package/src/config/discovery/prompt-patterns.yml +56 -0
  220. package/src/config/drafting-channels.yml +43 -0
  221. package/src/config/estate-count-budget.json +38 -31
  222. package/src/config/evaluator-budgets.json +14 -14
  223. package/src/config/gate-coverage.yml +731 -30
  224. package/src/config/gate-reachability-exemptions.json +21 -0
  225. package/src/config/gate-violation-baselines.json +38 -20
  226. package/src/config/harness-evolution-budget.json +25 -0
  227. package/src/config/lapsed-beta-baseline.json +96 -0
  228. package/src/config/memory-twin-verdicts.yml +129 -0
  229. package/src/config/metric-registry.yml +124 -0
  230. package/src/config/pack-size-budget.json +35 -7
  231. package/src/config/preamble-payload-budget.json +97 -71
  232. package/src/config/profiles/balanced.ini +27 -0
  233. package/src/config/profiles/full.ini +27 -0
  234. package/src/config/profiles/minimal.ini +27 -0
  235. package/src/config/publish-surface.json +9 -2
  236. package/src/config/routing-coverage-seed.json +43 -0
  237. package/src/config/rule-stub-ceilings.json +126 -112
  238. package/src/config/suggestion-capture.json +28 -0
  239. package/src/config/surface-matrix.yml +21 -2
  240. package/src/config/turnaround-budget.json +66 -0
  241. package/src/config/web-launch-readiness.json +188 -0
  242. package/src/install/claudeRuleRewrite.ts +288 -0
  243. package/src/install/detect.ts +60 -17
  244. package/src/install/detect_php_shape.ts +191 -0
  245. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  246. package/src/scripts/_dispatch.bash +27 -0
  247. package/src/scripts/_lib/activation_ladder.ts +211 -0
  248. package/src/scripts/_lib/activation_states.ts +88 -0
  249. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  250. package/src/scripts/_lib/arith_claims.ts +181 -0
  251. package/src/scripts/_lib/arm_ranking.ts +62 -0
  252. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  253. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  254. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  255. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  256. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  257. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  258. package/src/scripts/_lib/candidate_record.ts +601 -0
  259. package/src/scripts/_lib/capture_rate.ts +319 -0
  260. package/src/scripts/_lib/collector_denominator.ts +771 -0
  261. package/src/scripts/_lib/collector_record.ts +340 -0
  262. package/src/scripts/_lib/collector_store.ts +664 -0
  263. package/src/scripts/_lib/collector_supervision.ts +827 -0
  264. package/src/scripts/_lib/concern_estate.ts +77 -0
  265. package/src/scripts/_lib/config_chain.ts +477 -0
  266. package/src/scripts/_lib/config_cost.ts +209 -0
  267. package/src/scripts/_lib/council_settings_block.ts +6 -0
  268. package/src/scripts/_lib/curator_ops.ts +172 -0
  269. package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
  270. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  271. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  272. package/src/scripts/_lib/empty_cycles.ts +88 -0
  273. package/src/scripts/_lib/eval_publication.ts +354 -0
  274. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  275. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  276. package/src/scripts/_lib/evidence_basis.ts +118 -0
  277. package/src/scripts/_lib/exec_evidence.ts +8 -0
  278. package/src/scripts/_lib/experience_card.ts +272 -0
  279. package/src/scripts/_lib/experience_report.ts +151 -0
  280. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  281. package/src/scripts/_lib/gate_baseline.ts +150 -1
  282. package/src/scripts/_lib/generated_by.ts +66 -0
  283. package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
  284. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  285. package/src/scripts/_lib/host_denominator.ts +687 -0
  286. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  287. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  288. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  289. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  290. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  291. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  292. package/src/scripts/_lib/loop_guards.ts +299 -0
  293. package/src/scripts/_lib/loss_class.ts +129 -0
  294. package/src/scripts/_lib/machine_wake.ts +51 -0
  295. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  296. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  297. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  298. package/src/scripts/_lib/orchestration_record.ts +253 -5
  299. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  300. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  301. package/src/scripts/_lib/paired_stats.ts +245 -0
  302. package/src/scripts/_lib/paired_verdict.ts +226 -0
  303. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  304. package/src/scripts/_lib/privacy_class.ts +47 -0
  305. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  306. package/src/scripts/_lib/repeated_failure.ts +105 -0
  307. package/src/scripts/_lib/repo_root.ts +111 -0
  308. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  309. package/src/scripts/_lib/role_split.ts +338 -0
  310. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  311. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  312. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  313. package/src/scripts/_lib/skill_estate.ts +115 -0
  314. package/src/scripts/_lib/source_digest.ts +200 -0
  315. package/src/scripts/_lib/source_redact.ts +260 -0
  316. package/src/scripts/_lib/source_shape.ts +502 -0
  317. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  318. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  319. package/src/scripts/_lib/strip_comments.mjs +65 -0
  320. package/src/scripts/_lib/test_red_state.ts +154 -0
  321. package/src/scripts/_lib/trigger_shift.ts +144 -0
  322. package/src/scripts/_lib/untrusted_content.ts +82 -7
  323. package/src/scripts/adoption_report.ts +1 -1
  324. package/src/scripts/adr/evidence_census.ts +1 -1
  325. package/src/scripts/adr/regenerate_index.ts +26 -2
  326. package/src/scripts/adr_cite_check.ts +164 -1
  327. package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
  328. package/src/scripts/ai_council/blind_review.ts +11 -1
  329. package/src/scripts/ai_council/clients.ts +4 -0
  330. package/src/scripts/ai_council/config.ts +3 -0
  331. package/src/scripts/ai_council/consensus.ts +28 -8
  332. package/src/scripts/ai_council/consensus_round.ts +226 -0
  333. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  334. package/src/scripts/ai_council/inline_findings.ts +340 -0
  335. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  336. package/src/scripts/ai_council/orchestrator.ts +16 -203
  337. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  338. package/src/scripts/ai_council/pricing.ts +106 -0
  339. package/src/scripts/ai_council/prompts.ts +74 -7
  340. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  341. package/src/scripts/ai_council/py_format.ts +14 -3
  342. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  343. package/src/scripts/ai_council/response_record.ts +50 -0
  344. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  345. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  346. package/src/scripts/asset_delivery_ledger.ts +157 -0
  347. package/src/scripts/attest_artifact.ts +193 -0
  348. package/src/scripts/audit_auto_rules.ts +2 -1
  349. package/src/scripts/audit_command_surface.ts +1 -1
  350. package/src/scripts/audit_mcp_tools.ts +2 -2
  351. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  352. package/src/scripts/audit_user_type_axis.ts +2 -1
  353. package/src/scripts/bench_ab_clone.ts +215 -10
  354. package/src/scripts/bench_ab_integrity.ts +119 -5
  355. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  356. package/src/scripts/build_archive_index.ts +1 -1
  357. package/src/scripts/build_linear_digest.ts +1 -1
  358. package/src/scripts/build_proof.ts +11 -4
  359. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  360. package/src/scripts/build_source_digests.ts +157 -0
  361. package/src/scripts/cache_realization_report.ts +103 -0
  362. package/src/scripts/check_adr_frontmatter.ts +126 -0
  363. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  364. package/src/scripts/check_beta_review_markers.ts +235 -6
  365. package/src/scripts/check_bundle_path_leakage.ts +195 -7
  366. package/src/scripts/check_claims.ts +576 -6
  367. package/src/scripts/check_command_examples.ts +557 -0
  368. package/src/scripts/check_composite_arming.ts +35 -0
  369. package/src/scripts/check_concern_admissions.ts +365 -0
  370. package/src/scripts/check_enforcement_coverage.ts +28 -0
  371. package/src/scripts/check_estate_count.ts +263 -3
  372. package/src/scripts/check_gate_reachability.ts +383 -0
  373. package/src/scripts/check_host_loadability.ts +104 -0
  374. package/src/scripts/check_loss_class_declared.ts +308 -0
  375. package/src/scripts/check_md_language.ts +15 -98
  376. package/src/scripts/check_memory_proposal.ts +18 -11
  377. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  378. package/src/scripts/check_no_external_sources.ts +281 -6
  379. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  380. package/src/scripts/check_pack_size.ts +59 -2
  381. package/src/scripts/check_preamble_payload_budget.ts +144 -6
  382. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  383. package/src/scripts/check_publish_surface.ts +10 -1
  384. package/src/scripts/check_references.ts +24 -1
  385. package/src/scripts/check_routing_coverage.ts +352 -0
  386. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  387. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  388. package/src/scripts/check_score_contract.ts +528 -0
  389. package/src/scripts/check_skill_admissions.ts +514 -0
  390. package/src/scripts/check_static_parity.ts +285 -0
  391. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  392. package/src/scripts/check_suppression_hygiene.ts +15 -0
  393. package/src/scripts/check_web_launch_readiness.ts +705 -0
  394. package/src/scripts/ci_settle.ts +39 -2
  395. package/src/scripts/code_graph/build.ts +60 -3
  396. package/src/scripts/code_graph/extract.ts +44 -0
  397. package/src/scripts/code_graph/types.ts +24 -0
  398. package/src/scripts/collector_daemon.ts +714 -0
  399. package/src/scripts/config_cost_report.ts +302 -0
  400. package/src/scripts/consumer_matrix.ts +74 -1
  401. package/src/scripts/cost/budget.mjs +10 -3
  402. package/src/scripts/cost/track.mjs +10 -3
  403. package/src/scripts/council_cli.ts +37 -54
  404. package/src/scripts/description_route_check.ts +494 -0
  405. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  406. package/src/scripts/evolution_lab.ts +980 -0
  407. package/src/scripts/external_sources_denylist.json +5 -18
  408. package/src/scripts/extract_audit_patterns.ts +21 -0
  409. package/src/scripts/fold_intake.ts +12 -1
  410. package/src/scripts/gen_discovery_baseline.ts +1 -1
  411. package/src/scripts/generate_capabilities_index.ts +12 -5
  412. package/src/scripts/generate_capability_matrix.ts +3 -3
  413. package/src/scripts/generate_command_flows.ts +2 -2
  414. package/src/scripts/generate_cookbook.ts +2 -2
  415. package/src/scripts/generate_index.ts +8 -1
  416. package/src/scripts/generate_knowledge_index.ts +2 -1
  417. package/src/scripts/generate_ownership_matrix.ts +2 -1
  418. package/src/scripts/generate_pack_manifests.ts +10 -2
  419. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  420. package/src/scripts/generate_settings_reference.ts +1 -1
  421. package/src/scripts/git_authorization_hook.ts +22 -1
  422. package/src/scripts/grade_target_readiness.ts +48 -5
  423. package/src/scripts/hook_effect_doctor.ts +261 -0
  424. package/src/scripts/hook_manifest.json +1 -1
  425. package/src/scripts/hook_manifest.yaml +125 -11
  426. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  427. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  428. package/src/scripts/hooks/concern_registry.ts +6 -0
  429. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  430. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  431. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  432. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  433. package/src/scripts/hooks/shims/install.sh +61 -0
  434. package/src/scripts/hooks/shims/php +101 -0
  435. package/src/scripts/hooks/suggestion_capture_hook.ts +378 -0
  436. package/src/scripts/hot_context_hook.ts +16 -0
  437. package/src/scripts/install-hooks.sh +20 -5
  438. package/src/scripts/install.ts +17 -35
  439. package/src/scripts/inventory_frontmatter.ts +2 -1
  440. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  441. package/src/scripts/lint_budget_ownership.ts +54 -4
  442. package/src/scripts/lint_canonical_terms.ts +604 -0
  443. package/src/scripts/lint_composition_review.ts +619 -0
  444. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  445. package/src/scripts/lint_eval_specs.ts +593 -0
  446. package/src/scripts/lint_hook_manifest.ts +19 -0
  447. package/src/scripts/lint_host_portability.ts +373 -0
  448. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  449. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  450. package/src/scripts/lint_metric_consumers.ts +355 -0
  451. package/src/scripts/lint_skill_descriptions.ts +18 -1
  452. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  453. package/src/scripts/lint_skill_link_reach.ts +252 -0
  454. package/src/scripts/lint_skill_trigger_corpus.ts +752 -0
  455. package/src/scripts/lint_ticket_buildable.ts +17 -1
  456. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  457. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  458. package/src/scripts/measure_docs_dead_links.ts +348 -0
  459. package/src/scripts/measure_host_capture.ts +461 -0
  460. package/src/scripts/migration_status.ts +3 -3
  461. package/src/scripts/model_rule_injection.ts +60 -0
  462. package/src/scripts/orchestration_record.ts +14 -0
  463. package/src/scripts/pack_install_smoke.ts +363 -0
  464. package/src/scripts/pr_conflict_census.ts +187 -0
  465. package/src/scripts/preamble_byte_census.ts +139 -10
  466. package/src/scripts/prepack-check.mjs +4 -1
  467. package/src/scripts/probe_turnaround.ts +384 -0
  468. package/src/scripts/probe_unblocked_ask.ts +279 -0
  469. package/src/scripts/render_benchmark_md.ts +1 -1
  470. package/src/scripts/report_pack_delta.ts +204 -0
  471. package/src/scripts/rule_activation_census.ts +70 -9
  472. package/src/scripts/rule_backlinks.ts +1 -1
  473. package/src/scripts/run_lifecycle_suite.ts +208 -0
  474. package/src/scripts/run_skill_evals.ts +40 -0
  475. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  476. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  477. package/src/scripts/schemas/evals.schema.json +24 -1
  478. package/src/scripts/schemas/rule.schema.json +52 -1
  479. package/src/scripts/schemas/skill.schema.json +17 -2
  480. package/src/scripts/select_analysis_mode.ts +112 -0
  481. package/src/scripts/skill_overlap.ts +7 -1
  482. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  483. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  484. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  485. package/src/scripts/skill_usage_report.ts +2 -1
  486. package/src/scripts/stubs_due.ts +211 -0
  487. package/src/scripts/sweep_source_surfaces.ts +678 -0
  488. package/src/scripts/sync_pr_branch.ts +40 -1
  489. package/src/scripts/trigger_eval_grandfather.json +202 -222
  490. package/src/scripts/utilization_report.ts +22 -2
  491. package/src/server/schemas/settings.ts +10 -0
  492. package/src/templates/marketing-copy.yml +1 -1
  493. package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
  494. package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
  495. package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
  496. package/dist/agent-src/skills/alerting-doctrine/evals/triggers.json +0 -17
  497. package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
  498. package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
  499. package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
  500. package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
  501. package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
  502. package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
  503. package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
  504. package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
  505. package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
  506. package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
  507. package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
  508. package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
  509. package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
  510. package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
  511. package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
  512. package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
  513. package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
  514. package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
  515. package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
  516. package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
  517. package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
  518. package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
  519. package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
  520. package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
  521. package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
  522. package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
  523. package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
  524. package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
  525. package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
  526. package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
  527. package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
  528. package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
  529. package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
  530. package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
  531. package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
  532. package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
  533. package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
  534. package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
  535. package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
  536. package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
  537. package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
  538. package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
  539. package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -67
  540. package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
  541. package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
  542. package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
  543. package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
  544. package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
  545. package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
  546. package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
  547. package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
  548. package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
  549. package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
  550. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
  551. package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
  552. package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
  553. package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
  554. package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
  555. package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
  556. package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
  557. package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
  558. package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
  559. package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
  560. package/dist/agent-src/skills/js-library-packaging/evals/triggers.json +0 -17
  561. package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
  562. package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
  563. package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
  564. package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
  565. package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
  566. package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
  567. package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
  568. package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
  569. package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
  570. package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
  571. package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
  572. package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
  573. package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
  574. package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
  575. package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
  576. package/dist/agent-src/skills/monorepo-workspace/evals/triggers.json +0 -17
  577. package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
  578. package/dist/agent-src/skills/operational-readiness/evals/triggers.json +0 -17
  579. package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
  580. package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
  581. package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
  582. package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
  583. package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
  584. package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
  585. package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
  586. package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
  587. package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
  588. package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
  589. package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
  590. package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
  591. package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
  592. package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
  593. package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
  594. package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
  595. package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
  596. package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
  597. package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
  598. package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
  599. package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
  600. package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
  601. package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
  602. package/dist/agent-src/skills/server-hardening/evals/triggers.json +0 -17
  603. package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
  604. package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
  605. package/dist/agent-src/skills/storybook-workshop/evals/triggers.json +0 -17
  606. package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
  607. package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
  608. package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
  609. package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
  610. package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
  611. package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
  612. package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
  613. package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
  614. package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
  615. package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
  616. package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
  617. package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
  618. package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
  619. package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
  620. package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
  621. package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
  622. package/dist/agent-src/skills/workspace-link/evals/triggers.json +0 -17
  623. package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
  624. package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
  625. package/dist/cli/agent-config.js.map +0 -1
  626. package/dist/cli/bash/runBash.js.map +0 -1
  627. package/dist/cli/commands/commands.js.map +0 -1
  628. package/dist/cli/commands/config.js.map +0 -1
  629. package/dist/cli/commands/doctorShell.js.map +0 -1
  630. package/dist/cli/commands/mcpServer.js.map +0 -1
  631. package/dist/cli/commands/packs.js.map +0 -1
  632. package/dist/cli/commands/profiles.js.map +0 -1
  633. package/dist/cli/commands/recordTriggerEval.js.map +0 -1
  634. package/dist/cli/commands/rtkDetect.js.map +0 -1
  635. package/dist/cli/commands/settings.js.map +0 -1
  636. package/dist/cli/commands/uiAudit.js.map +0 -1
  637. package/dist/cli/commands/uiRender.js.map +0 -1
  638. package/dist/cli/commands/uiServe.js.map +0 -1
  639. package/dist/cli/commands/versions.js.map +0 -1
  640. package/dist/cli/commands/workspaces.js.map +0 -1
  641. package/dist/cli/configRoot.js.map +0 -1
  642. package/dist/cli/discovery/loadManifest.js.map +0 -1
  643. package/dist/cli/firstRunNotice.js.map +0 -1
  644. package/dist/cli/help.js.map +0 -1
  645. package/dist/cli/initRouting.js.map +0 -1
  646. package/dist/cli/log/logger.js.map +0 -1
  647. package/dist/cli/main.js.map +0 -1
  648. package/dist/cli/mcp/content.js.map +0 -1
  649. package/dist/cli/mcp/dispatch.js.map +0 -1
  650. package/dist/cli/mcp/stdio.js.map +0 -1
  651. package/dist/cli/paths.js.map +0 -1
  652. package/dist/cli/python/knowledge_ingest.js.map +0 -1
  653. package/dist/cli/python/workspace_analytics.js.map +0 -1
  654. package/dist/cli/python/workspace_crypto.js.map +0 -1
  655. package/dist/cli/python/workspace_documents.js.map +0 -1
  656. package/dist/cli/python/workspace_drive.js.map +0 -1
  657. package/dist/cli/python/workspace_drive_health.js.map +0 -1
  658. package/dist/cli/python/workspace_explain.js.map +0 -1
  659. package/dist/cli/python/workspace_hosts.js.map +0 -1
  660. package/dist/cli/python/workspace_inbox.js.map +0 -1
  661. package/dist/cli/python/workspace_render.js.map +0 -1
  662. package/dist/cli/python/workspace_roles.js.map +0 -1
  663. package/dist/cli/python/workspace_secrets.js.map +0 -1
  664. package/dist/cli/python/workspace_sessions.js.map +0 -1
  665. package/dist/cli/python/workspace_skills.js.map +0 -1
  666. package/dist/cli/registry.js.map +0 -1
  667. package/dist/install/agentSwitchDetection.js.map +0 -1
  668. package/dist/install/agentSwitchProfile.js.map +0 -1
  669. package/dist/install/atomic.js.map +0 -1
  670. package/dist/install/claudePathsPlan.js.map +0 -1
  671. package/dist/install/conflict.js.map +0 -1
  672. package/dist/install/detect.js.map +0 -1
  673. package/dist/install/emit_host_rules_cli.js.map +0 -1
  674. package/dist/install/globalRuleLayers.js.map +0 -1
  675. package/dist/install/hostLayerFingerprint.js.map +0 -1
  676. package/dist/install/partitionEligibility.js.map +0 -1
  677. package/dist/install/paths.js.map +0 -1
  678. package/dist/install/plan.js.map +0 -1
  679. package/dist/install/preflight.js.map +0 -1
  680. package/dist/install/rtkDetection.js.map +0 -1
  681. package/dist/install/ruleInScope.js.map +0 -1
  682. package/dist/install/ruleLayerPartition.js.map +0 -1
  683. package/dist/install/rule_scope.js.map +0 -1
  684. package/dist/install/rule_scope_cli.js.map +0 -1
  685. package/dist/install/selectedTools.js.map +0 -1
  686. package/dist/install/toolDetection.js.map +0 -1
  687. package/dist/install/txlog.js.map +0 -1
  688. package/dist/install/types.js.map +0 -1
  689. package/dist/install/wizard-plan.js.map +0 -1
  690. package/dist/install/wizardDismissals.js.map +0 -1
  691. package/dist/scripts/_lib/agent_settings.js.map +0 -1
  692. package/dist/scripts/_lib/agent_src.js.map +0 -1
  693. package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
  694. package/dist/scripts/_lib/claude_plugin.js.map +0 -1
  695. package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
  696. package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
  697. package/dist/scripts/_lib/environment_detector.js.map +0 -1
  698. package/dist/scripts/_lib/host_launch.js.map +0 -1
  699. package/dist/scripts/_lib/install_layout.js.map +0 -1
  700. package/dist/scripts/_lib/installed_lock.js.map +0 -1
  701. package/dist/scripts/_lib/lean_projection_mode.js.map +0 -1
  702. package/dist/scripts/_lib/model_tier.js.map +0 -1
  703. package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
  704. package/dist/scripts/_lib/scoped_projection.js.map +0 -1
  705. package/dist/scripts/_lib/script_output.js.map +0 -1
  706. package/dist/scripts/_lib/spawn_env.js.map +0 -1
  707. package/dist/scripts/_lib/surface_tiers.js.map +0 -1
  708. package/dist/scripts/_lib/token_count.js.map +0 -1
  709. package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
  710. package/dist/scripts/_lib/ui_surface.js.map +0 -1
  711. package/dist/scripts/_lib/user_global_paths.js.map +0 -1
  712. package/dist/scripts/ai_council/modes.js.map +0 -1
  713. package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
  714. package/dist/scripts/condense.js.map +0 -1
  715. package/dist/scripts/project_thin_rules.js.map +0 -1
  716. package/dist/server/app.js.map +0 -1
  717. package/dist/server/io/atomicMultiWrite.js.map +0 -1
  718. package/dist/server/io/atomicWrite.js.map +0 -1
  719. package/dist/server/io/sharedWriteCheck.js.map +0 -1
  720. package/dist/server/io/substituteTemplate.js.map +0 -1
  721. package/dist/server/io/yamlIO.js.map +0 -1
  722. package/dist/server/nicknameResolver.js.map +0 -1
  723. package/dist/server/port.js.map +0 -1
  724. package/dist/server/routes/discovery.js.map +0 -1
  725. package/dist/server/routes/install.js.map +0 -1
  726. package/dist/server/routes/ping.js.map +0 -1
  727. package/dist/server/routes/schema.js.map +0 -1
  728. package/dist/server/routes/settings.js.map +0 -1
  729. package/dist/server/routes/settingsChanges.js.map +0 -1
  730. package/dist/server/routes/userMd.js.map +0 -1
  731. package/dist/server/routes/wizard.js.map +0 -1
  732. package/dist/server/routes/workspace.js.map +0 -1
  733. package/dist/server/schemas/settings.js.map +0 -1
  734. package/dist/server/serverInfo.js.map +0 -1
  735. package/dist/server/token.js.map +0 -1
  736. package/dist/server/writeRoot.js.map +0 -1
  737. package/dist/shared/capabilities.js.map +0 -1
  738. package/dist/shared/interactiveContext.js.map +0 -1
  739. package/dist/shared/nicknamePrefill.js.map +0 -1
  740. package/dist/shared/settingsAsks.js.map +0 -1
  741. package/dist/shared/settingsCarveOut.js.map +0 -1
  742. package/dist/shared/settingsClasses.js.map +0 -1
  743. package/dist/shared/settingsConsent.js.map +0 -1
  744. package/dist/shared/settingsSurface.js.map +0 -1
  745. package/dist/shared/skillRanking.js.map +0 -1
  746. package/dist/shared/userMd/formAdapter.js.map +0 -1
  747. package/dist/shared/userMd/schema.js.map +0 -1
  748. package/dist/shared/userMd/utils.js.map +0 -1
  749. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
  750. package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
  751. package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
  752. package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
  753. package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
  754. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
  755. package/src/scripts/_lib/secret_detector.test.ts +0 -108
  756. package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
  757. package/src/scripts/_lib/ui_authority.test.ts +0 -251
  758. package/src/scripts/_lib/untrusted_content.test.ts +0 -175
  759. package/src/scripts/check_secret_leak.test.ts +0 -90
  760. package/src/scripts/design_slop_rules.test.ts +0 -246
  761. package/src/scripts/self_review_gate.test.ts +0 -296
  762. package/src/shared/capabilities.test.ts +0 -43
@@ -0,0 +1,752 @@
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 the field
36
+ * postdates almost every corpus: 25 of the 100 files in the shipped tree carry
37
+ * it today, so requiring it everywhere would red 75 files for a field that did
38
+ * not exist when they were written. (Both numbers move as corpora land; they
39
+ * are stated as of 2026-08-30 and are illustration, not a threshold — nothing
40
+ * reads them.)
41
+ *
42
+ * ## Forward-only, in three senses now
43
+ *
44
+ * The COUNT discipline (>=3 positives, >=2 near-misses) applies to every file
45
+ * today: exactly two files fail it, and both are listed as grandfathered by
46
+ * name rather than by a numeric baseline, so a third failure cannot hide inside
47
+ * a count. The LANGUAGE discipline applies only to files the diff adds or
48
+ * changes. So, since 2026-08-30, does the CASE-CLASS discipline.
49
+ *
50
+ * ## The case class — three semantic classes, declared, never inferred
51
+ *
52
+ * `road-to-governed-harness-evolution` step 2.3 asked for a four-class corpus
53
+ * where this gate had two: the boolean. AI council 2026-08-30, anthropic +
54
+ * openai, 2/2 convergent, re-scoped it to THREE semantic classes on this
55
+ * surface and moved the fourth elsewhere:
56
+ *
57
+ * - `exemplar` — a success case; requires `trigger: true`.
58
+ * - `near-miss` — vocabulary genuinely overlaps a neighbour, and the
59
+ * answer is still no; requires `trigger: false`.
60
+ * - `counterexample` — unrelated, guarding over-triggering rather than a
61
+ * neighbour; requires `trigger: false`.
62
+ *
63
+ * The fourth class the step named — `failure`, a case the routing gets wrong
64
+ * TODAY — is deliberately NOT here. Both seats reached the same reason
65
+ * independently: it is an ORTHOGONAL axis. `exemplar` / `near-miss` /
66
+ * `counterexample` describe intended routing; `failure` describes observed
67
+ * behaviour, and one case can be both. A corpus file is a regression LOCK, so
68
+ * a known-wrong case placed in it is red by construction, and a rule requiring
69
+ * one per file would reward deliberately broken routing.
70
+ *
71
+ * This does not contradict `:20-26` above. That paragraph says the near-miss /
72
+ * unrelated-negative distinction is not machine-DECIDABLE, and it still is not:
73
+ * nothing here detects it. The class is DECLARED by the author and the
74
+ * declaration is validated — precisely the mechanism the German requirement
75
+ * already uses two paragraphs up, for the same reason.
76
+ *
77
+ * Exit codes: 0 = clean · 1 = a discipline violation · 2 = dead scope.
78
+ */
79
+ import { execFileSync } from 'node:child_process';
80
+ import * as fs from 'node:fs';
81
+ import * as path from 'node:path';
82
+ import process from 'node:process';
83
+ import { fileURLToPath } from 'node:url';
84
+
85
+ import { GateLedger } from './_lib/gate_ledger.js';
86
+ import { type SelfTestCase, runGateCli, runSelfTest } from './_lib/gate_self_test.js';
87
+ import { resolveBaseRef } from './_lib/ratchet_base_ref.js';
88
+ import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
89
+
90
+ const HERE = fileURLToPath(import.meta.url);
91
+ const REAL_REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
92
+ const REPO_ROOT = process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'] ?? REAL_REPO_ROOT;
93
+
94
+ /**
95
+ * Treat every scanned unit as diff-touched, so the forward-only disciplines
96
+ * apply to all of them.
97
+ *
98
+ * This can only ever WIDEN the checked set — there is no direction in which it
99
+ * suppresses a finding — which is what makes it safe to honour from the
100
+ * environment. `--self-test` needs it because its fixtures live in a temporary
101
+ * directory that is not a git repository, so `changedUnits` finds nothing
102
+ * there and the class rules would be silently unreachable: a self-test that
103
+ * cannot reach the rule it claims to prove is the exact no-op this harness
104
+ * exists to catch.
105
+ */
106
+ function forwardAll(): boolean {
107
+ // Read per CALL, not at module load. `selfTest` spawns a subprocess so a
108
+ // module-level const worked there by accident; an in-process caller — a
109
+ // unit test, or any future embedder — could not reach the flag at all,
110
+ // which made the widening path itself untestable without a spawn.
111
+ return process.env['LINT_SKILL_TRIGGER_CORPUS_FORWARD_ALL'] === '1';
112
+ }
113
+
114
+ export const MIN_POSITIVES = 3;
115
+ export const MIN_NEAR_MISSES = 2;
116
+
117
+ /**
118
+ * The two corpus files that predate the discipline, named rather than counted.
119
+ *
120
+ * A numeric baseline would let a third failure arrive while the number stayed
121
+ * put if one of these were fixed in the same change. Names cannot do that.
122
+ */
123
+ export const GRANDFATHERED = new Set(['brand-asset-generation', 'estimate-ticket']);
124
+
125
+ /**
126
+ * The closed case-class vocabulary, and the polarity each class requires.
127
+ *
128
+ * Polarity is part of the vocabulary rather than a separate convention: a
129
+ * `near-miss` carrying `trigger: true` is not a near miss, it is a positive
130
+ * that was mislabelled, and a class system that cannot say so buys nothing
131
+ * over a free-text tag.
132
+ */
133
+ export const CASE_CLASS_POLARITY: Readonly<Record<string, boolean>> = {
134
+ exemplar: true,
135
+ 'near-miss': false,
136
+ counterexample: false,
137
+ };
138
+
139
+ export const CASE_CLASSES: readonly string[] = Object.keys(CASE_CLASS_POLARITY);
140
+
141
+ export interface CorpusStats {
142
+ unit: string;
143
+ positives: number;
144
+ nearMisses: number;
145
+ germanPositives: number;
146
+ /** True when at least one case declares a language at all. */
147
+ declaresLanguage: boolean;
148
+ /** Cases in the `queries` shape that declare no `class` at all. */
149
+ unclassified: number;
150
+ /** Declared class values outside the closed vocabulary, as written. */
151
+ badClassValues: string[];
152
+ /** Cases whose declared class contradicts their `trigger` boolean. */
153
+ classPolarityErrors: string[];
154
+ /** Which vocabulary members appear at least once. */
155
+ classesPresent: string[];
156
+ /**
157
+ * True when the file uses the legacy `should_trigger` / `should_not_trigger`
158
+ * arrays, whose entries are bare strings and cannot carry a class.
159
+ */
160
+ legacyShape: boolean;
161
+ }
162
+
163
+ export interface Violation {
164
+ unit: string;
165
+ rule:
166
+ | 'positives'
167
+ | 'near-misses'
168
+ | 'german'
169
+ | 'malformed'
170
+ | 'class-missing'
171
+ | 'class-vocab'
172
+ | 'class-polarity'
173
+ | 'class-coverage'
174
+ | 'class-shape';
175
+ message: string;
176
+ }
177
+
178
+ interface RawCase {
179
+ q?: string;
180
+ trigger?: boolean;
181
+ language?: string;
182
+ class?: unknown;
183
+ }
184
+
185
+ /** Read one corpus file into counts, across both shapes that exist. */
186
+ export function statsFor(unit: string, file: string): CorpusStats {
187
+ const doc = JSON.parse(fs.readFileSync(file, 'utf-8')) as {
188
+ queries?: RawCase[];
189
+ should_trigger?: string[];
190
+ should_not_trigger?: string[];
191
+ };
192
+ const queries = doc.queries ?? [];
193
+ let positives = queries.filter((q) => q.trigger === true).length;
194
+ let nearMisses = queries.filter((q) => q.trigger === false).length;
195
+ positives += (doc.should_trigger ?? []).length;
196
+ nearMisses += (doc.should_not_trigger ?? []).length;
197
+
198
+ const badClassValues: string[] = [];
199
+ const classPolarityErrors: string[] = [];
200
+ const present = new Set<string>();
201
+ let unclassified = 0;
202
+ for (const q of queries) {
203
+ const raw = q.class;
204
+ if (raw === undefined || raw === null || raw === '') {
205
+ unclassified += 1;
206
+ continue;
207
+ }
208
+ if (typeof raw !== 'string' || !(raw in CASE_CLASS_POLARITY)) {
209
+ badClassValues.push(String(raw));
210
+ continue;
211
+ }
212
+ present.add(raw);
213
+ if (q.trigger !== CASE_CLASS_POLARITY[raw]) {
214
+ classPolarityErrors.push(`${raw} on \`trigger: ${String(q.trigger)}\``);
215
+ }
216
+ }
217
+
218
+ return {
219
+ unit,
220
+ positives,
221
+ nearMisses,
222
+ germanPositives: queries.filter((q) => q.trigger === true && q.language === 'de').length,
223
+ declaresLanguage: queries.some((q) => typeof q.language === 'string'),
224
+ unclassified,
225
+ badClassValues,
226
+ classPolarityErrors,
227
+ classesPresent: [...present].sort(),
228
+ legacyShape:
229
+ (doc.should_trigger ?? []).length > 0 || (doc.should_not_trigger ?? []).length > 0,
230
+ };
231
+ }
232
+
233
+ /**
234
+ * `forward` is the diff-touched flag: true when this corpus file was added or
235
+ * changed against the base ref. The COUNT discipline ignores it; the LANGUAGE
236
+ * and CASE-CLASS disciplines are gated on it, so an untouched file authored
237
+ * before either existed is not red for a field that did not exist when it was
238
+ * written. Migration is by touch: the file that changes migrates.
239
+ */
240
+ export function judge(s: CorpusStats, forward: boolean): Violation[] {
241
+ const out: Violation[] = [];
242
+ if (GRANDFATHERED.has(s.unit)) return out;
243
+ if (s.positives < MIN_POSITIVES) {
244
+ out.push({
245
+ unit: s.unit,
246
+ rule: 'positives',
247
+ message: `${String(s.positives)} positive(s), the discipline asks for ${String(MIN_POSITIVES)}`,
248
+ });
249
+ }
250
+ if (s.nearMisses < MIN_NEAR_MISSES) {
251
+ out.push({
252
+ unit: s.unit,
253
+ rule: 'near-misses',
254
+ message: `${String(s.nearMisses)} near-miss(es), the discipline asks for ${String(MIN_NEAR_MISSES)}`,
255
+ });
256
+ }
257
+ if (forward && s.germanPositives < 1) {
258
+ out.push({
259
+ unit: s.unit,
260
+ rule: 'german',
261
+ message:
262
+ 'no positive declares `"language": "de"`. Declared, never detected — ' +
263
+ 'a detector would pass German-looking English and fail short German',
264
+ });
265
+ }
266
+ if (forward) out.push(...judgeClasses(s));
267
+ return out;
268
+ }
269
+
270
+ /**
271
+ * The case-class rules, all forward-only. Split out so the findings read as one
272
+ * discipline rather than as unrelated additions to `judge`.
273
+ *
274
+ * **`class-shape` cannot fire on the tree as it stands, and that is stated
275
+ * rather than left to be discovered** (completion review, 2026-08-30). It fires
276
+ * on a legacy-shaped corpus; the only two legacy-shaped files in the tree are
277
+ * exactly the two `GRANDFATHERED` units, and `judge` returns before reaching
278
+ * here for those. So it is a FORWARD guard — it catches a legacy-shaped file
279
+ * added from now on, or a grandfathered one promoted — not a rule with live
280
+ * coverage. It is exercised by synthetic fixtures in `--self-test`, so it is
281
+ * tested; what it is not is currently reachable from real data. Counting it
282
+ * among the rules this gate enforces TODAY would inflate the coverage claim,
283
+ * which is the failure this whole file exists to prevent one level down.
284
+ */
285
+ function judgeClasses(s: CorpusStats): Violation[] {
286
+ const out: Violation[] = [];
287
+ const vocab = CASE_CLASSES.join(' | ');
288
+ if (s.legacyShape) {
289
+ out.push({
290
+ unit: s.unit,
291
+ rule: 'class-shape',
292
+ message:
293
+ 'the `should_trigger` / `should_not_trigger` arrays hold bare strings and ' +
294
+ 'cannot carry a case class — migrate this file to the `queries` shape',
295
+ });
296
+ return out;
297
+ }
298
+ if (s.unclassified > 0) {
299
+ out.push({
300
+ unit: s.unit,
301
+ rule: 'class-missing',
302
+ message:
303
+ `${String(s.unclassified)} case(s) declare no \`class\` (${vocab}). ` +
304
+ 'Declared, never inferred — the near-miss / counterexample split is not ' +
305
+ 'machine-decidable, so the author states it and the gate checks the statement',
306
+ });
307
+ }
308
+ if (s.badClassValues.length > 0) {
309
+ out.push({
310
+ unit: s.unit,
311
+ rule: 'class-vocab',
312
+ message: `class outside the closed vocabulary (${vocab}): ${s.badClassValues.sort().join(', ')}`,
313
+ });
314
+ }
315
+ if (s.classPolarityErrors.length > 0) {
316
+ out.push({
317
+ unit: s.unit,
318
+ rule: 'class-polarity',
319
+ message:
320
+ 'class contradicts its own `trigger` boolean: ' +
321
+ `${s.classPolarityErrors.sort().join(', ')}. \`exemplar\` is a positive; ` +
322
+ '`near-miss` and `counterexample` are negatives',
323
+ });
324
+ }
325
+ const missing = CASE_CLASSES.filter((c) => !s.classesPresent.includes(c));
326
+ if (missing.length > 0) {
327
+ out.push({
328
+ unit: s.unit,
329
+ rule: 'class-coverage',
330
+ message:
331
+ `no case carries ${missing.join(' or ')}. A corpus of positives and ` +
332
+ 'near-misses alone cannot show whether the skill over-triggers on ' +
333
+ 'unrelated input, which is what a counterexample is for',
334
+ });
335
+ }
336
+ return out;
337
+ }
338
+
339
+ /**
340
+ * What the diff scope actually is — three states, deliberately not collapsed.
341
+ *
342
+ * The previous shape returned a bare `Set` and an empty one meant BOTH "the
343
+ * diff touched no corpus file" and "git could not answer". Those are opposite
344
+ * facts: the first is a clean tree, the second is a gate that cannot know what
345
+ * changed. Collapsing them made every forward-only rule a silent no-op wherever
346
+ * the base ref does not resolve — a shallow clone, a fork remote, a tarball, a
347
+ * worktree that never fetched — while `main()` still printed its success line
348
+ * asserting the discipline had run. A gate that reports green on a scope it
349
+ * could not read is the exact failure `DeadScopeError` exists for, applied one
350
+ * level up from the population to the DIFF.
351
+ */
352
+ export type ChangedScope =
353
+ | { kind: 'diff'; units: Set<string> }
354
+ | { kind: 'no-repo' }
355
+ | { kind: 'base-unresolvable'; base: string };
356
+
357
+ function gitOk(root: string, args: readonly string[]): boolean {
358
+ try {
359
+ execFileSync('git', [...args], {
360
+ cwd: root,
361
+ encoding: 'utf-8',
362
+ // Silenced deliberately: outside a repo git prints its whole usage
363
+ // text to stderr, and a gate that dumps a manual page on a path it
364
+ // already handles is noise a reader has to learn to ignore.
365
+ stdio: ['ignore', 'ignore', 'ignore'],
366
+ });
367
+ return true;
368
+ } catch {
369
+ return false;
370
+ }
371
+ }
372
+
373
+ /** Corpus files the diff added or modified, relative to a base ref. */
374
+ export function changedUnits(root: string, base: string): ChangedScope {
375
+ if (!gitOk(root, ['rev-parse', '--git-dir'])) return { kind: 'no-repo' };
376
+ if (!gitOk(root, ['rev-parse', '--verify', '--quiet', base])) {
377
+ return { kind: 'base-unresolvable', base };
378
+ }
379
+ let out = '';
380
+ try {
381
+ out = execFileSync('git', ['diff', '--name-only', `${base}...HEAD`], {
382
+ cwd: root,
383
+ encoding: 'utf-8',
384
+ stdio: ['ignore', 'pipe', 'ignore'],
385
+ });
386
+ } catch {
387
+ // The ref resolved a line ago, so a failure here is not "no diff".
388
+ return { kind: 'base-unresolvable', base };
389
+ }
390
+ const units = new Set<string>();
391
+ for (const line of out.split('\n')) {
392
+ const m = /^src\/skills\/([^/]+)\/evals\/triggers\.json$/.exec(line.trim());
393
+ if (m?.[1] !== undefined) units.add(m[1]);
394
+ }
395
+ return { kind: 'diff', units };
396
+ }
397
+
398
+ export interface Result {
399
+ violations: Violation[];
400
+ scanned: number;
401
+ ledger: GateLedger;
402
+ }
403
+
404
+ export function evaluate(root = REPO_ROOT, base?: string): Result {
405
+ const dir = path.join(root, 'src', 'skills');
406
+ let entries: fs.Dirent[];
407
+ try {
408
+ entries = fs.readdirSync(dir, { withFileTypes: true });
409
+ } catch {
410
+ throw new DeadScopeError(
411
+ 'lint_skill_trigger_corpus',
412
+ 'src/skills is unreadable — a corpus gate with no corpus passes every tree.',
413
+ );
414
+ }
415
+ // `origin/main` is exactly the ref that is NOT available where this matters:
416
+ // actions/checkout does a shallow PR-merge fetch, so a PR build has no
417
+ // remote-tracking main at all. Hardcoding it made the first version of this
418
+ // guard a hard CI failure on every run — the opposite of the silent no-op it
419
+ // replaced, and no better. `resolveBaseRef` is this repository's existing
420
+ // answer to the same problem (RATCHET_BASE_REF, then GITHUB_BASE_REF, then
421
+ // the merge commit's first parent on Actions, then origin/main), so the gate
422
+ // uses it rather than inventing a second ladder. An explicit `base` still
423
+ // wins, which is what the tests pass.
424
+ const resolved = base ?? resolveBaseRef(root);
425
+ const scope: ChangedScope =
426
+ resolved === null ? { kind: 'base-unresolvable', base: '(none resolved)' } : changedUnits(root, resolved);
427
+ // FORWARD_ALL widens to every unit, so it needs no diff and is checked
428
+ // first — that is what keeps `--self-test`, which runs in a temporary
429
+ // non-repo directory, reachable.
430
+ const wideMode = forwardAll();
431
+ if (!wideMode && scope.kind !== 'diff') {
432
+ throw new DeadScopeError(
433
+ 'lint_skill_trigger_corpus',
434
+ scope.kind === 'no-repo'
435
+ ? 'not a git repository, so the diff scope cannot be read and every ' +
436
+ 'forward-only rule would be unreachable while this gate printed green. ' +
437
+ 'Run it inside the repo, or set LINT_SKILL_TRIGGER_CORPUS_FORWARD_ALL=1 ' +
438
+ 'to check every unit instead.'
439
+ : `base ref ${scope.base} does not resolve, so the diff scope cannot be ` +
440
+ 'read and every forward-only rule would be unreachable while this gate ' +
441
+ 'printed green. Fetch it (`git fetch origin main`) or pass a base that ' +
442
+ 'exists; LINT_SKILL_TRIGGER_CORPUS_FORWARD_ALL=1 checks every unit instead.',
443
+ );
444
+ }
445
+ const changed = scope.kind === 'diff' ? scope.units : new Set<string>();
446
+ const ledger = new GateLedger('lint_skill_trigger_corpus');
447
+ const violations: Violation[] = [];
448
+ let scanned = 0;
449
+ for (const e of entries) {
450
+ if (!e.isDirectory()) continue;
451
+ const file = path.join(dir, e.name, 'evals', 'triggers.json');
452
+ if (!fs.existsSync(file)) continue;
453
+ scanned += 1;
454
+ ledger.plan(e.name);
455
+ let own: Violation[];
456
+ try {
457
+ own = judge(statsFor(e.name, file), wideMode || changed.has(e.name));
458
+ } catch {
459
+ own = [{ unit: e.name, rule: 'malformed', message: 'is not parseable JSON' }];
460
+ }
461
+ if (own.length === 0) ledger.complete(e.name);
462
+ else ledger.fail(e.name, own.map((v) => `[${v.rule}] ${v.message}`).join(' · '));
463
+ violations.push(...own);
464
+ }
465
+ if (scanned === 0) {
466
+ throw new DeadScopeError(
467
+ 'lint_skill_trigger_corpus',
468
+ 'zero corpus files found under src/skills/*/evals/triggers.json — 100 exist ' +
469
+ 'in the shipped tree, so an empty scan is a moved root, not a clean one.',
470
+ );
471
+ }
472
+ return { violations, scanned, ledger };
473
+ }
474
+
475
+ export function selfTest(): number {
476
+ const os = process.env['TMPDIR'] ?? '/tmp';
477
+ const tmp = fs.mkdtempSync(path.join(os, 'lstc-'));
478
+ const mkRoot = (unit: string, body: unknown): string => {
479
+ const root = fs.mkdtempSync(path.join(tmp, 'repo-'));
480
+ const d = path.join(root, 'src', 'skills', unit, 'evals');
481
+ fs.mkdirSync(d, { recursive: true });
482
+ fs.writeFileSync(path.join(d, 'triggers.json'), JSON.stringify(body));
483
+ // A REAL repo with a resolvable `origin/main`, not a bare directory.
484
+ //
485
+ // The non-forward arms below assert that a corpus is accepted when it
486
+ // is NOT diff-touched, and they used to get that for free: outside a
487
+ // repo `changedUnits` returned an empty set, which the gate could not
488
+ // distinguish from a clean diff. That conflation was the finding this
489
+ // branch fixed — an unreadable diff now REFUSES — so the fixtures have
490
+ // to supply the condition they were only ever simulating. Committing
491
+ // the file and pointing `origin/main` at that same commit makes the
492
+ // diff genuinely empty, which is what those arms mean.
493
+ const git = (...args: string[]): void => {
494
+ execFileSync('git', args, {
495
+ cwd: root,
496
+ stdio: ['ignore', 'ignore', 'ignore'],
497
+ env: {
498
+ ...process.env,
499
+ GIT_AUTHOR_NAME: 'selftest',
500
+ GIT_AUTHOR_EMAIL: 'selftest@invalid',
501
+ GIT_COMMITTER_NAME: 'selftest',
502
+ GIT_COMMITTER_EMAIL: 'selftest@invalid',
503
+ },
504
+ });
505
+ };
506
+ git('init', '-q');
507
+ git('add', '-A');
508
+ git('commit', '-q', '-m', 'fixture');
509
+ git('update-ref', 'refs/remotes/origin/main', 'HEAD');
510
+ return root;
511
+ };
512
+ const run = (root: string, forwardAll = false): number => {
513
+ process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'] = root;
514
+ if (forwardAll) process.env['LINT_SKILL_TRIGGER_CORPUS_FORWARD_ALL'] = '1';
515
+ try {
516
+ return runGateCli(REAL_REPO_ROOT, 'src/scripts/lint_skill_trigger_corpus.ts', [], root);
517
+ } finally {
518
+ delete process.env['LINT_SKILL_TRIGGER_CORPUS_ROOT'];
519
+ delete process.env['LINT_SKILL_TRIGGER_CORPUS_FORWARD_ALL'];
520
+ }
521
+ };
522
+ const good = {
523
+ queries: [
524
+ { q: 'a', trigger: true },
525
+ { q: 'b', trigger: true },
526
+ { q: 'c', trigger: true },
527
+ { q: 'd', trigger: false },
528
+ { q: 'e', trigger: false },
529
+ ],
530
+ };
531
+ /** The same corpus, fully classified and German-declared — forward-clean. */
532
+ const classified = {
533
+ queries: [
534
+ { q: 'a', trigger: true, class: 'exemplar' },
535
+ { q: 'b', trigger: true, class: 'exemplar' },
536
+ { q: 'c', trigger: true, class: 'exemplar', language: 'de' },
537
+ { q: 'd', trigger: false, class: 'near-miss' },
538
+ { q: 'e', trigger: false, class: 'counterexample' },
539
+ ],
540
+ };
541
+ const mutate = (fn: (qs: Record<string, unknown>[]) => Record<string, unknown>[]) => ({
542
+ queries: fn(JSON.parse(JSON.stringify(classified.queries)) as Record<string, unknown>[]),
543
+ });
544
+ const cases: SelfTestCase[] = [
545
+ {
546
+ name: 'a compliant corpus is accepted',
547
+ expect: 'accept',
548
+ run: () => run(mkRoot('probe', good)),
549
+ },
550
+ {
551
+ name: 'the should_trigger shape is read, not silently skipped',
552
+ expect: 'accept',
553
+ run: () =>
554
+ run(
555
+ mkRoot('probe', {
556
+ should_trigger: ['a', 'b', 'c'],
557
+ should_not_trigger: ['d', 'e'],
558
+ }),
559
+ ),
560
+ },
561
+ {
562
+ name: 'a grandfathered unit stays accepted at zero cases',
563
+ expect: 'accept',
564
+ run: () => run(mkRoot('estimate-ticket', { queries: [] })),
565
+ },
566
+ {
567
+ name: 'too few positives is rejected',
568
+ expect: 'reject',
569
+ run: () => run(mkRoot('probe', { queries: good.queries.slice(1) })),
570
+ },
571
+ {
572
+ name: 'too few near-misses is rejected',
573
+ expect: 'reject',
574
+ run: () => run(mkRoot('probe', { queries: good.queries.slice(0, 4) })),
575
+ },
576
+ {
577
+ name: 'a malformed corpus file is rejected, not skipped',
578
+ expect: 'reject',
579
+ run: () => {
580
+ const root = mkRoot('probe', good);
581
+ fs.writeFileSync(
582
+ path.join(root, 'src', 'skills', 'probe', 'evals', 'triggers.json'),
583
+ '{ not json',
584
+ );
585
+ return run(root);
586
+ },
587
+ },
588
+ {
589
+ name: 'a scan root with no corpus at all exits 2 rather than reporting clean',
590
+ expect: 'reject',
591
+ run: () => {
592
+ const root = fs.mkdtempSync(path.join(tmp, 'empty-'));
593
+ fs.mkdirSync(path.join(root, 'src', 'skills'), { recursive: true });
594
+ return run(root);
595
+ },
596
+ },
597
+ // --- case-class discipline, forward-only. Every case below runs with
598
+ // the forward flag forced on; the pair at the end proves the flag is
599
+ // what turns the rule on, so a rule that fired unconditionally would
600
+ // be caught here rather than by a reviewer.
601
+ {
602
+ name: 'a fully classified corpus is accepted under the class discipline',
603
+ expect: 'accept',
604
+ run: () => run(mkRoot('probe', classified), true),
605
+ },
606
+ {
607
+ name: 'an unclassified case is rejected',
608
+ expect: 'reject',
609
+ run: () =>
610
+ run(
611
+ mkRoot(
612
+ 'probe',
613
+ mutate((qs) => {
614
+ delete qs[0]?.['class'];
615
+ return qs;
616
+ }),
617
+ ),
618
+ true,
619
+ ),
620
+ },
621
+ {
622
+ name: 'a class outside the closed vocabulary is rejected',
623
+ expect: 'reject',
624
+ run: () =>
625
+ run(
626
+ mkRoot(
627
+ 'probe',
628
+ mutate((qs) => {
629
+ if (qs[0]) qs[0]['class'] = 'positive';
630
+ return qs;
631
+ }),
632
+ ),
633
+ true,
634
+ ),
635
+ },
636
+ {
637
+ name: 'a near-miss on trigger:true is rejected — polarity is part of the vocabulary',
638
+ expect: 'reject',
639
+ run: () =>
640
+ run(
641
+ mkRoot(
642
+ 'probe',
643
+ mutate((qs) => {
644
+ if (qs[0]) qs[0]['class'] = 'near-miss';
645
+ return qs;
646
+ }),
647
+ ),
648
+ true,
649
+ ),
650
+ },
651
+ {
652
+ name: 'an exemplar on trigger:false is rejected — the other polarity direction',
653
+ expect: 'reject',
654
+ run: () =>
655
+ run(
656
+ mkRoot(
657
+ 'probe',
658
+ mutate((qs) => {
659
+ if (qs[4]) qs[4]['class'] = 'exemplar';
660
+ return qs;
661
+ }),
662
+ ),
663
+ true,
664
+ ),
665
+ },
666
+ {
667
+ name: 'a corpus with no counterexample at all is rejected',
668
+ expect: 'reject',
669
+ run: () =>
670
+ run(
671
+ mkRoot(
672
+ 'probe',
673
+ mutate((qs) => {
674
+ if (qs[4]) qs[4]['class'] = 'near-miss';
675
+ return qs;
676
+ }),
677
+ ),
678
+ true,
679
+ ),
680
+ },
681
+ {
682
+ name: 'the legacy string-array shape is rejected under the class discipline',
683
+ expect: 'reject',
684
+ run: () =>
685
+ run(
686
+ mkRoot('probe', {
687
+ should_trigger: ['a', 'b', 'c'],
688
+ should_not_trigger: ['d', 'e'],
689
+ }),
690
+ true,
691
+ ),
692
+ },
693
+ {
694
+ name: 'the SAME unclassified corpus is accepted when NOT diff-touched',
695
+ expect: 'accept',
696
+ run: () => run(mkRoot('probe', good), false),
697
+ },
698
+ ];
699
+ try {
700
+ return runSelfTest({
701
+ gate: 'lint_skill_trigger_corpus',
702
+ cases,
703
+ minCases: 15,
704
+ minRejectCases: 10,
705
+ });
706
+ } finally {
707
+ fs.rmSync(tmp, { recursive: true, force: true });
708
+ }
709
+ }
710
+
711
+ export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
712
+ if (argv.includes('--self-test')) return selfTest();
713
+ const quiet = argv.includes('--quiet');
714
+ let r: Result;
715
+ try {
716
+ r = evaluate(root);
717
+ reportScanned({
718
+ gate: 'lint_skill_trigger_corpus',
719
+ scanned: r.scanned,
720
+ units: 'skill corpus file(s)',
721
+ roots: ['src/skills/*/evals/triggers.json'],
722
+ });
723
+ } catch (e) {
724
+ if (e instanceof DeadScopeError) {
725
+ process.stderr.write(`${e.message}\n`);
726
+ return 2;
727
+ }
728
+ throw e;
729
+ }
730
+ r.ledger.report(quiet ? () => undefined : process.stdout.write.bind(process.stdout));
731
+ if (r.violations.length === 0) {
732
+ process.stdout.write(
733
+ `lint_skill_trigger_corpus: ${String(r.scanned)} corpus file(s) hold the discipline ` +
734
+ `(>=${String(MIN_POSITIVES)} positives, >=${String(MIN_NEAR_MISSES)} near-misses; ` +
735
+ `${String(GRANDFATHERED.size)} grandfathered by name). Diff-touched files also ` +
736
+ `carry a declared case class per query (${CASE_CLASSES.join(' | ')}).\n`,
737
+ );
738
+ return 0;
739
+ }
740
+ for (const v of r.violations) {
741
+ process.stderr.write(` ${v.unit}: [${v.rule}] ${v.message}\n`);
742
+ }
743
+ process.stderr.write(
744
+ `${String(r.violations.length)} discipline violation(s). Add the missing cases — ` +
745
+ 'widening GRANDFATHERED is a defect, not a fix.\n',
746
+ );
747
+ return 1;
748
+ }
749
+
750
+ if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
751
+ process.exit(main());
752
+ }