@event4u/agent-config 14.12.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 (466) 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 +234 -0
  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/orchestration-telemetry.md +1 -0
  24. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  25. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  26. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  27. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  28. package/dist/agent-src/rules/broken-access-control.md +4 -0
  29. package/dist/agent-src/rules/code-provenance.md +4 -0
  30. package/dist/agent-src/rules/design-fidelity.md +1 -1
  31. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  32. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  33. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  34. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  35. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  36. package/dist/agent-src/rules/laravel-routing.md +1 -1
  37. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  38. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  39. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  40. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  41. package/dist/agent-src/rules/symfony-routing.md +1 -1
  42. package/dist/agent-src/rules/token-efficiency.md +14 -0
  43. package/dist/agent-src/rules/tool-safety.md +4 -0
  44. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  45. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  46. package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
  47. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  48. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  49. package/dist/agent-src/scripts/stubs_due.ts +400 -0
  50. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  51. package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
  52. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  53. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  54. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  55. package/dist/agent-src/skills/database/SKILL.md +8 -0
  56. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  57. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  58. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  60. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  61. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  62. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  63. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  64. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  65. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  66. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  67. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  68. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  69. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  70. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  71. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  72. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  73. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  74. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  75. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  76. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  77. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  78. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  79. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  80. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  81. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  82. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  83. package/dist/agent-src/templates/roadmaps.md +97 -3
  84. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  85. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  86. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  87. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  88. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  93. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  94. package/dist/cli/commands/uiAudit.js +124 -5
  95. package/dist/cli/registry.js +2 -0
  96. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  97. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  98. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  99. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  100. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  101. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  102. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  103. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  104. package/dist/cli-delegate/cmd_conformance.js +42 -10
  105. package/dist/cli-delegate/cmd_doctor.js +3 -3
  106. package/dist/cli-delegate/cmd_export.js +3 -2
  107. package/dist/cli-delegate/cmd_fleet.js +2 -2
  108. package/dist/cli-delegate/cmd_handoff.js +1 -1
  109. package/dist/cli-delegate/cmd_preflight.js +2 -2
  110. package/dist/cli-delegate/cmd_prune.js +3 -2
  111. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  112. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  113. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  114. package/dist/cli-delegate/cmd_sync.js +3 -2
  115. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  116. package/dist/cli-delegate/cmd_validate.js +3 -2
  117. package/dist/discovery/deprecation-report.md +1 -1
  118. package/dist/discovery/discovery-manifest.json +57 -57
  119. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  120. package/dist/discovery/discovery-manifest.summary.md +1 -1
  121. package/dist/discovery/dormancy-report.md +1 -1
  122. package/dist/discovery/orphan-report.md +1 -1
  123. package/dist/discovery/packs.json +2 -2
  124. package/dist/discovery/trust-report.md +1 -1
  125. package/dist/discovery/workspaces.json +2 -2
  126. package/dist/hooks/dispatch.js +1836 -712
  127. package/dist/install/claudeRuleRewrite.js +254 -0
  128. package/dist/install/detect.js +29 -16
  129. package/dist/install/detect_php_shape.js +159 -0
  130. package/dist/install/install.mjs +634 -428
  131. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  132. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  133. package/dist/mcp/registry-manifest.json +3 -3
  134. package/dist/mcp/server.json +3 -3
  135. package/dist/mcp/server.mjs +4818 -2645
  136. package/dist/server/schemas/settings.js +3 -0
  137. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  138. package/dist/ui/index.html +1 -1
  139. package/docs/MIGRATION.md +1 -1
  140. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  141. package/docs/contracts/provider-lifecycle.md +1 -1
  142. package/docs/contracts/settings-classes.md +10 -4
  143. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  144. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  145. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  146. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  147. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  148. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  149. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  150. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  151. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  152. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  153. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  154. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  155. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  156. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  157. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  158. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  159. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  160. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  161. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  162. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  163. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  164. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  165. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  166. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  167. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  168. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  169. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  170. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  171. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  172. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  173. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  174. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  175. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  176. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  177. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  178. package/docs/guidelines/augment-portability-patterns.md +6 -4
  179. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  180. package/docs/guidelines/cross-role-handoff.md +2 -2
  181. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  182. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  183. package/docs/guidelines/php/database.md +90 -7
  184. package/docs/guidelines/prompt-templates.md +7 -7
  185. package/llms.txt +2 -2
  186. package/package.json +5 -2
  187. package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  188. package/src/agent-src/scripts/guarded_baseline.ts +328 -0
  189. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  190. package/src/agent-src/scripts/stub_queue.ts +82 -0
  191. package/src/agent-src/scripts/stubs_due.ts +400 -0
  192. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  193. package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
  194. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  195. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  196. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  197. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  198. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  199. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  202. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  203. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  204. package/src/config/agent-settings.template.yml +32 -3
  205. package/src/config/assurance-capability-registry.json +21 -9
  206. package/src/config/canonical-terms.yml +119 -0
  207. package/src/config/capability-native-outcome-bars.json +81 -0
  208. package/src/config/ci-local-parity.yml +80 -0
  209. package/src/config/drafting-channels.yml +43 -0
  210. package/src/config/estate-count-budget.json +38 -36
  211. package/src/config/evaluator-budgets.json +14 -14
  212. package/src/config/gate-coverage.yml +579 -63
  213. package/src/config/gate-reachability-exemptions.json +21 -0
  214. package/src/config/gate-violation-baselines.json +37 -19
  215. package/src/config/harness-evolution-budget.json +25 -0
  216. package/src/config/lapsed-beta-baseline.json +96 -0
  217. package/src/config/memory-twin-verdicts.yml +129 -0
  218. package/src/config/metric-registry.yml +124 -0
  219. package/src/config/pack-size-budget.json +16 -15
  220. package/src/config/preamble-payload-budget.json +8 -8
  221. package/src/config/profiles/balanced.ini +27 -0
  222. package/src/config/profiles/full.ini +27 -0
  223. package/src/config/profiles/minimal.ini +27 -0
  224. package/src/config/publish-surface.json +9 -2
  225. package/src/config/routing-coverage-seed.json +16 -2
  226. package/src/config/rule-stub-ceilings.json +126 -112
  227. package/src/config/turnaround-budget.json +66 -0
  228. package/src/install/claudeRuleRewrite.ts +288 -0
  229. package/src/install/detect.ts +60 -17
  230. package/src/install/detect_php_shape.ts +191 -0
  231. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  232. package/src/scripts/_dispatch.bash +27 -0
  233. package/src/scripts/_lib/activation_ladder.ts +211 -0
  234. package/src/scripts/_lib/activation_states.ts +88 -0
  235. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  236. package/src/scripts/_lib/arith_claims.ts +181 -0
  237. package/src/scripts/_lib/arm_ranking.ts +62 -0
  238. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  239. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  240. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  241. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  242. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  243. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  244. package/src/scripts/_lib/candidate_record.ts +601 -0
  245. package/src/scripts/_lib/capture_rate.ts +319 -0
  246. package/src/scripts/_lib/collector_denominator.ts +771 -0
  247. package/src/scripts/_lib/collector_record.ts +340 -0
  248. package/src/scripts/_lib/collector_store.ts +664 -0
  249. package/src/scripts/_lib/collector_supervision.ts +827 -0
  250. package/src/scripts/_lib/concern_estate.ts +77 -0
  251. package/src/scripts/_lib/config_chain.ts +477 -0
  252. package/src/scripts/_lib/config_cost.ts +209 -0
  253. package/src/scripts/_lib/council_settings_block.ts +6 -0
  254. package/src/scripts/_lib/curator_ops.ts +172 -0
  255. package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
  256. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  257. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  258. package/src/scripts/_lib/empty_cycles.ts +88 -0
  259. package/src/scripts/_lib/eval_publication.ts +354 -0
  260. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  261. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  262. package/src/scripts/_lib/evidence_basis.ts +118 -0
  263. package/src/scripts/_lib/exec_evidence.ts +8 -0
  264. package/src/scripts/_lib/experience_card.ts +272 -0
  265. package/src/scripts/_lib/experience_report.ts +151 -0
  266. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  267. package/src/scripts/_lib/generated_by.ts +66 -0
  268. package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
  269. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  270. package/src/scripts/_lib/host_denominator.ts +687 -0
  271. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  272. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  273. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  274. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  275. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  276. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  277. package/src/scripts/_lib/loop_guards.ts +299 -0
  278. package/src/scripts/_lib/loss_class.ts +129 -0
  279. package/src/scripts/_lib/machine_wake.ts +51 -0
  280. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  281. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  282. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  283. package/src/scripts/_lib/orchestration_record.ts +253 -5
  284. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  285. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  286. package/src/scripts/_lib/paired_stats.ts +245 -0
  287. package/src/scripts/_lib/paired_verdict.ts +226 -0
  288. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  289. package/src/scripts/_lib/privacy_class.ts +47 -0
  290. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  291. package/src/scripts/_lib/repeated_failure.ts +105 -0
  292. package/src/scripts/_lib/repo_root.ts +111 -0
  293. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  294. package/src/scripts/_lib/role_split.ts +338 -0
  295. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  296. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  297. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  298. package/src/scripts/_lib/source_digest.ts +200 -0
  299. package/src/scripts/_lib/source_redact.ts +260 -0
  300. package/src/scripts/_lib/source_shape.ts +502 -0
  301. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  302. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  303. package/src/scripts/_lib/strip_comments.mjs +65 -0
  304. package/src/scripts/_lib/test_red_state.ts +154 -0
  305. package/src/scripts/_lib/trigger_shift.ts +144 -0
  306. package/src/scripts/_lib/untrusted_content.ts +82 -7
  307. package/src/scripts/adoption_report.ts +1 -1
  308. package/src/scripts/adr/evidence_census.ts +1 -1
  309. package/src/scripts/adr/regenerate_index.ts +26 -2
  310. package/src/scripts/adr_cite_check.ts +164 -1
  311. package/src/scripts/ai_council/blind_review.ts +11 -1
  312. package/src/scripts/ai_council/clients.ts +4 -0
  313. package/src/scripts/ai_council/config.ts +3 -0
  314. package/src/scripts/ai_council/consensus.ts +28 -8
  315. package/src/scripts/ai_council/consensus_round.ts +226 -0
  316. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  317. package/src/scripts/ai_council/inline_findings.ts +340 -0
  318. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  319. package/src/scripts/ai_council/orchestrator.ts +16 -203
  320. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  321. package/src/scripts/ai_council/pricing.ts +106 -0
  322. package/src/scripts/ai_council/prompts.ts +74 -7
  323. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  324. package/src/scripts/ai_council/py_format.ts +14 -3
  325. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  326. package/src/scripts/ai_council/response_record.ts +50 -0
  327. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  328. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  329. package/src/scripts/asset_delivery_ledger.ts +157 -0
  330. package/src/scripts/attest_artifact.ts +193 -0
  331. package/src/scripts/audit_auto_rules.ts +2 -1
  332. package/src/scripts/audit_command_surface.ts +1 -1
  333. package/src/scripts/audit_mcp_tools.ts +2 -2
  334. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  335. package/src/scripts/audit_user_type_axis.ts +2 -1
  336. package/src/scripts/bench_ab_clone.ts +215 -10
  337. package/src/scripts/bench_ab_integrity.ts +119 -5
  338. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  339. package/src/scripts/build_archive_index.ts +1 -1
  340. package/src/scripts/build_linear_digest.ts +1 -1
  341. package/src/scripts/build_proof.ts +11 -4
  342. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  343. package/src/scripts/build_source_digests.ts +157 -0
  344. package/src/scripts/cache_realization_report.ts +103 -0
  345. package/src/scripts/check_adr_frontmatter.ts +126 -0
  346. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  347. package/src/scripts/check_beta_review_markers.ts +235 -6
  348. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  349. package/src/scripts/check_claims.ts +576 -6
  350. package/src/scripts/check_composite_arming.ts +35 -0
  351. package/src/scripts/check_concern_admissions.ts +365 -0
  352. package/src/scripts/check_enforcement_coverage.ts +28 -0
  353. package/src/scripts/check_estate_count.ts +142 -1
  354. package/src/scripts/check_gate_reachability.ts +383 -0
  355. package/src/scripts/check_host_loadability.ts +104 -0
  356. package/src/scripts/check_loss_class_declared.ts +308 -0
  357. package/src/scripts/check_md_language.ts +15 -98
  358. package/src/scripts/check_memory_proposal.ts +18 -11
  359. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  360. package/src/scripts/check_no_external_sources.ts +281 -6
  361. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  362. package/src/scripts/check_pack_size.ts +59 -2
  363. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  364. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  365. package/src/scripts/check_publish_surface.ts +10 -1
  366. package/src/scripts/check_references.ts +24 -1
  367. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  368. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  369. package/src/scripts/check_score_contract.ts +26 -3
  370. package/src/scripts/check_static_parity.ts +285 -0
  371. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  372. package/src/scripts/check_suppression_hygiene.ts +15 -0
  373. package/src/scripts/ci_settle.ts +39 -2
  374. package/src/scripts/code_graph/build.ts +60 -3
  375. package/src/scripts/code_graph/extract.ts +44 -0
  376. package/src/scripts/code_graph/types.ts +24 -0
  377. package/src/scripts/collector_daemon.ts +714 -0
  378. package/src/scripts/config_cost_report.ts +302 -0
  379. package/src/scripts/consumer_matrix.ts +74 -1
  380. package/src/scripts/cost/budget.mjs +10 -3
  381. package/src/scripts/cost/track.mjs +10 -3
  382. package/src/scripts/council_cli.ts +37 -54
  383. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  384. package/src/scripts/evolution_lab.ts +980 -0
  385. package/src/scripts/external_sources_denylist.json +5 -18
  386. package/src/scripts/extract_audit_patterns.ts +21 -0
  387. package/src/scripts/fold_intake.ts +12 -1
  388. package/src/scripts/gen_discovery_baseline.ts +1 -1
  389. package/src/scripts/generate_capabilities_index.ts +12 -5
  390. package/src/scripts/generate_capability_matrix.ts +3 -3
  391. package/src/scripts/generate_command_flows.ts +2 -2
  392. package/src/scripts/generate_cookbook.ts +2 -2
  393. package/src/scripts/generate_index.ts +8 -1
  394. package/src/scripts/generate_knowledge_index.ts +2 -1
  395. package/src/scripts/generate_ownership_matrix.ts +2 -1
  396. package/src/scripts/generate_pack_manifests.ts +10 -2
  397. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  398. package/src/scripts/generate_settings_reference.ts +1 -1
  399. package/src/scripts/git_authorization_hook.ts +22 -1
  400. package/src/scripts/grade_target_readiness.ts +48 -5
  401. package/src/scripts/hook_effect_doctor.ts +261 -0
  402. package/src/scripts/hook_manifest.json +1 -1
  403. package/src/scripts/hook_manifest.yaml +98 -11
  404. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  405. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  406. package/src/scripts/hooks/concern_registry.ts +4 -0
  407. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  408. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  409. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  410. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  411. package/src/scripts/hooks/shims/install.sh +61 -0
  412. package/src/scripts/hooks/shims/php +101 -0
  413. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  414. package/src/scripts/hot_context_hook.ts +16 -0
  415. package/src/scripts/install-hooks.sh +20 -5
  416. package/src/scripts/install.ts +17 -35
  417. package/src/scripts/inventory_frontmatter.ts +2 -1
  418. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  419. package/src/scripts/lint_canonical_terms.ts +604 -0
  420. package/src/scripts/lint_composition_review.ts +619 -0
  421. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  422. package/src/scripts/lint_eval_specs.ts +593 -0
  423. package/src/scripts/lint_hook_manifest.ts +19 -0
  424. package/src/scripts/lint_host_portability.ts +373 -0
  425. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  426. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  427. package/src/scripts/lint_metric_consumers.ts +355 -0
  428. package/src/scripts/lint_skill_descriptions.ts +18 -1
  429. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  430. package/src/scripts/lint_skill_link_reach.ts +252 -0
  431. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  432. package/src/scripts/lint_ticket_buildable.ts +17 -1
  433. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  434. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  435. package/src/scripts/measure_docs_dead_links.ts +348 -0
  436. package/src/scripts/measure_host_capture.ts +461 -0
  437. package/src/scripts/migration_status.ts +3 -3
  438. package/src/scripts/model_rule_injection.ts +60 -0
  439. package/src/scripts/orchestration_record.ts +14 -0
  440. package/src/scripts/preamble_byte_census.ts +139 -10
  441. package/src/scripts/prepack-check.mjs +4 -1
  442. package/src/scripts/probe_turnaround.ts +384 -0
  443. package/src/scripts/probe_unblocked_ask.ts +279 -0
  444. package/src/scripts/render_benchmark_md.ts +1 -1
  445. package/src/scripts/rule_activation_census.ts +70 -9
  446. package/src/scripts/rule_backlinks.ts +1 -1
  447. package/src/scripts/run_lifecycle_suite.ts +208 -0
  448. package/src/scripts/run_skill_evals.ts +40 -0
  449. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  450. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  451. package/src/scripts/schemas/evals.schema.json +24 -1
  452. package/src/scripts/schemas/rule.schema.json +52 -1
  453. package/src/scripts/schemas/skill.schema.json +17 -2
  454. package/src/scripts/skill_overlap.ts +7 -1
  455. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  456. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  457. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  458. package/src/scripts/skill_usage_report.ts +2 -1
  459. package/src/scripts/stubs_due.ts +211 -0
  460. package/src/scripts/sweep_source_surfaces.ts +678 -0
  461. package/src/scripts/sync_pr_branch.ts +3 -3
  462. package/src/scripts/trigger_eval_grandfather.json +202 -222
  463. package/src/scripts/utilization_report.ts +22 -2
  464. package/src/server/schemas/settings.ts +5 -0
  465. package/src/templates/marketing-copy.yml +1 -1
  466. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -71,7 +71,14 @@ import * as path from 'node:path';
