@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,452 @@
1
+ /**
2
+ * The deterministic evaluation cascade — cheap to expensive, abort on the first
3
+ * hard failure.
4
+ *
5
+ * `road-to-governed-harness-evolution` step 4.1, built to the AI council's
6
+ * **Option B** of 2026-08-31 and NOT to Option A. The distinction is the whole
7
+ * design of this file, so it is recorded here rather than only in the roadmap.
8
+ *
9
+ * ## Why this is a PREFIX and not the twelve-stage cascade
10
+ *
11
+ * Step 4.1 names a twelve-stage form whose stages include activation/delivery
12
+ * and adherence. Those stages classify a candidate by observing how the harness
13
+ * BEHAVED, and Phase 1's step 1.1 fixes what that classification rests on: *"a
14
+ * deliberately failing trigger eval is classifiable as content vs activation vs
15
+ * adherence **from the recorded receipt alone**"*. There is no receipt producer.
16
+ * Until there is, a stage that assigned `activation` from a deterministic proxy
17
+ * would be manufacturing evidence — a holdout leak is not an observation that
18
+ * activation failed, and an `underpowered` result asserts insufficient evidence
19
+ * rather than a cause.
20
+ *
21
+ * So this module implements exactly the stages whose evidence the process
22
+ * produces ITSELF and can stand behind:
23
+ *
24
+ * | # | Stage | Cost | Family on failure |
25
+ * |---|---|---|---|
26
+ * | 1 | schema validity | zero model calls | `content` |
27
+ * | 2 | path ownership *(unreachable today — see the stage)* | zero model calls | `content` |
28
+ * | 3 | holdout disclosure | zero model calls | `unknown` |
29
+ * | 4 | budget | zero model calls | `unknown` |
30
+ * | 5 | near-duplicate screen | zero model calls | `content` |
31
+ * | 6 | metric vector + verdict| zero model calls | `unknown` |
32
+ *
33
+ * (Numbered as the prefix. In the full twelve-stage enumeration the receipt
34
+ * stages take slots 6-11 and the verdict is slot 12 — see
35
+ * `_lib/cascade_stage_enumeration.ts`.)
36
+ *
37
+ * **Every stage here is free.** That is not an accident of the current stage
38
+ * set — it is why these six are the ones that can ship without receipts, and it
39
+ * makes the step's "a candidate failing the cheapest stage consumes no model
40
+ * call" trivially true rather than merely asserted.
41
+ *
42
+ * **No stage is SOFT.** A condition whose failure does not block is a
43
+ * diagnostic, not a cascade gate — so every stage here either passes or aborts
44
+ * the cascade, and there is no third "warn" outcome a caller could ignore.
45
+ *
46
+ * ## The families, and the one this prefix may NOT assign
47
+ *
48
+ * `content | activation | adherence | unknown` are Phase 1's, and no fifth is
49
+ * invented. This prefix assigns `content` and `unknown` only. It NEVER assigns
50
+ * `activation` or `adherence`, because those are the receipt-bearing families
51
+ * and nothing in the prefix has a receipt. `unknown` is the honest family for a
52
+ * stage that establishes a candidate is unusable without establishing why in
53
+ * behavioural terms — it is a real classification, not a fallback.
54
+ *
55
+ * ## AMENDED 2026-09-01 — the prefix is no longer the whole stage list
56
+ *
57
+ * `road-to-governed-evidence-production` step 1.1 built the missing piece: an
58
+ * independent, append-only receipt producer
59
+ * (`_lib/activation_receipt_producer.ts`). So `runCascade` now accepts an
60
+ * optional {@link CascadeInput.receipt} and, when one is supplied, runs the six
61
+ * receipt-bearing stages between the peer screen and the measurement stage.
62
+ *
63
+ * **`PREFIX_ASSIGNABLE_FAMILIES` was NOT widened, and that is the point.** The
64
+ * exclusion is a property of the deterministic prefix and stays exactly as
65
+ * strict as it was: no prefix stage may assign `activation` or `adherence`. What
66
+ * changed is that the prefix is one half of the stage list rather than all of
67
+ * it. The other half's permitted families are
68
+ * {@link RECEIPT_ASSIGNABLE_FAMILIES}, and a receipt stage reaches them only
69
+ * from a receipt — never from any property of the candidate.
70
+ *
71
+ * The trust boundary and the evidence-cost claims this rests on are stated in
72
+ * `docs/contracts/activation-receipt-trust-boundary.md` and cited, not restated,
73
+ * here: TB-1 fixes the import direction (this module imports the ladder; the
74
+ * ladder imports nothing from here), and EC-2 fixes the stage placement.
75
+ */
76
+
77
+ import {
78
+ assertMutationPathsOwned,
79
+ parseCandidateRecord,
80
+ PathOwnershipError,
81
+ CandidateSchemaError,
82
+ type CandidateRecord,
83
+ } from './candidate_record.js';
84
+ import {
85
+ assertWithinBudget,
86
+ BudgetExceededError,
87
+ diversityCollapsed,
88
+ type RunBudget,
89
+ type RunPlan,
90
+ } from './harness_evolution_guards.js';
91
+ import {
92
+ buildVector,
93
+ promotionVerdict,
94
+ type MetricRow,
95
+ type MetricVector,
96
+ type PromotionVerdict,
97
+ } from './evaluation_vector.js';
98
+ import {
99
+ LADDER,
100
+ RECEIPT_STAGES,
101
+ firstStall,
102
+ type ActivationReceipt,
103
+ type ReceiptStage,
104
+ } from './activation_ladder.js';
105
+
106
+ /** Phase 1's families. No fifth is invented here. */
107
+ export const FAILURE_FAMILIES = ['content', 'activation', 'adherence', 'unknown'] as const;
108
+ export type FailureFamily = (typeof FAILURE_FAMILIES)[number];
109
+
110
+ /**
111
+ * The families this prefix is permitted to assign.
112
+ *
113
+ * `activation` and `adherence` are deliberately absent: assigning either from a
114
+ * deterministic proxy is the evidence-manufacturing the council refused.
115
+ */
116
+ export const PREFIX_ASSIGNABLE_FAMILIES: readonly FailureFamily[] = ['content', 'unknown'];
117
+
118
+ /**
119
+ * The families the RECEIPT-BEARING stages may assign.
120
+ *
121
+ * **DERIVED from {@link LADDER}, not written out** — and the first hand-written
122
+ * version of this constant was WRONG, which is why it is derived now. It read
123
+ * `['activation','adherence','unknown']` on the assumption that the receipt half
124
+ * was the complement of the prefix half. It is not: the `eligible` rung's family
125
+ * is `content`, so a receipt stage can legitimately assign `content` too, and
126
+ * the test asserting stage-versus-permission agreement caught it on its first
127
+ * run. A permission table maintained by hand beside the table it describes is a
128
+ * second source of truth for the same fact.
129
+ *
130
+ * `unknown` is added because a receipt stage reaches it by a route the ladder's
131
+ * own family column does not carry: a rung that was never observed. That is a
132
+ * property of the WALK ({@link firstStall} short-circuits on `unknown`), not of
133
+ * any rung, so it cannot be derived from `LADDER` and is named here instead.
134
+ *
135
+ * **What did NOT change is the constant that matters.**
136
+ * {@link PREFIX_ASSIGNABLE_FAMILIES} is untouched: no deterministic stage may
137
+ * assign `activation` or `adherence`. The fix for step 4.1's open conjunct was
138
+ * never to widen that exclusion — it was to stop the prefix being the whole
139
+ * stage list.
140
+ */
141
+ export const RECEIPT_ASSIGNABLE_FAMILIES: readonly FailureFamily[] = [
142
+ ...new Set<FailureFamily>([...LADDER.map((s) => s.family), 'unknown']),
143
+ ];
144
+
145
+ export const CASCADE_STAGES = [
146
+ 'schema-validity',
147
+ 'path-ownership',
148
+ 'holdout-disclosure',
149
+ 'budget',
150
+ 'near-duplicate',
151
+ 'metric-verdict',
152
+ ] as const;
153
+ export type CascadeStage = (typeof CASCADE_STAGES)[number];
154
+
155
+ /**
156
+ * Any stage the cascade can run — a deterministic prefix stage, or one of the
157
+ * six receipt-bearing stages contributed by the activation ladder.
158
+ *
159
+ * The two sets are kept as separate types rather than merged into one enum
160
+ * because their ASSIGNABLE FAMILIES differ, and that difference is the whole
161
+ * trust boundary: a prefix stage may never assign `activation` or `adherence`,
162
+ * and a receipt stage may never assign `content`. One flat enum would make both
163
+ * halves look interchangeable at every call site.
164
+ */
165
+ export type StageId = CascadeStage | ReceiptStage;
166
+
167
+ /** The cheapest stage. Its failure must cost nothing. */
168
+ export const CHEAPEST_STAGE: CascadeStage = 'schema-validity';
169
+
170
+ const STAGE_FAMILY: Readonly<Record<CascadeStage, FailureFamily>> = {
171
+ 'schema-validity': 'content',
172
+ 'path-ownership': 'content',
173
+ 'holdout-disclosure': 'unknown',
174
+ budget: 'unknown',
175
+ 'near-duplicate': 'content',
176
+ 'metric-verdict': 'unknown',
177
+ };
178
+
179
+ /**
180
+ * The family a stall AT this stage belongs to. Total over {@link StageId}.
181
+ *
182
+ * The prefix half is this module's table; the receipt half is read from
183
+ * {@link LADDER}, which owns the rung→family mapping. Copying six rows into
184
+ * `STAGE_FAMILY` would be a second place to change when a rung's family changes,
185
+ * and the two would disagree silently.
186
+ */
187
+ export function familyForStage(stage: StageId): FailureFamily {
188
+ const prefix = STAGE_FAMILY[stage as CascadeStage];
189
+ if (prefix !== undefined) return prefix;
190
+ const i = RECEIPT_STAGES.indexOf(stage as ReceiptStage);
191
+ // Unreachable through the public API: `StageId` is the union of the two
192
+ // sets, so a stage that is in neither table cannot be constructed without a
193
+ // cast. `unknown` is the honest fallback rather than a throw — a classifier
194
+ // that crashes on an unrecognised stage turns a labelling gap into a lost run.
195
+ return i >= 0 ? (LADDER[i] as { family: FailureFamily }).family : 'unknown';
196
+ }
197
+
198
+ export interface CascadePass {
199
+ readonly outcome: 'pass';
200
+ readonly candidate_id: string;
201
+ readonly stages_run: readonly StageId[];
202
+ readonly model_calls: 0;
203
+ readonly verdict: PromotionVerdict;
204
+ }
205
+
206
+ export interface CascadeAbort {
207
+ readonly outcome: 'abort';
208
+ readonly candidate_id: string | null;
209
+ /** The FIRST failing stage. The cascade does not continue past it. */
210
+ readonly failed_stage: StageId;
211
+ readonly family: FailureFamily;
212
+ readonly detail: string;
213
+ readonly stages_run: readonly StageId[];
214
+ readonly model_calls: 0;
215
+ }
216
+
217
+ /**
218
+ * Stages 1-5 passed and the verdict stage was NOT REACHED because the run
219
+ * supplied no measurements.
220
+ *
221
+ * This is deliberately a third outcome and not an abort. A run that materialises
222
+ * candidates without measuring them has not failed — materialising is what
223
+ * `evolution_lab run` is for, and turning that into a non-zero exit would change
224
+ * a verb's contract to make a new stage look reachable. Nor is it a pass: there
225
+ * is no verdict, so nothing may read one. Naming the state is what keeps "no
226
+ * metrics" from being silently benign.
227
+ */
228
+ export interface CascadeIncomplete {
229
+ readonly outcome: 'incomplete';
230
+ readonly candidate_id: string;
231
+ readonly stages_run: readonly StageId[];
232
+ readonly model_calls: 0;
233
+ readonly not_reached: CascadeStage;
234
+ readonly why: string;
235
+ }
236
+
237
+ export type CascadeResult = CascadePass | CascadeAbort | CascadeIncomplete;
238
+
239
+ export interface CascadeInput {
240
+ /** The raw, unparsed record. Stage 1 is what turns it into a `CandidateRecord`. */
241
+ readonly raw: unknown;
242
+ readonly plan: RunPlan;
243
+ readonly budget: RunBudget;
244
+ /** Sibling candidate texts, for the near-duplicate screen. */
245
+ readonly peers?: readonly string[] | undefined;
246
+ /** Metric rows, when the caller has them. Absent means the run measured nothing. */
247
+ readonly rows?: readonly MetricRow[] | undefined;
248
+ /**
249
+ * An already-built vector, when the caller has one.
250
+ *
251
+ * Takes precedence over `rows`. Step 5.6's run report parses vectors from
252
+ * `--vector` and validates them through `buildVector`, so re-deriving one
253
+ * here from loose rows would give the verdict a second, less-checked path
254
+ * to the same number.
255
+ */
256
+ readonly vector?: MetricVector | undefined;
257
+ /**
258
+ * An activation receipt for the artefact this candidate produces, when one
259
+ * was observed.
260
+ *
261
+ * ABSENT means no receipt was produced, which is not the same as a receipt
262
+ * whose rungs are unknown: with no receipt the six receipt-bearing stages do
263
+ * not run at all, and `stages_run` says so. Only
264
+ * `_lib/activation_receipt_producer.ts` mints these — the cascade consumes a
265
+ * receipt and never derives one, which is the direction
266
+ * `docs/contracts/activation-receipt-trust-boundary.md` TB-1 fixes.
267
+ */
268
+ readonly receipt?: ActivationReceipt | undefined;
269
+ }
270
+
271
+ function abort(
272
+ stage: StageId,
273
+ detail: string,
274
+ run: StageId[],
275
+ candidate_id: string | null,
276
+ ): CascadeAbort {
277
+ return {
278
+ outcome: 'abort',
279
+ candidate_id,
280
+ failed_stage: stage,
281
+ family: familyForStage(stage),
282
+ detail,
283
+ stages_run: [...run],
284
+ model_calls: 0,
285
+ };
286
+ }
287
+
288
+ /**
289
+ * Run the deterministic prefix over one candidate.
290
+ *
291
+ * Aborts on the FIRST hard failure — later stages are not attempted, so a
292
+ * candidate that fails stage 1 never reaches stage 6. `model_calls` is a literal
293
+ * `0` on every path rather than a counter, because a counter can be wrong and a
294
+ * literal cannot: there is no code path in this module that could increment one.
295
+ */
296
+ export function runCascade(input: CascadeInput): CascadeResult {
297
+ const run: StageId[] = [];
298
+
299
+ // Stage 1 — schema validity. The cheapest, and the one whose failure must
300
+ // cost nothing: it runs before any other stage touches the record.
301
+ run.push('schema-validity');
302
+ let record: CandidateRecord;
303
+ try {
304
+ record = parseCandidateRecord(input.raw);
305
+ } catch (e) {
306
+ // ATTRIBUTION, not just error handling. `parseMutations` already calls
307
+ // `assertMutationPathsOwned` (`_lib/candidate_record.ts:434`), so an
308
+ // unowned path throws from INSIDE the parse. Catching everything here
309
+ // as a schema failure would file a path-ownership violation under the
310
+ // wrong stage and the wrong evidence — the failing stage is what Phase
311
+ // 1's classification reads, so getting it wrong is not cosmetic.
312
+ if (e instanceof PathOwnershipError) {
313
+ run.push('path-ownership');
314
+ return abort('path-ownership', e.message, run, null);
315
+ }
316
+ const why = e instanceof CandidateSchemaError ? e.message : String(e);
317
+ return abort('schema-validity', why, run, null);
318
+ }
319
+
320
+ // Stage 2 — path ownership, re-checked.
321
+ //
322
+ // HONEST LABEL: this branch is UNREACHABLE through this function's public
323
+ // API today, and therefore untested. `runCascade` only ever accepts `raw`
324
+ // and parses it, and `parseMutations` already calls
325
+ // `assertMutationPathsOwned` (`_lib/candidate_record.ts:434`), so every
326
+ // unowned path throws inside stage 1 and is attributed above. Measured
327
+ // 2026-08-31 by neutralising the abort below: 15/15 stayed green.
328
+ //
329
+ // It is kept rather than deleted because it is free and it fails closed if
330
+ // the parser ever stops enforcing ownership — but "defense in depth" is a
331
+ // claim, and this one has no test behind it, so it is written down as an
332
+ // unproven guard instead of counted as a proven one. Deleting it is a
333
+ // legitimate future call; silently trusting it is not.
334
+ run.push('path-ownership');
335
+ try {
336
+ assertMutationPathsOwned(record.mutations);
337
+ } catch (e) {
338
+ const why = e instanceof PathOwnershipError ? e.message : String(e);
339
+ return abort('path-ownership', why, run, record.id);
340
+ }
341
+
342
+ // Stage 3 — holdout disclosure. The guard that REFUSES disclosure to a
343
+ // proposer already exists and exits non-zero at its own call sites; what
344
+ // this stage adds is that a record carrying a holdout reference never
345
+ // reaches the verdict stage.
346
+ run.push('holdout-disclosure');
347
+ const leaked = record.mutations.find((m) => m.path.includes('holdout'));
348
+ if (leaked !== undefined) {
349
+ return abort('holdout-disclosure', `mutation path names a holdout: ${leaked.path}`, run, record.id);
350
+ }
351
+
352
+ // Stage 4 — budget. Before any expensive stage, and before any spend.
353
+ run.push('budget');
354
+ try {
355
+ assertWithinBudget(input.plan, input.budget);
356
+ } catch (e) {
357
+ const why = e instanceof BudgetExceededError ? e.message : String(e);
358
+ return abort('budget', why, run, record.id);
359
+ }
360
+
361
+ // Stage 5 — near-duplicate screen. Deterministic, zero model calls, and it
362
+ // runs BEFORE the verdict so a paraphrase never consumes a measurement.
363
+ run.push('near-duplicate');
364
+ const peers = input.peers ?? [];
365
+ if (peers.length > 0 && diversityCollapsed([record.id, ...peers])) {
366
+ return abort('near-duplicate', 'candidate set collapsed to duplicates', run, record.id);
367
+ }
368
+
369
+ // Stages 6-11 — the RECEIPT-BEARING stages, one per ladder rung.
370
+ //
371
+ // Placed here, and the placement is the evidence-cost contract's EC-2: after
372
+ // every record-only, plan-only and peer-only stage, and before the
373
+ // measurement stage whose evidence is the most expensive to obtain. Reading
374
+ // a receipt is cheap but not precondition-free — how far an artefact climbed
375
+ // says nothing useful about a candidate that is not even well-formed.
376
+ //
377
+ // NO RECEIPT MEANS NO STAGES RUN. Not "six stages that returned unknown":
378
+ // the ladder already distinguishes absent from negative, and running a stage
379
+ // over evidence that does not exist would put six entries in `stages_run`
380
+ // that observed nothing. `stages_run` is what a reader counts coverage from.
381
+ if (input.receipt !== undefined) {
382
+ const stall = firstStall(input.receipt);
383
+ if (stall !== null) {
384
+ // Every stage up to the stall ran; the stall's own stage ran and is
385
+ // where the walk stopped. Abort-on-first, same rule as the prefix.
386
+ const upTo = LADDER.findIndex((s) => s.rung === stall.rung);
387
+ for (let i = 0; i <= upTo; i += 1) run.push(RECEIPT_STAGES[i] as ReceiptStage);
388
+ if (stall.family !== 'unknown') {
389
+ // A rung that was OBSERVED not to be reached. This is the only
390
+ // path on which the cascade assigns `activation` or `adherence`,
391
+ // and it assigns it from the receipt rather than from any
392
+ // property of the candidate.
393
+ return abort(
394
+ stall.stage,
395
+ `activation stalled at rung '${stall.rung}'` +
396
+ (input.receipt.reason !== undefined ? ` (${input.receipt.reason})` : ''),
397
+ run,
398
+ record.id,
399
+ );
400
+ }
401
+ // An UNOBSERVED rung is not a failure. The cascade has learned
402
+ // nothing about activation and says so by not aborting — folding
403
+ // `unknown` into a refusal would turn every capture gap into a
404
+ // rejected candidate, which is the inflation `ladderRate` keeps out
405
+ // of its own denominator for exactly the same reason.
406
+ } else {
407
+ for (const s of RECEIPT_STAGES) run.push(s);
408
+ }
409
+ }
410
+
411
+ // Stage 12 — metric vector and the promotion verdict. This is the ONLY
412
+ // promoter consulted, and it is `_lib/evaluation_vector.ts`'s, never a
413
+ // second verdict computed here.
414
+ if (input.vector === undefined && (input.rows === undefined || input.rows.length === 0)) {
415
+ return {
416
+ outcome: 'incomplete',
417
+ candidate_id: record.id,
418
+ stages_run: [...run],
419
+ model_calls: 0,
420
+ not_reached: 'metric-verdict',
421
+ why: 'no metric rows: the run measured nothing, so no verdict exists',
422
+ };
423
+ }
424
+ run.push('metric-verdict');
425
+ let vector: MetricVector;
426
+ if (input.vector !== undefined) {
427
+ if (input.vector.candidate_id !== record.id) {
428
+ return abort(
429
+ 'metric-verdict',
430
+ `vector names candidate '${input.vector.candidate_id}', not '${record.id}'`,
431
+ run,
432
+ record.id,
433
+ );
434
+ }
435
+ vector = input.vector;
436
+ } else {
437
+ try {
438
+ vector = buildVector(record.id, input.rows as readonly MetricRow[]);
439
+ } catch (e) {
440
+ return abort('metric-verdict', String((e as Error).message), run, record.id);
441
+ }
442
+ }
443
+ const verdict = promotionVerdict(vector);
444
+
445
+ return {
446
+ outcome: 'pass',
447
+ candidate_id: record.id,
448
+ stages_run: [...run],
449
+ model_calls: 0,
450
+ verdict,
451
+ };
452
+ }