@event4u/agent-config 8.4.1 → 8.6.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 (581) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +92 -0
  3. package/README.md +17 -5
  4. package/dist/agent-src/README.md +1 -1
  5. package/dist/agent-src/commands/{analyze-reference-repo.md → analyze/reference-repo.md} +3 -1
  6. package/dist/agent-src/commands/analyze.md +9 -6
  7. package/dist/agent-src/commands/{bug-fix.md → bug/fix.md} +3 -1
  8. package/dist/agent-src/commands/{bug-investigate.md → bug/investigate.md} +4 -2
  9. package/dist/agent-src/commands/bug.md +59 -0
  10. package/dist/agent-src/commands/{set-cost-profile.md → cost/profile.md} +9 -6
  11. package/dist/agent-src/commands/{cost-report.md → cost/report.md} +38 -17
  12. package/dist/agent-src/commands/cost.md +57 -0
  13. package/dist/agent-src/commands/evals/{review-changes.json → review.json} +12 -8
  14. package/dist/agent-src/commands/{quality-fix.md → fix/quality.md} +5 -2
  15. package/dist/agent-src/commands/fix.md +7 -4
  16. package/dist/agent-src/commands/optimize/project.md +250 -0
  17. package/dist/agent-src/commands/{optimize-prompt.md → optimize/prompt.md} +3 -2
  18. package/dist/agent-src/commands/optimize.md +17 -12
  19. package/dist/agent-src/commands/{package-reset.md → package/reset.md} +2 -0
  20. package/dist/agent-src/commands/{package-test.md → package/test.md} +3 -1
  21. package/dist/agent-src/commands/package.md +56 -0
  22. package/dist/agent-src/commands/{project-analyze.md → project/analyze.md} +10 -8
  23. package/dist/agent-src/commands/{project-health.md → project/health.md} +2 -0
  24. package/dist/agent-src/commands/project.md +60 -0
  25. package/dist/agent-src/commands/{review-changes.md → review/changes.md} +26 -24
  26. package/dist/agent-src/commands/{review-routing.md → review/routing.md} +21 -17
  27. package/dist/agent-src/commands/review.md +61 -0
  28. package/dist/agent-src/commands/security-audit-config.md +24 -23
  29. package/dist/agent-src/commands/{sync-agent-settings.md → sync/agent-settings.md} +11 -7
  30. package/dist/agent-src/commands/{sync-gitignore → sync/gitignore}/fix.md +36 -27
  31. package/dist/agent-src/commands/{sync-gitignore.md → sync/gitignore.md} +22 -21
  32. package/dist/agent-src/commands/sync.md +58 -0
  33. package/dist/agent-src/commands/{e2e-heal.md → tests/e2e-heal.md} +5 -2
  34. package/dist/agent-src/commands/{e2e-plan.md → tests/e2e-plan.md} +5 -2
  35. package/dist/agent-src/commands/tests.md +11 -5
  36. package/dist/agent-src/contexts/augment-infrastructure.md +3 -3
  37. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +30 -0
  38. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +15 -1
  39. package/dist/agent-src/contexts/execution/subagent-steering.md +54 -1
  40. package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
  41. package/dist/agent-src/contexts/model-recommendations.md +19 -0
  42. package/dist/agent-src/contexts/skills-and-commands.md +2 -2
  43. package/dist/agent-src/contexts/subagent-configuration.md +8 -0
  44. package/dist/agent-src/rules/external-reference-deep-dive.md +1 -1
  45. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
  46. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
  47. package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +1 -1
  48. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -1
  49. package/dist/agent-src/skills/judge-security-auditor/SKILL.md +1 -1
  50. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  51. package/dist/agent-src/skills/judge-test-coverage/SKILL.md +1 -1
  52. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  53. package/dist/agent-src/skills/mobile-e2e-strategy/SKILL.md +5 -5
  54. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +2 -2
  55. package/dist/agent-src/skills/quality-tools/SKILL.md +1 -1
  56. package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
  57. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  58. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  59. package/dist/agent-src/templates/agent-settings.md +1 -1
  60. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
  61. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
  62. package/dist/cli/commands/config.js +44 -0
  63. package/dist/cli/commands/config.js.map +1 -0
  64. package/dist/cli/commands/uiServe.js +1 -0
  65. package/dist/cli/commands/uiServe.js.map +1 -1
  66. package/dist/cli/help.js +38 -0
  67. package/dist/cli/help.js.map +1 -0
  68. package/dist/cli/initRouting.js +16 -1
  69. package/dist/cli/initRouting.js.map +1 -1
  70. package/dist/cli/main.js +43 -37
  71. package/dist/cli/main.js.map +1 -1
  72. package/dist/cli/registry.js +45 -44
  73. package/dist/cli/registry.js.map +1 -1
  74. package/dist/discovery/deprecation-report.md +1 -1
  75. package/dist/discovery/discovery-manifest.json +419 -210
  76. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  77. package/dist/discovery/discovery-manifest.summary.md +4 -4
  78. package/dist/discovery/orphan-report.md +1 -1
  79. package/dist/discovery/packs.json +31 -25
  80. package/dist/discovery/trust-report.md +2 -2
  81. package/dist/discovery/workspaces.json +30 -24
  82. package/dist/install/install.mjs +6064 -159
  83. package/dist/install/selectedTools.js +39 -10
  84. package/dist/install/selectedTools.js.map +1 -1
  85. package/dist/mcp/registry-manifest.json +3 -3
  86. package/dist/server/app.js +15 -3
  87. package/dist/server/app.js.map +1 -1
  88. package/dist/server/routes/ping.js +16 -0
  89. package/dist/server/routes/ping.js.map +1 -1
  90. package/dist/server/routes/settings.js +42 -6
  91. package/dist/server/routes/settings.js.map +1 -1
  92. package/dist/server/routes/settingsChanges.js +55 -0
  93. package/dist/server/routes/settingsChanges.js.map +1 -0
  94. package/dist/server/routes/userMd.js +7 -2
  95. package/dist/server/routes/userMd.js.map +1 -1
  96. package/dist/server/routes/wizard.js +76 -14
  97. package/dist/server/routes/wizard.js.map +1 -1
  98. package/dist/server/writeRoot.js +17 -0
  99. package/dist/server/writeRoot.js.map +1 -1
  100. package/dist/shared/settingsSurface.js +120 -0
  101. package/dist/shared/settingsSurface.js.map +1 -0
  102. package/dist/ui/assets/index-BPFMZWUs.css +1 -0
  103. package/dist/ui/assets/index-BiEZiZ31.js +40 -0
  104. package/dist/ui/assets/index-BiEZiZ31.js.map +1 -0
  105. package/dist/ui/index.html +15 -2
  106. package/docs/CLAIMS.md +27 -15
  107. package/docs/architecture.md +1 -1
  108. package/docs/catalog.md +37 -31
  109. package/docs/command-flows.md +22 -16
  110. package/docs/contracts/command-clusters.md +39 -9
  111. package/docs/contracts/file-ownership-matrix.json +21 -0
  112. package/docs/contracts/frontmatter-contract.md +1 -1
  113. package/docs/contracts/gui-wizard.md +16 -4
  114. package/docs/contracts/iron-law-overrides.txt +1 -0
  115. package/docs/contracts/rule-classification.md +2 -2
  116. package/docs/contracts/settings-api.md +58 -2
  117. package/docs/contracts/surface-matrix.md +5 -0
  118. package/docs/cookbook.md +7 -7
  119. package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +74 -0
  120. package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +91 -0
  121. package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +125 -0
  122. package/docs/decisions/INDEX.md +3 -0
  123. package/docs/featured-commands.md +1 -1
  124. package/docs/featured-skills.md +4 -4
  125. package/docs/flows.md +2 -2
  126. package/docs/getting-started-by-role.md +1 -1
  127. package/docs/getting-started-laravel.md +1 -1
  128. package/docs/getting-started.md +6 -3
  129. package/docs/governance-advantage.md +1 -1
  130. package/docs/guidelines/agent-infra/5w2h-analysis.md +1 -1
  131. package/docs/guidelines/agent-infra/ios-simulator-guide.md +1 -1
  132. package/docs/proof.md +12 -2
  133. package/package.json +3 -1
  134. package/src/agent-src/README.md +1 -1
  135. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
  136. package/src/config/agent-settings.template.yml +1 -1
  137. package/src/install/selectedTools.ts +38 -10
  138. package/src/scripts/_cli/cmd_converge.ts +38 -0
  139. package/src/scripts/_cli/cmd_doctor.ts +113 -2
  140. package/src/scripts/_cli/cmd_explain.ts +2 -2
  141. package/src/scripts/_cli/cmd_export.ts +3 -3
  142. package/src/scripts/_cli/cmd_fleet.ts +13 -1
  143. package/src/scripts/_cli/cmd_migrate.ts +3 -3
  144. package/src/scripts/_cli/cmd_prune.ts +2 -2
  145. package/src/scripts/_cli/cmd_refresh.ts +4 -4
  146. package/src/scripts/_cli/cmd_settings_check.ts +2 -2
  147. package/src/scripts/_cli/cmd_settings_migrate.ts +2 -2
  148. package/src/scripts/_cli/cmd_sync.ts +2 -2
  149. package/src/scripts/_cli/cmd_uninstall.ts +2 -2
  150. package/src/scripts/_cli/cmd_update.ts +8 -8
  151. package/src/scripts/_cli/cmd_upgrade.ts +4 -3
  152. package/src/scripts/_cli/cmd_validate.ts +3 -3
  153. package/src/scripts/_cli/cmd_versions.ts +2 -2
  154. package/src/scripts/_cli/explain_last/assumptions.ts +2 -2
  155. package/src/scripts/_cli/explain_last/council.ts +2 -2
  156. package/src/scripts/_cli/explain_last/halt.ts +2 -2
  157. package/src/scripts/_cli/explain_last/index.ts +2 -2
  158. package/src/scripts/_cli/explain_last/inputs.ts +4 -4
  159. package/src/scripts/_cli/explain_last/memory.ts +2 -2
  160. package/src/scripts/_cli/explain_last/provider.ts +2 -2
  161. package/src/scripts/_cli/explain_last/render.ts +2 -2
  162. package/src/scripts/_cli/explain_last/route.ts +2 -2
  163. package/src/scripts/_cli/explain_last/scrubber.ts +2 -2
  164. package/src/scripts/_cli/explain_last/sections/assumptions.ts +2 -2
  165. package/src/scripts/_cli/explain_last/sections/council.ts +2 -2
  166. package/src/scripts/_cli/explain_last/sections/halt.ts +2 -2
  167. package/src/scripts/_cli/explain_last/sections/header.ts +2 -2
  168. package/src/scripts/_cli/explain_last/sections/index.ts +1 -1
  169. package/src/scripts/_cli/explain_last/sections/inputs.ts +2 -2
  170. package/src/scripts/_cli/explain_last/sections/memory.ts +2 -2
  171. package/src/scripts/_cli/explain_last/sections/pack.ts +2 -2
  172. package/src/scripts/_cli/explain_last/sections/provider.ts +2 -2
  173. package/src/scripts/_cli/explain_last/sections/route.ts +2 -2
  174. package/src/scripts/_cli/explain_last/state_loader.ts +2 -2
  175. package/src/scripts/_dispatch.bash +20 -1
  176. package/src/scripts/_lib/agent_settings.ts +1 -1
  177. package/src/scripts/_lib/agent_src.ts +7 -7
  178. package/src/scripts/_lib/agents_overlay.ts +1 -1
  179. package/src/scripts/_lib/auto_dispatch.ts +63 -0
  180. package/src/scripts/_lib/bench_ab_cache.ts +1 -1
  181. package/src/scripts/_lib/bench_ab_scoring.ts +1 -1
  182. package/src/scripts/_lib/bench_ab_scoring_v2.ts +3 -3
  183. package/src/scripts/_lib/bench_cost.ts +1 -1
  184. package/src/scripts/_lib/bench_quality.ts +3 -3
  185. package/src/scripts/_lib/bench_report.ts +4 -4
  186. package/src/scripts/_lib/bench_telegraph.ts +1 -1
  187. package/src/scripts/_lib/bench_telegraph_report.ts +4 -4
  188. package/src/scripts/_lib/changelog_eras.ts +1 -1
  189. package/src/scripts/_lib/claude_desktop_bundler.ts +1 -1
  190. package/src/scripts/_lib/cli_wrapper.ts +1 -1
  191. package/src/scripts/_lib/fs_atomic.ts +1 -1
  192. package/src/scripts/_lib/global_deploy_inventory.ts +1 -1
  193. package/src/scripts/_lib/install_layout.ts +1 -1
  194. package/src/scripts/_lib/install_regenerator.ts +1 -1
  195. package/src/scripts/_lib/installed_lock.ts +1 -1
  196. package/src/scripts/_lib/installed_tools.ts +1 -1
  197. package/src/scripts/_lib/json_pointers.ts +1 -1
  198. package/src/scripts/_lib/knowledge_global.ts +1 -1
  199. package/src/scripts/_lib/knowledge_global_promote.ts +2 -2
  200. package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
  201. package/src/scripts/_lib/link_crypto.ts +4 -4
  202. package/src/scripts/_lib/linked_projects.ts +4 -4
  203. package/src/scripts/_lib/model_tier.ts +1 -1
  204. package/src/scripts/_lib/module_detection.ts +2 -2
  205. package/src/scripts/_lib/pin_resolver.ts +1 -1
  206. package/src/scripts/_lib/script_output.ts +1 -1
  207. package/src/scripts/_lib/security_lint.ts +1 -1
  208. package/src/scripts/_lib/subagent_routing.ts +24 -0
  209. package/src/scripts/_lib/subagent_steering.ts +213 -3
  210. package/src/scripts/_lib/surface_tiers.ts +1 -1
  211. package/src/scripts/_lib/text_similarity.ts +1 -1
  212. package/src/scripts/_lib/update_check.ts +2 -2
  213. package/src/scripts/_lib/user_global_paths.ts +1 -1
  214. package/src/scripts/_lib/value_ladder.ts +1 -1
  215. package/src/scripts/_lib/value_report.ts +1 -1
  216. package/src/scripts/_lib/zip_min.ts +2 -2
  217. package/src/scripts/adoption_report.ts +3 -3
  218. package/src/scripts/adoption_snapshot.ts +3 -3
  219. package/src/scripts/adoption_status.ts +2 -2
  220. package/src/scripts/adr/regenerate_index.ts +3 -3
  221. package/src/scripts/ai_council/_default_prices.ts +2 -3
  222. package/src/scripts/ai_council/advisors.ts +1 -1
  223. package/src/scripts/ai_council/airgap.ts +1 -1
  224. package/src/scripts/ai_council/budget_guard.ts +1 -1
  225. package/src/scripts/ai_council/bundler.ts +1 -1
  226. package/src/scripts/ai_council/cli_hints.ts +1 -1
  227. package/src/scripts/ai_council/clients.ts +5 -5
  228. package/src/scripts/ai_council/compile_corpus.ts +1 -1
  229. package/src/scripts/ai_council/confidence_gate.ts +1 -1
  230. package/src/scripts/ai_council/config.ts +1 -1
  231. package/src/scripts/ai_council/consensus.ts +1 -1
  232. package/src/scripts/ai_council/events_log.ts +1 -1
  233. package/src/scripts/ai_council/learn_low_impact_preview.ts +1 -1
  234. package/src/scripts/ai_council/low_impact_corpus.ts +1 -1
  235. package/src/scripts/ai_council/low_impact_intake.ts +1 -1
  236. package/src/scripts/ai_council/modes.ts +1 -1
  237. package/src/scripts/ai_council/orchestrator.ts +3 -3
  238. package/src/scripts/ai_council/pricing.ts +2 -2
  239. package/src/scripts/ai_council/probation_gate.ts +2 -2
  240. package/src/scripts/ai_council/project_context.ts +1 -1
  241. package/src/scripts/ai_council/prompts.ts +1 -1
  242. package/src/scripts/ai_council/redact_low_impact_entry.ts +2 -2
  243. package/src/scripts/ai_council/session.ts +1 -1
  244. package/src/scripts/ai_council/shadow_dispatch.ts +1 -1
  245. package/src/scripts/ai_council/solo_dispatch.ts +1 -1
  246. package/src/scripts/analysis_freshness.ts +2 -2
  247. package/src/scripts/annotate_discovery.ts +2 -2
  248. package/src/scripts/apply_modules_config.ts +2 -2
  249. package/src/scripts/audit_adr_coverage.ts +3 -3
  250. package/src/scripts/audit_auto_rules.ts +2 -2
  251. package/src/scripts/audit_cloud_compatibility.ts +3 -3
  252. package/src/scripts/audit_command_surface.ts +2 -2
  253. package/src/scripts/audit_initial_context.ts +7 -6
  254. package/src/scripts/audit_likelihood.ts +5 -5
  255. package/src/scripts/audit_mcp_tools.ts +3 -3
  256. package/src/scripts/audit_overlap.ts +2 -2
  257. package/src/scripts/audit_skill_descriptions.ts +2 -2
  258. package/src/scripts/audit_skill_overlap.ts +5 -5
  259. package/src/scripts/audit_user_type_axis.ts +4 -4
  260. package/src/scripts/backfill_model_tier.ts +1 -1
  261. package/src/scripts/bench_ab_cache_dispatch.ts +2 -2
  262. package/src/scripts/bench_ab_clone.ts +2 -2
  263. package/src/scripts/bench_ab_diff.ts +3 -3
  264. package/src/scripts/bench_ab_integrity.ts +2 -2
  265. package/src/scripts/bench_ab_run.ts +4 -4
  266. package/src/scripts/bench_ab_task_runner.ts +1 -1
  267. package/src/scripts/bench_ab_tracka_run.ts +2 -2
  268. package/src/scripts/bench_ab_v2_run.ts +1 -1
  269. package/src/scripts/bench_ab_v2_stats.ts +2 -2
  270. package/src/scripts/bench_baseline_ready.ts +1 -1
  271. package/src/scripts/bench_condense_memory.ts +4 -4
  272. package/src/scripts/bench_drift_check.ts +3 -3
  273. package/src/scripts/bench_per_tool.ts +1 -1
  274. package/src/scripts/bench_rtk_savings.ts +4 -4
  275. package/src/scripts/bench_run.ts +4 -4
  276. package/src/scripts/bench_runner.ts +1 -1
  277. package/src/scripts/build_cloud_bundle.ts +3 -3
  278. package/src/scripts/build_discovery_manifest.ts +13 -15
  279. package/src/scripts/build_linear_digest.ts +2 -2
  280. package/src/scripts/build_mcp_registry_manifest.ts +3 -3
  281. package/src/scripts/build_proof.ts +6 -0
  282. package/src/scripts/build_rule_trigger_matrix.ts +2 -2
  283. package/src/scripts/capture_showcase_session.ts +3 -3
  284. package/src/scripts/chat_history.ts +1 -1
  285. package/src/scripts/check_always_budget.ts +1 -1
  286. package/src/scripts/check_artefact_checksums.ts +4 -4
  287. package/src/scripts/check_artefact_count_messaging.ts +197 -0
  288. package/src/scripts/check_augment_description_cap.ts +3 -3
  289. package/src/scripts/check_augmentignore.ts +1 -1
  290. package/src/scripts/check_beta_review_markers.ts +3 -3
  291. package/src/scripts/check_bite_sized_granularity.ts +1 -1
  292. package/src/scripts/check_cluster_patterns.ts +47 -3
  293. package/src/scripts/check_command_count_messaging.ts +2 -2
  294. package/src/scripts/check_condensation.ts +2 -2
  295. package/src/scripts/check_condensed_paths.ts +6 -6
  296. package/src/scripts/check_context_paths.ts +1 -1
  297. package/src/scripts/check_council_config_location.ts +3 -3
  298. package/src/scripts/check_council_layout.ts +2 -2
  299. package/src/scripts/check_council_references.ts +2 -2
  300. package/src/scripts/check_discovery_determinism.ts +3 -3
  301. package/src/scripts/check_gate_paths.ts +4 -4
  302. package/src/scripts/check_iron_law_prominence.ts +2 -2
  303. package/src/scripts/check_kernel_rule_bundle.ts +3 -3
  304. package/src/scripts/check_knowledge_cards.ts +4 -4
  305. package/src/scripts/check_knowledge_pages.ts +1 -1
  306. package/src/scripts/check_md_language.ts +3 -3
  307. package/src/scripts/check_memory.ts +3 -3
  308. package/src/scripts/check_memory_proposal.ts +2 -2
  309. package/src/scripts/check_module_management_neutral.ts +1 -1
  310. package/src/scripts/check_no_conflict_markers.ts +1 -1
  311. package/src/scripts/check_no_external_sources.ts +1 -1
  312. package/src/scripts/check_no_local_settings_committed.ts +2 -2
  313. package/src/scripts/check_no_new_legacy_path.ts +3 -3
  314. package/src/scripts/check_no_roadmap_refs.ts +3 -3
  315. package/src/scripts/check_one_off_location.ts +3 -3
  316. package/src/scripts/check_overlay_cascade_subdirs.ts +3 -3
  317. package/src/scripts/check_portability.ts +3 -3
  318. package/src/scripts/check_proposal.ts +0 -0
  319. package/src/scripts/check_public_catalog_links.ts +1 -1
  320. package/src/scripts/check_public_links.ts +2 -2
  321. package/src/scripts/check_references.ts +3 -3
  322. package/src/scripts/check_release_includes_discovery.ts +2 -2
  323. package/src/scripts/check_release_pr_shape.ts +2 -2
  324. package/src/scripts/check_release_published.ts +1 -1
  325. package/src/scripts/check_release_trunk_sync.ts +3 -3
  326. package/src/scripts/check_reply_consistency.ts +1 -1
  327. package/src/scripts/check_roadmap_trackable.ts +2 -2
  328. package/src/scripts/check_role_doc_links.ts +2 -2
  329. package/src/scripts/check_safety_floor_untouched.ts +3 -3
  330. package/src/scripts/check_skill_requires.ts +2 -2
  331. package/src/scripts/check_structural_breaking.ts +2 -2
  332. package/src/scripts/check_surface_tiers.ts +2 -2
  333. package/src/scripts/check_template_pin_drift.ts +1 -1
  334. package/src/scripts/check_test_coverage_diff.ts +2 -2
  335. package/src/scripts/check_token_optimizer_freshness.ts +3 -3
  336. package/src/scripts/check_trigger_evals.ts +2 -2
  337. package/src/scripts/check_update_banner.ts +1 -1
  338. package/src/scripts/ci_status.ts +0 -0
  339. package/src/scripts/ci_summary.ts +3 -3
  340. package/src/scripts/ci_time_ratio.ts +1 -1
  341. package/src/scripts/command_suggester/cooldown.ts +1 -1
  342. package/src/scripts/command_suggester/index.ts +1 -1
  343. package/src/scripts/command_suggester/loader.ts +1 -1
  344. package/src/scripts/command_suggester/match.ts +1 -1
  345. package/src/scripts/command_suggester/rank.ts +1 -1
  346. package/src/scripts/command_suggester/render.ts +1 -1
  347. package/src/scripts/command_suggester/sanitize.ts +1 -1
  348. package/src/scripts/command_suggester/settings.ts +1 -1
  349. package/src/scripts/command_suggester/types.ts +0 -0
  350. package/src/scripts/compile_router.ts +4 -4
  351. package/src/scripts/condense.ts +3 -3
  352. package/src/scripts/condense_memory.ts +1 -1
  353. package/src/scripts/config/index.ts +1 -1
  354. package/src/scripts/config/packs.ts +1 -1
  355. package/src/scripts/config/presets.ts +1 -1
  356. package/src/scripts/config/profile_explain.ts +1 -1
  357. package/src/scripts/config/profiles.ts +1 -1
  358. package/src/scripts/config/session_profiles.ts +1 -1
  359. package/src/scripts/context_hygiene_hook.ts +2 -2
  360. package/src/scripts/cost_by_conversation.ts +1 -1
  361. package/src/scripts/cost_summary.ts +2 -2
  362. package/src/scripts/council_cli.ts +1 -1
  363. package/src/scripts/council_prune.ts +1 -1
  364. package/src/scripts/cross_repo_retrieve.ts +2 -2
  365. package/src/scripts/discovery_stats.ts +3 -3
  366. package/src/scripts/evidence_report.ts +4 -4
  367. package/src/scripts/extract_audit_patterns.ts +2 -2
  368. package/src/scripts/first_run_gate_hook.ts +1 -1
  369. package/src/scripts/gen_discovery_baseline.ts +2 -2
  370. package/src/scripts/generate_capabilities_index.ts +2 -2
  371. package/src/scripts/generate_capability_matrix.ts +2 -2
  372. package/src/scripts/generate_catalog.ts +2 -2
  373. package/src/scripts/generate_command_flows.ts +2 -2
  374. package/src/scripts/generate_cookbook.ts +1 -1
  375. package/src/scripts/generate_index.ts +3 -3
  376. package/src/scripts/generate_ownership_matrix.ts +2 -2
  377. package/src/scripts/generate_pack_manifests.ts +2 -2
  378. package/src/scripts/generate_role_experiences_catalog.ts +3 -3
  379. package/src/scripts/hooks/block_no_verify.ts +2 -2
  380. package/src/scripts/hooks/dispatch_hook.ts +2 -2
  381. package/src/scripts/hooks/dispatch_issues.ts +1 -1
  382. package/src/scripts/hooks/envelope.ts +1 -1
  383. package/src/scripts/hooks/replay_hook.ts +1 -1
  384. package/src/scripts/hooks/state_io.ts +1 -1
  385. package/src/scripts/hooks_doctor.ts +1 -1
  386. package/src/scripts/hooks_status.ts +1 -1
  387. package/src/scripts/injection_scan_hook.ts +1 -1
  388. package/src/scripts/install.ts +145 -3
  389. package/src/scripts/inventory_abstraction_budget.ts +5 -5
  390. package/src/scripts/inventory_frontmatter.ts +1 -1
  391. package/src/scripts/inventory_meta_layers.ts +1 -1
  392. package/src/scripts/iron_law_sha.ts +1 -1
  393. package/src/scripts/knowledge_global_cli.ts +3 -3
  394. package/src/scripts/linked_projects_list.ts +1 -1
  395. package/src/scripts/lint_agent_security.ts +4 -4
  396. package/src/scripts/lint_agent_skill_names.ts +1 -1
  397. package/src/scripts/lint_agents_layout.ts +2 -2
  398. package/src/scripts/lint_agents_md.ts +3 -3
  399. package/src/scripts/lint_archived_skills.ts +2 -2
  400. package/src/scripts/lint_artefact_frontmatter.ts +2 -2
  401. package/src/scripts/lint_bench_ab.ts +2 -2
  402. package/src/scripts/lint_bench_corpus.ts +1 -1
  403. package/src/scripts/lint_command_flow_coverage.ts +1 -1
  404. package/src/scripts/lint_command_routing.ts +2 -2
  405. package/src/scripts/lint_command_tiers.ts +1 -1
  406. package/src/scripts/lint_command_verbs.ts +4 -4
  407. package/src/scripts/lint_commit_subjects.ts +2 -2
  408. package/src/scripts/lint_context_spine_usage.ts +3 -3
  409. package/src/scripts/lint_discovery_manifest.ts +4 -4
  410. package/src/scripts/lint_discovery_vocabulary.ts +2 -2
  411. package/src/scripts/lint_empty_roadmaps.ts +3 -3
  412. package/src/scripts/lint_eval_freshness.ts +2 -2
  413. package/src/scripts/lint_examples.ts +2 -2
  414. package/src/scripts/lint_explain_trace.ts +2 -2
  415. package/src/scripts/lint_featured_skills.ts +0 -0
  416. package/src/scripts/lint_flows.ts +5 -5
  417. package/src/scripts/lint_framework_leakage.ts +1 -1
  418. package/src/scripts/lint_framework_leakage_allowlist.json +10 -2
  419. package/src/scripts/lint_frontmatter_boilerplate.ts +2 -2
  420. package/src/scripts/lint_ghostwriter_source.ts +3 -3
  421. package/src/scripts/lint_global_paths.ts +1 -1
  422. package/src/scripts/lint_handoffs.ts +1 -1
  423. package/src/scripts/lint_hidden_unicode.ts +1 -1
  424. package/src/scripts/lint_hook_concern_budget.ts +2 -2
  425. package/src/scripts/lint_hook_manifest.ts +2 -2
  426. package/src/scripts/lint_instruction_smuggling.ts +1 -1
  427. package/src/scripts/lint_load_context.ts +2 -2
  428. package/src/scripts/lint_marketplace.ts +1 -1
  429. package/src/scripts/lint_marketplace_install_completeness.ts +2 -2
  430. package/src/scripts/lint_mcp_config_security.ts +1 -1
  431. package/src/scripts/lint_mcp_registry_manifest.ts +1 -1
  432. package/src/scripts/lint_media_policy_linkage.ts +3 -3
  433. package/src/scripts/lint_missions.ts +3 -3
  434. package/src/scripts/lint_model_tier_coverage.ts +3 -3
  435. package/src/scripts/lint_namespace.ts +2 -2
  436. package/src/scripts/lint_namespace_collisions.ts +2 -2
  437. package/src/scripts/lint_new_skill_gate.ts +3 -3
  438. package/src/scripts/lint_no_new_atomic_commands.ts +9 -6
  439. package/src/scripts/lint_no_python_twin_rationale.ts +102 -0
  440. package/src/scripts/lint_one_off_age.ts +2 -2
  441. package/src/scripts/lint_orchestration_dsl.ts +3 -3
  442. package/src/scripts/lint_orchestrator_auto_detect.ts +1 -1
  443. package/src/scripts/lint_pack_boundaries.ts +2 -2
  444. package/src/scripts/lint_pack_dependencies.ts +2 -2
  445. package/src/scripts/lint_pack_first_win.ts +2 -2
  446. package/src/scripts/lint_persona_governance.ts +3 -3
  447. package/src/scripts/lint_positioning.ts +1 -1
  448. package/src/scripts/lint_profile_overlay_set_only.ts +2 -2
  449. package/src/scripts/lint_readme_jargon.ts +2 -2
  450. package/src/scripts/lint_readme_size.ts +2 -2
  451. package/src/scripts/lint_regression.ts +3 -3
  452. package/src/scripts/lint_roadmap_ci_steps.ts +3 -3
  453. package/src/scripts/lint_roadmap_complexity.ts +1 -1
  454. package/src/scripts/lint_roadmap_later_disposition.ts +2 -2
  455. package/src/scripts/lint_role_experiences.ts +2 -2
  456. package/src/scripts/lint_rule_interactions.ts +1 -1
  457. package/src/scripts/lint_rule_tiers.ts +1 -1
  458. package/src/scripts/lint_showcase_sessions.ts +2 -2
  459. package/src/scripts/lint_skill_frontmatter_safety.ts +1 -1
  460. package/src/scripts/lint_skill_originality.ts +1 -1
  461. package/src/scripts/lint_skill_tools.ts +3 -3
  462. package/src/scripts/lint_ticket_buildable.ts +2 -2
  463. package/src/scripts/lint_topics_yaml.ts +3 -3
  464. package/src/scripts/lint_trust_coherence.ts +3 -3
  465. package/src/scripts/lint_value_dashboard.ts +3 -3
  466. package/src/scripts/lint_workflow_security.ts +3 -3
  467. package/src/scripts/lint_workspace_boundary.ts +2 -2
  468. package/src/scripts/mcp_parity_smoke.ts +1 -1
  469. package/src/scripts/mcp_render.ts +1 -1
  470. package/src/scripts/mcp_server/catalog.ts +1 -1
  471. package/src/scripts/mcp_server/index.ts +1 -1
  472. package/src/scripts/mcp_server/metadata.ts +1 -1
  473. package/src/scripts/mcp_server/prompts.ts +1 -1
  474. package/src/scripts/mcp_server/resources.ts +1 -1
  475. package/src/scripts/mcp_server/server.ts +1 -1
  476. package/src/scripts/mcp_server/telemetry.ts +1 -1
  477. package/src/scripts/mcp_server/tools.ts +1 -1
  478. package/src/scripts/mcp_telemetry_health.ts +1 -1
  479. package/src/scripts/mcp_telemetry_query.ts +3 -3
  480. package/src/scripts/mcp_telemetry_store.ts +3 -3
  481. package/src/scripts/measure_augment_budget.ts +2 -2
  482. package/src/scripts/measure_density.ts +2 -2
  483. package/src/scripts/measure_frugality_savings.ts +3 -3
  484. package/src/scripts/measure_markitdown_lift.ts +1 -1
  485. package/src/scripts/measure_patterns.ts +1 -1
  486. package/src/scripts/measure_projection_bytes.ts +1 -1
  487. package/src/scripts/measure_rule_budget.ts +1 -1
  488. package/src/scripts/measure_skill_reduction.ts +1 -1
  489. package/src/scripts/memory_hash.ts +1 -1
  490. package/src/scripts/memory_lookup.ts +6 -6
  491. package/src/scripts/memory_report.ts +1 -1
  492. package/src/scripts/memory_signal.ts +1 -1
  493. package/src/scripts/memory_status.ts +2 -2
  494. package/src/scripts/migrate_command_suggestions.ts +1 -1
  495. package/src/scripts/migrate_frontmatter_defaults.ts +1 -1
  496. package/src/scripts/mine_session.ts +3 -3
  497. package/src/scripts/minimal_safe_diff_hook.ts +2 -2
  498. package/src/scripts/move_artefact.ts +3 -3
  499. package/src/scripts/new_skill.ts +3 -3
  500. package/src/scripts/onboarding_gate_hook.ts +2 -2
  501. package/src/scripts/pack_mcp_content.ts +1 -1
  502. package/src/scripts/parity/replay.ts +3 -2
  503. package/src/scripts/pattern_share.ts +2 -2
  504. package/src/scripts/plan_physical_move.ts +3 -3
  505. package/src/scripts/prediction-pool/poisson_sim.ts +2 -2
  506. package/src/scripts/prediction-pool/pool_winsim.ts +2 -2
  507. package/src/scripts/prediction-pool/score_ev.ts +2 -2
  508. package/src/scripts/print_required_checks.ts +2 -2
  509. package/src/scripts/probe_projection_fidelity.ts +2 -2
  510. package/src/scripts/probe_skill_registration.ts +2 -2
  511. package/src/scripts/profile_staleness_hook.ts +2 -2
  512. package/src/scripts/profile_use.ts +2 -2
  513. package/src/scripts/project_thin_rules.ts +3 -3
  514. package/src/scripts/propose_modules_config.ts +2 -2
  515. package/src/scripts/prototype_lint_contradictions.ts +2 -2
  516. package/src/scripts/prove_pack_extractable.ts +1 -1
  517. package/src/scripts/readme_linter.ts +4 -4
  518. package/src/scripts/redact_hook_capture.ts +2 -2
  519. package/src/scripts/refine_ticket_detect.ts +1 -1
  520. package/src/scripts/release.ts +30 -19
  521. package/src/scripts/render_benchmark_md.ts +2 -2
  522. package/src/scripts/render_value_md.ts +2 -2
  523. package/src/scripts/roadmap_progress_hook.ts +1 -1
  524. package/src/scripts/router_telemetry.ts +1 -1
  525. package/src/scripts/run_skill_evals.ts +2 -2
  526. package/src/scripts/runtime_dispatcher.ts +1 -1
  527. package/src/scripts/runtime_handler.ts +1 -1
  528. package/src/scripts/runtime_registry.ts +3 -3
  529. package/src/scripts/score_skill_selection.ts +1 -1
  530. package/src/scripts/security_audit_config.ts +2 -2
  531. package/src/scripts/skill_collision_clusters.ts +1 -1
  532. package/src/scripts/skill_discovery.ts +1 -1
  533. package/src/scripts/skill_linter.ts +8 -7
  534. package/src/scripts/skill_overlap.ts +2 -2
  535. package/src/scripts/skill_preview.ts +1 -1
  536. package/src/scripts/skill_tools/audit_persona_coverage.ts +3 -3
  537. package/src/scripts/skill_tools/audit_user_type_coverage.ts +3 -3
  538. package/src/scripts/skill_tools/index.ts +1 -1
  539. package/src/scripts/skill_tools/run_block_d_eval.ts +3 -3
  540. package/src/scripts/skill_tools/score_skill_relevance.ts +3 -3
  541. package/src/scripts/skill_tools/suggest_skill_for_task.ts +3 -3
  542. package/src/scripts/skill_trigger_eval.ts +2 -2
  543. package/src/scripts/skill_usage_collect.ts +2 -2
  544. package/src/scripts/skill_usage_report.ts +2 -2
  545. package/src/scripts/smoke_path_resolution.ts +2 -2
  546. package/src/scripts/smoke_quickstart.ts +4 -4
  547. package/src/scripts/snapshot_agent_outputs.ts +2 -2
  548. package/src/scripts/spotcheck_thin_root.ts +2 -2
  549. package/src/scripts/surface-tiers.yml +1 -0
  550. package/src/scripts/sync_agent_settings.ts +2 -2
  551. package/src/scripts/sync_github_metadata.ts +4 -4
  552. package/src/scripts/sync_gitignore.ts +3 -3
  553. package/src/scripts/sync_yaml_rt.ts +2 -2
  554. package/src/scripts/telegraph_stats.ts +1 -1
  555. package/src/scripts/tool_registry.ts +2 -2
  556. package/src/scripts/tools/adapter_errors.ts +1 -1
  557. package/src/scripts/tools/base_adapter.ts +1 -1
  558. package/src/scripts/tools/github_adapter.ts +1 -1
  559. package/src/scripts/tools/jira_adapter.ts +1 -1
  560. package/src/scripts/trigger_coverage.ts +2 -2
  561. package/src/scripts/update_counts.ts +68 -6
  562. package/src/scripts/update_prices.ts +3 -3
  563. package/src/scripts/validate_agent_settings.ts +3 -3
  564. package/src/scripts/validate_decision_engine.ts +2 -2
  565. package/src/scripts/validate_discovery_manifest.ts +3 -3
  566. package/src/scripts/validate_frontmatter.ts +5 -5
  567. package/src/scripts/validate_pack_yaml.ts +0 -0
  568. package/src/scripts/validate_safe_paths.ts +2 -2
  569. package/src/scripts/validate_telegraph_carveouts.ts +3 -3
  570. package/src/scripts/verify_before_complete_hook.ts +2 -2
  571. package/src/scripts/verify_physical_move.ts +2 -2
  572. package/src/scripts/wrapper_freshness_hook.ts +3 -3
  573. package/src/server/schemas/settings.ts +426 -0
  574. package/src/shared/settingsSurface.ts +184 -0
  575. package/src/shared/userMd/formAdapter.ts +86 -0
  576. package/src/shared/userMd/schema.ts +59 -0
  577. package/src/shared/userMd/utils.ts +91 -0
  578. package/dist/agent-src/commands/optimize-project.md +0 -243
  579. package/dist/ui/assets/index-BbWWuFrF.css +0 -1
  580. package/dist/ui/assets/index-UjcTG_9O.js +0 -40
  581. package/dist/ui/assets/index-UjcTG_9O.js.map +0 -1