71
71
  import process from 'node:process';
72
72
  import { fileURLToPath } from 'node:url';
73
73
 
74
- import { OVERLAP_THRESHOLD, _cosine, collect } from './audit_skill_overlap.js';
74
+ import {
75
+ ALLOWLIST as OVERLAP_ALLOWLIST,
76
+ OVERLAP_THRESHOLD,
77
+ _cosine,
78
+ _loadAllowlist,
79
+ _pairKey,
80
+ collect,
81
+ } from './audit_skill_overlap.js';
75
82
  import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
76
83
  import { parse_frontmatter } from './skill_overlap.js';
77
84
 
@@ -168,9 +175,18 @@ const QUOTED_PHRASE_RE = /['"`][^'"`]{3,}['"`]/;
168
175
  * Uses the canonical instrument, not a second implementation — one metric, one
169
176
  * threshold, one answer. Cross-pack pairs are excluded for the same reason a
170
177
  * cross-pack merge is out of scope: they do not compete for the same install.
178
+ *
179
+ * "One answer" includes the canonical EXCEPTIONS. A pair in
180
+ * `audit_skill_overlap_allowlist.json` is one a human read both sides of and
181
+ * ruled structural — shared domain vocabulary, distinct responsibility. Reading
182
+ * the same metric at the same threshold while ignoring its reviewed exceptions
183
+ * would be a second implementation wearing the first one's numbers, and it
184
+ * would ask an author to satisfy (e)/(f) for an overlap the project already
185
+ * decided is not a routing hazard.
171
186
  */
172
187
  function computeClusters(root: string, threshold: number = OVERLAP_THRESHOLD): Map<string, string[]> {
173
188
  const clusters = new Map<string, string[]>();
189
+ const reviewed = _loadAllowlist(OVERLAP_ALLOWLIST);
174
190
  const skills = collect(root).map((s) => ({
175
191
  slug: path.basename(path.dirname(s.relpath)),
176
192
  packs: s.packs,
@@ -189,6 +205,7 @@ function computeClusters(root: string, threshold: number = OVERLAP_THRESHOLD): M
189
205
  }
190
206
  if (!sharesPack) continue;
191
207
  if (_cosine(a.vector, b.vector) < threshold) continue;
208
+ if (reviewed.has(_pairKey(a.slug, b.slug))) continue;
192
209
  clusters.set(a.slug, [...(clusters.get(a.slug) ?? []), b.slug]);
193
210
  clusters.set(b.slug, [...(clusters.get(b.slug) ?? []), a.slug]);
194
211
  }
@@ -115,6 +115,28 @@ function _exec_block(body: ReadonlyArray<[number, string]>): Record<string, [num
115
115
  return out;
116
116
  }
117
117
 
118
+
119
+ /**
120
+ * Which grant key is legal on this artefact's surface.
121
+ *
122
+ * `road-to-skill-ecosystem-runtime-enforcement` Phase 3 Step 6. The failure this
123
+ * catches is silent by construction: **a loader ignores an unrecognised
124
+ * frontmatter key**, so a tool restriction written on the wrong surface parses
125
+ * fine, restricts nothing, and the artefact inherits every tool. A parse success
126
+ * is not a restriction — and nothing in the tree said so before this check.
127
+ *
128
+ * - `src/subagents/*.md` — subagent-v1 (`subagent.schema.json`) grants with a
129
+ * TOP-LEVEL `tools:`. It has no `execution:` block at all.
130
+ * - everything else (skills, commands, domain artefacts) — grants live under
131
+ * `execution.allowed_tools`, or as the consumer-format `allowed-tools`.
132
+ * A top-level `tools:` here is read by nothing.
133
+ */
134
+ export type GrantSurface = 'subagent' | 'skill-like';
135
+
136
+ export function grantSurface(rel: string): GrantSurface {
137
+ return rel.replace(/\\/g, '/').includes('src/subagents/') ? 'subagent' : 'skill-like';
138
+ }
139
+
118
140
  export function _scan(sf: sl.ScannedFile): sl.Finding[] {
119
141
  if (sf.pragma_allows(CHECK)) {
120
142
  return [];
@@ -130,6 +152,42 @@ export function _scan(sf: sl.ScannedFile): sl.Finding[] {
130
152
  const handler = _stripQuotes((ex['handler'] ?? [0, ''])[1]);
131
153
  const is_execution_skill = Object.keys(ex).length > 0 && handler !== '' && handler !== 'none';
132
154
 
155
+ // Wrong-surface tool restrictions. A key the loader does not recognise is
156
+ // IGNORED, so the artefact inherits everything — the restriction reads as
157
+ // present and is not. Both directions are checked, because both have a
158
+ // plausible author: a skill copying a subagent's `tools:` list, and a
159
+ // subagent copying a skill's `execution:` block.
160
+ const surface = grantSurface(sf.rel);
161
+ for (const [lineno, text] of body) {
162
+ if (surface === 'skill-like' && _RE_TOOLS_KEY.test(text)) {
163
+ out.push(
164
+ new sl.Finding(
165
+ sf.rel,
166
+ lineno,
167
+ CHECK,
168
+ 'HIGH',
169
+ 'top-level `tools:` on a non-subagent surface — subagent-v1 only; ' +
170
+ 'the loader ignores it here, so this artefact is NOT restricted ' +
171
+ '(use execution.allowed_tools)',
172
+ sf.weight,
173
+ ),
174
+ );
175
+ }
176
+ if (surface === 'subagent' && _RE_EXECUTION.test(text)) {
177
+ out.push(
178
+ new sl.Finding(
179
+ sf.rel,
180
+ lineno,
181
+ CHECK,
182
+ 'HIGH',
183
+ '`execution:` block on a subagent definition — subagent-v1 has no such ' +
184
+ 'key, so any allowed_tools under it restricts nothing (use top-level `tools:`)',
185
+ sf.weight,
186
+ ),
187
+ );
188
+ }
189
+ }
190
+
133
191
  // consumer consent-bypass header + wildcard `allowed-tools` (hyphen = Claude
134
192
  // format; the underscore source key is covered by the execution block below).
135
193
  for (const [lineno, text] of body) {
@@ -0,0 +1,252 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Cross-skill body links resolve inside the tree a consumer receives.
4
+ *
5
+ * `road-to-inbox-harvest-2026-08-f-skill-selection-evidence` Phase 2.2.
6
+ *
7
+ * ── Why the DELIVERED tree and not `src/` ───────────────────────────────────
8
+ * `check_references` already walks `dist/agent-src` and reports a broken path.
9
+ * What it cannot answer is the question a consumer has: *does this link resolve
10
+ * in the tree I was given*. A link is not broken because its target is missing
11
+ * from the repository — it is broken because the target is missing from the
12
+ * SUBSET that shipped, and those are different failures with different fixes.
13
+ *
14
+ * So the corpus is `dist/agent-src/skills`, which is what the installer
15
+ * deploys. Not `src/skills`, whose contents a consumer never sees, and
16
+ * deliberately not per-pack: the roadmap's own step leaves the per-pack half to
17
+ * a parked owner, and a check that silently widened to it would be answering a
18
+ * question nobody asked here.
19
+ *
20
+ * ── The pattern, and the two links a tighter one misses ─────────────────────
21
+ * `](../<slug>/SKILL.md` — no trailing `\)`. With the paren the count is 974
22
+ * rather than 976, because two links carry an anchor (`SKILL.md#section`). That
23
+ * is the measurement note Phase 2.1 records, and it is the reason this gate does
24
+ * not close the pattern: a two-link blind spot in a link checker is a link
25
+ * checker that reports clean while missing exactly the shape most likely to rot.
26
+ *
27
+ * Exit codes: 0 clean · 1 unresolved link(s) · 2 usage / dead corpus.
28
+ */
29
+ import * as fs from 'node:fs';
30
+ import * as path from 'node:path';
31
+ import process from 'node:process';
32
+ import { fileURLToPath, pathToFileURL } from 'node:url';
33
+
34
+ import { GateLedger } from './_lib/gate_ledger.js';
35
+ import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
36
+ import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
37
+
38
+ const _HERE = fileURLToPath(import.meta.url);
39
+ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
40
+
41
+ /** The delivered skills tree — what the installer deploys. */
42
+ export const DELIVERED_SKILLS_ROOT = 'dist/agent-src/skills';
43
+
44
+ /**
45
+ * A relative cross-skill body link.
46
+ *
47
+ * Deliberately NOT anchored on a closing paren — see the header. An anchor
48
+ * suffix (`SKILL.md#heading`) is a link like any other and must resolve.
49
+ */
50
+ const CROSS_SKILL_LINK = /\]\(\.\.\/([a-z0-9-]+)\/SKILL\.md/g;
51
+
52
+ export interface UnresolvedLink {
53
+ /** Skill whose body carries the link. */
54
+ from: string;
55
+ /** Slug the link points at. */
56
+ to: string;
57
+ }
58
+
59
+ export interface ReachReport {
60
+ /** Skills present in the delivered tree. */
61
+ delivered: number;
62
+ /** Cross-skill links examined. */
63
+ links: number;
64
+ unresolved: UnresolvedLink[];
65
+ }
66
+
67
+ /** Every skill directory in the delivered tree. */
68
+ export function deliveredSkills(root: string): string[] {
69
+ const dir = path.join(root, DELIVERED_SKILLS_ROOT);
70
+ try {
71
+ return fs
72
+ .readdirSync(dir, { withFileTypes: true })
73
+ .filter((e) => e.isDirectory())
74
+ .map((e) => e.name)
75
+ .sort();
76
+ } catch {
77
+ return [];
78
+ }
79
+ }
80
+
81
+ /** Check every delivered skill's body links against the delivered set. */
82
+ export function run(root: string, ledger?: GateLedger): ReachReport {
83
+ const slugs = deliveredSkills(root);
84
+ const present = new Set(slugs);
85
+ const unresolved: UnresolvedLink[] = [];
86
+ let links = 0;
87
+ for (const slug of slugs) {
88
+ ledger?.plan(slug);
89
+ const file = path.join(root, DELIVERED_SKILLS_ROOT, slug, 'SKILL.md');
90
+ let source: string;
91
+ try {
92
+ source = fs.readFileSync(file, 'utf-8');
93
+ } catch {
94
+ // A skill directory with no SKILL.md carries no body links. Recorded
95
+ // as a skip rather than silently completed, so the ledger's planned
96
+ // count stays honest about what was actually read.
97
+ ledger?.skip(slug, 'no_applicable_files');
98
+ continue;
99
+ }
100
+ let bad = 0;
101
+ for (const m of source.matchAll(CROSS_SKILL_LINK)) {
102
+ links += 1;
103
+ const target = m[1] as string;
104
+ if (!present.has(target)) {
105
+ unresolved.push({ from: slug, to: target });
106
+ bad += 1;
107
+ }
108
+ }
109
+ if (bad > 0) ledger?.fail(slug, `${String(bad)} unresolved cross-skill link(s)`);
110
+ else ledger?.complete(slug);
111
+ }
112
+ return { delivered: slugs.length, links, unresolved };
113
+ }
114
+
115
+ /** Self-test. The rejecting case is a link to a skill that is not delivered. */
116
+ function selfTest(): number {
117
+ const tmp = fs.mkdtempSync(path.join(REPO_ROOT, '.link-reach-selftest-'));
118
+ const mk = (slug: string, body: string): void => {
119
+ const d = path.join(tmp, DELIVERED_SKILLS_ROOT, slug);
120
+ fs.mkdirSync(d, { recursive: true });
121
+ fs.writeFileSync(path.join(d, 'SKILL.md'), body, 'utf-8');
122
+ };
123
+ const fresh = (): void => {
124
+ fs.rmSync(path.join(tmp, 'dist'), { recursive: true, force: true });
125
+ };
126
+ const invoke = (): number =>
127
+ runGateCli(REPO_ROOT, 'src/scripts/lint_skill_link_reach.ts', ['--root', tmp, '--quiet'], REPO_ROOT);
128
+ try {
129
+ return runSelfTest({
130
+ gate: 'lint_skill_link_reach',
131
+ minCases: 4,
132
+ minRejectCases: 2,
133
+ cases: [
134
+ {
135
+ name: 'a link to a skill that is NOT delivered is rejected',
136
+ expect: 'reject',
137
+ run: () => {
138
+ fresh();
139
+ mk('a', 'see [b](../b/SKILL.md)\n');
140
+ return invoke();
141
+ },
142
+ },
143
+ {
144
+ name: 'a link carrying an ANCHOR is checked too — the two-link blind spot',
145
+ expect: 'reject',
146
+ run: () => {
147
+ fresh();
148
+ mk('a', 'see [b](../b/SKILL.md#some-heading)\n');
149
+ return invoke();
150
+ },
151
+ },
152
+ {
153
+ name: 'a link to a delivered skill is accepted',
154
+ expect: 'accept',
155
+ run: () => {
156
+ fresh();
157
+ mk('a', 'see [b](../b/SKILL.md)\n');
158
+ mk('b', 'body\n');
159
+ return invoke();
160
+ },
161
+ },
162
+ {
163
+ name: 'an empty delivered tree is REFUSED, not passed',
164
+ expect: 'reject',
165
+ run: () => {
166
+ fresh();
167
+ fs.mkdirSync(path.join(tmp, DELIVERED_SKILLS_ROOT), { recursive: true });
168
+ return invoke();
169
+ },
170
+ },
171
+ ],
172
+ });
173
+ } finally {
174
+ fs.rmSync(tmp, { recursive: true, force: true });
175
+ }
176
+ }
177
+
178
+ export function main(argv: string[] = process.argv.slice(2)): number {
179
+ if (argv.includes('--self-test')) {
180
+ if (process.env['GATE_SELF_TEST_CHILD'] === '1') {
181
+ process.stderr.write('lint_skill_link_reach: --self-test must not recurse\n');
182
+ return 2;
183
+ }
184
+ return selfTest();
185
+ }
186
+ const rootIdx = argv.indexOf('--root');
187
+ const rootArg = rootIdx >= 0 ? argv[rootIdx + 1] : undefined;
188
+ const root = rootArg === undefined ? REPO_ROOT : path.resolve(rootArg);
189
+ const quiet = argv.includes('--quiet');
190
+ const isFixture = root !== REPO_ROOT;
191
+
192
+ const ledger = isFixture ? undefined : new GateLedger('lint_skill_link_reach');
193
+ const report = run(root, ledger);
194
+
195
+ const sink = (chunk: string): boolean => {
196
+ if (!quiet) process.stdout.write(chunk);
197
+ return true;
198
+ };
199
+ try {
200
+ reportScanned(
201
+ {
202
+ gate: 'lint_skill_link_reach',
203
+ scanned: report.delivered,
204
+ units: 'delivered skill(s)',
205
+ roots: [DELIVERED_SKILLS_ROOT],
206
+ },
207
+ sink,
208
+ );
209
+ } catch (e) {
210
+ if (e instanceof DeadScopeError) {
211
+ process.stderr.write(`❌ ${e.message}\n`);
212
+ return 2;
213
+ }
214
+ throw e;
215
+ }
216
+
217
+ if (report.unresolved.length > 0) {
218
+ if (!quiet) {
219
+ process.stderr.write(
220
+ `❌ lint_skill_link_reach: ${String(report.unresolved.length)} cross-skill link(s) ` +
221
+ `do not resolve inside ${DELIVERED_SKILLS_ROOT}:\n`,
222
+ );
223
+ for (const u of report.unresolved) {
224
+ process.stderr.write(` ${u.from}/SKILL.md → ../${u.to}/SKILL.md (not delivered)\n`);
225
+ }
226
+ process.stderr.write(
227
+ ' A consumer following that link gets a 404. Either the target belongs in the\n' +
228
+ ' delivered set, or the link should point at something that is.\n',
229
+ );
230
+ }
231
+ ledger?.report(quiet ? () => undefined : undefined);
232
+ return 1;
233
+ }
234
+ ledger?.report(quiet ? () => undefined : undefined);
235
+ if (!quiet) {
236
+ process.stdout.write(
237
+ `✅ lint_skill_link_reach: ${String(report.links)} cross-skill link(s) across ` +
238
+ `${String(report.delivered)} delivered skill(s) all resolve.\n`,
239
+ );
240
+ }
241
+ return 0;
242
+ }
243
+
244
+ /* c8 ignore start */
245
+ function isCliEntry(): boolean {
246
+ if (process.argv[1] === undefined) return false;
247
+ return pathToFileURL(path.resolve(process.argv[1])).href === pathToFileURL(_HERE).href;
248
+ }
249
+ if (isCliEntry()) {
250
+ process.exit(main());
251
+ }
252
+ /* c8 ignore stop */