@event4u/agent-config 14.12.0 → 14.14.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 (521) 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 +118 -155
  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 +145 -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-comment-discipline.md +6 -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 +252 -8
  47. package/dist/agent-src/scripts/guarded_baseline.ts +343 -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 +516 -0
  51. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  52. package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
  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/database/SKILL.md +8 -0
  57. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  58. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  59. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  60. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  61. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  62. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  63. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  64. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  65. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  66. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  67. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  68. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  69. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  70. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  71. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  72. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  73. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  74. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  75. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  76. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  77. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  78. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  79. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  80. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  81. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  82. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  83. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  84. package/dist/agent-src/templates/roadmaps.md +97 -3
  85. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  86. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  87. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  88. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  93. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  94. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  95. package/dist/cli/commands/uiAudit.js +124 -5
  96. package/dist/cli/registry.js +2 -0
  97. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  98. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  99. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  100. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  101. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  102. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  103. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  104. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  105. package/dist/cli-delegate/cmd_conformance.js +80 -11
  106. package/dist/cli-delegate/cmd_doctor.js +3 -3
  107. package/dist/cli-delegate/cmd_export.js +3 -2
  108. package/dist/cli-delegate/cmd_fleet.js +2 -2
  109. package/dist/cli-delegate/cmd_handoff.js +1 -1
  110. package/dist/cli-delegate/cmd_preflight.js +2 -2
  111. package/dist/cli-delegate/cmd_prune.js +3 -2
  112. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  113. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  114. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  115. package/dist/cli-delegate/cmd_sync.js +3 -2
  116. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  117. package/dist/cli-delegate/cmd_validate.js +3 -2
  118. package/dist/discovery/deprecation-report.md +1 -1
  119. package/dist/discovery/discovery-manifest.json +58 -58
  120. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  121. package/dist/discovery/discovery-manifest.summary.md +1 -1
  122. package/dist/discovery/dormancy-report.md +1 -1
  123. package/dist/discovery/orphan-report.md +1 -1
  124. package/dist/discovery/packs.json +2 -2
  125. package/dist/discovery/trust-report.md +1 -1
  126. package/dist/discovery/workspaces.json +2 -2
  127. package/dist/hooks/dispatch.js +2900 -1049
  128. package/dist/install/claudeRuleRewrite.js +254 -0
  129. package/dist/install/detect.js +29 -16
  130. package/dist/install/detect_php_shape.js +159 -0
  131. package/dist/install/install.mjs +634 -428
  132. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  133. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  134. package/dist/mcp/registry-manifest.json +3 -3
  135. package/dist/mcp/server.json +3 -3
  136. package/dist/mcp/server.mjs +4895 -2627
  137. package/dist/server/schemas/settings.js +3 -0
  138. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  139. package/dist/ui/index.html +1 -1
  140. package/docs/MIGRATION.md +1 -1
  141. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  142. package/docs/contracts/provider-lifecycle.md +1 -1
  143. package/docs/contracts/settings-classes.md +10 -4
  144. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  145. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  146. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  147. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  148. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  149. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  150. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  151. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  152. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  153. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  154. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  155. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  156. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  157. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  158. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  159. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  160. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  161. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  162. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  163. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  164. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  165. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  166. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  167. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  168. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  169. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  170. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  171. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  172. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  173. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  174. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  175. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  176. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  177. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  178. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  179. package/docs/guidelines/augment-portability-patterns.md +6 -4
  180. package/docs/guidelines/code-clarity.md +18 -0
  181. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  182. package/docs/guidelines/cross-role-handoff.md +2 -2
  183. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  184. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  185. package/docs/guidelines/php/database.md +90 -7
  186. package/docs/guidelines/prompt-templates.md +7 -7
  187. package/llms.txt +2 -2
  188. package/package.json +5 -2
  189. package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
  190. package/src/agent-src/scripts/guarded_baseline.ts +343 -0
  191. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  192. package/src/agent-src/scripts/stub_queue.ts +82 -0
  193. package/src/agent-src/scripts/stubs_due.ts +516 -0
  194. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  195. package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
  196. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  197. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  198. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  199. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  202. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  203. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  204. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  205. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  206. package/src/config/agent-settings.template.yml +32 -3
  207. package/src/config/assurance-capability-registry.json +21 -9
  208. package/src/config/canonical-terms.yml +119 -0
  209. package/src/config/capability-native-outcome-bars.json +81 -0
  210. package/src/config/ci-local-parity.yml +80 -0
  211. package/src/config/drafting-channels.yml +43 -0
  212. package/src/config/estate-count-budget.json +57 -36
  213. package/src/config/evaluator-budgets.json +14 -14
  214. package/src/config/gate-coverage.yml +729 -63
  215. package/src/config/gate-reachability-exemptions.json +21 -0
  216. package/src/config/gate-violation-baselines.json +42 -19
  217. package/src/config/harness-evolution-budget.json +25 -0
  218. package/src/config/lapsed-beta-baseline.json +96 -0
  219. package/src/config/memory-twin-verdicts.yml +129 -0
  220. package/src/config/metric-registry.yml +124 -0
  221. package/src/config/pack-size-budget.json +16 -15
  222. package/src/config/preamble-payload-budget.json +12 -4
  223. package/src/config/profiles/balanced.ini +27 -0
  224. package/src/config/profiles/full.ini +27 -0
  225. package/src/config/profiles/minimal.ini +27 -0
  226. package/src/config/publish-surface.json +9 -2
  227. package/src/config/routing-coverage-seed.json +16 -2
  228. package/src/config/rule-stub-ceilings.json +133 -112
  229. package/src/config/turnaround-budget.json +66 -0
  230. package/src/install/claudeRuleRewrite.ts +288 -0
  231. package/src/install/detect.ts +60 -17
  232. package/src/install/detect_php_shape.ts +191 -0
  233. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  234. package/src/scripts/_dispatch.bash +23 -0
  235. package/src/scripts/_lib/activation_ladder.ts +255 -0
  236. package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
  237. package/src/scripts/_lib/activation_states.ts +88 -0
  238. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  239. package/src/scripts/_lib/adr_frontmatter.ts +26 -0
  240. package/src/scripts/_lib/arith_claims.ts +181 -0
  241. package/src/scripts/_lib/arm_ranking.ts +62 -0
  242. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  243. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  244. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  245. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  246. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  247. package/src/scripts/_lib/candidate_pair_delta.ts +349 -0
  248. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  249. package/src/scripts/_lib/candidate_record.ts +601 -0
  250. package/src/scripts/_lib/capture_rate.ts +319 -0
  251. package/src/scripts/_lib/carrier_status.ts +118 -0
  252. package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -0
  253. package/src/scripts/_lib/collector_denominator.ts +771 -0
  254. package/src/scripts/_lib/collector_record.ts +340 -0
  255. package/src/scripts/_lib/collector_store.ts +664 -0
  256. package/src/scripts/_lib/collector_supervision.ts +827 -0
  257. package/src/scripts/_lib/concern_estate.ts +77 -0
  258. package/src/scripts/_lib/config_chain.ts +477 -0
  259. package/src/scripts/_lib/config_cost.ts +209 -0
  260. package/src/scripts/_lib/corpus_manifest.ts +726 -0
  261. package/src/scripts/_lib/council_settings_block.ts +6 -0
  262. package/src/scripts/_lib/curator_ops.ts +172 -0
  263. package/src/scripts/_lib/delivery_arm_experiment.ts +282 -0
  264. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  265. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  266. package/src/scripts/_lib/empty_cycles.ts +88 -0
  267. package/src/scripts/_lib/estate_carrier_cases.ts +72 -0
  268. package/src/scripts/_lib/eval_publication.ts +354 -0
  269. package/src/scripts/_lib/evaluation_cascade.ts +452 -0
  270. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  271. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  272. package/src/scripts/_lib/evidence_basis.ts +118 -0
  273. package/src/scripts/_lib/evolution_roi.ts +562 -0
  274. package/src/scripts/_lib/exec_evidence.ts +8 -0
  275. package/src/scripts/_lib/experience_card.ts +272 -0
  276. package/src/scripts/_lib/experience_report.ts +151 -0
  277. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  278. package/src/scripts/_lib/generated_by.ts +66 -0
  279. package/src/scripts/_lib/harness_evolution_guards.ts +239 -0
  280. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  281. package/src/scripts/_lib/host_denominator.ts +687 -0
  282. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  283. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  284. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  285. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  286. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  287. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  288. package/src/scripts/_lib/lexical_shortlist.ts +215 -0
  289. package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
  290. package/src/scripts/_lib/llm_proposer_transport.ts +153 -0
  291. package/src/scripts/_lib/loop_guards.ts +299 -0
  292. package/src/scripts/_lib/loss_class.ts +129 -0
  293. package/src/scripts/_lib/machine_wake.ts +51 -0
  294. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  295. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  296. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  297. package/src/scripts/_lib/orchestration_record.ts +253 -5
  298. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  299. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  300. package/src/scripts/_lib/paired_stats.ts +245 -0
  301. package/src/scripts/_lib/paired_verdict.ts +226 -0
  302. package/src/scripts/_lib/pathology_archive.ts +393 -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/promotion_capability.ts +315 -0
  306. package/src/scripts/_lib/promotion_evidence.ts +414 -0
  307. package/src/scripts/_lib/promotion_review.ts +294 -0
  308. package/src/scripts/_lib/prompt_shape.ts +92 -0
  309. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  310. package/src/scripts/_lib/release_highlights.ts +70 -1
  311. package/src/scripts/_lib/release_material.ts +125 -2
  312. package/src/scripts/_lib/repeated_failure.ts +105 -0
  313. package/src/scripts/_lib/repo_root.ts +111 -0
  314. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  315. package/src/scripts/_lib/role_split.ts +338 -0
  316. package/src/scripts/_lib/routing_corpus.ts +307 -0
  317. package/src/scripts/_lib/routing_index_input.ts +104 -0
  318. package/src/scripts/_lib/rule_injection.ts +22 -1
  319. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  320. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  321. package/src/scripts/_lib/semantic_noop.ts +167 -0
  322. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  323. package/src/scripts/_lib/source_digest.ts +200 -0
  324. package/src/scripts/_lib/source_redact.ts +260 -0
  325. package/src/scripts/_lib/source_shape.ts +502 -0
  326. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  327. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  328. package/src/scripts/_lib/strip_comments.mjs +65 -0
  329. package/src/scripts/_lib/test_red_state.ts +154 -0
  330. package/src/scripts/_lib/trigger_shift.ts +144 -0
  331. package/src/scripts/_lib/untrusted_content.ts +82 -7
  332. package/src/scripts/activation_receipt.ts +258 -0
  333. package/src/scripts/adoption_report.ts +1 -1
  334. package/src/scripts/adr/evidence_census.ts +1 -1
  335. package/src/scripts/adr/regenerate_index.ts +26 -2
  336. package/src/scripts/adr_cite_check.ts +164 -1
  337. package/src/scripts/ai_council/blind_review.ts +11 -1
  338. package/src/scripts/ai_council/clients.ts +4 -0
  339. package/src/scripts/ai_council/config.ts +3 -0
  340. package/src/scripts/ai_council/consensus.ts +28 -8
  341. package/src/scripts/ai_council/consensus_round.ts +226 -0
  342. package/src/scripts/ai_council/cross_exam.ts +128 -0
  343. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  344. package/src/scripts/ai_council/explain_route.ts +157 -0
  345. package/src/scripts/ai_council/information_gain.ts +293 -0
  346. package/src/scripts/ai_council/inline_findings.ts +340 -0
  347. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  348. package/src/scripts/ai_council/leakage_corpus.ts +385 -0
  349. package/src/scripts/ai_council/leakage_patterns.ts +453 -0
  350. package/src/scripts/ai_council/minority_retention.ts +171 -0
  351. package/src/scripts/ai_council/orchestrator.ts +16 -203
  352. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  353. package/src/scripts/ai_council/pricing.ts +106 -0
  354. package/src/scripts/ai_council/prompts.ts +74 -7
  355. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  356. package/src/scripts/ai_council/py_format.ts +14 -3
  357. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  358. package/src/scripts/ai_council/recouncil_savings.ts +299 -0
  359. package/src/scripts/ai_council/replay_route.ts +223 -0
  360. package/src/scripts/ai_council/response_record.ts +50 -0
  361. package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
  362. package/src/scripts/ai_council/routing_training_row.ts +197 -0
  363. package/src/scripts/ai_council/synthesis_strategy.ts +159 -0
  364. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  365. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  366. package/src/scripts/asset_delivery_ledger.ts +157 -0
  367. package/src/scripts/attest_artifact.ts +193 -0
  368. package/src/scripts/audit_auto_rules.ts +2 -1
  369. package/src/scripts/audit_command_surface.ts +1 -1
  370. package/src/scripts/audit_mcp_tools.ts +2 -2
  371. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  372. package/src/scripts/audit_user_type_axis.ts +2 -1
  373. package/src/scripts/bench_ab_clone.ts +215 -10
  374. package/src/scripts/bench_ab_integrity.ts +119 -5
  375. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  376. package/src/scripts/build_archive_index.ts +1 -1
  377. package/src/scripts/build_linear_digest.ts +1 -1
  378. package/src/scripts/build_proof.ts +11 -4
  379. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  380. package/src/scripts/build_source_digests.ts +157 -0
  381. package/src/scripts/cache_realization_report.ts +103 -0
  382. package/src/scripts/check_adr_frontmatter.ts +131 -10
  383. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  384. package/src/scripts/check_beta_review_markers.ts +235 -6
  385. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  386. package/src/scripts/check_claims.ts +576 -6
  387. package/src/scripts/check_composite_arming.ts +35 -0
  388. package/src/scripts/check_concern_admissions.ts +365 -0
  389. package/src/scripts/check_enforcement_coverage.ts +28 -0
  390. package/src/scripts/check_estate_count.ts +347 -25
  391. package/src/scripts/check_gate_reachability.ts +383 -0
  392. package/src/scripts/check_host_loadability.ts +104 -0
  393. package/src/scripts/check_loss_class_declared.ts +308 -0
  394. package/src/scripts/check_md_language.ts +15 -98
  395. package/src/scripts/check_memory_proposal.ts +18 -11
  396. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  397. package/src/scripts/check_no_external_sources.ts +281 -6
  398. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  399. package/src/scripts/check_pack_size.ts +59 -2
  400. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  401. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  402. package/src/scripts/check_publish_surface.ts +10 -1
  403. package/src/scripts/check_references.ts +24 -1
  404. package/src/scripts/check_release_highlights.ts +96 -13
  405. package/src/scripts/check_roadmap_trackable.ts +17 -2
  406. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  407. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  408. package/src/scripts/check_score_contract.ts +26 -3
  409. package/src/scripts/check_static_parity.ts +285 -0
  410. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  411. package/src/scripts/check_suppression_hygiene.ts +15 -0
  412. package/src/scripts/ci_settle.ts +39 -2
  413. package/src/scripts/code_graph/build.ts +60 -3
  414. package/src/scripts/code_graph/extract.ts +44 -0
  415. package/src/scripts/code_graph/types.ts +24 -0
  416. package/src/scripts/collector_daemon.ts +714 -0
  417. package/src/scripts/config_cost_report.ts +302 -0
  418. package/src/scripts/consumer_matrix.ts +74 -1
  419. package/src/scripts/corpus_manifest.ts +235 -0
  420. package/src/scripts/cost/budget.mjs +10 -3
  421. package/src/scripts/cost/track.mjs +10 -3
  422. package/src/scripts/council_cli.ts +37 -54
  423. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  424. package/src/scripts/evolution_lab.ts +1153 -0
  425. package/src/scripts/external_sources_denylist.json +5 -18
  426. package/src/scripts/extract_audit_patterns.ts +21 -0
  427. package/src/scripts/fold_intake.ts +12 -1
  428. package/src/scripts/gen_discovery_baseline.ts +1 -1
  429. package/src/scripts/generate_capabilities_index.ts +12 -5
  430. package/src/scripts/generate_capability_matrix.ts +3 -3
  431. package/src/scripts/generate_command_flows.ts +2 -2
  432. package/src/scripts/generate_cookbook.ts +2 -2
  433. package/src/scripts/generate_index.ts +8 -1
  434. package/src/scripts/generate_knowledge_index.ts +2 -1
  435. package/src/scripts/generate_ownership_matrix.ts +2 -1
  436. package/src/scripts/generate_pack_manifests.ts +10 -2
  437. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  438. package/src/scripts/generate_settings_reference.ts +1 -1
  439. package/src/scripts/git_authorization_hook.ts +22 -1
  440. package/src/scripts/grade_target_readiness.ts +48 -5
  441. package/src/scripts/hook_effect_doctor.ts +261 -0
  442. package/src/scripts/hook_manifest.json +1 -1
  443. package/src/scripts/hook_manifest.yaml +125 -16
  444. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  445. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  446. package/src/scripts/hooks/comment_discipline_hook.ts +146 -0
  447. package/src/scripts/hooks/concern_registry.ts +6 -0
  448. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  449. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  450. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  451. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  452. package/src/scripts/hooks/shims/install.sh +61 -0
  453. package/src/scripts/hooks/shims/php +101 -0
  454. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  455. package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
  456. package/src/scripts/hot_context_hook.ts +16 -0
  457. package/src/scripts/install-hooks.sh +20 -5
  458. package/src/scripts/install.ts +17 -35
  459. package/src/scripts/inventory_frontmatter.ts +2 -1
  460. package/src/scripts/language_mirror_hook.ts +14 -2
  461. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  462. package/src/scripts/lint_canonical_terms.ts +604 -0
  463. package/src/scripts/lint_carrier_integrity.ts +820 -0
  464. package/src/scripts/lint_code_comments.ts +643 -0
  465. package/src/scripts/lint_composition_review.ts +619 -0
  466. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  467. package/src/scripts/lint_eval_specs.ts +593 -0
  468. package/src/scripts/lint_hook_manifest.ts +19 -0
  469. package/src/scripts/lint_host_portability.ts +373 -0
  470. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  471. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  472. package/src/scripts/lint_metric_consumers.ts +355 -0
  473. package/src/scripts/lint_plan_risk_register.ts +39 -19
  474. package/src/scripts/lint_promotion_paths.ts +779 -0
  475. package/src/scripts/lint_skill_descriptions.ts +18 -1
  476. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  477. package/src/scripts/lint_skill_link_reach.ts +252 -0
  478. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  479. package/src/scripts/lint_ticket_buildable.ts +17 -1
  480. package/src/scripts/llm_propose.ts +256 -0
  481. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  482. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  483. package/src/scripts/measure_delivery_sets.ts +361 -0
  484. package/src/scripts/measure_docs_dead_links.ts +348 -0
  485. package/src/scripts/measure_host_capture.ts +461 -0
  486. package/src/scripts/measure_routing_signal.ts +307 -0
  487. package/src/scripts/migration_status.ts +3 -3
  488. package/src/scripts/model_rule_injection.ts +76 -0
  489. package/src/scripts/orchestration_record.ts +14 -0
  490. package/src/scripts/preamble_byte_census.ts +139 -10
  491. package/src/scripts/prepack-check.mjs +4 -1
  492. package/src/scripts/probe_council_retention.ts +495 -0
  493. package/src/scripts/probe_turnaround.ts +384 -0
  494. package/src/scripts/probe_unblocked_ask.ts +279 -0
  495. package/src/scripts/release.ts +21 -37
  496. package/src/scripts/release_drill.ts +143 -0
  497. package/src/scripts/release_env.ts +35 -0
  498. package/src/scripts/release_publication.ts +84 -0
  499. package/src/scripts/render_benchmark_md.ts +1 -1
  500. package/src/scripts/rule_activation_census.ts +70 -9
  501. package/src/scripts/rule_backlinks.ts +1 -1
  502. package/src/scripts/run_lifecycle_suite.ts +208 -0
  503. package/src/scripts/run_skill_evals.ts +40 -0
  504. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  505. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  506. package/src/scripts/schemas/evals.schema.json +24 -1
  507. package/src/scripts/schemas/rule.schema.json +52 -1
  508. package/src/scripts/schemas/skill.schema.json +17 -2
  509. package/src/scripts/skill_overlap.ts +7 -1
  510. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  511. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  512. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  513. package/src/scripts/skill_usage_report.ts +2 -1
  514. package/src/scripts/stubs_due.ts +211 -0
  515. package/src/scripts/sweep_source_surfaces.ts +678 -0
  516. package/src/scripts/sync_pr_branch.ts +3 -3
  517. package/src/scripts/trigger_eval_grandfather.json +202 -222
  518. package/src/scripts/utilization_report.ts +22 -2
  519. package/src/server/schemas/settings.ts +5 -0
  520. package/src/templates/marketing-copy.yml +1 -1
  521. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -16,11 +16,13 @@
