@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,414 @@
1
+ /**
2
+ * The promotion evidence package — `road-to-harness-promotion-bridge` steps
3
+ * 7.1, 7.2, 7.3 and 7.5.
4
+ *
5
+ * ## What this module is, and what it deliberately is not
6
+ *
7
+ * It is a REFUSING VALIDATOR. It reads an untrusted evidence document and either
8
+ * returns a typed package or throws naming the first thing missing. It performs
9
+ * no filesystem write, mints no capability, and expresses no promotion — the
10
+ * capability stays `_lib/promotion_capability.ts` and the structural invariant
11
+ * that nothing bypasses it stays `lint_promotion_paths.ts`.
12
+ *
13
+ * ## 7.1 — one evidence package per promotion, in the fuller form
14
+ *
15
+ * > *The master adopted a 9-field package; the skipped parent's has 14, and the
16
+ * > five extra are exactly the fields that make 3.2, 4.4 and 7.3 auditable:
17
+ * > pathology cell, candidate lineage, mutation dimension, selection results,
18
+ * > sealed result, cost, scope.*
19
+ * > verify: **a promotion attempt with any field absent is refused.**
20
+ *
21
+ * **The step's own arithmetic does not close, and it is implemented rather than
22
+ * silently reconciled.** It says "the five extra" and then names SEVEN fields.
23
+ * Both readings were available — implement five of the seven, or implement all
24
+ * seven — and the conservative one is taken: all seven are REQUIRED, because
25
+ * dropping two would be a narrowing of a transferred step, and narrowing a
26
+ * transferred step is exactly what the split's own preamble forbids. The count
27
+ * discrepancy is recorded here rather than resolved, since resolving it means
28
+ * editing the verbatim text.
29
+ *
30
+ * {@link PROMOTION_EVIDENCE_FIELDS} therefore carries the seven named fields,
31
+ * the candidate id they hang off, and three more that belong to sibling steps in
32
+ * the same package: `governance` (7.2), `rollout` (7.5) and
33
+ * `material_improvement` (7.4). One package, one validator, one refusal path —
34
+ * splitting them into four documents would be the second governance system 7.2
35
+ * forbids, in a different costume.
36
+ *
37
+ * ## 7.2 — route through the existing gate, not a second governance system
38
+ *
39
+ * > verify: **no new governance verb, no new approval path.**
40
+ *
41
+ * The four vocabulary terms are IMPORTED, not redeclared: `AUTHORITY_BASES`,
42
+ * `EVIDENCE_STRENGTHS`, `REOPEN_POLICIES` and `PROTECTED_DIMENSIONS` all come
43
+ * from `_lib/adr_frontmatter.ts`, which is what `check_adr_frontmatter.ts` and
44
+ * `adr_cite_check.ts` already read. A copy would have satisfied the letter and
45
+ * broken the point: two lists that can drift ARE two governance systems.
46
+ *
47
+ * ## 7.3 — promote by scope, with a transfer gate
48
+ *
49
+ * {@link SCOPE_LADDER} is ordered, and the order is its contract. A raise
50
+ * demands independent transfer evidence from a second solver OR a second host
51
+ * configuration; evidence that all comes from one of each is refused, which is
52
+ * the step's second verify clause verbatim.
53
+ *
54
+ * ## 7.5 — roll out by canary, never silently
55
+ *
56
+ * A package that declares it changes a shipped default and cannot name a
57
+ * COMPLETED opt-in bundle is refused. What this can and cannot establish is
58
+ * stated at {@link assertRollout}.
59
+ */
60
+ import {
61
+ AUTHORITY_BASES,
62
+ EVIDENCE_STRENGTHS,
63
+ PROTECTED_DIMENSIONS,
64
+ REOPEN_POLICIES,
65
+ } from './adr_frontmatter.js';
66
+ import { MUTATION_DIMENSIONS, type MutationDimension, isMutationDimension } from './candidate_record.js';
67
+
68
+ /** Raised on the first missing or malformed field. Never a list — the first one is the finding. */
69
+ export class PromotionEvidenceError extends Error {
70
+ /** The field that failed, so a caller can name it without parsing the message. */
71
+ readonly field: string;
72
+ constructor(field: string, why: string) {
73
+ super(`promotion evidence: '${field}' ${why}`);
74
+ this.name = 'PromotionEvidenceError';
75
+ this.field = field;
76
+ }
77
+ }
78
+
79
+ // --- 7.3 — the scope ladder -------------------------------------------------
80
+
81
+ /**
82
+ * The ladder, in ascending order. The ORDER is the contract: it is the only
83
+ * thing that makes "moving up a level" decidable.
84
+ */
85
+ export const SCOPE_LADDER = ['episode', 'repo', 'stack', 'profile-pack', 'global'] as const;
86
+ export type ScopeLevel = (typeof SCOPE_LADDER)[number];
87
+
88
+ export function isScopeLevel(v: unknown): v is ScopeLevel {
89
+ return typeof v === 'string' && (SCOPE_LADDER as readonly string[]).includes(v);
90
+ }
91
+
92
+ export function scopeIndex(s: ScopeLevel): number {
93
+ return SCOPE_LADDER.indexOf(s);
94
+ }
95
+
96
+ /** One independent replication of the candidate's effect. */
97
+ export interface TransferEvidence {
98
+ /** The host configuration it was reproduced under. */
99
+ readonly configuration: string;
100
+ /** The solver that reproduced it. */
101
+ readonly solver: string;
102
+ /** What was observed. Free text, but non-empty — an unstated result is not evidence. */
103
+ readonly result: string;
104
+ }
105
+
106
+ export interface PromotionScope {
107
+ readonly level: ScopeLevel;
108
+ /** Absent means "not a raise" — the candidate is promoted at the level it was evaluated. */
109
+ readonly raisedFrom?: ScopeLevel;
110
+ readonly transferEvidence: readonly TransferEvidence[];
111
+ }
112
+
113
+ /**
114
+ * The transfer gate.
115
+ *
116
+ * A raise needs evidence that is INDEPENDENT of the configuration the candidate
117
+ * was evaluated under — a second solver or a second host configuration. Evidence
118
+ * that all shares one solver and one configuration is one observation written
119
+ * several times, and admitting it is how "every promotion goes straight to
120
+ * canonical and the anti-bloat doctrine has no teeth".
121
+ *
122
+ * @throws {PromotionEvidenceError} on a raise without independent evidence.
123
+ */
124
+ export function assertTransferEvidence(scope: PromotionScope): void {
125
+ if (scope.raisedFrom === undefined) {
126
+ return;
127
+ }
128
+ if (scopeIndex(scope.level) <= scopeIndex(scope.raisedFrom)) {
129
+ return;
130
+ }
131
+ const solvers = new Set(scope.transferEvidence.map((e) => e.solver));
132
+ const configurations = new Set(scope.transferEvidence.map((e) => e.configuration));
133
+ if (solvers.size < 2 && configurations.size < 2) {
134
+ throw new PromotionEvidenceError(
135
+ 'scope',
136
+ `raises ${scope.raisedFrom} -> ${scope.level} on ${String(scope.transferEvidence.length)} ` +
137
+ `observation(s) from ${String(solvers.size)} solver(s) and ${String(configurations.size)} ` +
138
+ 'configuration(s). A raise requires a SECOND solver or a SECOND host configuration; ' +
139
+ 'one configuration measured repeatedly is one observation, not transfer.',
140
+ );
141
+ }
142
+ }
143
+
144
+ // --- 7.5 — the canary rollout -----------------------------------------------
145
+
146
+ /** Ordered: a promotion enters at `opt-in` and reaches `default` only through it. */
147
+ export const ROLLOUT_STAGES = ['opt-in', 'canary', 'default'] as const;
148
+ export type RolloutStage = (typeof ROLLOUT_STAGES)[number];
149
+
150
+ export interface PromotionRollout {
151
+ readonly stage: RolloutStage;
152
+ /** The opt-in candidate bundle this promotion shipped in. */
153
+ readonly bundle: string;
154
+ readonly optInCompleted: boolean;
155
+ /** Does landing this change what a consumer gets without opting in? */
156
+ readonly changesShippedDefault: boolean;
157
+ }
158
+
159
+ /**
160
+ * The stage gate.
161
+ *
162
+ * > verify: **no promotion changes a shipped default without an opt-in stage.**
163
+ *
164
+ * **What this establishes and what it does not.** It refuses a PACKAGE that
165
+ * declares a shipped-default change with no completed opt-in bundle, and it
166
+ * refuses a package that claims the `default` stage without one. It cannot
167
+ * establish that a package which declares `changesShippedDefault: false` is
168
+ * telling the truth — that is only observable once a promotion path can actually
169
+ * run and the resulting diff can be compared against the shipped defaults, which
170
+ * `blocker: merge-authority` prevents. The mechanism half is built and tested;
171
+ * the observation half is named as absent rather than implied.
172
+ *
173
+ * @throws {PromotionEvidenceError}
174
+ */
175
+ export function assertRollout(rollout: PromotionRollout): void {
176
+ if (rollout.changesShippedDefault && !rollout.optInCompleted) {
177
+ throw new PromotionEvidenceError(
178
+ 'rollout',
179
+ 'changes a shipped default with no COMPLETED opt-in stage. Roll out by canary: ship the ' +
180
+ 'candidate in an opt-in bundle, complete that stage, and only then change what a ' +
181
+ 'consumer gets without asking for it.',
182
+ );
183
+ }
184
+ if (rollout.stage === 'default' && !rollout.optInCompleted) {
185
+ throw new PromotionEvidenceError(
186
+ 'rollout',
187
+ "claims the 'default' stage without a completed opt-in stage. The ladder is " +
188
+ `${ROLLOUT_STAGES.join(' -> ')} and it is not skippable.`,
189
+ );
190
+ }
191
+ if (rollout.optInCompleted && rollout.bundle.trim() === '') {
192
+ throw new PromotionEvidenceError(
193
+ 'rollout',
194
+ 'reports a completed opt-in stage but names no bundle. An unnamed bundle cannot be audited, ' +
195
+ 'and an unauditable opt-in is the silent rollout this step exists to prevent.',
196
+ );
197
+ }
198
+ }
199
+
200
+ // --- 7.2 — the governance block, in the existing vocabulary -----------------
201
+
202
+ export interface PromotionGovernance {
203
+ readonly authorityBasis: string;
204
+ readonly evidenceStrength: string;
205
+ readonly reopenPolicy: string;
206
+ readonly protectedDimensions: readonly string[];
207
+ }
208
+
209
+ // --- 7.1 — the package ------------------------------------------------------
210
+
211
+ /**
212
+ * Every field a promotion attempt must carry. Order is the refusal order, so a
213
+ * caller fixing one at a time walks the list top to bottom.
214
+ */
215
+ export const PROMOTION_EVIDENCE_FIELDS = [
216
+ 'candidate_id',
217
+ 'pathology_cell',
218
+ 'lineage',
219
+ 'dimension',
220
+ 'selection',
221
+ 'sealed_result',
222
+ 'cost',
223
+ 'scope',
224
+ 'governance',
225
+ 'rollout',
226
+ 'material_improvement',
227
+ ] as const;
228
+ export type PromotionEvidenceField = (typeof PROMOTION_EVIDENCE_FIELDS)[number];
229
+
230
+ export interface PromotionEvidence {
231
+ readonly candidateId: string;
232
+ /** The pathology × subject cell the candidate targets (3.2 attribution). */
233
+ readonly pathologyCell: string;
234
+ /** Ancestor candidate ids, oldest first. May be empty; the KEY is required. */
235
+ readonly lineage: readonly string[];
236
+ readonly dimension: MutationDimension;
237
+ readonly selection: { readonly trials: number; readonly wins: number; readonly summary: string };
238
+ readonly sealedResult: { readonly held: boolean; readonly summary: string };
239
+ readonly cost: { readonly trials: number; readonly spendCents: number };
240
+ readonly scope: PromotionScope;
241
+ readonly governance: PromotionGovernance;
242
+ readonly rollout: PromotionRollout;
243
+ /** 7.4's evidence: what it replaces, what it says, and the measured delta. */
244
+ readonly materialImprovement: {
245
+ readonly baselineText: string;
246
+ readonly candidateText: string;
247
+ readonly deltaPercent: number;
248
+ };
249
+ }
250
+
251
+ function obj(input: unknown, field: string): Record<string, unknown> {
252
+ if (typeof input !== 'object' || input === null || Array.isArray(input)) {
253
+ throw new PromotionEvidenceError(field, 'must be a JSON object');
254
+ }
255
+ return input as Record<string, unknown>;
256
+ }
257
+
258
+ function required(o: Record<string, unknown>, key: PromotionEvidenceField): unknown {
259
+ // ABSENT, never defaulted. The verify clause is "a promotion attempt with any
260
+ // field absent is refused", and a default is a value the author did not choose.
261
+ if (!(key in o)) {
262
+ throw new PromotionEvidenceError(key, 'is required and is never defaulted — an absent field is not an empty one');
263
+ }
264
+ return o[key];
265
+ }
266
+
267
+ function nonEmptyString(v: unknown, field: string): string {
268
+ if (typeof v !== 'string' || v.trim() === '') {
269
+ throw new PromotionEvidenceError(field, 'must be a non-empty string');
270
+ }
271
+ return v;
272
+ }
273
+
274
+ function integer(v: unknown, field: string): number {
275
+ if (typeof v !== 'number' || !Number.isInteger(v) || v < 0) {
276
+ throw new PromotionEvidenceError(field, 'must be a non-negative integer');
277
+ }
278
+ return v;
279
+ }
280
+
281
+ function oneOf(v: unknown, allowed: readonly string[], field: string): string {
282
+ if (typeof v !== 'string' || !allowed.includes(v)) {
283
+ throw new PromotionEvidenceError(field, `must be one of ${allowed.join(', ')} (got ${JSON.stringify(v)})`);
284
+ }
285
+ return v;
286
+ }
287
+
288
+ /**
289
+ * Validate an untrusted evidence document — the refusing path.
290
+ *
291
+ * @throws {PromotionEvidenceError} on the first violation, naming the field.
292
+ */
293
+ export function parsePromotionEvidence(input: unknown): PromotionEvidence {
294
+ const o = obj(input, 'package');
295
+
296
+ const candidateId = nonEmptyString(required(o, 'candidate_id'), 'candidate_id');
297
+ const pathologyCell = nonEmptyString(required(o, 'pathology_cell'), 'pathology_cell');
298
+
299
+ const rawLineage = required(o, 'lineage');
300
+ if (!Array.isArray(rawLineage)) {
301
+ throw new PromotionEvidenceError('lineage', 'must be an array of ancestor candidate ids (use [] for none)');
302
+ }
303
+ const lineage = rawLineage.map((x, i) => nonEmptyString(x, `lineage[${String(i)}]`));
304
+
305
+ const dimension = required(o, 'dimension');
306
+ if (!isMutationDimension(dimension)) {
307
+ throw new PromotionEvidenceError(
308
+ 'dimension',
309
+ `must be one of ${MUTATION_DIMENSIONS.join(', ')} — one PRIMARY dimension per candidate (step 3.2)`,
310
+ );
311
+ }
312
+
313
+ const sel = obj(required(o, 'selection'), 'selection');
314
+ const selection = {
315
+ trials: integer(sel['trials'], 'selection.trials'),
316
+ wins: integer(sel['wins'], 'selection.wins'),
317
+ summary: nonEmptyString(sel['summary'], 'selection.summary'),
318
+ };
319
+ if (selection.wins > selection.trials) {
320
+ throw new PromotionEvidenceError('selection', 'reports more wins than trials');
321
+ }
322
+
323
+ const sealed = obj(required(o, 'sealed_result'), 'sealed_result');
324
+ if (typeof sealed['held'] !== 'boolean') {
325
+ throw new PromotionEvidenceError('sealed_result.held', 'must be a boolean — did the sealed evaluation hold?');
326
+ }
327
+ const sealedResult = { held: sealed['held'], summary: nonEmptyString(sealed['summary'], 'sealed_result.summary') };
328
+
329
+ const rawCost = obj(required(o, 'cost'), 'cost');
330
+ const cost = {
331
+ trials: integer(rawCost['trials'], 'cost.trials'),
332
+ spendCents: integer(rawCost['spend_cents'], 'cost.spend_cents'),
333
+ };
334
+
335
+ const rawScope = obj(required(o, 'scope'), 'scope');
336
+ const level = rawScope['level'];
337
+ if (!isScopeLevel(level)) {
338
+ throw new PromotionEvidenceError('scope.level', `must be one of ${SCOPE_LADDER.join(' -> ')}`);
339
+ }
340
+ const rawRaised = rawScope['raised_from'];
341
+ if (rawRaised !== undefined && !isScopeLevel(rawRaised)) {
342
+ throw new PromotionEvidenceError('scope.raised_from', `must be one of ${SCOPE_LADDER.join(' -> ')} when present`);
343
+ }
344
+ const rawTransfer = rawScope['transfer_evidence'];
345
+ if (!Array.isArray(rawTransfer)) {
346
+ throw new PromotionEvidenceError('scope.transfer_evidence', 'must be an array (use [] when this is not a raise)');
347
+ }
348
+ const transferEvidence: TransferEvidence[] = rawTransfer.map((raw, i) => {
349
+ const e = obj(raw, `scope.transfer_evidence[${String(i)}]`);
350
+ return {
351
+ configuration: nonEmptyString(e['configuration'], `scope.transfer_evidence[${String(i)}].configuration`),
352
+ solver: nonEmptyString(e['solver'], `scope.transfer_evidence[${String(i)}].solver`),
353
+ result: nonEmptyString(e['result'], `scope.transfer_evidence[${String(i)}].result`),
354
+ };
355
+ });
356
+ const scope: PromotionScope =
357
+ rawRaised === undefined
358
+ ? { level, transferEvidence }
359
+ : { level, raisedFrom: rawRaised, transferEvidence };
360
+ assertTransferEvidence(scope);
361
+
362
+ const gov = obj(required(o, 'governance'), 'governance');
363
+ const rawDims = gov['protected_dimensions'];
364
+ if (!Array.isArray(rawDims)) {
365
+ throw new PromotionEvidenceError('governance.protected_dimensions', "must be an array (use ['none'])");
366
+ }
367
+ const governance: PromotionGovernance = {
368
+ authorityBasis: oneOf(gov['authority_basis'], AUTHORITY_BASES, 'governance.authority_basis'),
369
+ evidenceStrength: oneOf(gov['evidence_strength'], EVIDENCE_STRENGTHS, 'governance.evidence_strength'),
370
+ reopenPolicy: oneOf(gov['reopen_policy'], REOPEN_POLICIES, 'governance.reopen_policy'),
371
+ protectedDimensions: rawDims.map((d, i) =>
372
+ oneOf(d, PROTECTED_DIMENSIONS, `governance.protected_dimensions[${String(i)}]`),
373
+ ),
374
+ };
375
+ if (governance.protectedDimensions.length === 0) {
376
+ throw new PromotionEvidenceError('governance.protected_dimensions', "must name at least one dimension (use ['none'])");
377
+ }
378
+
379
+ const rol = obj(required(o, 'rollout'), 'rollout');
380
+ if (typeof rol['opt_in_completed'] !== 'boolean' || typeof rol['changes_shipped_default'] !== 'boolean') {
381
+ throw new PromotionEvidenceError('rollout', "needs boolean 'opt_in_completed' and 'changes_shipped_default'");
382
+ }
383
+ const rollout: PromotionRollout = {
384
+ stage: oneOf(rol['stage'], ROLLOUT_STAGES, 'rollout.stage') as RolloutStage,
385
+ bundle: typeof rol['bundle'] === 'string' ? rol['bundle'] : '',
386
+ optInCompleted: rol['opt_in_completed'],
387
+ changesShippedDefault: rol['changes_shipped_default'],
388
+ };
389
+ assertRollout(rollout);
390
+
391
+ const mi = obj(required(o, 'material_improvement'), 'material_improvement');
392
+ const materialImprovement = {
393
+ baselineText: nonEmptyString(mi['baseline_text'], 'material_improvement.baseline_text'),
394
+ candidateText: nonEmptyString(mi['candidate_text'], 'material_improvement.candidate_text'),
395
+ deltaPercent: typeof mi['delta_percent'] === 'number' ? mi['delta_percent'] : Number.NaN,
396
+ };
397
+ if (!Number.isFinite(materialImprovement.deltaPercent)) {
398
+ throw new PromotionEvidenceError('material_improvement.delta_percent', 'must be a finite number');
399
+ }
400
+
401
+ return {
402
+ candidateId,
403
+ pathologyCell,
404
+ lineage,
405
+ dimension: dimension as MutationDimension,
406
+ selection,
407
+ sealedResult,
408
+ cost,
409
+ scope,
410
+ governance,
411
+ rollout,
412
+ materialImprovement,
413
+ };
414
+ }