@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,307 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * measure_routing_signal — does the skill BODY carry routing signal the
4
+ * description does not? (`road-to-governed-harness-evolution` step 5.1.)
5
+ *
6
+ * THE BAR WAS FIXED BEFORE THIS FILE EXISTED. Every threshold, the k, the
7
+ * corpus partition, the verdict function and a committed prediction live in
8
+ * `agents/evidence/analysis/routing-signal-preregistration-2026-08-31.md`,
9
+ * which is committed in an earlier commit that adds no measurement module. The
10
+ * constants below are transcribed from it; they are not chosen here.
11
+ *
12
+ * TWO GAPS, AND ONLY ONE OF THEM IS MEASURABLE HERE.
13
+ *
14
+ * Gap A — proxy-to-real-session fidelity. Stated by the description-surface
15
+ * route checker's own header: asking a model which units it would
16
+ * load is not the host's selection procedure. Measuring it needs real
17
+ * sessions, and step 5.2 parks the live harness for this whole
18
+ * roadmap. So this run emits `null` with `status:
19
+ * unmeasured-by-construction` and the reason. That field is not a
20
+ * caveat — it bounds the external validity of the Gap B verdict, and
21
+ * a consumer reading the verdict file gets both or neither.
22
+ *
23
+ * Gap B — the description-vs-body question this run answers.
24
+ *
25
+ * WHY McNEMAR AND NOT A RERUN BAND. The estimator is deterministic: same tree,
26
+ * same ranking, every time. A rerun band would be identically zero and would
27
+ * measure nothing. The variance that exists is sampling variance over cases, so
28
+ * the paired discordant-pair test is the form that addresses it.
29
+ *
30
+ * ZERO MODEL CALLS AND ZERO SPEND, and that follows from the imports rather
31
+ * than from good behaviour: this module imports a file reader and a pure
32
+ * scorer, and nothing that can open a socket.
33
+ *
34
+ * Usage:
35
+ * ./scripts-run src/scripts/measure_routing_signal human table
36
+ * ./scripts-run src/scripts/measure_routing_signal --json machine record
37
+ * ./scripts-run src/scripts/measure_routing_signal --write persist verdict
38
+ *
39
+ * Exit 0 = the measurement ran · 2 = it could not run.
40
+ */
41
+ import * as fs from 'node:fs';
42
+ import * as path from 'node:path';
43
+ import { fileURLToPath, pathToFileURL } from 'node:url';
44
+
45
+ import {
46
+ ARMS,
47
+ type Arm,
48
+ type CatalogueEntry,
49
+ type CorpusCase,
50
+ legacyShaped,
51
+ loadCatalogue,
52
+ loadTrainCases,
53
+ termIndex,
54
+ topK,
55
+ } from './_lib/routing_corpus.js';
56
+
57
+ export const REPO = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
58
+
59
+ /** Where the verdict lands. Step 6.5 derives its input set from this file. */
60
+ export const VERDICT_REL = 'agents/evidence/analysis/routing-body-signal-verdict.json';
61
+ export const PREREG_REL = 'agents/evidence/analysis/routing-signal-preregistration-2026-08-31.md';
62
+
63
+ // --- the pre-registered constants, transcribed ------------------------------
64
+
65
+ export const K = 5;
66
+ export const RECALL_GAIN_BAR_PP = 5.0;
67
+ export const FALSE_ACTIVATION_GUARD_PP = 2.0;
68
+ export const POWER_FLOOR_DISCORDANT = 10;
69
+ export const ALPHA = 0.05;
70
+
71
+ export type Verdict = 'signal' | 'null' | 'harmful' | 'underpowered';
72
+
73
+ export interface ArmCounts {
74
+ readonly positives: number;
75
+ readonly positiveHits: number;
76
+ readonly negatives: number;
77
+ readonly negativeHits: number;
78
+ }
79
+
80
+ export interface Discordance {
81
+ /** control miss → body hit. */
82
+ readonly gained: number;
83
+ /** control hit → body miss. */
84
+ readonly lost: number;
85
+ }
86
+
87
+ export interface Measurement {
88
+ readonly k: number;
89
+ readonly catalogueSize: number;
90
+ readonly trainCorpora: number;
91
+ readonly legacyShaped: readonly string[];
92
+ readonly cases: number;
93
+ readonly arms: Record<Arm, ArmCounts>;
94
+ readonly recallPp: Record<Arm, number>;
95
+ readonly falseActivationPp: Record<Arm, number>;
96
+ readonly deltaRecallPp: number;
97
+ readonly deltaFalseActivationPp: number;
98
+ readonly positiveDiscordance: Discordance;
99
+ readonly pValue: number;
100
+ readonly verdict: Verdict;
101
+ readonly verdictReason: string;
102
+ }
103
+
104
+ /** Exact two-sided McNemar: a binomial sign test over the discordant pairs. */
105
+ export function mcnemarExactP(gained: number, lost: number): number {
106
+ const n = gained + lost;
107
+ if (n === 0) return 1;
108
+ const logFact: number[] = [0];
109
+ for (let i = 1; i <= n; i++) logFact.push((logFact[i - 1] as number) + Math.log(i));
110
+ const logChoose = (a: number, b: number): number =>
111
+ (logFact[a] as number) - (logFact[b] as number) - (logFact[a - b] as number);
112
+ const extreme = Math.min(gained, lost);
113
+ let tail = 0;
114
+ for (let i = 0; i <= extreme; i++) tail += Math.exp(logChoose(n, i) - n * Math.LN2);
115
+ return Math.min(1, 2 * tail);
116
+ }
117
+
118
+ const pp = (hits: number, total: number): number => (total === 0 ? 0 : (hits / total) * 100);
119
+
120
+ export function measure(repo = REPO, k = K): Measurement {
121
+ const catalogue: CatalogueEntry[] = loadCatalogue(repo);
122
+ const cases: CorpusCase[] = loadTrainCases(repo);
123
+ if (catalogue.length === 0 || cases.length === 0) {
124
+ throw new Error('measure_routing_signal: empty catalogue or corpus — a run over nothing');
125
+ }
126
+ const indexes = new Map<Arm, ReturnType<typeof termIndex>>();
127
+ for (const arm of ARMS) indexes.set(arm, termIndex(catalogue, arm));
128
+
129
+ const counts: Record<string, { p: number; ph: number; n: number; nh: number }> = {};
130
+ for (const arm of ARMS) counts[arm] = { p: 0, ph: 0, n: 0, nh: 0 };
131
+ let gained = 0;
132
+ let lost = 0;
133
+
134
+ // One ranking pass per (case, arm). The prompt is re-tokenized per arm by
135
+ // `topK`; that is the price of keeping the control arm byte-identical to
136
+ // the shipped call rather than hand-rolling a shared fast path.
137
+ for (const c of cases) {
138
+ const hit: Record<string, boolean> = {};
139
+ for (const arm of ARMS) {
140
+ const ranked = topK(c.prompt, catalogue, indexes.get(arm) as Map<string, Set<string>>, k);
141
+ hit[arm] = ranked.some((r) => r.name === c.skill);
142
+ const bucket = counts[arm] as { p: number; ph: number; n: number; nh: number };
143
+ if (c.expect) {
144
+ bucket.p += 1;
145
+ if (hit[arm]) bucket.ph += 1;
146
+ } else {
147
+ bucket.n += 1;
148
+ if (hit[arm]) bucket.nh += 1;
149
+ }
150
+ }
151
+ if (c.expect) {
152
+ const control = hit['description'] === true;
153
+ const body = hit['description+body'] === true;
154
+ if (!control && body) gained += 1;
155
+ if (control && !body) lost += 1;
156
+ }
157
+ }
158
+
159
+ const arms = {} as Record<Arm, ArmCounts>;
160
+ const recallPp = {} as Record<Arm, number>;
161
+ const falsePp = {} as Record<Arm, number>;
162
+ for (const arm of ARMS) {
163
+ const b = counts[arm] as { p: number; ph: number; n: number; nh: number };
164
+ arms[arm] = { positives: b.p, positiveHits: b.ph, negatives: b.n, negativeHits: b.nh };
165
+ recallPp[arm] = pp(b.ph, b.p);
166
+ falsePp[arm] = pp(b.nh, b.n);
167
+ }
168
+ const deltaRecall = (recallPp['description+body'] as number) - (recallPp['description'] as number);
169
+ const deltaFalse =
170
+ (falsePp['description+body'] as number) - (falsePp['description'] as number);
171
+ const p = mcnemarExactP(gained, lost);
172
+
173
+ // The pre-registered verdict function, in its pre-registered order.
174
+ let verdict: Verdict;
175
+ let reason: string;
176
+ if (gained + lost < POWER_FLOOR_DISCORDANT) {
177
+ verdict = 'underpowered';
178
+ reason = `${gained + lost} discordant positive pairs < power floor ${POWER_FLOOR_DISCORDANT}`;
179
+ } else if (deltaFalse > FALSE_ACTIVATION_GUARD_PP) {
180
+ verdict = 'harmful';
181
+ reason = `false activation +${deltaFalse.toFixed(2)} pp breaches the +${FALSE_ACTIVATION_GUARD_PP.toFixed(1)} pp guard`;
182
+ } else if (deltaRecall >= RECALL_GAIN_BAR_PP && p < ALPHA) {
183
+ verdict = 'signal';
184
+ reason = `recall +${deltaRecall.toFixed(2)} pp at p=${p.toExponential(2)}`;
185
+ } else {
186
+ verdict = 'null';
187
+ reason = `recall +${deltaRecall.toFixed(2)} pp at p=${p.toExponential(2)} does not clear +${RECALL_GAIN_BAR_PP.toFixed(1)} pp and p<${ALPHA}`;
188
+ }
189
+
190
+ return {
191
+ k,
192
+ catalogueSize: catalogue.length,
193
+ trainCorpora: new Set(cases.map((c) => c.skill)).size,
194
+ legacyShaped: legacyShaped(repo),
195
+ cases: cases.length,
196
+ arms,
197
+ recallPp,
198
+ falseActivationPp: falsePp,
199
+ deltaRecallPp: deltaRecall,
200
+ deltaFalseActivationPp: deltaFalse,
201
+ positiveDiscordance: { gained, lost },
202
+ pValue: p,
203
+ verdict,
204
+ verdictReason: reason,
205
+ };
206
+ }
207
+
208
+ /**
209
+ * The verdict record step 6.5 reads.
210
+ *
211
+ * `proxy_to_real_fidelity` is a REQUIRED field carrying `null`. A consumer that
212
+ * reads `body_signal` without reading it has taken the conclusion without its
213
+ * bound, so the two ship in one object.
214
+ */
215
+ export function verdictRecord(m: Measurement, measuredAt: string): Record<string, unknown> {
216
+ return {
217
+ schema: 1,
218
+ step: '5.1',
219
+ roadmap: 'road-to-governed-harness-evolution',
220
+ preregistration: PREREG_REL,
221
+ measured_at: measuredAt,
222
+ proxy_to_real_fidelity: {
223
+ value: null,
224
+ status: 'unmeasured-by-construction',
225
+ reason:
226
+ 'Step 5.2 parks the live routing harness for this roadmap; a fidelity ' +
227
+ 'figure requires real sessions. Every routing conclusion in this file is ' +
228
+ 'bounded by this unmeasured quantity.',
229
+ },
230
+ body_signal: {
231
+ verdict: m.verdict,
232
+ reason: m.verdictReason,
233
+ k: m.k,
234
+ delta_recall_pp: Number(m.deltaRecallPp.toFixed(3)),
235
+ delta_false_activation_pp: Number(m.deltaFalseActivationPp.toFixed(3)),
236
+ p_value: Number(m.pValue.toPrecision(4)),
237
+ discordant_positive_pairs: m.positiveDiscordance,
238
+ bars: {
239
+ recall_gain_pp: RECALL_GAIN_BAR_PP,
240
+ false_activation_guard_pp: FALSE_ACTIVATION_GUARD_PP,
241
+ power_floor_discordant: POWER_FLOOR_DISCORDANT,
242
+ alpha: ALPHA,
243
+ },
244
+ arms: m.arms,
245
+ recall_pp: {
246
+ description: Number((m.recallPp['description'] as number).toFixed(3)),
247
+ 'description+body': Number((m.recallPp['description+body'] as number).toFixed(3)),
248
+ },
249
+ false_activation_pp: {
250
+ description: Number((m.falseActivationPp['description'] as number).toFixed(3)),
251
+ 'description+body': Number(
252
+ (m.falseActivationPp['description+body'] as number).toFixed(3),
253
+ ),
254
+ },
255
+ },
256
+ corpus: {
257
+ partition: 'train',
258
+ holdout_sealed: true,
259
+ train_corpora: m.trainCorpora,
260
+ legacy_shaped_corpora: m.legacyShaped,
261
+ cases: m.cases,
262
+ catalogue_size: m.catalogueSize,
263
+ },
264
+ };
265
+ }
266
+
267
+ export function render(m: Measurement): string {
268
+ const rows = ARMS.map(
269
+ (arm) =>
270
+ ` ${arm.padEnd(18)} recall@${m.k} ${(m.recallPp[arm] as number).toFixed(2).padStart(6)} %` +
271
+ ` false-activation@${m.k} ${(m.falseActivationPp[arm] as number).toFixed(2).padStart(6)} %`,
272
+ );
273
+ return [
274
+ `measure_routing_signal — step 5.1, k=${m.k}`,
275
+ ` catalogue ${m.catalogueSize} skills · train corpora ${m.trainCorpora}` +
276
+ ` (${m.legacyShaped.length} legacy-shaped: ${m.legacyShaped.join(', ') || 'none'})` +
277
+ ` · cases ${m.cases}`,
278
+ ...rows,
279
+ ` delta recall ${m.deltaRecallPp >= 0 ? '+' : ''}${m.deltaRecallPp.toFixed(2)} pp` +
280
+ ` (bar +${RECALL_GAIN_BAR_PP.toFixed(1)} pp)`,
281
+ ` delta false activation ${m.deltaFalseActivationPp >= 0 ? '+' : ''}${m.deltaFalseActivationPp.toFixed(2)} pp` +
282
+ ` (guard +${FALSE_ACTIVATION_GUARD_PP.toFixed(1)} pp)`,
283
+ ` discordant positives gained ${m.positiveDiscordance.gained} lost ${m.positiveDiscordance.lost}` +
284
+ ` · McNemar exact p=${m.pValue.toExponential(3)}`,
285
+ ` proxy-to-real fidelity: null (unmeasured-by-construction — 5.2 park)`,
286
+ ` VERDICT: ${m.verdict} — ${m.verdictReason}`,
287
+ ].join('\n');
288
+ }
289
+
290
+ export function main(argv: readonly string[]): number {
291
+ const m = measure();
292
+ const record = verdictRecord(m, new Date().toISOString().slice(0, 10));
293
+ if (argv.includes('--write')) {
294
+ fs.writeFileSync(path.join(REPO, VERDICT_REL), `${JSON.stringify(record, null, 2)}\n`);
295
+ }
296
+ process.stdout.write(argv.includes('--json') ? `${JSON.stringify(record, null, 2)}\n` : `${render(m)}\n`);
297
+ return 0;
298
+ }
299
+
300
+ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {
301
+ try {
302
+ process.exit(main(process.argv.slice(2)));
303
+ } catch (err) {
304
+ process.stderr.write(`measure_routing_signal: ${(err as Error).message}\n`);
305
+ process.exit(2);
306
+ }
307
+ }
@@ -10,7 +10,7 @@
10
10
  * dashboard (default: `agents/evidence/migration-status.md`).