16
16
  * Exit codes: 0 = clean, 1 = violations found, 3 = internal error.
17
17
  */
18
18
  import * as fs from 'node:fs';
19
+ import * as os from 'node:os';
19
20
  import * as path from 'node:path';
20
21
  import { fileURLToPath, pathToFileURL } from 'node:url';
21
22
 
22
23
  import { asOf } from './_lib/as_of.js';
23
- import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
24
+ import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
25
+ import { DeadScopeError, reportScanned } from './_lib/scan_scope.js';
24
26
 
25
27
  const _HERE = fileURLToPath(import.meta.url);
26
28
  const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
@@ -30,6 +32,85 @@ const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---\s*\n/;
30
32
  const STABILITY_RE = /^stability:\s*(\w+)\s*$/m;
31
33
  const PROMOTE_RE = /^promote-to:\s*stable\s*$/m;
32
34
  const KEEP_RE = /^keep-beta-until:\s*(\d{4}-\d{2}-\d{2})\s*$/m;
35
+
36
+ /**
37
+ * The frozen no-growth baseline of contracts already lapsed at 2026-08-25.
38
+ *
39
+ * AI council 2/2 (2026-08-25) chose a **ratchet** over both a flat report and a
40
+ * flat error. The shape, and each clause is load-bearing:
41
+ *
42
+ * - a lapsed contract **in** the baseline -> warning (inherited debt)
43
+ * - a lapsed contract **not** in it -> ERROR (a fresh lapse, today)
44
+ *
45
+ * So new work is enforced immediately while the 86-contract cohort does not red
46
+ * an arbitrary future PR whose author caused none of it. The cohort is real:
47
+ * 44 of the 86 lapsed on the same day and 64 within four days, which is one past
48
+ * session's uniform window expiring at once rather than 86 lapses of discipline.
49
+ *
50
+ * **The list may not grow, and an entry may not be re-added.** Both are the
51
+ * ratchet, and both fall out of the rule above rather than needing their own
52
+ * check: anything not already in the file errors.
53
+ *
54
+ * **Removal is derived from the contract's own state, never from editing this
55
+ * file.** An entry stops mattering because the contract stopped being a lapsed
56
+ * beta — promoted, recorded unmaintained, superseded, or given a reviewed new
57
+ * deadline. One seat asked for exactly this qualification, on the ground that an
58
+ * allowlist whose entries can simply be deleted is cosmetic.
59
+ */
60
+ const BASELINE_REL = 'src/config/lapsed-beta-baseline.json';
61
+
62
+ interface LapsedBaseline {
63
+ contracts: string[];
64
+ }
65
+
66
+ let _baselineCache: Set<string> | null = null;
67
+
68
+ export function loadLapsedBaseline(root: string = ROOT): Set<string> {
69
+ if (_baselineCache !== null) {
70
+ return _baselineCache;
71
+ }
72
+ const p = path.join(root, BASELINE_REL);
73
+ if (!fs.existsSync(p)) {
74
+ // The baseline reaching zero is the SUCCESS state: the file is deleted
75
+ // in the same change that flips the severity. An absent file therefore
76
+ // means "no inherited debt", i.e. every lapse is fresh and errors.
77
+ _baselineCache = new Set<string>();
78
+ return _baselineCache;
79
+ }
80
+ const parsed = JSON.parse(fs.readFileSync(p, 'utf-8')) as LapsedBaseline;
81
+ _baselineCache = new Set(parsed.contracts);
82
+ return _baselineCache;
83
+ }
84
+
85
+ /** Test seam — the module-level cache would otherwise outlive a fixture. */
86
+ export function _resetLapsedBaseline(): void {
87
+ _baselineCache = null;
88
+ }
89
+
90
+ /**
91
+ * Severity of the LAPSED-deadline finding — `keep-beta-until` in the past.
92
+ *
93
+ * `warning` on purpose, and this constant exists so that promoting it is a
94
+ * one-word, reviewable change rather than an edit buried in a branch.
95
+ *
96
+ * Until 2026-08-25 the gate compared `keep-beta-until` ONLY against
97
+ * `today + MAX_REVIEW_WINDOW_DAYS` and errored when the date was too far in the
98
+ * FUTURE. There was no floor, so a date arbitrarily far in the PAST passed and
99
+ * the gate printed "All beta contracts carry a valid review marker" while 86 of
100
+ * the 121 beta contracts were lapsed. The gate enforced the ceiling of the
101
+ * review window and never its expiry.
102
+ *
103
+ * It ships as a report rather than an error because the backlog is a COHORT:
104
+ * 44 of those 86 lapsed on the same day (2026-08-12) and 64 within four days,
105
+ * which is one past session's uniform window expiring en masse rather than 86
106
+ * independent lapses. Erroring on a cohort artifact produces one loud failure on
107
+ * an arbitrary future PR whose author did nothing wrong — the way a gate gets
108
+ * waived instead of adopted. The inventory and its dispositions are
109
+ * `agents/evidence/analysis/lapsed-beta-inventory-2026-08-25.md`; the decision on
110
+ * whether this becomes an error is that roadmap's step 0.2 and is not taken here.
111
+ */
112
+ const LAPSED_SEVERITY_IN_BASELINE: 'error' | 'warning' = 'warning';
113
+ const LAPSED_SEVERITY_FRESH: 'error' | 'warning' = 'error';
33
114
  const SUPERSEDED_RE = /^superseded-by:\s*\S+\s*$/m;