@@ -117,6 +117,12 @@ export interface OrchEntry {
117
117
  token_delta: number;
118
118
  outcome: string;
119
119
  verify_mode: string;
120
+ /** Routing extension (road-to-cost-aware-model-routing) — null on pre-extension lines. */
121
+ task_class: string | null;
122
+ tier_chosen: string | null;
123
+ tier_source: string | null;
124
+ escalated_from: string | null;
125
+ verify_result_by_tier: Record<string, string> | null;
120
126
  }
121
127
 
122
128
  /**
@@ -129,9 +135,8 @@ export interface OrchEntry {
129
135
  *
130
136
  * user_override_rate cannot be measured from telemetry alone — returns 0.
131
137
  */
132
- export function readOrchestrationMetrics(
133
- lines: string[],
134
- ): GuardrailMetrics {
138
+ /** Parse orchestration entries from audit-log-v1 JSONL lines (shared by all aggregators). */
139
+ export function parseOrchEntries(lines: string[]): OrchEntry[] {
135
140
  const entries: OrchEntry[] = [];
136
141
  for (const line of lines) {
137
142
  const trimmed = line.trim();
@@ -141,17 +146,33 @@ export function readOrchestrationMetrics(
141
146
  if (parsed['input_kind'] !== 'orchestration') continue;
142
147
  const orch = parsed['orchestration'] as Record<string, unknown> | undefined;
143
148
  if (!orch) continue;
149
+ const vbt = orch['verify_result_by_tier'];
144
150
  entries.push({
145
151
  task_size_estimate: Number(orch['task_size_estimate'] ?? 0),
146
152
  spawn_count: Number(orch['spawn_count'] ?? 0),
147
153
  token_delta: Number(orch['token_delta'] ?? 0),
148
154
  outcome: String(orch['outcome'] ?? ''),
149
155
  verify_mode: String(orch['verify_mode'] ?? ''),
156
+ task_class: orch['task_class'] == null ? null : String(orch['task_class']),
157
+ tier_chosen: orch['tier_chosen'] == null ? null : String(orch['tier_chosen']),
158
+ tier_source: orch['tier_source'] == null ? null : String(orch['tier_source']),
159
+ escalated_from: orch['escalated_from'] == null ? null : String(orch['escalated_from']),
160
+ verify_result_by_tier:
161
+ vbt != null && typeof vbt === 'object' && !Array.isArray(vbt)
162
+ ? Object.fromEntries(Object.entries(vbt as Record<string, unknown>).map(([k, v]) => [k, String(v)]))
163
+ : null,
150
164
  });
151
165
  } catch {
152
166
  // skip malformed lines
153
167
  }
154
168
  }
169
+ return entries;
170
+ }
171
+
172
+ export function readOrchestrationMetrics(
173
+ lines: string[],
174
+ ): GuardrailMetrics {
175
+ const entries = parseOrchEntries(lines);
155
176
 
156
177
  if (entries.length === 0) {
157
178
  return { token_ratio: 1, spawn_failure_rate: 0, verify_skip_rate: 0, user_override_rate: 0 };
@@ -174,3 +195,192 @@ export function readOrchestrationMetrics(
174
195
  user_override_rate: 0, // cannot measure from telemetry alone
175
196
  };
176
197
  }
198
+
199
+ /**
200
+ * Per-tier / per-class routing aggregates (road-to-cost-aware-model-routing
201
+ * Phase 0). Pure aggregation over the routing telemetry fields — feeds the
202
+ * `/cost:report` per-tier view and the Phase-2 tripwires. Pre-extension lines
203
+ * (null routing fields) are ignored per aggregate.
204
+ */
205
+ export interface TierRoutingMetrics {
206
+ /** Dispatch count per tier_chosen. */
207
+ dispatches_by_tier: Record<string, number>;
208
+ /** Dispatch count per task_class. */
209
+ dispatches_by_class: Record<string, number>;
210
+ /** Escalation count per task_class (entries with escalated_from set). */
211
+ escalations_by_class: Record<string, number>;
212
+ /** escalations_by_class / dispatches_by_class, per class present in both. */
213
+ escalation_rate_by_class: Record<string, number>;
214
+ /** Per tier: pass / (pass + fail) over verify_result_by_tier attempts. */
215
+ verify_pass_rate_by_tier: Record<string, number>;
216
+ }
217
+
218
+ export function readTierRoutingMetrics(lines: string[]): TierRoutingMetrics {
219
+ const entries = parseOrchEntries(lines);
220
+
221
+ const dispatches_by_tier: Record<string, number> = {};
222
+ const dispatches_by_class: Record<string, number> = {};
223
+ const escalations_by_class: Record<string, number> = {};
224
+ const verifyCounts: Record<string, { pass: number; fail: number }> = {};
225
+
226
+ for (const e of entries) {
227
+ if (e.tier_chosen !== null) {
228
+ dispatches_by_tier[e.tier_chosen] = (dispatches_by_tier[e.tier_chosen] ?? 0) + 1;
229
+ }
230
+ if (e.task_class !== null) {
231
+ dispatches_by_class[e.task_class] = (dispatches_by_class[e.task_class] ?? 0) + 1;
232
+ if (e.escalated_from !== null) {
233
+ escalations_by_class[e.task_class] = (escalations_by_class[e.task_class] ?? 0) + 1;
234
+ }
235
+ }
236
+ if (e.verify_result_by_tier !== null) {
237
+ for (const [tier, result] of Object.entries(e.verify_result_by_tier)) {
238
+ const c = (verifyCounts[tier] ??= { pass: 0, fail: 0 });
239
+ if (result === 'pass') c.pass += 1;
240
+ else if (result === 'fail') c.fail += 1;
241
+ // 'skipped' counts toward neither pass nor fail.
242
+ }
243
+ }
244
+ }
245
+
246
+ const escalation_rate_by_class: Record<string, number> = {};
247
+ for (const [cls, n] of Object.entries(dispatches_by_class)) {
248
+ escalation_rate_by_class[cls] = (escalations_by_class[cls] ?? 0) / n;
249
+ }
250
+
251
+ const verify_pass_rate_by_tier: Record<string, number> = {};
252
+ for (const [tier, c] of Object.entries(verifyCounts)) {
253
+ const attempts = c.pass + c.fail;
254
+ if (attempts > 0) verify_pass_rate_by_tier[tier] = c.pass / attempts;
255
+ }
256
+
257
+ return {
258
+ dispatches_by_tier,
259
+ dispatches_by_class,
260
+ escalations_by_class,
261
+ escalation_rate_by_class,
262
+ verify_pass_rate_by_tier,
263
+ };
264
+ }
265
+
266
+ /**
267
+ * Cost-routing tripwires (road-to-cost-aware-model-routing Phase 2) —
268
+ * steering policy over the routing telemetry, surfaced never auto-flipped.
269
+ */
270
+ export const ROUTING_TRIPWIRES = {
271
+ /**
272
+ * Per-class escalation rate above which the class's static default tier
273
+ * should be promoted: cascading a class that escalates this often costs
274
+ * more than starting on the higher tier.
275
+ */
276
+ escalation_promotion_rate: 0.4,
277
+ /** Verify-pass rate drop (absolute) below the trailing baseline that counts as drift. */
278
+ verify_pass_drift_tolerance: 0.1,
279
+ /** Minimum dispatches per class before the escalation tripwire may fire (noise floor). */
280
+ min_class_dispatches: 5,
281
+ } as const;
282
+
283
+ /**
284
+ * Tripwire (i): classes whose escalation rate exceeds the promotion
285
+ * threshold — their static default tier is wrong; promote it, stop cascading.
286
+ * Classes below the dispatch noise floor never fire.
287
+ */
288
+ export function escalationPromotionCandidates(m: TierRoutingMetrics): string[] {
289
+ const candidates: string[] = [];
290
+ for (const [cls, rate] of Object.entries(m.escalation_rate_by_class)) {
291
+ const dispatches = m.dispatches_by_class[cls] ?? 0;
292
+ if (dispatches < ROUTING_TRIPWIRES.min_class_dispatches) continue;
293
+ if (rate > ROUTING_TRIPWIRES.escalation_promotion_rate) candidates.push(cls);
294
+ }
295
+ return candidates.sort();
296
+ }
297
+
298
+ /**
299
+ * Tripwire (ii): tiers whose current verify-pass rate dropped below the
300
+ * trailing baseline by more than the tolerance — verifier or model drift.
301
+ * Tiers absent from either side are skipped (no baseline → no drift claim).
302
+ */
303
+ export function verifyPassDrift(
304
+ current: Record<string, number>,
305
+ trailingBaseline: Record<string, number>,
306
+ ): string[] {
307
+ const drifting: string[] = [];
308
+ for (const [tier, baseline] of Object.entries(trailingBaseline)) {
309
+ const now = current[tier];
310
+ if (now === undefined) continue;
311
+ if (now < baseline - ROUTING_TRIPWIRES.verify_pass_drift_tolerance) drifting.push(tier);
312
+ }
313
+ return drifting.sort();
314
+ }
315
+
316
+ /**
317
+ * Verify-fail escalation (road-to-cost-aware-model-routing Phase 4 / M3).
318
+ *
319
+ * A verification FAILURE on a downshifted return re-dispatches the slice one
320
+ * tier up, consuming the existing N=3 budget — never a new budget. Confined
321
+ * to tier_source static|inferred; inherit slices keep same-tier retry.
322
+ * The trigger is the judge verdict / deterministic verify result — never the
323
+ * subagent's self-reported confidence.
324
+ */
325
+ export type EscalationTier = 'lite' | 'medium' | 'high';
326
+
327
+ export interface VerifyFailInputs {
328
+ /** Tier of the attempt that just failed verification. */
329
+ failed_tier: EscalationTier;
330
+ /** Provenance of the slice's tier (telemetry `tier_source`). */
331
+ tier_source: 'static' | 'inferred' | 'inherit';
332
+ /** Consecutive failed attempts on this slice INCLUDING the one that just failed. */
333
+ consecutive_failures: number;
334
+ }
335
+
336
+ export interface VerifyFailDecision {
337
+ action: 'escalate' | 'retry-same-tier' | 'slice-failed';
338
+ /** Tier for the next attempt; null when the slice is failed. */
339
+ next_tier: EscalationTier | null;
340
+ reason: string;
341
+ }
342
+
343
+ const TIER_ABOVE: Record<EscalationTier, EscalationTier | null> = {
344
+ lite: 'medium',
345
+ medium: 'high',
346
+ high: null,
347
+ };
348
+
349
+ export function escalateOnVerifyFail(inp: VerifyFailInputs): VerifyFailDecision {
350
+ // Outside the downshift path → existing same-tier retry semantics, budget unchanged.
351
+ if (inp.tier_source === 'inherit') {
352
+ if (budgetHalt(inp.consecutive_failures)) {
353
+ return { action: 'slice-failed', next_tier: null, reason: 'N=3 budget exhausted on session tier' };
354
+ }
355
+ return {
356
+ action: 'retry-same-tier',
357
+ next_tier: inp.failed_tier,
358
+ reason: 'inherit slice — no downshift decision, same-tier retry semantics unchanged',
359
+ };
360
+ }
361
+
362
+ // Downshifted slice: two failed attempts mark the slice failed — the third
363
+ // "attempt" of the N=3 budget is the orchestrator's replan at session tier.
364
+ if (inp.consecutive_failures >= 2) {
365
+ return {
366
+ action: 'slice-failed',
367
+ next_tier: null,
368
+ reason: 'two failed attempts on a downshifted slice — mark failed, orchestrator replans at session tier',
369
+ };
370
+ }
371
+
372
+ const above = TIER_ABOVE[inp.failed_tier];
373
+ if (above === null) {
374
+ return {
375
+ action: 'slice-failed',
376
+ next_tier: null,
377
+ reason: 'verify-fail on the highest tier — no tier above, mark failed and replan',
378
+ };
379
+ }
380
+
381
+ return {
382
+ action: 'escalate',
383
+ next_tier: above,
384
+ reason: `verify-fail on ${inp.failed_tier} → re-dispatch one tier up (${above}); consumes the N=3 budget`,
385
+ };
386
+ }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Surface-tier (core vs lab) resolution for the install split.
3
3
  *
4
- * TypeScript twin of `src/scripts/_lib/surface_tiers.py` (ADR-200 — Python→TS
4
+ * Ported from the retired Python `src/scripts/_lib/surface_tiers.py` (ADR-200 — Python→TS
5
5
  * migration). Public API mirrors the Python module exactly (snake_case kept
6
6
  * deliberately — fidelity over TS idiom).
7
7
  *
@@ -9,7 +9,7 @@
9
9
  * below WARN_THRESHOLD → no conflict, proceed to create
10
10
  *
11
11
  * Deliberately does NOT touch `memory_signal.ts` — that script is a
12
- * byte-faithful parity twin of its retired Python original ("no
12
+ * byte-faithful parity port of the retired Python implementation ("no
13
13
  * behaviour changes" is a load-bearing contract of that file). This
14
14
  * module is consumed as an ADDITIONAL, advisory check layered on top,
15
15
  * from `check_memory_similarity.ts` and later the knowledge-page
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Daily update-check banner for the `agent-config` dispatcher.
3
3
  *
4
- * TypeScript twin of `src/scripts/_lib/update_check.py` (ADR-200,
4
+ * Ported from the retired Python `src/scripts/_lib/update_check.py` (ADR-200,
5
5
  * Phase 2 / Wave 1 batch B). Pure functions: `check_for_update()`
6
6
  * decides whether a banner should be emitted and returns the banner
7
7
  * string (or `null`). The dispatcher prints the returned string to
8
8
  * `stderr` after the subcommand finishes — never delaying the work,
9
9
  * never prompting.
10
10
  *
11
- * Design constraints (mirrored from the Python original):
11
+ * Design constraints (mirrored from the retired Python implementation):
12
12
  *
13
13
  * - Node builtins only (global `fetch` on Node >= 20).
14
14
  * - 1 s hard timeout on the registry call; network failure is silent.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Vendor-namespaced user-global path resolution.
3
3
  *
4
- * TypeScript twin of `src/scripts/_lib/user_global_paths.py` (ADR-200,
4
+ * Ported from the retired Python `src/scripts/_lib/user_global_paths.py` (ADR-200,
5
5
  * Phase 2 / Wave 1 batch B). Mirrors the Python module's public API
6
6
  * exactly — same exported snake_case names, same semantics, same
7
7
  * path-resolution behavior. Single source of truth for "where does this
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Pure normaliser: raw bench reports → `value-v1` rung dicts.
3
3
  *
4
- * TypeScript twin of `src/scripts/_lib/value_ladder.py` (ADR-200 py2ts
4
+ * Ported from the retired Python `src/scripts/_lib/value_ladder.py` (ADR-200 py2ts
5
5
  * Phase 2 / Wave 2a). Phase 1 Step 2 of the readable-value-dashboard roadmap.
6
6
  *
7
7
  * This module is **pure** — no I/O, no file reads, no clock. Inputs are
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Assemble `value-v1` JSON from on-disk raw bench reports.
3
3
  *
4
- * TypeScript twin of `src/scripts/_lib/value_report.py` (ADR-200 py2ts
4
+ * Ported from the retired Python `src/scripts/_lib/value_report.py` (ADR-200 py2ts
5
5
  * Phase 2 / Wave 2a). Phase 1 Step 3 of the readable-value-dashboard roadmap.
6
6
  *
7
7
  * Reads:
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Minimal ZIP writer/reader on Node builtins only (`node:zlib`).
3
3
  *
4
- * Internal helper for the TypeScript twin of
5
- * `src/scripts/_lib/claude_desktop_bundler.py` (ADR-200 py2ts Phase 2):
4
+ * Internal helper for the port of the retired Python
5
+ * `src/scripts/_lib/claude_desktop_bundler.py` (ADR-200):
6
6
  * the repo ships no ZIP dependency, and the ADR contract forbids adding
7
7
  * one — so the bundler twin writes the (well-specified) ZIP container
8
8
  * itself and compresses entries with `zlib.deflateRawSync`
@@ -2,15 +2,15 @@
2
2
  /**
3
3
  * Roll up `adoption-snapshots.jsonl` into a Markdown trend report.
4
4
  *
5
- * TypeScript twin of `src/scripts/adoption_report.py` (ADR-200, Phase 8 /
6
- * Wave 8a). The CLI contract is mirrored EXACTLY — the flags `--in` /
5
+ * Ported from the retired Python `src/scripts/adoption_report.py` (ADR-200, Phase 8 /
6
+ * Wave 8a). The CLI contract is pinned — the flags `--in` /
7
7
  * `--out` / `--weeks`, exit codes (0 written · 1 IO failure on read/write),
8
8
  * the stdout/stderr split, byte-identical messages, AND byte-identical
9
9
  * generated Markdown (the report is a write target). Mirrors the shape of
10
10
  * `skill_usage_report.py`: a single file, no external deps. The report is
11
11
  * regenerated on every invocation (idempotent for a given JSONL state).
12
12
  *
13
- * No behaviour changes — latent Python quirks replicated.
13
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
14
14
  */
15
15
  import * as fs from 'node:fs';
16
16
  import * as path from 'node:path';
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Pull the four public adoption signals into a single dated JSONL row.
4
4
  *
5
- * TypeScript twin of `src/scripts/adoption_snapshot.py` (ADR-200, Phase 8
6
- * Wave 8a). Mirrors the Python CLI contract EXACTLY — flags (`--out`,
5
+ * Ported from the retired Python `src/scripts/adoption_snapshot.py` (ADR-200, Phase 8
6
+ * Wave 8a). The CLI contract is pinned — flags (`--out`,
7
7
  * `--no-network`), exit codes (0 / 1 / 2), stdout/stderr split, and the
8
8
  * byte-identical JSONL row (`json.dumps(row)` default separators,
9
9
  * ensure_ascii=True, no trailing space differences).
@@ -59,7 +59,7 @@ const GH_SEARCH_URL_TEMPLATE =
59
59
 
60
60
  const TIMEOUT_S = 10;
61
61
 
62
- // Free-form JSON-ish value type for signal payloads. The Python original uses
62
+ // Free-form JSON-ish value type for signal payloads. the retired Python implementation uses
63
63
  // `dict[str, Any]`; the only documented `any`-shaped surface (HTTP JSON).
64
64
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
65
  type Json = any;
@@ -2,13 +2,13 @@
2
2
  /**
3
3
  * One-screen adoption dashboard for the maintainer's weekly review.
4
4
  *
5
- * TypeScript twin of `src/scripts/adoption_status.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/adoption_status.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8a). The CLI contract is mirrored
7
7
  * EXACTLY: same flags (`--json`, `--branch`), same exit codes (0 normal,
8
8
  * 1 on registry-read IO error), same byte-identical text + JSON output,
9
9
  * same `ci_status` shell-out (now the `.ts` twin run via `tsx` — no
10
10
  * python3), same `unknown` best-effort fallbacks. No behaviour
11
- * changes — latent bugs replicated.
11
+ * changes — historical quirks preserved (consumers pin the exact behaviour).
12
12
  *
13
13
  * Prints three things in one short block:
14
14
  *
@@ -5,11 +5,11 @@
5
5
  * non-numbered ADRs into an Unnumbered table, hard-fails on duplicate
6
6
  * numbers, filename/frontmatter mismatch, or broken supersedes links.
7
7
  *
8
- * TypeScript twin of `src/scripts/adr/regenerate_index.py` (ADR-200, Phase 8).
9
- * The CLI contract is mirrored EXACTLY — `--dir` (default `docs/adr/`),
8
+ * Ported from the retired Python `src/scripts/adr/regenerate_index.py` (ADR-200).
9
+ * The CLI contract is pinned — `--dir` (default `docs/adr/`),
10
10
  * `--check`, exit codes (0 / 1 / 2), the stdout/stderr split, byte-identical
11
11
  * messages, AND byte-identical generated `INDEX.md`. No behaviour changes —
12
- * latent Python quirks replicated.
12
+ * historical quirks preserved (consumers pin the exact behaviour).
13
13
  */
14
14
  import * as fs from 'node:fs';
15
15
  import * as path from 'node:path';
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * Shipped baseline prices for the AI Council.
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/_default_prices.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/_default_prices.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 8 / Wave 8g; ported as a prerequisite of
6
- * `update_prices.ts`). Values + ordering + `as_rows()` semantics mirror the
7
- * Python original EXACTLY.
6
+ * `update_prices.ts`). Values + ordering + `as_rows()` semantics are pinned by tests.
8
7
  *
9
8
  * This module is the bootstrap source for `agents/runtime/.agent-prices.md`
10
9
  * when the runtime file is missing, and the network-fallback source for
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Thinking-style advisors — replace-mode call planning (Phase 6).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/advisors.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/advisors.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 1). When the user-global
6
6
  * `~/.event4u/agent-config/settings/.ai-council.yml` (always global —
7
7
  * ADR-104) enables an advisor (e.g. `contrarian` bound to
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Airgap detection for the AI Council installer / first-run (step-9 P11 · U1).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/airgap.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/airgap.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 1; ai_council FOUNDATION wave). Public surface
6
6
  * mirrors the Python module exactly (snake_case kept deliberately):
7
7
  * `COUNCIL_PROBE_HOSTS`, `DEFAULT_TIMEOUT_S`, `AIRGAP_BANNER`,
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Per-day rolling cost-budget guard for the council (D3).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/budget_guard.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/budget_guard.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 1; ai_council FOUNDATION wave). Mirrors the
6
6
  * Python public surface exactly (snake_case kept deliberately):
7
7
  * `LEDGER_FILENAME`, `LEDGER_PATH`, `ROLLING_WINDOW_HOURS`, `SpendEntry`,
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Context bundling for council consultations.
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/bundler.py` (ADR-094 —
4
+ * Ported from the retired Python `src/scripts/ai_council/bundler.py` (ADR-094 —
5
5
  * Python→TS migration, Phase 1).
6
6
  *
7
7
  * Takes a raw artefact (free-form prompt, roadmap path, diff range, or
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Per-provider CLI install hints for `mode: cli` members (step-9 P2).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/cli_hints.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/cli_hints.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 1; ai_council FOUNDATION wave). Public surface
6
6
  * mirrors the Python module exactly (snake_case kept deliberately):
7
7
  * `INSTALL_HINTS`, `hint_for`, `format_install_hints`.
@@ -1,5 +1,5 @@
1
- // External-AI clients for the council — byte-identical TypeScript twin of
2
- // `src/scripts/ai_council/clients.py` (py2ts migration, ADR-200).
1
+ // External-AI clients for the council — ported from the retired Python
2
+ // `src/scripts/ai_council/clients.py` (ADR-200).
3
3
  //
4
4
  // Mirrors the contract from `scripts/skill_trigger_eval.py`:
5
5
  // - Tokens come exclusively from `~/.event4u/agent-config/<provider>.key`
@@ -31,7 +31,7 @@
31
31
  // `cli_call_budget.max_calls_per_day.<provider>` quota with state persisted at
32
32
  // `~/.event4u/agent-config/cli-calls.json` (daily UTC reset).
33
33
  //
34
- // TRANSPORT SEAM (TS-only, for tests): the Python original calls
34
+ // TRANSPORT SEAM (TS-only, for tests): the retired Python implementation calls
35
35
  // `subprocess.run` directly inside `CliClient.ask`. The twin routes that one
36
36
  // call through the protected `_runSubprocess(cmd, stdinPayload)` instance
37
37
  // method so a test subclass can stub the transport without live processes —
@@ -154,7 +154,7 @@ export class CouncilResponse {
154
154
  // Python uses `time.monotonic()`. latency_ms is non-deterministic; tests
155
155
  // normalise it. Exposed so tests can pin it if they choose.
156
156
  let _monotonicSource: () => number = () => {
157
- // performance.now() is monotonic milliseconds; the Python original is
157
+ // performance.now() is monotonic milliseconds; the retired Python implementation is
158
158
  // seconds, but we only ever compute `int((now - t0) * 1000)`, so feeding
159
159
  // milliseconds here and dropping the *1000 keeps the same arithmetic.
160
160
  return performance.now();
@@ -967,7 +967,7 @@ export abstract class CliClient extends ExternalAIClient {
967
967
  * `subprocess.run(cmd, input=..., capture_output=True, text=True,
968
968
  * timeout=..., check=False)`. Throws `SubprocessError` for the timeout /
969
969
  * ENOENT / OSError branches so `ask()` can classify them exactly as the
970
- * Python original does. Tests override this to inject canned output without
970
+ * historical contract requires. Tests override this to inject canned output without
971
971
  * spawning a process.
972
972
  */
973
973
  protected _runSubprocess(cmd: string[], stdinPayload: string | null): SubprocessResult {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Compile the human-edited low-impact corpus Markdown to a YAML lockfile.
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/compile_corpus.py`
4
+ * Ported from the retired Python `src/scripts/ai_council/compile_corpus.py`
5
5
  * (ADR-200 — Python→TS migration, Phase 1).
6
6
  *
7
7
  * Step-10 — see `agents/roadmaps/step-10-corpus-yaml-lockfile.md`.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Confidence gate for solo-member dispatch (step-9 P13).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/confidence_gate.py`
4
+ * Ported from the retired Python `src/scripts/ai_council/confidence_gate.py`
5
5
  * (ADR-200 — Python→TS migration, Phase 1). Defense-in-depth on top of
6
6
  * shadow-mode SLO: when a single member's response signals uncertainty,
7
7
  * presents unresolved alternatives, or refuses, the dispatcher escalates
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Council configuration loader — single source of truth.
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/config.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/config.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 12). Mirrors the Python module's public
6
6
  * surface and validation behaviour byte-for-byte: same exported
7
7
  * snake_case names, same defaults, same error messages, same precedence.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Consensus scoring for the analysis lens (Phase 4 / F3).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/consensus.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/consensus.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 1). After the final deliberation round, members
6
6
  * score each other's findings. The renderer ranks findings by consensus and
7
7
  * surfaces a "Minority Views" section for sub-threshold items so they remain
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Persistent council events log (step-8 phase 3).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/events_log.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/events_log.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 1). Appends one JSON line per council event to
6
6
  * `<project_root>/agents/runtime/council/events.log`. Schema v1 carries the
7
7
  * minimum needed to answer the "why did the council skip / block this?"
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Preview builder for `/memory learn-low-impact` (step-9 Phase 7).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/learn_low_impact_preview.py`
4
+ * Ported from the retired Python `src/scripts/ai_council/learn_low_impact_preview.py`
5
5
  * (ADR-200 — Python→TS migration, Phase 1).
6
6
  *
7
7
  * Default invocation is `--preview`: build a structured plan describing
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Hardened parser for `agents/decisions/low-impact-decisions.md` (step-9 P4).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/low_impact_corpus.py`
4
+ * Ported from the retired Python `src/scripts/ai_council/low_impact_corpus.py`
5
5
  * (ADR-200 — Python→TS migration, Phase 1).
6
6
  *
7
7
  * Replaces the silent-skip behaviour of the inline regex in
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Intake trigger + dedup for `agents/decisions/low-impact-decisions.md` (Phase 12).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/low_impact_intake.py`
4
+ * Ported from the retired Python `src/scripts/ai_council/low_impact_intake.py`
5
5
  * (ADR-200 — Python→TS migration, Phase 1). Pure-text, deterministic.
6
6
  *
7
7
  * User signals "leichte Frage" / "low-impact question" / equivalents
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Mode resolution for council members (Phase 2b).
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/modes.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/modes.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 1). Pure resolver — never touches the
6
6
  * filesystem or environment. Callers pass in already-loaded values from
7
7
  * `.agent-settings.yml`.
@@ -1,7 +1,7 @@
1
1
  // Council orchestrator — fan out one question to multiple members.
2
2
  //
3
- // py2ts twin of orchestrator.py (ADR-200). Byte-for-byte parity with the
4
- // Python original: member dispatch order, sequential cost gating, the overrun
3
+ // Port of the retired Python orchestrator.py (ADR-200). The historical contract
4
+ // is pinned byte-for-byte by tests: member dispatch order, sequential cost gating, the overrun
5
5
  // callback contract, multi-round debate / peer-review / consensus passes, and
6
6
  // the Markdown render assembly are all mirrored exactly.
7
7
  //
@@ -69,7 +69,7 @@ import {
69
69
  // The orchestrator formats USD / scores / strengths via Python f-string
70
70
  // specs (`:.4f`, `:.2f`, `:.1f`) which round half-to-even on the decimal
71
71
  // representation. JS `toFixed` rounds half away from zero, so the spec
72
- // formatting is reimplemented to stay byte-exact with the Python original.
72
+ // formatting is reimplemented to stay byte-exact with the retired Python implementation.
73
73
 
74
74
  /**
75
75
  * Format `x` to `ndigits` decimals using round-half-to-even, matching
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Runtime pricing layer for the AI Council.
3
3
  *
4
- * TypeScript twin of `src/scripts/ai_council/pricing.py` (ADR-200 —
4
+ * Ported from the retired Python `src/scripts/ai_council/pricing.py` (ADR-200 —
5
5
  * Python→TS migration, Phase 8 / Wave 8g; ported as a prerequisite of
6
6
  * `update_prices.ts`). Mirrors the Python public surface used by the
7
7
  * caller: `PRICES_FILE`, `load_prices`, `is_stale`, `_render_markdown`,
8
8
  * plus `bootstrap_from_defaults` / `last_monday_utc` for completeness.
9
9
  *
10
10
  * Reads `agents/runtime/.agent-prices.md`, parses YAML frontmatter + the
11
- * Markdown table. No behaviour changes — latent Python quirks replicated,
11
+ * Markdown table. Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.,
12
12
  * including the byte-identical `{x:>6.2f}` row formatting.
13
13
  */
14
14
  import * as fs from 'node:fs';