11
11
  *
12
12
  * Usage:
13
- * npx tsx src/scripts/migration_status.ts [--out <path>]
13
+ * npx tsx migration_status [--out <path>]
14
14
  *
15
15
  * Node builtins only — no third-party imports.
16
16
  */
@@ -240,7 +240,7 @@ function renderDashboard(
240
240
  lines.push('# Python → TypeScript Migration Status');
241
241
  lines.push('');
242
242
  lines.push(
243
- `> Generated by \`src/scripts/migration_status.ts\` — do not edit by hand. Timestamp: ${timestamp}`,
243
+ `> Generated by \`migration_status\` — do not edit by hand. Timestamp: ${timestamp}`,
244
244
  );
245
245
  lines.push('');
246
246
  lines.push(
@@ -311,7 +311,7 @@ function main(): void {
311
311
  process.stdout.write(`Tracked .py after exclusions: ${pyFiles.length}\n`);
312
312
  }
313
313
 
314
- // Run the CLI only when executed directly (`npx tsx src/scripts/migration_status.ts`),
314
+ // Run the CLI only when executed directly (`npx tsx migration_status`),
315
315
  // not when imported (e.g. by src/scripts/parity/phase_gate.ts for `categorize`).
316
316
  function _isCliEntry(): boolean {
317
317
  if (process.argv[1] === undefined) {
@@ -52,6 +52,7 @@ import { parse as parseYaml } from 'yaml';
52
52
 
53
53
  import { LexicalIndex } from './_lib/lexical_index.js';
54
54
  import { gpt_tokens } from './_lib/token_count.js';
55
+ import { makePromptShortlist } from './_lib/lexical_shortlist.js';
55
56
  import {
56
57
  allTierRules,
57
58
  kernelIds,
@@ -63,6 +64,12 @@ import {
63
64
  triggerlessRuleIds,
64
65
  type Router,
65
66
  } from './_lib/rule_injection.js';
67
+ import {
68
+ renderArmExperiment,
69
+ runArmExperiment,
70
+ type ArmName,
71
+ type ArmRow,
72
+ } from './_lib/delivery_arm_experiment.js';
66
73
  import { thin_entry } from './project_thin_rules.js';
67
74
  import { CAP_BYTES, buildInjection } from './hooks/rule_inject_hook.js';
68
75
 
@@ -802,11 +809,56 @@ export function runSelftest(corpusDir: string): SelftestCase[] {
802
809
  return out;
803
810
  }
804
811
 
812
+ /**
813
+ * Step 6.1's three-arm run, assembled from parts that already exist.
814
+ *
815
+ * The standing token figures come from `standingCorpora` — the SAME function
816
+ * the price grid reads — so the delivery table and the price table can never
817
+ * disagree about what a shape costs to stand up. `capBytes` is a parameter
818
+ * rather than a constant so the run can be shown sensitive to the mechanism it
819
+ * reports on; the default is the concern's own `CAP_BYTES`.
820
+ */
821
+ export function runThreeArm(
822
+ corpusDir: string,
823
+ capBytes: number = CAP_BYTES,
824
+ useShortlist = false,
825
+ ): { rows: ArmRow[]; lines: string[] } {
826
+ const router = loadRouter(REPO_ROOT);
827
+ const cases = loadCorpus(corpusDir);
828
+ const sc = standingCorpora(router);
829
+ const standing: Record<ArmName, number> = {
830
+ 'eager-all': sc.eagerTokens,
831
+ thin: sc.thinTokens,
832
+ delivery: sc.thinTokens,
833
+ };
834
+ // STEP 6.3 — the shortlist is OPT-IN and OFF by default, so the figures 6.1
835
+ // recorded reproduce byte-for-byte without it. It reaches the delivery arm
836
+ // as a tie-break under the matcher's score and can move nothing but which
837
+ // matched bodies survive a binding cap.
838
+ const rows = runArmExperiment({
839
+ repoRoot: REPO_ROOT,
840
+ router,
841
+ cases,
842
+ capBytes,
843
+ standing,
844
+ tokensOf,
845
+ shortlist: useShortlist ? makePromptShortlist(REPO_ROOT, router) : null,
846
+ });
847
+ const lines = renderArmExperiment(rows, capBytes);
848
+ lines.push(
849
+ useShortlist
850
+ ? 'shortlist: ON — lexical BM25 tie-break under the matcher score (step 6.3)'
851
+ : 'shortlist: OFF — cap order is score then router order (step 6.1 baseline)',
852
+ );
853
+ return { rows, lines };
854
+ }
855
+
805
856
  // ── CLI ──────────────────────────────────────────────────────────────────
806
857
 
807
858
  const USAGE = `usage: model_rule_injection [--corpus DIR] [--baseline-comparison]
808
859
  [--honour-open-files]
809
860
  [--selftest] [--endpoints] [--json]
861
+ [--three-arm] [--cap-bytes N] [--shortlist]
810
862
 
811
863
  Offline recall + cost model for trigger-delivered rule bodies. No metered call
812
864
  on any path.
@@ -820,6 +872,9 @@ export function main(argv: string[] | null = null): number {
820
872
  let selftest = false;
821
873
  let endpoints = false;
822
874
  let json = false;
875
+ let threeArm = false;
876
+ let shortlist = false;
877
+ let capBytes = CAP_BYTES;
823
878
  for (let i = 0; i < args.length; i += 1) {
824
879
  const a = args[i] as string;
825
880
  if (a === '--corpus') {
@@ -835,6 +890,17 @@ export function main(argv: string[] | null = null): number {
835
890
  endpoints = true;
836
891
  } else if (a === '--json') {
837
892
  json = true;
893
+ } else if (a === '--three-arm') {
894
+ threeArm = true;
895
+ } else if (a === '--shortlist') {
896
+ shortlist = true;
897
+ } else if (a === '--cap-bytes') {
898
+ i += 1;
899
+ capBytes = Number.parseInt(args[i] as string, 10);
900
+ if (!Number.isFinite(capBytes) || capBytes < 1) {
901
+ process.stderr.write(`model_rule_injection: --cap-bytes needs a positive integer\n`);
902
+ return 2;
903
+ }
838
904
  } else if (a === '-h' || a === '--help') {
839
905
  process.stdout.write(USAGE);
840
906
  return 0;
@@ -844,6 +910,16 @@ export function main(argv: string[] | null = null): number {
844
910
  }
845
911
  }
846
912
 
913
+ if (threeArm) {
914
+ const res = runThreeArm(corpus, capBytes, shortlist);
915
+ if (json) {
916
+ process.stdout.write(`${JSON.stringify(res.rows, null, 2)}\n`);
917
+ } else {
918
+ process.stdout.write(`${res.lines.join('\n')}\n`);
919
+ }
920
+ return 0;
921
+ }
922
+
847
923
  if (selftest) {
848
924
  const results = runSelftest(corpus);
849
925
  const failed = results.filter((r) => !r.passed);
@@ -127,6 +127,20 @@ export function main(argv: string[] = process.argv.slice(2)): number {
127
127
  tier_source: str(flags, 'tier-source') as TierSource | undefined,
128
128
  task_class: str(flags, 'task-class'),
129
129
  dispatch_mode: str(flags, 'dispatch-mode') as never,
130
+ // `--skills-applied=a,b` records ids; `--skills-applied=` (empty)
131
+ // records the EMPTY array, which is a real observation ("none
132
+ // applied") and deliberately not the same as omitting the flag
133
+ // ("not recorded"). The empty-string check therefore cannot be folded
134
+ // into the `?.split()` chain above, which would map both onto
135
+ // undefined and destroy the distinction the field exists for.
136
+ expected_output: str(flags, 'expected-output') as never,
137
+ diff_lines: int(flags, 'diff-lines'),
138
+ empty_cycles: int(flags, 'empty-cycles'),
139
+ skills_applied: (() => {
140
+ const raw = str(flags, 'skills-applied');
141
+ if (raw === undefined) return undefined;
142
+ return raw.split(',').map((v) => v.trim()).filter(Boolean);
143
+ })(),
130
144
  task_size_estimate: int(flags, 'task-size-estimate'),
131
145
  wall_clock_ms: int(flags, 'wall-clock-ms'),
132
146
  dispatch_tokens: int(flags, 'dispatch-tokens'),