34
115
 
35
116
  const MAX_REVIEW_WINDOW_DAYS = 90;
@@ -146,6 +227,26 @@ function check_one(p: string, todayOrdinal: number): Violation[] {
146
227
  if (km) {
147
228
  const [ry, rm, rd] = _parseISODate(km[1]!);
148
229
  const reviewOrdinal = _dateOrdinal(ry, rm, rd);
230
+ // Lower bound — the deadline has passed. Checked BEFORE the upper
231
+ // bound because a lapsed date can never also exceed the forward window,
232
+ // so the order is a readability choice rather than a precedence one.
233
+ if (reviewOrdinal < todayOrdinal) {
234
+ const inherited = loadLapsedBaseline().has(rel);
235
+ const age = todayOrdinal - reviewOrdinal;
236
+ return [
237
+ {
238
+ file: rel,
239
+ reason:
240
+ `keep-beta-until=${_ordinalToISO(reviewOrdinal)} has LAPSED ` +
241
+ `(${age} day(s) ago); review the contract and ` +
242
+ 'promote it, extend the window with a reason, or record it as superseded' +
243
+ (inherited
244
+ ? ' [inherited: in the frozen 2026-08-25 baseline, clear by 2026-11-23]'
245
+ : ' [FRESH lapse — not in the frozen baseline, which may not grow]'),
246
+ severity: inherited ? LAPSED_SEVERITY_IN_BASELINE : LAPSED_SEVERITY_FRESH,
247
+ },
248
+ ];
249
+ }
149
250
  const maxOrdinal = todayOrdinal + MAX_REVIEW_WINDOW_DAYS;
150
251
  if (reviewOrdinal > maxOrdinal) {
151
252
  return [
@@ -162,17 +263,65 @@ function check_one(p: string, todayOrdinal: number): Violation[] {
162
263
  return [];
163
264
  }
164
265
 
266
+
267
+ /**
268
+ * STABILITY.md's own re-audit condition, as a command instead of as prose.
269
+ *
270
+ * `STABILITY.md`:
271
+ *
272
+ * "The audit is repeated whenever the `keep-beta-until` date passes for
273
+ * >= 25 % of beta contracts, or at the start of any roadmap phase that
274
+ * touches the contract surface."
275
+ *
276
+ * That condition was met at 71.1 % and nothing noticed, which is the defect
277
+ * `road-to-contract-review-deadlines` D2 records. A trigger nobody can run is
278
+ * how a threshold gets crossed by a factor of three in silence — so the
279
+ * percentage is computed here, next to the data, and printed.
280
+ *
281
+ * Deliberately a REPORT, not a gate: the enforcement half is the frozen
282
+ * baseline plus the fresh-lapse error above. A second failing check over the
283
+ * same population would red the same PRs twice for one cause.
284
+ */
285
+ export const REAUDIT_TRIGGER_PCT = 25;
286
+
287
+ export interface TriggerVerdict {
288
+ betaContracts: number;
289
+ lapsed: number;
290
+ pct: number;
291
+ fired: boolean;
292
+ }
293
+
294
+ export function evaluateTrigger(violations: readonly Violation[], betaContracts: number): TriggerVerdict {
295
+ const lapsed = violations.filter((v) => v.reason.includes('has LAPSED')).length;
296
+ const pct = betaContracts === 0 ? 0 : (lapsed / betaContracts) * 100;
297
+ return { betaContracts, lapsed, pct, fired: pct >= REAUDIT_TRIGGER_PCT };
298
+ }
299
+
165
300
  interface ParsedArgs {
166
301
  json: boolean;
302
+ trigger: boolean;
303
+ /** Fixture root, for `--self-test`. A fixture is never judged against the repo baseline. */
304
+ root: string | null;
167
305
  }
168
306
 
169
307
  function parse_args(argv: readonly string[]): ParsedArgs {
170
- const args: ParsedArgs = { json: false };
171
- for (const arg of argv) {
308
+ const args: ParsedArgs = { json: false, trigger: false, root: null };
309
+ for (let i = 0; i < argv.length; i += 1) {
310
+ const arg = argv[i] as string;
172
311
  if (arg === '--json') {
173
312
  args.json = true;
313
+ } else if (arg === '--root') {
314
+ args.root = argv[i + 1] ?? null;
315
+ i += 1;
316
+ } else if (arg === '--trigger') {
317
+ args.trigger = true;
174
318
  } else if (arg === '-h' || arg === '--help') {
175
- process.stdout.write('usage: check_beta_review_markers [-h] [--json]\n');
319
+ process.stdout.write(
320
+ 'usage: check_beta_review_markers [-h] [--json] [--trigger]\n' +
321
+ ' --trigger print the lapsed percentage and whether STABILITY.md\n' +
322
+ ' re-audit condition (>= 25 %) has fired. Reports; never fails.\n' +
323
+ ' --root DIR judge a fixture tree instead of the repo (self-test seam).\n',
324
+ );
176
325
  process.exit(0);
177
326
  } else {
178
327
  process.stderr.write(
@@ -190,12 +339,70 @@ function _todayOrdinal(): number {
190
339
  return _dateOrdinal(now.getFullYear(), now.getMonth() + 1, now.getDate());
191
340
  }
192
341
 
342
+
343
+ /**
344
+ * Self-test — the gate proving it still DISCRIMINATES, not merely that it ran.
345
+ *
346
+ * A `scanned:` floor proves a gate read something; only a rejecting case proves
347
+ * the reading changes the verdict. All four cases shell out to the real CLI
348
+ * through a fixture `docs/contracts/`, because an in-process call cannot catch
349
+ * an argv parser or an entry guard that silently no-ops.
350
+ */
351
+ export function selfTest(): number {
352
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'beta-selftest-'));
353
+ const write = (name: string, body: string): string => {
354
+ const dir = path.join(tmp, name, 'docs', 'contracts');
355
+ fs.mkdirSync(dir, { recursive: true });
356
+ fs.writeFileSync(path.join(dir, 'sample.md'), body, 'utf-8');
357
+ return path.join(tmp, name);
358
+ };
359
+ const run = (root: string): number =>
360
+ runGateCli(ROOT, 'src/scripts/check_beta_review_markers.ts', ['--root', root], root);
361
+
362
+ try {
363
+ return runSelfTest({
364
+ gate: 'check_beta_review_markers',
365
+ minCases: 4,
366
+ minRejectCases: 2,
367
+ cases: [
368
+ {
369
+ name: 'a lapsed deadline outside the frozen baseline is rejected',
370
+ expect: 'reject',
371
+ run: () => run(write('lapsed', '---\nstability: beta\nkeep-beta-until: 2020-01-01\n---\n')),
372
+ },
373
+ {
374
+ name: 'a beta contract with NO marker at all is rejected',
375
+ expect: 'reject',
376
+ run: () => run(write('nomarker', '---\nstability: beta\n---\n')),
377
+ },
378
+ {
379
+ name: 'a beta contract inside its window passes',
380
+ expect: 'accept',
381
+ run: () => run(write('fresh', `---\nstability: beta\nkeep-beta-until: ${_ordinalToISO(_todayOrdinal() + 30)}\n---\n`)),
382
+ },
383
+ {
384
+ name: 'a stable contract needs no marker and passes',
385
+ expect: 'accept',
386
+ run: () => run(write('stable', '---\nstability: stable\n---\n')),
387
+ },
388
+ ],
389
+ });
390
+ } finally {
391
+ fs.rmSync(tmp, { recursive: true, force: true });
392
+ }
393
+ }
394
+
193
395
  function main(): number {
396
+ if (process.argv.slice(2).includes('--self-test')) return selfTest();
194
397
  const args = parse_args(process.argv.slice(2));
195
398
  const todayOrdinal = _todayOrdinal();
196
399
  const violations: Violation[] = [];
197
- const contracts = _globMdSorted(path.join(ROOT, CONTRACTS_DIR));
400
+ const scanRoot = args.root ?? ROOT;
401
+ const contracts = _globMdSorted(path.join(scanRoot, CONTRACTS_DIR));
402
+ let betaContracts = 0;
198
403
  for (const p of contracts) {
404
+ const fm = read_frontmatter(p);
405
+ if (fm !== null && /^stability:\s*beta\s*$/m.test(fm)) betaContracts += 1;
199
406
  violations.push(...check_one(p, todayOrdinal));
200
407
  }
201
408
  // Count every contract read, not the `stability: beta` subset: over a moved
@@ -203,7 +410,13 @@ function main(): number {
203
410
  // the same clean line, and only the second is a dead gate. Exit 1 is the
204
411
  // violation code; 3 stays reserved for the internal-error handler below.
205
412
  try {
206
- assertScanned({
413
+ // `reportScanned`, not `assertScanned`: the gate-coverage manifest's
414
+ // rule 1 requires exactly one machine-readable `scanned: <N>` line, and
415
+ // asserting without printing satisfies the scope guard while leaving the
416
+ // census blind — which is the same "green over nothing" shape both
417
+ // mechanisms exist to end. Emitted on the RED path too, so the gate
418
+ // cannot report its coverage only when it passes.
419
+ reportScanned({
207
420
  gate: 'check_beta_review_markers',
208
421
  scanned: contracts.length,
209
422
  units: 'contract file(s)',
@@ -216,6 +429,22 @@ function main(): number {
216
429
  }
217
430
  throw exc;
218
431
  }
432
+ if (args.trigger) {
433
+ const t = evaluateTrigger(violations, betaContracts);
434
+ const line =
435
+ `beta contracts: ${String(t.betaContracts)} · lapsed: ${String(t.lapsed)} · ` +
436
+ `${t.pct.toFixed(1)} % · STABILITY.md re-audit trigger (>= ${String(REAUDIT_TRIGGER_PCT)} %): ` +
437
+ (t.fired ? 'FIRED' : 'not fired');
438
+ if (args.json) {
439
+ process.stdout.write(JSON.stringify({ trigger: t }, null, 2) + '\n');
440
+ } else {
441
+ process.stdout.write(`${line}\n`);
442
+ }
443
+ // A report never fails a build. The enforcement half is the frozen
444
+ // baseline plus the fresh-lapse error; failing here too would red the
445
+ // same pull request twice for one cause.
446
+ return 0;
447
+ }
219
448
  if (args.json) {
220
449
  process.stdout.write(JSON.stringify({ violations }, null, 2) + '\n');
221
450
  } else {
@@ -129,7 +129,40 @@ const PUBLISHED_MD_ROOTS: readonly string[] = [
129
129
  'src/config',
130
130
  ];
131
131
 
132
- /** Named `.md` / text files `files[]` ships individually. */
132
+ /**
133
+ * Named `.md` / text files `files[]` ships individually.
134
+ *
135
+ * SCOPE DECISION, recorded 2026-08-26 (road-to-published-number-truth 4.2)
136
+ * because it had been DERIVED from `files[]` rather than chosen, and a derived
137
+ * scope answers no question when someone asks why a leaking file is not caught.
138
+ *
139
+ * **This gate's scope is the npm payload, deliberately — not "every tracked
140
+ * public file".** It exists to stop an absolute home path reaching a consumer's
141
+ * disk, so its unit is what the tarball carries.
142
+ *
143
+ * **The class it therefore excludes, named rather than left implicit:
144
+ * tracked-but-unshipped `.md`.** These are public on the forge and readable by
145
+ * anyone, but never installed. `ONBOARDING.md` is the live instance: it is
146
+ * tracked, it is not in `files[]`, and on 2026-08-26 it carried 37 occurrences
147
+ * of one maintainer's absolute home path. Those were rewritten to repo-relative
148
+ * in the same change (`grep -c '/Users/' ONBOARDING.md` → 0), but that was a
149
+ * ONE-TIME fix and this gate does not keep it that way.
150
+ *
151
+ * **Why not simply widen.** The sibling test at
152
+ * `tests/scripts/check_bundle_path_leakage.test.ts:313-324` asserts that every
153
+ * `PUBLISHED_MD_ROOTS` entry is inside `files[]`, with the reason stated in its
154
+ * own comment: *"a root outside the tarball would scan content no consumer
155
+ * receives, which is scope creep dressed as rigour."* Adding a non-shipped file
156
+ * here would contradict that principle while leaving its test green only
157
+ * because the loop happens to walk ROOTS and not FILES — passing on a
158
+ * technicality is not the same as being in scope.
159
+ *
160
+ * **The residual, stated rather than closed.** Nothing currently prevents a new
161
+ * absolute path from landing in a tracked-but-unshipped `.md`. Closing it means
162
+ * a separate scan with its own name and its own scope sentence — a
163
+ * forge-visibility gate, not a payload gate — and that is a deliberate
164
+ * non-goal here rather than an oversight.
165
+ */
133
166
  const PUBLISHED_MD_FILES: readonly string[] = [
134
167
  'AGENTS.md',
135
168
  'CHANGELOG.md',