@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
@@ -0,0 +1,319 @@
1
+ /**
2
+ * capture_rate — the measurement itself: numerator ÷ denominator, reported with
3
+ * a 95 % Wilson score interval, judged on the LOWER bound.
4
+ *
5
+ * `road-to-supervised-telemetry-collector` step 1.2 item 9 and step 1.3 fixed
6
+ * the decision rule before any number existed, so it could not be chosen after:
7
+ *
8
+ * > Capture rate = numerator ÷ denominator, both as defined above, reported with
9
+ * > a **95 % Wilson score interval**. The target in 1.3 is met when the **lower
10
+ * > bound** of that interval is at or above the target — not the point estimate.
11
+ *
12
+ * > **≥ 90 % capture**, read as the lower bound of the 95 % Wilson interval,
13
+ * > over the **21-day window** and **≥ 2,000 eligible dispatches across ≥ 5
14
+ * > machines**.
15
+ *
16
+ * This module computes that, and nothing else. It does not decide, does not
17
+ * enable anything, and does not read the clock — the window boundaries are
18
+ * inputs, because a measurement module that reads `Date.now()` cannot be tested
19
+ * against a fixed window.
20
+ *
21
+ * ## Why it exists before the window does
22
+ *
23
+ * AI council, 2026-08-30 (DEGRADED — 1 of 2 seats; `openai` absent,
24
+ * `os_error: ENOBUFS`), on the disposition of Phase 6: the seat chose option (d)
25
+ * and made this a **prerequisite checkpoint between Phase 5 and Phase 6** rather
26
+ * than a substitute for 6.1 —
27
+ *
28
+ * > The synthetic test is a checkpoint, not a Phase 6 step. It answers "does the
29
+ * > instrument work?" before asking "what does it measure?"
30
+ *
31
+ * So: seeded opportunities and captures, an asserted ratio, an asserted Wilson
32
+ * bound, the minimum-sample boundary, malformed input, and duplicate
33
+ * suppression — all verifiable with zero elapsed days. **It proves the
34
+ * instrument. It claims nothing about the field measurement**, which needs 21
35
+ * days that no run can compress.
36
+ *
37
+ * ## NO PRODUCTION CALLER, and that is the honest state rather than an omission
38
+ *
39
+ * `judgeCapture`, `judgeEnablement` and `readOpportunities`' window parameter
40
+ * are called from tests and from nothing else (R2 round-4 finding 12). The
41
+ * consumer is Phase 6, which is parked: 6.1 needs a 21-day window, 6.2 reads
42
+ * these verdicts, and neither has run. Naming it here because this module's own
43
+ * argument — that the two halves of the ratio must age on the same clock — reads
44
+ * as if something computed the ratio today, and nothing does.
45
+ *
46
+ * It is deliberately NOT the same class as the two no-caller defects this
47
+ * change fixed. `spoolRecord` and `terminateCollector` had consumers that were
48
+ * supposed to exist and did not; these have a consumer that is scheduled and
49
+ * blocked, which is why the roadmap leaves AC-10 unchecked rather than claiming
50
+ * the instrument is in use.
51
+ */
52
+
53
+ /** The confidence level the decision rule fixes. Not a parameter — 1.2 item 9 names it. */
54
+ export const WILSON_Z = 1.959963984540054; // two-sided 95 %
55
+
56
+ /** The target from 1.3, as a proportion. Read as a LOWER bound, never a point estimate. */
57
+ export const CAPTURE_TARGET = 0.9;
58
+
59
+ /** Minimum sample from 1.2 items 7–8. Below this the reading is not eligible at all. */
60
+ export const MINIMUM_SAMPLE = 2_000;
61
+ export const MINIMUM_MACHINES = 5;
62
+
63
+ /**
64
+ * No single machine may contribute more than this share of the denominator.
65
+ *
66
+ * The third sample constraint from 1.2 item 7, dropped by the first
67
+ * implementation (R2 round-5 finding 7) with its reason attached: *"a rate
68
+ * measured on one machine measures that machine's supervisor, not the
69
+ * population's"*. `MINIMUM_SAMPLE` and `MINIMUM_MACHINES` are both satisfiable
70
+ * by 1,996 dispatches from one machine and one apiece from four others.
71
+ */
72
+ export const MAX_MACHINE_SHARE = 0.4;
73
+ export const WINDOW_DAYS = 21;
74
+
75
+ export interface Interval {
76
+ readonly lower: number;
77
+ readonly upper: number;
78
+ }
79
+
80
+ /**
81
+ * The Wilson score interval for a binomial proportion.
82
+ *
83
+ * Wilson rather than the normal approximation because the normal one is wrong
84
+ * exactly where this measurement lives: near a proportion of 1, it produces an
85
+ * upper bound above 1 and a spuriously narrow interval. At `n = 0` there is no
86
+ * proportion to estimate, and the honest interval is the whole range `[0, 1]` —
87
+ * NOT `[0, 0]`, which would read as "we measured zero capture" rather than "we
88
+ * measured nothing".
89
+ */
90
+ export function wilsonInterval(successes: number, trials: number, z: number = WILSON_Z): Interval {
91
+ if (!Number.isInteger(successes) || !Number.isInteger(trials)) {
92
+ throw new TypeError('wilsonInterval: counts must be integers');
93
+ }
94
+ if (successes < 0 || trials < 0 || successes > trials) {
95
+ throw new RangeError(
96
+ `wilsonInterval: impossible counts (${successes} of ${trials})`,
97
+ );
98
+ }
99
+ if (trials === 0) return Object.freeze({ lower: 0, upper: 1 });
100
+
101
+ const p = successes / trials;
102
+ const z2 = z * z;
103
+ const denominator = 1 + z2 / trials;
104
+ const centre = p + z2 / (2 * trials);
105
+ const spread = z * Math.sqrt((p * (1 - p) + z2 / (4 * trials)) / trials);
106
+ return Object.freeze({
107
+ lower: Math.max(0, (centre - spread) / denominator),
108
+ upper: Math.min(1, (centre + spread) / denominator),
109
+ });
110
+ }
111
+
112
+ export interface CaptureReading {
113
+ /** Records that reached the store, de-duplicated. */
114
+ readonly numerator: number;
115
+ /** Dispatch opportunities recorded by the independent writer. */
116
+ readonly denominator: number;
117
+ /**
118
+ * Distinct machines contributing to the denominator.
119
+ *
120
+ * **NOT derivable from the denominator artifact as it ships**, and saying so
121
+ * is the honest form (R2 round-5 finding 8). `recordOpportunity` writes
122
+ * `date\tevent\tplatform` with no machine identifier, so the only place a
123
+ * machine id exists is the STORE — the numerator. Counting the floor there
124
+ * biases it in the same direction as everything else this module warns
125
+ * about: a machine that captured nothing contributes zero and the
126
+ * population looks smaller than it is.
127
+ *
128
+ * The field is therefore an INPUT the caller must supply from somewhere
129
+ * that knows, and Phase 6 is where that caller is built. Closing it means
130
+ * either a machine column on the opportunity line — which is a schema
131
+ * change and a privacy question, since a machine id beside a date is the
132
+ * fingerprint `FIELD_PURPOSE` argues against — or an out-of-band count.
133
+ * Neither is decided here.
134
+ */
135
+ readonly machines: number;
136
+ /**
137
+ * The largest single machine's share of the denominator, 0..1.
138
+ *
139
+ * Same provenance problem as `machines`, same honest treatment: supplied by
140
+ * the caller, `null` when unknown. `null` is INELIGIBLE rather than
141
+ * passing — an unmeasured concentration is not a satisfied one.
142
+ */
143
+ // `| undefined` explicitly: `exactOptionalPropertyTypes` is on, so an
144
+ // optional property does NOT implicitly accept `undefined` — and a caller
145
+ // that has not measured the share is exactly the case this field exists to
146
+ // report as ineligible.
147
+ readonly maxMachineShare?: number | null | undefined;
148
+ /** Whole days elapsed in the observation window. */
149
+ readonly windowDays: number;
150
+ }
151
+
152
+ export type EligibilityFailure =
153
+ | 'window-too-short'
154
+ | 'sample-too-small'
155
+ | 'too-few-machines'
156
+ | 'numerator-exceeds-denominator'
157
+ /** One machine contributes more than {@link MAX_MACHINE_SHARE} of the denominator. */
158
+ | 'machine-concentration'
159
+ /**
160
+ * A count that is negative, fractional, or not a number at all.
161
+ *
162
+ * Its own member rather than a shared "impossible" bucket, because the
163
+ * remedy differs: `numerator-exceeds-denominator` is a counting bug in the
164
+ * two writers, `malformed-counts` is a corrupt reading. Before this existed
165
+ * such a reading fell straight through to `wilsonInterval` and CRASHED —
166
+ * the one class of bad input this module's three-valued design was built to
167
+ * report rather than throw on (R2 finding 15).
168
+ */
169
+ | 'malformed-counts';
170
+
171
+ export interface CaptureVerdict {
172
+ /** Point estimate. `null` when the denominator is 0 — a ratio, not a zero. */
173
+ readonly rate: number | null;
174
+ readonly interval: Interval;
175
+ /** Whether the reading may be judged against the target at all. */
176
+ readonly eligible: boolean;
177
+ /** Why not. Empty when eligible. */
178
+ readonly ineligibleBecause: readonly EligibilityFailure[];
179
+ /**
180
+ * `true` / `false` only when eligible; `null` when the reading cannot be
181
+ * judged. A three-valued verdict, because "not eligible" collapsed to
182
+ * `false` reads as a MISS — and a miss triggers 6.3's decision record for a
183
+ * measurement that never happened.
184
+ */
185
+ readonly meetsTarget: boolean | null;
186
+ }
187
+
188
+ /**
189
+ * Judge a reading against the 1.3 target.
190
+ *
191
+ * Eligibility is checked BEFORE the comparison and reported separately, because
192
+ * the two questions have different consequences: an ineligible reading means
193
+ * keep observing, a miss means run 6.3. Collapsing them is how a 200-dispatch
194
+ * sample becomes a recorded failure.
195
+ */
196
+ export function judgeCapture(
197
+ reading: CaptureReading,
198
+ target: number = CAPTURE_TARGET,
199
+ ): CaptureVerdict {
200
+ const failures: EligibilityFailure[] = [];
201
+
202
+ // Checked FIRST, and it is the guard that keeps `wilsonInterval` from
203
+ // raising: that function throws on a negative or fractional count, by
204
+ // design, and a judge that propagates the throw cannot report anything.
205
+ const countsAreSane =
206
+ Number.isInteger(reading.numerator)
207
+ && Number.isInteger(reading.denominator)
208
+ && reading.numerator >= 0
209
+ && reading.denominator >= 0;
210
+ if (!countsAreSane) failures.push('malformed-counts');
211
+ else if (reading.numerator > reading.denominator) {
212
+ failures.push('numerator-exceeds-denominator');
213
+ }
214
+ if (!Number.isFinite(reading.windowDays) || reading.windowDays < WINDOW_DAYS) {
215
+ failures.push('window-too-short');
216
+ }
217
+ if (!Number.isFinite(reading.denominator) || reading.denominator < MINIMUM_SAMPLE) {
218
+ failures.push('sample-too-small');
219
+ }
220
+ if (!Number.isFinite(reading.machines) || reading.machines < MINIMUM_MACHINES) {
221
+ failures.push('too-few-machines');
222
+ }
223
+ const share = reading.maxMachineShare;
224
+ if (share === undefined || share === null || !Number.isFinite(share) || share > MAX_MACHINE_SHARE) {
225
+ failures.push('machine-concentration');
226
+ }
227
+
228
+ const uncomputable =
229
+ failures.includes('numerator-exceeds-denominator') || failures.includes('malformed-counts');
230
+ const interval = uncomputable
231
+ ? Object.freeze({ lower: 0, upper: 1 })
232
+ : wilsonInterval(reading.numerator, reading.denominator);
233
+ const rate =
234
+ uncomputable || reading.denominator === 0
235
+ ? null
236
+ : reading.numerator / reading.denominator;
237
+ const eligible = failures.length === 0;
238
+
239
+ return Object.freeze({
240
+ rate,
241
+ interval,
242
+ eligible,
243
+ ineligibleBecause: Object.freeze(failures),
244
+ // The lower bound, never the point estimate. A point estimate that
245
+ // clears the target on a sample whose interval straddles it has not
246
+ // cleared it, and 1.2 item 9 fixed that before the number existed.
247
+ meetsTarget: eligible ? interval.lower >= target : null,
248
+ });
249
+ }
250
+
251
+ /**
252
+ * The six readings 6.2 requires, as a type that cannot be partially filled.
253
+ *
254
+ * Every field is required and `null` is a legal value meaning **not recorded**.
255
+ * That is the shape the step demands — *"a missing reading blocks the flip"* —
256
+ * and an optional field would let a caller omit one and still typecheck.
257
+ *
258
+ * The type is not the enforcement, though, and treating it as such was a defect:
259
+ * {@link judgeEnablement} accepts only a literal `true`, so a key absent at
260
+ * RUNTIME blocks the flip exactly like an explicit `null`. A compile-time
261
+ * guarantee does not survive `JSON.parse` or a cast, and these readings are
262
+ * precisely the kind of object that arrives through both.
263
+ */
264
+ export interface EnablementReadings {
265
+ readonly captureTargetMet: boolean | null;
266
+ readonly lifecycleGreenOnEveryPlatform: boolean | null;
267
+ readonly resourceBudgetsMet: boolean | null;
268
+ readonly noPrivacyOrIntegrityIncident: boolean | null;
269
+ readonly staticModeCompatible: boolean | null;
270
+ readonly windowAndSampleSatisfied: boolean | null;
271
+ }
272
+
273
+ export const ENABLEMENT_READING_NAMES = [
274
+ 'captureTargetMet',
275
+ 'lifecycleGreenOnEveryPlatform',
276
+ 'resourceBudgetsMet',
277
+ 'noPrivacyOrIntegrityIncident',
278
+ 'staticModeCompatible',
279
+ 'windowAndSampleSatisfied',
280
+ ] as const;
281
+
282
+ export interface EnablementVerdict {
283
+ readonly flip: boolean;
284
+ /** Readings that are `null`. A missing reading blocks, and is not a failure. */
285
+ readonly missing: readonly string[];
286
+ /** Readings that are `false`. */
287
+ readonly failed: readonly string[];
288
+ }
289
+
290
+ /**
291
+ * Decide whether the default may flip.
292
+ *
293
+ * Missing and failed are reported separately for the same reason eligibility is
294
+ * separate above: "we did not look" and "we looked and it was bad" call for
295
+ * different actions, and one of them is 6.3.
296
+ */
297
+ export function judgeEnablement(readings: EnablementReadings): EnablementVerdict {
298
+ const missing: string[] = [];
299
+ const failed: string[] = [];
300
+ for (const name of ENABLEMENT_READING_NAMES) {
301
+ const value = readings[name];
302
+ // ACCEPT ONLY `true` (R2 round-3 finding 4). The first version tested
303
+ // `=== null` then `=== false`, so a key that was ABSENT at runtime was
304
+ // neither and still yielded `flip: true`. The type made omission a
305
+ // compile error and these readings are exactly the kind of object
306
+ // assembled from JSON or a cast — including in this module's own tests —
307
+ // so the guarantee held everywhere except where it mattered. The step's
308
+ // rule is "a missing reading blocks the flip", and only a positive test
309
+ // for `true` implements it.
310
+ if (value === true) continue;
311
+ if (value === false) failed.push(name);
312
+ else missing.push(name);
313
+ }
314
+ return Object.freeze({
315
+ flip: missing.length === 0 && failed.length === 0,
316
+ missing: Object.freeze(missing),
317
+ failed: Object.freeze(failed),
318
+ });
319
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * The `status: carrier` predicate, and the reasoning five readers share.
3
+ *
4
+ * A carrier is a roadmap whose job is to hold obligations deferred out of a
5
+ * parent that is already archived. Every item in it has an unmet resumption
6
+ * trigger, and it has no `## Phase` headings, so it is skipped wherever a draft
7
+ * is: the dashboard, `/roadmap:process-*`, the trackability check and the plan
8
+ * risk register. It differs from a draft in what it costs to remove — a draft
9
+ * may be deleted freely, a carrier may not.
10
+ *
11
+ * This module exists because the predicate had two implementations within one
12
+ * change and five callers within one week. Two implementations of one frontmatter
13
+ * test drift, and the one nobody runs locally drifts first — the same
14
+ * memory-twin failure this repository has already recorded against a fixture
15
+ * corpus. One test, one place, and the reasoning above lives beside it rather
16
+ * than being restated in each caller.
17
+ *
18
+ * The read is frontmatter-scoped on purpose. A fenced `status: carrier` inside a
19
+ * roadmap that documents the syntax is not a declaration, and a body-wide match
20
+ * turned exactly that into a hard failure before a review caught it.
21
+ */
22
+
23
+ /** The frontmatter values that mean "not schedulable work, and not disposable". */
24
+ export const CARRIER_VALUES: ReadonlySet<string> = new Set(['carrier']);
25
+
26
+ /** The leading `---\n…\n---` block, or null when the text carries none. */
27
+ export function frontmatterBlock(text: string): string | null {
28
+ const m = /^---\n([\s\S]*?)\n---/.exec(text);
29
+ return m === null ? null : (m[1] ?? '');
30
+ }
31
+
32
+ /** True when `text`'s FRONTMATTER declares one of {@link CARRIER_VALUES}. */
33
+ export function declaresCarrier(text: string | null | undefined): boolean {
34
+ if (text === null || text === undefined) {
35
+ return false;
36
+ }
37
+ const fm = frontmatterBlock(text);
38
+ if (fm === null) {
39
+ return false;
40
+ }
41
+ const m = /^status:[ \t]*([A-Za-z-]+)[ \t]*$/m.exec(fm);
42
+ return m !== null && CARRIER_VALUES.has((m[1] ?? '').toLowerCase());
43
+ }
44
+
45
+ /**
46
+ * Count the top-level roadmaps in `roadmapRoot` that declare themselves carriers.
47
+ *
48
+ * Lives here rather than in the estate gate because it is the same fact as the
49
+ * predicate above, read over a directory instead of a string, and the gate that
50
+ * needs it is already at its source-size ceiling.
51
+ *
52
+ * @param isCandidate the caller's own roadmap-filename test, so this module does
53
+ * not acquire a second opinion about what counts as a roadmap.
54
+ */
55
+ export function countDeclaredCarriers(
56
+ roadmapRoot: string,
57
+ isCandidate: (name: string) => boolean,
58
+ fsLike: {
59
+ readdirSync: (p: string) => string[];
60
+ statSync: (p: string) => { isFile: () => boolean };
61
+ readFileSync: (p: string, enc: 'utf-8') => string;
62
+ },
63
+ join: (...parts: string[]) => string,
64
+ ): number {
65
+ let names: string[];
66
+ try {
67
+ names = fsLike.readdirSync(roadmapRoot);
68
+ } catch {
69
+ return 0;
70
+ }
71
+ let n = 0;
72
+ for (const name of names) {
73
+ if (!name.endsWith('.md') || !isCandidate(name)) {
74
+ continue;
75
+ }
76
+ const abs = join(roadmapRoot, name);
77
+ try {
78
+ if (!fsLike.statSync(abs).isFile()) {
79
+ continue;
80
+ }
81
+ if (declaresCarrier(fsLike.readFileSync(abs, 'utf-8'))) {
82
+ n += 1;
83
+ }
84
+ } catch {
85
+ continue;
86
+ }
87
+ }
88
+ return n;
89
+ }
90
+
91
+ /**
92
+ * Fixture design — why two of the estate self-test cases are shaped as they are.
93
+ *
94
+ * The reasoning behind two of `check_estate_count`'s self-test cases, kept here
95
+ * because the gate that holds them is at its source-size ceiling and because
96
+ * both facts are about the carrier status rather than about that gate.
97
+ *
98
+ * **The deletion case's addition is a DRAFT, and that is the whole design.**
99
+ * A carrier holds obligations lifted out of an already-archived parent, so
100
+ * paying an offset for removing one rewards the loss: the deletion buys nothing
101
+ * and the addition stays unpaid. With an *ordinary* addition the growth half and
102
+ * the unpaid half coincide — growth iff `n > a`, unpaid iff `n > a` — so the
103
+ * case rejected on two independent grounds and stayed red with the carrier
104
+ * branch reverted, asserting nothing about the feature it named. A draft is
105
+ * invisible to `collect()`, so the count half cannot move and only the offset
106
+ * scoring decides.
107
+ *
108
+ * **The count case asserts the flip BACK, not the flip TO.** A reclassification
109
+ * is not a disposal in either direction, but the flip *to* carrier cannot be
110
+ * asserted by exit code: it lowers the count, a count below the floor is a
111
+ * drawdown, and a drawdown is free whichever way carriers are counted. Its
112
+ * consequence is assertable — with carriers uncounted the flip lowers the floor,
113
+ * so flipping the same file back reads as growth and must be paid for. That is
114
+ * the fixture's state, with the carrier already in the base tree, and it rejects
115
+ * with the carrier term removed from the count. The neutrality of the forward
116
+ * flip is asserted directly in `check_estate_count.test.ts`, where a count is
117
+ * readable.
118
+ */
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The twelve-stage evaluation cascade, DERIVED rather than enumerated by hand.
3
+ *
4
+ * `road-to-governed-evidence-production` step 1.2. E9 (2026-08-30) decided the
5
+ * ARITY — twelve — and enumerated the stages nowhere. The 2026-08-31 council
6
+ * round that was asked for the enumeration returned `REVISE`, and the reason it
7
+ * gave is the reason this module exists rather than a constant list: running the
8
+ * same seat twice produced two materially different twelves — different names,
9
+ * different order, a different placement of the statistical stage.
10
+ *
11
+ * **So the enumeration is not proposed. It is computed.** Two committed arrays
12
+ * and one stated ordering rule determine it, and re-running the computation over
13
+ * the same tree cannot yield a different answer. Nobody's judgement is in the
14
+ * output, which is what "settled" has to mean after two judgements disagreed.
15
+ *
16
+ * ## The ordering rule
17
+ *
18
+ * Stages are ordered by the EVIDENCE each one needs — the `CascadeInput` field
19
+ * it reads — and within a class by source order. The classes, cheapest evidence
20
+ * first:
21
+ *
22
+ * | Rank | Class | Evidence it needs | `CascadeInput` field |
23
+ * |---|---|---|---|
24
+ * | 0 | `record` | the candidate record alone | `raw` |
25
+ * | 1 | `plan` | the run plan and the budget ceiling | `plan`, `budget` |
26
+ * | 2 | `peers` | the sibling candidates of this run | `peers` |
27
+ * | 3 | `receipt` | an activation receipt | `receipt` |
28
+ * | 4 | `measurement` | measured trials | `rows`, `vector` |
29
+ *
30
+ * The rule is not a preference. It is the cascade's own cheapest-first,
31
+ * abort-on-first-failure discipline restated over evidence rather than over
32
+ * cost: a stage may not run before the evidence it depends on could exist, and a
33
+ * candidate that fails a cheap-evidence stage must never consume the expensive
34
+ * evidence. `docs/contracts/activation-receipt-trust-boundary.md` EC-2 is the
35
+ * receipt row of exactly this table.
36
+ *
37
+ * ## What is NOT decided here
38
+ *
39
+ * The rung SEMANTICS — what `delivered` means, what observes it — belong to
40
+ * `_lib/activation_ladder.ts`, and the `REVISE` verdict's condition on them was
41
+ * discharged by the trust-boundary and evidence-cost contract, not by this file.
42
+ * This module settles the enumeration and its order, and nothing else.
43
+ */
44
+
45
+ import { CASCADE_STAGES, type StageId } from './evaluation_cascade.js';
46
+ import { RECEIPT_STAGES } from './activation_ladder.js';
47
+
48
+ /** What evidence a stage needs. The ordering key. */
49
+ export const EVIDENCE_CLASSES = ['record', 'plan', 'peers', 'receipt', 'measurement'] as const;
50
+ export type EvidenceClass = (typeof EVIDENCE_CLASSES)[number];
51
+
52
+ /**
53
+ * The evidence class of each DETERMINISTIC prefix stage.
54
+ *
55
+ * Written out because it is a fact about `runCascade`'s body — which
56
+ * `CascadeInput` field each stage reads — and a fact about code cannot be
57
+ * derived from a list of names. It is not unchecked: the companion test asserts
58
+ * this order against the order in which `runCascade` first touches each input
59
+ * field, so a stage that starts reading a different field reds here rather than
60
+ * quietly reordering the enumeration.
61
+ */
62
+ export const PREFIX_EVIDENCE_CLASS: Readonly<Record<string, EvidenceClass>> = {
63
+ 'schema-validity': 'record',
64
+ 'path-ownership': 'record',
65
+ 'holdout-disclosure': 'record',
66
+ budget: 'plan',
67
+ 'near-duplicate': 'peers',
68
+ 'metric-verdict': 'measurement',
69
+ };
70
+
71
+ /** The evidence class of any stage. Receipt stages are uniformly `receipt`. */
72
+ export function evidenceClass(stage: StageId): EvidenceClass {
73
+ if ((RECEIPT_STAGES as readonly string[]).includes(stage)) return 'receipt';
74
+ const c = PREFIX_EVIDENCE_CLASS[stage];
75
+ if (c === undefined) throw new Error(`no evidence class declared for stage '${stage}'`);
76
+ return c;
77
+ }
78
+
79
+ /**
80
+ * The committed twelve, in order.
81
+ *
82
+ * Route A of step 1.2's reproduction: the two committed arrays, sorted by
83
+ * evidence class, stable within a class. `Array.prototype.sort` is specified as
84
+ * stable since ES2019, which is what makes "within a class, source order" a
85
+ * property of the language rather than of an implementation.
86
+ */
87
+ export const TWELVE_STAGES: readonly StageId[] = [...CASCADE_STAGES, ...RECEIPT_STAGES].sort(
88
+ (a, b) => EVIDENCE_CLASSES.indexOf(evidenceClass(a)) - EVIDENCE_CLASSES.indexOf(evidenceClass(b)),
89
+ );
90
+
91
+ /** The arity E9 decided. Stated so a drift from twelve is a named failure. */
92
+ export const DECIDED_ARITY = 12;