@event4u/agent-config 8.4.1 → 8.5.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 (572) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +67 -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} +18 -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/toolchain-resolver.md +1 -1
  38. package/dist/agent-src/contexts/skills-and-commands.md +2 -2
  39. package/dist/agent-src/rules/external-reference-deep-dive.md +1 -1
  40. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
  41. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
  42. package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +1 -1
  43. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -1
  44. package/dist/agent-src/skills/judge-security-auditor/SKILL.md +1 -1
  45. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  46. package/dist/agent-src/skills/judge-test-coverage/SKILL.md +1 -1
  47. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  48. package/dist/agent-src/skills/mobile-e2e-strategy/SKILL.md +5 -5
  49. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +2 -2
  50. package/dist/agent-src/skills/quality-tools/SKILL.md +1 -1
  51. package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
  52. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  53. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  54. package/dist/agent-src/templates/agent-settings.md +1 -1
  55. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
  56. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
  57. package/dist/cli/commands/config.js +44 -0
  58. package/dist/cli/commands/config.js.map +1 -0
  59. package/dist/cli/commands/uiServe.js +1 -0
  60. package/dist/cli/commands/uiServe.js.map +1 -1
  61. package/dist/cli/help.js +38 -0
  62. package/dist/cli/help.js.map +1 -0
  63. package/dist/cli/initRouting.js +16 -1
  64. package/dist/cli/initRouting.js.map +1 -1
  65. package/dist/cli/main.js +43 -37
  66. package/dist/cli/main.js.map +1 -1
  67. package/dist/cli/registry.js +45 -44
  68. package/dist/cli/registry.js.map +1 -1
  69. package/dist/discovery/deprecation-report.md +1 -1
  70. package/dist/discovery/discovery-manifest.json +419 -210
  71. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  72. package/dist/discovery/discovery-manifest.summary.md +4 -4
  73. package/dist/discovery/orphan-report.md +1 -1
  74. package/dist/discovery/packs.json +31 -25
  75. package/dist/discovery/trust-report.md +2 -2
  76. package/dist/discovery/workspaces.json +30 -24
  77. package/dist/install/install.mjs +6064 -159
  78. package/dist/install/selectedTools.js +39 -10
  79. package/dist/install/selectedTools.js.map +1 -1
  80. package/dist/mcp/registry-manifest.json +3 -3
  81. package/dist/server/app.js +15 -3
  82. package/dist/server/app.js.map +1 -1
  83. package/dist/server/routes/ping.js +16 -0
  84. package/dist/server/routes/ping.js.map +1 -1
  85. package/dist/server/routes/settings.js +42 -6
  86. package/dist/server/routes/settings.js.map +1 -1
  87. package/dist/server/routes/settingsChanges.js +55 -0
  88. package/dist/server/routes/settingsChanges.js.map +1 -0
  89. package/dist/server/routes/userMd.js +7 -2
  90. package/dist/server/routes/userMd.js.map +1 -1
  91. package/dist/server/routes/wizard.js +76 -14
  92. package/dist/server/routes/wizard.js.map +1 -1
  93. package/dist/server/writeRoot.js +17 -0
  94. package/dist/server/writeRoot.js.map +1 -1
  95. package/dist/shared/settingsSurface.js +120 -0
  96. package/dist/shared/settingsSurface.js.map +1 -0
  97. package/dist/ui/assets/index-BPFMZWUs.css +1 -0
  98. package/dist/ui/assets/index-BiEZiZ31.js +40 -0
  99. package/dist/ui/assets/index-BiEZiZ31.js.map +1 -0
  100. package/dist/ui/index.html +15 -2
  101. package/docs/CLAIMS.md +20 -15
  102. package/docs/architecture.md +1 -1
  103. package/docs/catalog.md +37 -31
  104. package/docs/command-flows.md +22 -16
  105. package/docs/contracts/command-clusters.md +39 -9
  106. package/docs/contracts/file-ownership-matrix.json +21 -0
  107. package/docs/contracts/frontmatter-contract.md +1 -1
  108. package/docs/contracts/gui-wizard.md +16 -4
  109. package/docs/contracts/iron-law-overrides.txt +1 -0
  110. package/docs/contracts/rule-classification.md +2 -2
  111. package/docs/contracts/settings-api.md +58 -2
  112. package/docs/contracts/surface-matrix.md +5 -0
  113. package/docs/cookbook.md +7 -7
  114. package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +74 -0
  115. package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +91 -0
  116. package/docs/decisions/INDEX.md +2 -0
  117. package/docs/featured-commands.md +1 -1
  118. package/docs/featured-skills.md +4 -4
  119. package/docs/flows.md +2 -2
  120. package/docs/getting-started-by-role.md +1 -1
  121. package/docs/getting-started-laravel.md +1 -1
  122. package/docs/getting-started.md +6 -3
  123. package/docs/governance-advantage.md +1 -1
  124. package/docs/guidelines/agent-infra/5w2h-analysis.md +1 -1
  125. package/docs/guidelines/agent-infra/ios-simulator-guide.md +1 -1
  126. package/docs/proof.md +11 -2
  127. package/package.json +3 -1
  128. package/src/agent-src/README.md +1 -1
  129. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
  130. package/src/config/agent-settings.template.yml +1 -1
  131. package/src/install/selectedTools.ts +38 -10
  132. package/src/scripts/_cli/cmd_converge.ts +38 -0
  133. package/src/scripts/_cli/cmd_doctor.ts +113 -2
  134. package/src/scripts/_cli/cmd_explain.ts +2 -2
  135. package/src/scripts/_cli/cmd_export.ts +3 -3
  136. package/src/scripts/_cli/cmd_fleet.ts +13 -1
  137. package/src/scripts/_cli/cmd_migrate.ts +3 -3
  138. package/src/scripts/_cli/cmd_prune.ts +2 -2
  139. package/src/scripts/_cli/cmd_refresh.ts +4 -4
  140. package/src/scripts/_cli/cmd_settings_check.ts +2 -2
  141. package/src/scripts/_cli/cmd_settings_migrate.ts +2 -2
  142. package/src/scripts/_cli/cmd_sync.ts +2 -2
  143. package/src/scripts/_cli/cmd_uninstall.ts +2 -2
  144. package/src/scripts/_cli/cmd_update.ts +8 -8
  145. package/src/scripts/_cli/cmd_upgrade.ts +4 -3
  146. package/src/scripts/_cli/cmd_validate.ts +3 -3
  147. package/src/scripts/_cli/cmd_versions.ts +2 -2
  148. package/src/scripts/_cli/explain_last/assumptions.ts +2 -2
  149. package/src/scripts/_cli/explain_last/council.ts +2 -2
  150. package/src/scripts/_cli/explain_last/halt.ts +2 -2
  151. package/src/scripts/_cli/explain_last/index.ts +2 -2
  152. package/src/scripts/_cli/explain_last/inputs.ts +4 -4
  153. package/src/scripts/_cli/explain_last/memory.ts +2 -2
  154. package/src/scripts/_cli/explain_last/provider.ts +2 -2
  155. package/src/scripts/_cli/explain_last/render.ts +2 -2
  156. package/src/scripts/_cli/explain_last/route.ts +2 -2
  157. package/src/scripts/_cli/explain_last/scrubber.ts +2 -2
  158. package/src/scripts/_cli/explain_last/sections/assumptions.ts +2 -2
  159. package/src/scripts/_cli/explain_last/sections/council.ts +2 -2
  160. package/src/scripts/_cli/explain_last/sections/halt.ts +2 -2
  161. package/src/scripts/_cli/explain_last/sections/header.ts +2 -2
  162. package/src/scripts/_cli/explain_last/sections/index.ts +1 -1
  163. package/src/scripts/_cli/explain_last/sections/inputs.ts +2 -2
  164. package/src/scripts/_cli/explain_last/sections/memory.ts +2 -2
  165. package/src/scripts/_cli/explain_last/sections/pack.ts +2 -2
  166. package/src/scripts/_cli/explain_last/sections/provider.ts +2 -2
  167. package/src/scripts/_cli/explain_last/sections/route.ts +2 -2
  168. package/src/scripts/_cli/explain_last/state_loader.ts +2 -2
  169. package/src/scripts/_dispatch.bash +20 -1
  170. package/src/scripts/_lib/agent_settings.ts +1 -1
  171. package/src/scripts/_lib/agent_src.ts +7 -7
  172. package/src/scripts/_lib/agents_overlay.ts +1 -1
  173. package/src/scripts/_lib/bench_ab_cache.ts +1 -1
  174. package/src/scripts/_lib/bench_ab_scoring.ts +1 -1
  175. package/src/scripts/_lib/bench_ab_scoring_v2.ts +3 -3
  176. package/src/scripts/_lib/bench_cost.ts +1 -1
  177. package/src/scripts/_lib/bench_quality.ts +3 -3
  178. package/src/scripts/_lib/bench_report.ts +4 -4
  179. package/src/scripts/_lib/bench_telegraph.ts +1 -1
  180. package/src/scripts/_lib/bench_telegraph_report.ts +4 -4
  181. package/src/scripts/_lib/changelog_eras.ts +1 -1
  182. package/src/scripts/_lib/claude_desktop_bundler.ts +1 -1
  183. package/src/scripts/_lib/cli_wrapper.ts +1 -1
  184. package/src/scripts/_lib/fs_atomic.ts +1 -1
  185. package/src/scripts/_lib/global_deploy_inventory.ts +1 -1
  186. package/src/scripts/_lib/install_layout.ts +1 -1
  187. package/src/scripts/_lib/install_regenerator.ts +1 -1
  188. package/src/scripts/_lib/installed_lock.ts +1 -1
  189. package/src/scripts/_lib/installed_tools.ts +1 -1
  190. package/src/scripts/_lib/json_pointers.ts +1 -1
  191. package/src/scripts/_lib/knowledge_global.ts +1 -1
  192. package/src/scripts/_lib/knowledge_global_promote.ts +2 -2
  193. package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
  194. package/src/scripts/_lib/link_crypto.ts +4 -4
  195. package/src/scripts/_lib/linked_projects.ts +4 -4
  196. package/src/scripts/_lib/model_tier.ts +1 -1
  197. package/src/scripts/_lib/module_detection.ts +2 -2
  198. package/src/scripts/_lib/pin_resolver.ts +1 -1
  199. package/src/scripts/_lib/script_output.ts +1 -1
  200. package/src/scripts/_lib/security_lint.ts +1 -1
  201. package/src/scripts/_lib/surface_tiers.ts +1 -1
  202. package/src/scripts/_lib/text_similarity.ts +1 -1
  203. package/src/scripts/_lib/update_check.ts +2 -2
  204. package/src/scripts/_lib/user_global_paths.ts +1 -1
  205. package/src/scripts/_lib/value_ladder.ts +1 -1
  206. package/src/scripts/_lib/value_report.ts +1 -1
  207. package/src/scripts/_lib/zip_min.ts +2 -2
  208. package/src/scripts/adoption_report.ts +3 -3
  209. package/src/scripts/adoption_snapshot.ts +3 -3
  210. package/src/scripts/adoption_status.ts +2 -2
  211. package/src/scripts/adr/regenerate_index.ts +3 -3
  212. package/src/scripts/ai_council/_default_prices.ts +2 -3
  213. package/src/scripts/ai_council/advisors.ts +1 -1
  214. package/src/scripts/ai_council/airgap.ts +1 -1
  215. package/src/scripts/ai_council/budget_guard.ts +1 -1
  216. package/src/scripts/ai_council/bundler.ts +1 -1
  217. package/src/scripts/ai_council/cli_hints.ts +1 -1
  218. package/src/scripts/ai_council/clients.ts +5 -5
  219. package/src/scripts/ai_council/compile_corpus.ts +1 -1
  220. package/src/scripts/ai_council/confidence_gate.ts +1 -1
  221. package/src/scripts/ai_council/config.ts +1 -1
  222. package/src/scripts/ai_council/consensus.ts +1 -1
  223. package/src/scripts/ai_council/events_log.ts +1 -1
  224. package/src/scripts/ai_council/learn_low_impact_preview.ts +1 -1
  225. package/src/scripts/ai_council/low_impact_corpus.ts +1 -1
  226. package/src/scripts/ai_council/low_impact_intake.ts +1 -1
  227. package/src/scripts/ai_council/modes.ts +1 -1
  228. package/src/scripts/ai_council/orchestrator.ts +3 -3
  229. package/src/scripts/ai_council/pricing.ts +2 -2
  230. package/src/scripts/ai_council/probation_gate.ts +2 -2
  231. package/src/scripts/ai_council/project_context.ts +1 -1
  232. package/src/scripts/ai_council/prompts.ts +1 -1
  233. package/src/scripts/ai_council/redact_low_impact_entry.ts +2 -2
  234. package/src/scripts/ai_council/session.ts +1 -1
  235. package/src/scripts/ai_council/shadow_dispatch.ts +1 -1
  236. package/src/scripts/ai_council/solo_dispatch.ts +1 -1
  237. package/src/scripts/analysis_freshness.ts +2 -2
  238. package/src/scripts/annotate_discovery.ts +2 -2
  239. package/src/scripts/apply_modules_config.ts +2 -2
  240. package/src/scripts/audit_adr_coverage.ts +3 -3
  241. package/src/scripts/audit_auto_rules.ts +2 -2
  242. package/src/scripts/audit_cloud_compatibility.ts +3 -3
  243. package/src/scripts/audit_command_surface.ts +2 -2
  244. package/src/scripts/audit_initial_context.ts +7 -6
  245. package/src/scripts/audit_likelihood.ts +5 -5
  246. package/src/scripts/audit_mcp_tools.ts +3 -3
  247. package/src/scripts/audit_overlap.ts +2 -2
  248. package/src/scripts/audit_skill_descriptions.ts +2 -2
  249. package/src/scripts/audit_skill_overlap.ts +5 -5
  250. package/src/scripts/audit_user_type_axis.ts +4 -4
  251. package/src/scripts/backfill_model_tier.ts +1 -1
  252. package/src/scripts/bench_ab_cache_dispatch.ts +2 -2
  253. package/src/scripts/bench_ab_clone.ts +2 -2
  254. package/src/scripts/bench_ab_diff.ts +3 -3
  255. package/src/scripts/bench_ab_integrity.ts +2 -2
  256. package/src/scripts/bench_ab_run.ts +4 -4
  257. package/src/scripts/bench_ab_task_runner.ts +1 -1
  258. package/src/scripts/bench_ab_tracka_run.ts +2 -2
  259. package/src/scripts/bench_ab_v2_run.ts +1 -1
  260. package/src/scripts/bench_ab_v2_stats.ts +2 -2
  261. package/src/scripts/bench_baseline_ready.ts +1 -1
  262. package/src/scripts/bench_condense_memory.ts +4 -4
  263. package/src/scripts/bench_drift_check.ts +3 -3
  264. package/src/scripts/bench_per_tool.ts +1 -1
  265. package/src/scripts/bench_rtk_savings.ts +4 -4
  266. package/src/scripts/bench_run.ts +4 -4
  267. package/src/scripts/bench_runner.ts +1 -1
  268. package/src/scripts/build_cloud_bundle.ts +3 -3
  269. package/src/scripts/build_discovery_manifest.ts +13 -15
  270. package/src/scripts/build_linear_digest.ts +2 -2
  271. package/src/scripts/build_mcp_registry_manifest.ts +3 -3
  272. package/src/scripts/build_proof.ts +6 -0
  273. package/src/scripts/build_rule_trigger_matrix.ts +2 -2
  274. package/src/scripts/capture_showcase_session.ts +3 -3
  275. package/src/scripts/chat_history.ts +1 -1
  276. package/src/scripts/check_always_budget.ts +1 -1
  277. package/src/scripts/check_artefact_checksums.ts +4 -4
  278. package/src/scripts/check_artefact_count_messaging.ts +197 -0
  279. package/src/scripts/check_augment_description_cap.ts +3 -3
  280. package/src/scripts/check_augmentignore.ts +1 -1
  281. package/src/scripts/check_beta_review_markers.ts +3 -3
  282. package/src/scripts/check_bite_sized_granularity.ts +1 -1
  283. package/src/scripts/check_cluster_patterns.ts +47 -3
  284. package/src/scripts/check_command_count_messaging.ts +2 -2
  285. package/src/scripts/check_condensation.ts +2 -2
  286. package/src/scripts/check_condensed_paths.ts +6 -6
  287. package/src/scripts/check_context_paths.ts +1 -1
  288. package/src/scripts/check_council_config_location.ts +3 -3
  289. package/src/scripts/check_council_layout.ts +2 -2
  290. package/src/scripts/check_council_references.ts +2 -2
  291. package/src/scripts/check_discovery_determinism.ts +3 -3
  292. package/src/scripts/check_gate_paths.ts +4 -4
  293. package/src/scripts/check_iron_law_prominence.ts +2 -2
  294. package/src/scripts/check_kernel_rule_bundle.ts +3 -3
  295. package/src/scripts/check_knowledge_cards.ts +4 -4
  296. package/src/scripts/check_knowledge_pages.ts +1 -1
  297. package/src/scripts/check_md_language.ts +3 -3
  298. package/src/scripts/check_memory.ts +3 -3
  299. package/src/scripts/check_memory_proposal.ts +2 -2
  300. package/src/scripts/check_module_management_neutral.ts +1 -1
  301. package/src/scripts/check_no_conflict_markers.ts +1 -1
  302. package/src/scripts/check_no_external_sources.ts +1 -1
  303. package/src/scripts/check_no_local_settings_committed.ts +2 -2
  304. package/src/scripts/check_no_new_legacy_path.ts +3 -3
  305. package/src/scripts/check_no_roadmap_refs.ts +3 -3
  306. package/src/scripts/check_one_off_location.ts +3 -3
  307. package/src/scripts/check_overlay_cascade_subdirs.ts +3 -3
  308. package/src/scripts/check_portability.ts +3 -3
  309. package/src/scripts/check_proposal.ts +0 -0
  310. package/src/scripts/check_public_catalog_links.ts +1 -1
  311. package/src/scripts/check_public_links.ts +2 -2
  312. package/src/scripts/check_references.ts +3 -3
  313. package/src/scripts/check_release_includes_discovery.ts +2 -2
  314. package/src/scripts/check_release_pr_shape.ts +2 -2
  315. package/src/scripts/check_release_published.ts +1 -1
  316. package/src/scripts/check_release_trunk_sync.ts +3 -3
  317. package/src/scripts/check_reply_consistency.ts +1 -1
  318. package/src/scripts/check_roadmap_trackable.ts +2 -2
  319. package/src/scripts/check_role_doc_links.ts +2 -2
  320. package/src/scripts/check_safety_floor_untouched.ts +3 -3
  321. package/src/scripts/check_skill_requires.ts +2 -2
  322. package/src/scripts/check_structural_breaking.ts +2 -2
  323. package/src/scripts/check_surface_tiers.ts +2 -2
  324. package/src/scripts/check_template_pin_drift.ts +1 -1
  325. package/src/scripts/check_test_coverage_diff.ts +2 -2
  326. package/src/scripts/check_token_optimizer_freshness.ts +3 -3
  327. package/src/scripts/check_trigger_evals.ts +2 -2
  328. package/src/scripts/check_update_banner.ts +1 -1
  329. package/src/scripts/ci_status.ts +0 -0
  330. package/src/scripts/ci_summary.ts +3 -3
  331. package/src/scripts/ci_time_ratio.ts +1 -1
  332. package/src/scripts/command_suggester/cooldown.ts +1 -1
  333. package/src/scripts/command_suggester/index.ts +1 -1
  334. package/src/scripts/command_suggester/loader.ts +1 -1
  335. package/src/scripts/command_suggester/match.ts +1 -1
  336. package/src/scripts/command_suggester/rank.ts +1 -1
  337. package/src/scripts/command_suggester/render.ts +1 -1
  338. package/src/scripts/command_suggester/sanitize.ts +1 -1
  339. package/src/scripts/command_suggester/settings.ts +1 -1
  340. package/src/scripts/command_suggester/types.ts +0 -0
  341. package/src/scripts/compile_router.ts +4 -4
  342. package/src/scripts/condense.ts +3 -3
  343. package/src/scripts/condense_memory.ts +1 -1
  344. package/src/scripts/config/index.ts +1 -1
  345. package/src/scripts/config/packs.ts +1 -1
  346. package/src/scripts/config/presets.ts +1 -1
  347. package/src/scripts/config/profile_explain.ts +1 -1
  348. package/src/scripts/config/profiles.ts +1 -1
  349. package/src/scripts/config/session_profiles.ts +1 -1
  350. package/src/scripts/context_hygiene_hook.ts +2 -2
  351. package/src/scripts/cost_by_conversation.ts +1 -1
  352. package/src/scripts/cost_summary.ts +2 -2
  353. package/src/scripts/council_cli.ts +1 -1
  354. package/src/scripts/council_prune.ts +1 -1
  355. package/src/scripts/cross_repo_retrieve.ts +2 -2
  356. package/src/scripts/discovery_stats.ts +3 -3
  357. package/src/scripts/evidence_report.ts +4 -4
  358. package/src/scripts/extract_audit_patterns.ts +2 -2
  359. package/src/scripts/first_run_gate_hook.ts +1 -1
  360. package/src/scripts/gen_discovery_baseline.ts +2 -2
  361. package/src/scripts/generate_capabilities_index.ts +2 -2
  362. package/src/scripts/generate_capability_matrix.ts +2 -2
  363. package/src/scripts/generate_catalog.ts +2 -2
  364. package/src/scripts/generate_command_flows.ts +2 -2
  365. package/src/scripts/generate_cookbook.ts +1 -1
  366. package/src/scripts/generate_index.ts +3 -3
  367. package/src/scripts/generate_ownership_matrix.ts +2 -2
  368. package/src/scripts/generate_pack_manifests.ts +2 -2
  369. package/src/scripts/generate_role_experiences_catalog.ts +3 -3
  370. package/src/scripts/hooks/block_no_verify.ts +2 -2
  371. package/src/scripts/hooks/dispatch_hook.ts +2 -2
  372. package/src/scripts/hooks/dispatch_issues.ts +1 -1
  373. package/src/scripts/hooks/envelope.ts +1 -1
  374. package/src/scripts/hooks/replay_hook.ts +1 -1
  375. package/src/scripts/hooks/state_io.ts +1 -1
  376. package/src/scripts/hooks_doctor.ts +1 -1
  377. package/src/scripts/hooks_status.ts +1 -1
  378. package/src/scripts/injection_scan_hook.ts +1 -1
  379. package/src/scripts/install.ts +145 -3
  380. package/src/scripts/inventory_abstraction_budget.ts +5 -5
  381. package/src/scripts/inventory_frontmatter.ts +1 -1
  382. package/src/scripts/inventory_meta_layers.ts +1 -1
  383. package/src/scripts/iron_law_sha.ts +1 -1
  384. package/src/scripts/knowledge_global_cli.ts +3 -3
  385. package/src/scripts/linked_projects_list.ts +1 -1
  386. package/src/scripts/lint_agent_security.ts +4 -4
  387. package/src/scripts/lint_agent_skill_names.ts +1 -1
  388. package/src/scripts/lint_agents_layout.ts +2 -2
  389. package/src/scripts/lint_agents_md.ts +3 -3
  390. package/src/scripts/lint_archived_skills.ts +2 -2
  391. package/src/scripts/lint_artefact_frontmatter.ts +2 -2
  392. package/src/scripts/lint_bench_ab.ts +2 -2
  393. package/src/scripts/lint_bench_corpus.ts +1 -1
  394. package/src/scripts/lint_command_flow_coverage.ts +1 -1
  395. package/src/scripts/lint_command_routing.ts +2 -2
  396. package/src/scripts/lint_command_tiers.ts +1 -1
  397. package/src/scripts/lint_command_verbs.ts +4 -4
  398. package/src/scripts/lint_commit_subjects.ts +2 -2
  399. package/src/scripts/lint_context_spine_usage.ts +3 -3
  400. package/src/scripts/lint_discovery_manifest.ts +4 -4
  401. package/src/scripts/lint_discovery_vocabulary.ts +2 -2
  402. package/src/scripts/lint_empty_roadmaps.ts +3 -3
  403. package/src/scripts/lint_eval_freshness.ts +2 -2
  404. package/src/scripts/lint_examples.ts +2 -2
  405. package/src/scripts/lint_explain_trace.ts +2 -2
  406. package/src/scripts/lint_featured_skills.ts +0 -0
  407. package/src/scripts/lint_flows.ts +5 -5
  408. package/src/scripts/lint_framework_leakage.ts +1 -1
  409. package/src/scripts/lint_framework_leakage_allowlist.json +10 -2
  410. package/src/scripts/lint_frontmatter_boilerplate.ts +2 -2
  411. package/src/scripts/lint_ghostwriter_source.ts +3 -3
  412. package/src/scripts/lint_global_paths.ts +1 -1
  413. package/src/scripts/lint_handoffs.ts +1 -1
  414. package/src/scripts/lint_hidden_unicode.ts +1 -1
  415. package/src/scripts/lint_hook_concern_budget.ts +2 -2
  416. package/src/scripts/lint_hook_manifest.ts +2 -2
  417. package/src/scripts/lint_instruction_smuggling.ts +1 -1
  418. package/src/scripts/lint_load_context.ts +2 -2
  419. package/src/scripts/lint_marketplace.ts +1 -1
  420. package/src/scripts/lint_marketplace_install_completeness.ts +2 -2
  421. package/src/scripts/lint_mcp_config_security.ts +1 -1
  422. package/src/scripts/lint_mcp_registry_manifest.ts +1 -1
  423. package/src/scripts/lint_media_policy_linkage.ts +3 -3
  424. package/src/scripts/lint_missions.ts +3 -3
  425. package/src/scripts/lint_model_tier_coverage.ts +3 -3
  426. package/src/scripts/lint_namespace.ts +2 -2
  427. package/src/scripts/lint_namespace_collisions.ts +2 -2
  428. package/src/scripts/lint_new_skill_gate.ts +3 -3
  429. package/src/scripts/lint_no_new_atomic_commands.ts +9 -6
  430. package/src/scripts/lint_no_python_twin_rationale.ts +102 -0
  431. package/src/scripts/lint_one_off_age.ts +2 -2
  432. package/src/scripts/lint_orchestration_dsl.ts +3 -3
  433. package/src/scripts/lint_orchestrator_auto_detect.ts +1 -1
  434. package/src/scripts/lint_pack_boundaries.ts +2 -2
  435. package/src/scripts/lint_pack_dependencies.ts +2 -2
  436. package/src/scripts/lint_pack_first_win.ts +2 -2
  437. package/src/scripts/lint_persona_governance.ts +3 -3
  438. package/src/scripts/lint_positioning.ts +1 -1
  439. package/src/scripts/lint_profile_overlay_set_only.ts +2 -2
  440. package/src/scripts/lint_readme_jargon.ts +2 -2
  441. package/src/scripts/lint_readme_size.ts +2 -2
  442. package/src/scripts/lint_regression.ts +3 -3
  443. package/src/scripts/lint_roadmap_ci_steps.ts +3 -3
  444. package/src/scripts/lint_roadmap_complexity.ts +1 -1
  445. package/src/scripts/lint_roadmap_later_disposition.ts +2 -2
  446. package/src/scripts/lint_role_experiences.ts +2 -2
  447. package/src/scripts/lint_rule_interactions.ts +1 -1
  448. package/src/scripts/lint_rule_tiers.ts +1 -1
  449. package/src/scripts/lint_showcase_sessions.ts +2 -2
  450. package/src/scripts/lint_skill_frontmatter_safety.ts +1 -1
  451. package/src/scripts/lint_skill_originality.ts +1 -1
  452. package/src/scripts/lint_skill_tools.ts +3 -3
  453. package/src/scripts/lint_ticket_buildable.ts +2 -2
  454. package/src/scripts/lint_topics_yaml.ts +3 -3
  455. package/src/scripts/lint_trust_coherence.ts +3 -3
  456. package/src/scripts/lint_value_dashboard.ts +3 -3
  457. package/src/scripts/lint_workflow_security.ts +3 -3
  458. package/src/scripts/lint_workspace_boundary.ts +2 -2
  459. package/src/scripts/mcp_parity_smoke.ts +1 -1
  460. package/src/scripts/mcp_render.ts +1 -1
  461. package/src/scripts/mcp_server/catalog.ts +1 -1
  462. package/src/scripts/mcp_server/index.ts +1 -1
  463. package/src/scripts/mcp_server/metadata.ts +1 -1
  464. package/src/scripts/mcp_server/prompts.ts +1 -1
  465. package/src/scripts/mcp_server/resources.ts +1 -1
  466. package/src/scripts/mcp_server/server.ts +1 -1
  467. package/src/scripts/mcp_server/telemetry.ts +1 -1
  468. package/src/scripts/mcp_server/tools.ts +1 -1
  469. package/src/scripts/mcp_telemetry_health.ts +1 -1
  470. package/src/scripts/mcp_telemetry_query.ts +3 -3
  471. package/src/scripts/mcp_telemetry_store.ts +3 -3
  472. package/src/scripts/measure_augment_budget.ts +2 -2
  473. package/src/scripts/measure_density.ts +2 -2
  474. package/src/scripts/measure_frugality_savings.ts +3 -3
  475. package/src/scripts/measure_markitdown_lift.ts +1 -1
  476. package/src/scripts/measure_patterns.ts +1 -1
  477. package/src/scripts/measure_projection_bytes.ts +1 -1
  478. package/src/scripts/measure_rule_budget.ts +1 -1
  479. package/src/scripts/measure_skill_reduction.ts +1 -1
  480. package/src/scripts/memory_hash.ts +1 -1
  481. package/src/scripts/memory_lookup.ts +6 -6
  482. package/src/scripts/memory_report.ts +1 -1
  483. package/src/scripts/memory_signal.ts +1 -1
  484. package/src/scripts/memory_status.ts +2 -2
  485. package/src/scripts/migrate_command_suggestions.ts +1 -1
  486. package/src/scripts/migrate_frontmatter_defaults.ts +1 -1
  487. package/src/scripts/mine_session.ts +3 -3
  488. package/src/scripts/minimal_safe_diff_hook.ts +2 -2
  489. package/src/scripts/move_artefact.ts +3 -3
  490. package/src/scripts/new_skill.ts +3 -3
  491. package/src/scripts/onboarding_gate_hook.ts +2 -2
  492. package/src/scripts/pack_mcp_content.ts +1 -1
  493. package/src/scripts/parity/replay.ts +3 -2
  494. package/src/scripts/pattern_share.ts +2 -2
  495. package/src/scripts/plan_physical_move.ts +3 -3
  496. package/src/scripts/prediction-pool/poisson_sim.ts +2 -2
  497. package/src/scripts/prediction-pool/pool_winsim.ts +2 -2
  498. package/src/scripts/prediction-pool/score_ev.ts +2 -2
  499. package/src/scripts/print_required_checks.ts +2 -2
  500. package/src/scripts/probe_projection_fidelity.ts +2 -2
  501. package/src/scripts/probe_skill_registration.ts +2 -2
  502. package/src/scripts/profile_staleness_hook.ts +2 -2
  503. package/src/scripts/profile_use.ts +2 -2
  504. package/src/scripts/project_thin_rules.ts +3 -3
  505. package/src/scripts/propose_modules_config.ts +2 -2
  506. package/src/scripts/prototype_lint_contradictions.ts +2 -2
  507. package/src/scripts/prove_pack_extractable.ts +1 -1
  508. package/src/scripts/readme_linter.ts +4 -4
  509. package/src/scripts/redact_hook_capture.ts +2 -2
  510. package/src/scripts/refine_ticket_detect.ts +1 -1
  511. package/src/scripts/release.ts +30 -19
  512. package/src/scripts/render_benchmark_md.ts +2 -2
  513. package/src/scripts/render_value_md.ts +2 -2
  514. package/src/scripts/roadmap_progress_hook.ts +1 -1
  515. package/src/scripts/router_telemetry.ts +1 -1
  516. package/src/scripts/run_skill_evals.ts +2 -2
  517. package/src/scripts/runtime_dispatcher.ts +1 -1
  518. package/src/scripts/runtime_handler.ts +1 -1
  519. package/src/scripts/runtime_registry.ts +3 -3
  520. package/src/scripts/score_skill_selection.ts +1 -1
  521. package/src/scripts/security_audit_config.ts +2 -2
  522. package/src/scripts/skill_collision_clusters.ts +1 -1
  523. package/src/scripts/skill_discovery.ts +1 -1
  524. package/src/scripts/skill_linter.ts +8 -7
  525. package/src/scripts/skill_overlap.ts +2 -2
  526. package/src/scripts/skill_preview.ts +1 -1
  527. package/src/scripts/skill_tools/audit_persona_coverage.ts +3 -3
  528. package/src/scripts/skill_tools/audit_user_type_coverage.ts +3 -3
  529. package/src/scripts/skill_tools/index.ts +1 -1
  530. package/src/scripts/skill_tools/run_block_d_eval.ts +3 -3
  531. package/src/scripts/skill_tools/score_skill_relevance.ts +3 -3
  532. package/src/scripts/skill_tools/suggest_skill_for_task.ts +3 -3
  533. package/src/scripts/skill_trigger_eval.ts +2 -2
  534. package/src/scripts/skill_usage_collect.ts +2 -2
  535. package/src/scripts/skill_usage_report.ts +2 -2
  536. package/src/scripts/smoke_path_resolution.ts +2 -2
  537. package/src/scripts/smoke_quickstart.ts +4 -4
  538. package/src/scripts/snapshot_agent_outputs.ts +2 -2
  539. package/src/scripts/spotcheck_thin_root.ts +2 -2
  540. package/src/scripts/surface-tiers.yml +1 -0
  541. package/src/scripts/sync_agent_settings.ts +2 -2
  542. package/src/scripts/sync_github_metadata.ts +4 -4
  543. package/src/scripts/sync_gitignore.ts +3 -3
  544. package/src/scripts/sync_yaml_rt.ts +2 -2
  545. package/src/scripts/telegraph_stats.ts +1 -1
  546. package/src/scripts/tool_registry.ts +2 -2
  547. package/src/scripts/tools/adapter_errors.ts +1 -1
  548. package/src/scripts/tools/base_adapter.ts +1 -1
  549. package/src/scripts/tools/github_adapter.ts +1 -1
  550. package/src/scripts/tools/jira_adapter.ts +1 -1
  551. package/src/scripts/trigger_coverage.ts +2 -2
  552. package/src/scripts/update_counts.ts +68 -6
  553. package/src/scripts/update_prices.ts +3 -3
  554. package/src/scripts/validate_agent_settings.ts +3 -3
  555. package/src/scripts/validate_decision_engine.ts +2 -2
  556. package/src/scripts/validate_discovery_manifest.ts +3 -3
  557. package/src/scripts/validate_frontmatter.ts +5 -5
  558. package/src/scripts/validate_pack_yaml.ts +0 -0
  559. package/src/scripts/validate_safe_paths.ts +2 -2
  560. package/src/scripts/validate_telegraph_carveouts.ts +3 -3
  561. package/src/scripts/verify_before_complete_hook.ts +2 -2
  562. package/src/scripts/verify_physical_move.ts +2 -2
  563. package/src/scripts/wrapper_freshness_hook.ts +3 -3
  564. package/src/server/schemas/settings.ts +426 -0
  565. package/src/shared/settingsSurface.ts +184 -0
  566. package/src/shared/userMd/formAdapter.ts +86 -0
  567. package/src/shared/userMd/schema.ts +59 -0
  568. package/src/shared/userMd/utils.ts +91 -0
  569. package/dist/agent-src/commands/optimize-project.md +0 -243
  570. package/dist/ui/assets/index-BbWWuFrF.css +0 -1
  571. package/dist/ui/assets/index-UjcTG_9O.js +0 -40
  572. package/dist/ui/assets/index-UjcTG_9O.js.map +0 -1
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * File-first memory retrieval.
4
4
  *
5
- * TypeScript twin of `src/scripts/memory_lookup.py` (ADR-200). The public
6
- * API and CLI contract mirror the Python original EXACTLY — same exported
5
+ * Ported from the retired Python `src/scripts/memory_lookup.py` (ADR-200). The public
6
+ * API and CLI contract mirror the retired Python implementation EXACTLY — same exported
7
7
  * names (snake_case kept deliberately, especially `retrieve(...)` whose
8
8
  * signature/return shape is cited by rules), same exit codes, stdout/stderr
9
9
  * split, byte-identical messages, same memory-file scan + ranking + JSON
@@ -40,7 +40,7 @@ import YAML, { parseDocument } from 'yaml';
40
40
  // timestamp into a `datetime.datetime`. The `yaml` npm parses both to JS Date
41
41
  // objects whose String()/JSON form differs, so `json.dumps(..., default=str)`
42
42
  // in the CLI would not match. This marker preserves PyYAML's str() form so
43
- // JSON output and as_dict() are byte-identical to the Python original.
43
+ // JSON output and as_dict() are byte-stable — downstream consumers and checksum gates pin these bytes.
44
44
  const PYYAML_DATE_ONLY_RE = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;
45
45
  const PYYAML_TIMESTAMP_RE =
46
46
  /^(?:[0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}(?:[Tt]|[ \t]+)[0-9]{1,2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]*)?(?:[ \t]*(?:Z|[-+][0-9]{1,2}(?::[0-9]{2})?))?)$/;
@@ -191,7 +191,7 @@ function _load_yaml(p: string): unknown {
191
191
  const raw = text.slice(node.range[0], node.range[1]);
192
192
  // Under YAML 1.1 the `yaml` lib resolves plain timestamp scalars to
193
193
  // JS Date objects. Recover PyYAML's str() form from the original
194
- // source so JSON output / as_dict() match the Python original.
194
+ // source so JSON output / as_dict() match the retired Python implementation.
195
195
  if (node.value instanceof Date) {
196
196
  if (PYYAML_DATE_ONLY_RE.test(raw)) {
197
197
  (node as { value: unknown }).value = new PyTimestamp(raw);
@@ -476,10 +476,10 @@ export function _score(entry: Record<string, unknown>, keys: string[]): number {
476
476
  /**
477
477
  * Project cross-repo matches into discounted, tagged Hits.
478
478
  *
479
- * Lazy + guarded: the Python original imports `cross_repo_retrieve` on
479
+ * Lazy + guarded: the retired Python implementation imports `cross_repo_retrieve` on
480
480
  * demand and swallows any failure (script absent, no opted-in siblings) so
481
481
  * the cross-repo type degrades to zero hits rather than breaking retrieval.
482
- * The TypeScript twin of `cross_repo_retrieve` is unported in this phase, so
482
+ * The Ported from the retired Python `cross_repo_retrieve` is unported in this phase, so
483
483
  * this always degrades to zero hits — flagged as a divergence candidate.
484
484
  * Scores sit below curated/knowledge (0.85× floor, then a small per-rank
485
485
  * decrement) so cross-repo context never outranks the project's own truth.
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * One-shot memory observability report.
4
4
  *
5
- * TypeScript twin of `src/scripts/memory_report.py` (ADR-200, Phase 7 /
5
+ * Ported from the retired Python `src/scripts/memory_report.py` (ADR-200, Phase 7 /
6
6
  * dev-side memory). The public API and CLI contract mirror the Python
7
7
  * original EXACTLY — same exported names (snake_case kept deliberately),
8
8
  * same exit codes, stdout/stderr split, byte-identical messages, and
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Write-side helper: drop an engineering-memory signal.
4
4
  *
5
- * TypeScript twin of `src/scripts/memory_signal.py` (ADR-200, Phase 7 /
5
+ * Ported from the retired Python `src/scripts/memory_signal.py` (ADR-200, Phase 7 /
6
6
  * dev-side memory). The public API and CLI contract mirror the Python
7
7
  * original EXACTLY — same exported names (snake_case kept deliberately),
8
8
  * same exit codes, stdout/stderr split, byte-identical messages, same
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * File-backed memory status (no external backend).
4
4
  *
5
- * TypeScript twin of `src/scripts/memory_status.py` (ADR-200). The public
6
- * API and CLI contract mirror the Python original EXACTLY — same exported
5
+ * Ported from the retired Python `src/scripts/memory_status.py` (ADR-200). The public
6
+ * API and CLI contract mirror the retired Python implementation EXACTLY — same exported
7
7
  * names (snake_case kept deliberately), same exit codes, stdout/stderr
8
8
  * split, byte-identical messages and JSON shape. No behaviour changes.
9
9
  *
@@ -3,7 +3,7 @@
3
3
  * One-shot migration: inject the `suggestion:` frontmatter block into every
4
4
  * command under `.agent-src.uncondensed/commands/`.
5
5
  *
6
- * TypeScript twin of `src/scripts/migrate_command_suggestions.py` (ADR-200 —
6
+ * Ported from the retired Python `src/scripts/migrate_command_suggestions.py` (ADR-200 —
7
7
  * Python→TS migration, Phase 8 / Wave 8e). Faithful twin: the legacy
8
8
  * `.agent-src.uncondensed/commands/` path is part of the original module's
9
9
  * contract and is reproduced verbatim. Public surface mirrors the Python module
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Migrate artefact frontmatter to omit fields equal to their schema default.
4
4
  *
5
- * TypeScript twin of `src/scripts/migrate_frontmatter_defaults.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/migrate_frontmatter_defaults.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8e). Public surface mirrors the Python
7
7
  * module exactly: same CLI flags (`--dry-run`, `--deltas PATH`), same exit code
8
8
  * (0), same stdout summary, and byte-identical rewritten files + dry-run delta
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Mine a session for memory signals — the engine behind `/memory mine`.
4
4
  *
5
- * TypeScript twin of `src/scripts/mine_session.py` (ADR-200 — Python→TS
6
- * migration, Phase 8 / Wave 8g). Mirrors the Python CLI contract EXACTLY —
5
+ * Ported from the retired Python `src/scripts/mine_session.py` (ADR-200 — Python→TS
6
+ * migration, Phase 8 / Wave 8g). The CLI contract is pinned —
7
7
  * every flag, exit code (0), the stdout/stderr split, byte-identical
8
8
  * messages, byte-identical preview Markdown, and byte-identical
9
9
  * `json.dumps(..., ensure_ascii=False)` intake JSONL lines.
@@ -26,7 +26,7 @@
26
26
  *
27
27
  * Auto-resolved transcript discovery (`rglob` sorted by mtime) is
28
28
  * intrinsically non-deterministic; golden parity supplies a fixed
29
- * `--transcript`. No behaviour changes — latent Python quirks replicated.
29
+ * `--transcript`. Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
30
30
  */
31
31
  import * as crypto from 'node:crypto';
32
32
  import * as fs from 'node:fs';
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Platform-agnostic hook for the `minimal-safe-diff` rule.
4
4
  *
5
- * TypeScript twin of `src/scripts/minimal_safe_diff_hook.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/minimal_safe_diff_hook.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 6 / hooks). Public API mirrors the Python
7
7
  * module exactly (snake_case kept deliberately — fidelity over TS idiom).
8
8
  *
@@ -39,7 +39,7 @@ import { atomic_write_json } from "./hooks/state_io.js";
39
39
 
40
40
  // NOTE: the Python docstring says `agents/runtime/state/`, but the code
41
41
  // constant is `agents/state/`. Replicated verbatim — latent docstring/code
42
- // divergence in the Python original (ADR-200 § replicate latent bugs).
42
+ // divergence in the retired Python implementation (ADR-200 § replicate latent bugs).
43
43
  export const STATE_FILE = path.join("agents", "state", "minimal-safe-diff.json");
44
44
  export const SETTINGS_FILE = ".agent-settings.yml";
45
45
  export const DEFAULT_THRESHOLD = 5;
@@ -2,10 +2,10 @@
2
2
  /**
3
3
  * Move a single artefact between packs via `git mv` (history-preserving).
4
4
  *
5
- * TypeScript twin of `src/scripts/move_artefact.py` (ADR-200, Phase 8 /
5
+ * Ported from the retired Python `src/scripts/move_artefact.py` (ADR-200, Phase 8 /
6
6
  * Wave 8b). The public surface, CLI contract, exit codes, stdout/stderr
7
- * split, byte-for-byte messages, and the `git mv` semantics mirror the
8
- * Python original EXACTLY. The frontmatter rewrite reproduces PyYAML's
7
+ * split, byte-for-byte messages, and the `git mv` semantics are pinned by
8
+ * tests. The frontmatter rewrite reproduces PyYAML's
9
9
  * `safe_dump(..., sort_keys=False, allow_unicode=True)` output through a
10
10
  * faithful port of the PyYAML emitter (scalar-style resolution, plain /
11
11
  * single-quoted / double-quoted writers with the same best-width=80
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Interactive scaffolder for new skills under the packages/ layout.
4
4
  *
5
- * TypeScript twin of `src/scripts/new_skill.py` (ADR-200 — Python→TS
6
- * migration, Phase 8 / Wave 8b). The CLI contract is mirrored EXACTLY —
5
+ * Ported from the retired Python `src/scripts/new_skill.py` (ADR-200 — Python→TS
6
+ * migration, Phase 8 / Wave 8b). The CLI contract is pinned —
7
7
  * the `--pack` / `--type` / `--name` / `--description` / `--workspace`
8
8
  * (repeatable) / `--force` flags, exit codes (0 ok · 1 file exists · 2
9
9
  * usage / validation), the stdout/stderr split, byte-identical messages,
@@ -15,7 +15,7 @@
15
15
  * - rule → rules/<name>.md
16
16
  * - command → commands/<name>.md
17
17
  *
18
- * No behaviour changes — latent Python quirks replicated.
18
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
19
19
  */
20
20
  import * as fs from 'node:fs';
21
21
  import * as path from 'node:path';
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Platform-agnostic hook for the `onboarding-gate` rule.
4
4
  *
5
- * TypeScript twin of `src/scripts/onboarding_gate_hook.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/onboarding_gate_hook.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 6 / hooks). Public API mirrors the Python
7
7
  * module exactly (snake_case kept deliberately — fidelity over TS idiom).
8
8
  *
@@ -40,7 +40,7 @@ import { atomic_write_json } from "./hooks/state_io.js";
40
40
  export const SETTINGS_FILE = ".agent-settings.yml";
41
41
  // NOTE: the Python docstring says `agents/runtime/state/`, but the code
42
42
  // constant is `agents/state/`. Replicated verbatim — this is a latent
43
- // docstring/code divergence in the Python original (ADR-200 § replicate
43
+ // docstring/code divergence in the retired Python implementation (ADR-200 § replicate
44
44
  // latent bugs), and `STATE_FILE` is what the test suite asserts against.
45
45
  export const STATE_DIR = path.join("agents", "state");
46
46
  export const STATE_FILE = path.join(STATE_DIR, "onboarding-gate.json");
@@ -23,7 +23,7 @@
23
23
  //
24
24
  // Governed by `docs/contracts/mcp-cloud-scope.md` §A0-cloud invariant 5.
25
25
  //
26
- // TS twin of pack_mcp_content.py (py2ts migration, ADR-200). Byte-identical
26
+ // TS port of the retired Python pack_mcp_content.py (ADR-200). Byte-identical
27
27
  // twin: same five scanners, same wire shape, same compact-JSON / indent=2
28
28
  // manifest serialization, same gzip archival copy (mtime=0, level 9, with
29
29
  // Python's OS=0xFF header byte). The .py stays the deploy entrypoint until
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Golden-replay runner — proves a TypeScript port behaves identically to its
3
- * Python original.
2
+ * Golden-replay runner — proves a TypeScript port behaves identically to the
3
+ * retired Python implementation it replaced (golden transcripts were captured
4
+ * before the teardown).
4
5
  *
5
6
  * CLI:
6
7
  * tsx src/scripts/parity/replay.ts \
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Maintainer dev script — export / import file-first patterns across projects.
4
4
  *
5
- * TypeScript twin of `src/scripts/pattern_share.py` (ADR-200). Mirrors the
5
+ * Ported from the retired Python `src/scripts/pattern_share.py` (ADR-200). Mirrors the
6
6
  * Python CLI contract EXACTLY — the `export` / `import` subcommands, their
7
7
  * positional + flag args (`--out`, `--force`), exit codes (0 / 1 / 2),
8
8
  * stdout/stderr split, the byte-identical refusal/success lines (`❌ …` /
@@ -245,7 +245,7 @@ function _isFlag(a: string): boolean {
245
245
  return a.startsWith('-') && a !== '-';
246
246
  }
247
247
 
248
- // argparse precedence (verified against the Python original):
248
+ // argparse precedence (verified against the retired Python implementation):
249
249
  // 1. an optional that needs a value but is missing it → SUB-level error
250
250
  // "argument --out: expected one argument" (during consumption).
251
251
  // 2. a missing required positional → SUB-level error
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Plan + apply the physical monorepo migration (Phase 4).
4
4
  *
5
- * TypeScript twin of `src/scripts/plan_physical_move.py` (ADR-200, Phase 8 /
5
+ * Ported from the retired Python `src/scripts/plan_physical_move.py` (ADR-200, Phase 8 /
6
6
  * Wave 8b). Mirrors the CLI contract EXACTLY — the `--apply`, `--out` flags,
7
7
  * exit codes (0 clean dry-run / 1 dry-run-with-conflicts / 2 refuse-apply /
8
8
  * 3 source-missing / 4 git-mv-failed), the stdout/stderr split, byte-identical
@@ -13,9 +13,9 @@
13
13
  * destination under `packages/core/` or `packages/pack-<id>/`, and emits
14
14
  * `dist/migration/move-plan.json`. `--apply` executes the moves via `git mv`.
15
15
  *
16
- * No behaviour changes — latent Python quirks replicated. (The dry-run path
16
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour. (The dry-run path
17
17
  * writes the plan JSON to BOTH the default location and `--out`; when they
18
- * coincide the file is written twice, exactly as the Python original does.)
18
+ * coincide the file is written twice, exactly as the retired Python implementation does.)
19
19
  */
20
20
  import { spawnSync } from 'node:child_process';
21
21
  import * as fs from 'node:fs';
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Poisson tournament simulator for prediction-pool-optimizer.
4
4
  *
5
- * TypeScript twin of `src/scripts/prediction-pool/poisson_sim.py` (ADR-200).
6
- * The CLI contract is mirrored EXACTLY — the positional `config` JSON file,
5
+ * Ported from the retired Python `src/scripts/prediction-pool/poisson_sim.py` (ADR-200).
6
+ * The CLI contract is pinned — the positional `config` JSON file,
7
7
  * `--runs` / `--seed`, exit codes, the stdout/stderr split, and byte-identical
8
8
  * output. No behaviour changes.
9
9
  *
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Field model + P(finish 1st) simulator for prediction-pool-optimizer.
4
4
  *
5
- * TypeScript twin of `src/scripts/prediction-pool/pool_winsim.py` (ADR-200).
6
- * The CLI contract is mirrored EXACTLY — the positional `config` JSON file,
5
+ * Ported from the retired Python `src/scripts/prediction-pool/pool_winsim.py` (ADR-200).
6
+ * The CLI contract is pinned — the positional `config` JSON file,
7
7
  * `--runs` / `--max-flips` / `--max-opponents` / `--top-flip` / `--seed` /
8
8
  * `--json`, exit codes, the stdout/stderr split, and byte-identical text AND
9
9
  * `--json` output. No behaviour changes.
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Exact-score EV optimiser for prediction-pool-optimizer.
4
4
  *
5
- * TypeScript twin of `src/scripts/prediction-pool/score_ev.py` (ADR-200,
6
- * Phase 8). The CLI contract is mirrored EXACTLY — the positional `matches`
5
+ * Ported from the retired Python `src/scripts/prediction-pool/score_ev.py` (ADR-200,
6
+ * Phase 8). The CLI contract is pinned — the positional `matches`
7
7
  * JSON file, `--lh` / `--la` / `--exact` / `--diff` / `--tendency` /
8
8
  * `--max-tip` / `--top` / `--json`, exit codes, the stdout/stderr split, and
9
9
  * byte-identical text AND `--json` output. No behaviour changes.
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Print the expected required-check set for the current branch.
4
4
  *
5
- * TypeScript twin of `src/scripts/print_required_checks.py` (ADR-200,
6
- * Phase 8 / Wave 8g). Mirrors the Python CLI contract EXACTLY — `--branch`
5
+ * Ported from the retired Python `src/scripts/print_required_checks.py` (ADR-200,
6
+ * Phase 8 / Wave 8g). The CLI contract is pinned — `--branch`
7
7
  * / `--base` flags, PR-shape classification (release / docs-only / feature),
8
8
  * exit codes (0 ok, 1 release-shape OUT-OF-SHAPE fallback-to-feature, 2 usage),
9
9
  * stdout/stderr split, byte-identical messages. Reuses the release-shape
@@ -2,13 +2,13 @@
2
2
  /**
3
3
  * Phase 4.2 — Probe per-tool projection fidelity against the fixture.
4
4
  *
5
- * TypeScript twin of `src/scripts/probe_projection_fidelity.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/probe_projection_fidelity.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8c). Mirrors the CLI contract
7
7
  * EXACTLY: flags (`--fixture`, `--report`), exit codes (0 when no fail, 1
8
8
  * when any check fails, 2 when the YAML dependency is missing — replicated
9
9
  * via a try/catch import), byte-identical stdout, and the byte-identical
10
10
  * written report (`json.dumps(report, indent=2) + "\n"`). No behaviour
11
- * changes — latent quirks replicated.
11
+ * changes — historical quirks preserved (consumers pin the exact behaviour).
12
12
  *
13
13
  * Reads tests/fixtures/projection_fidelity/fixtures.yml, walks the
14
14
  * projected trees (.augment/, .claude/, .cursor/, .clinerules/,
@@ -2,12 +2,12 @@
2
2
  /**
3
3
  * Tool-agnostic skill-registration probe.
4
4
  *
5
- * TypeScript twin of `src/scripts/probe_skill_registration.py` (ADR-090 —
5
+ * Ported from the retired Python `src/scripts/probe_skill_registration.py` (ADR-090 —
6
6
  * Python→TS migration, Phase 8 / Wave 8c). Mirrors the CLI contract
7
7
  * EXACTLY: flags (`--tool`, `--scope`, `--format`, `--strict`, `--home`,
8
8
  * `--project`), exit codes (0 informational / 0 when strict & clean, 2
9
9
  * when strict & findings), byte-identical text + JSON stdout, and the same
10
- * dataclass field order. No behaviour changes — latent quirks replicated.
10
+ * dataclass field order. Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
11
11
  *
12
12
  * Roadmap: road-to-clean-skill-distribution-channels.md § Phase C.
13
13
  * Contract: docs/contracts/skill-distribution-channels.md.
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Session-profile staleness notice — `session_start` hook.
4
4
  *
5
- * TypeScript twin of `src/scripts/profile_staleness_hook.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/profile_staleness_hook.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 6 / hooks). Public API mirrors the Python
7
7
  * module exactly (snake_case kept deliberately — fidelity over TS idiom).
8
8
  *
@@ -18,7 +18,7 @@
18
18
  * notice is derived from the overlay file), emits at most one stderr line,
19
19
  * returns 0 on every path.
20
20
  *
21
- * NOTE (ADR-200): the Python original imports `scripts.config.session_profiles`,
21
+ * NOTE (ADR-200): the retired Python implementation imports `scripts.config.session_profiles`,
22
22
  * which is UNPORTED. The only entry point this hook touches is
23
23
  * `session_profiles.stale_notice(root)`, a fail-open read of the overlay file
24
24
  * (`agents/settings/.agent-settings.local.yml` → `runtime.active_packs`) plus a
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * `agent-config use --profile=<id>` — switch the active experience.
4
4
  *
5
- * TypeScript twin of `src/scripts/profile_use.py` (ADR-200 — Python→TS
6
- * migration, Phase 8 / Wave 8e). The CLI contract is mirrored EXACTLY:
5
+ * Ported from the retired Python `src/scripts/profile_use.py` (ADR-200 — Python→TS
6
+ * migration, Phase 8 / Wave 8e). The CLI contract is pinned:
7
7
  * same flags (`--profile=<id>` / `--profile <id>`), same exit codes
8
8
  * (0 success, 2 on missing/unknown profile), same byte-identical
9
9
  * stdout / stderr prose, and byte-identical surgical text edits of the
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Thin-projection of the rule layer (lean-initial-context build-out, Phase 3.1).
4
4
  *
5
- * TypeScript twin of `src/scripts/project_thin_rules.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/project_thin_rules.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8b). The CLI contract is mirrored
7
7
  * EXACTLY — the `--measure` / `--out` / `--json` flags, exit codes, the
8
8
  * stdout/stderr split, byte-identical messages, and byte-identical JSON
@@ -20,11 +20,11 @@
20
20
  *
21
21
  * NOTE (faithful literal): the thin-entry pointer keeps the verbatim
22
22
  * `Body: [`{rule_id}`](../../.agent-src.uncondensed/rules/{rule_id}.md)`
23
- * Markdown link from the Python original. The same-basename `.py` twin
23
+ * Markdown link from the retired Python implementation. The same-basename `.py` twin
24
24
  * carries that literal, so the ADR-051 legacy-path guard exempts this `.ts`
25
25
  * file by twin-parity.
26
26
  *
27
- * No behaviour changes — latent Python quirks replicated.
27
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
28
28
  *
29
29
  * Usage:
30
30
  * project_thin_rules --measure # measure delta, no write
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Propose a `modules:` block for `.agent-project-settings.yml`.
4
4
  *
5
- * TypeScript twin of `src/scripts/propose_modules_config.py` (ADR-200,
6
- * Phase 8 / Wave 8g). Mirrors the Python CLI contract EXACTLY — `--project`
5
+ * Ported from the retired Python `src/scripts/propose_modules_config.py` (ADR-200,
6
+ * Phase 8 / Wave 8g). The CLI contract is pinned — `--project`
7
7
  * / `--json` flags, the interactive numbered-options TTY block, the
8
8
  * machine-readable JSON envelope (byte-identical to `json.dump(indent=2)`),
9
9
  * exit codes (0 always on success, 2 unreachable path), stdout/stderr split.
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Prototype contradiction linter (P1.1 of road-to-package-optimization).
4
4
  *
5
- * TypeScript twin of `src/scripts/prototype_lint_contradictions.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/prototype_lint_contradictions.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8g). Mirrors the Python CLI contract
7
7
  * EXACTLY — no flags, exit codes (0 clean / 1 contradictions found), the
8
8
  * stdout JSON shape (`json.dump(report, indent=2)`, insertion order, NO
@@ -17,7 +17,7 @@
17
17
  *
18
18
  * Heuristic family — two deterministic checks (routing + imperative conflict)
19
19
  * across rules, skills, commands, and contexts. No behaviour changes —
20
- * latent Python quirks replicated.
20
+ * historical quirks preserved (consumers pin the exact behaviour).
21
21
  */
22
22
  import * as fs from 'node:fs';
23
23
  import * as path from 'node:path';
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Prove a pack + its declared dependency closure is self-contained.
4
4
  *
5
- * TypeScript twin of `prove_pack_extractable.py` (Phase 8 / Wave 8g).
5
+ * Ported from the retired Python `prove_pack_extractable.py` (Phase 8 / Wave 8g).
6
6
  *
7
7
  * road-to-6.0.0-D Phase 1 Step 6 — the *extraction proof*. It de-risks the
8
8
  * monorepo collapse (Phase 3) by proving that a pack moved into the flat
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * README quality linter for agent-config repositories.
4
4
  *
5
- * TypeScript twin of `src/scripts/readme_linter.py` (ADR-200 — Python→TS
6
- * migration, Phase 8 / Wave 8b). The CLI contract is mirrored EXACTLY —
5
+ * Ported from the retired Python `src/scripts/readme_linter.py` (ADR-200 — Python→TS
6
+ * migration, Phase 8 / Wave 8b). The CLI contract is pinned —
7
7
  * the positional `readme` arg, the `--root` / `--format` / `--strict`
8
8
  * flags, exit codes (0 pass · 1 warnings · 2 errors / strict-warnings ·
9
9
  * 3 README-not-found / internal error), the stdout/stderr split, and
@@ -14,7 +14,7 @@
14
14
  * Detects weak, misleading, or incomplete READMEs by cross-checking
15
15
  * against actual repository files (Taskfile.yml, package.json, etc.).
16
16
  *
17
- * No behaviour changes — latent Python quirks replicated.
17
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
18
18
  */
19
19
  import * as fs from 'node:fs';
20
20
  import * as path from 'node:path';
@@ -46,7 +46,7 @@ const BUILTIN_COMMANDS = new Set<string>([
46
46
  'php artisan', 'cargo build', 'cargo test', 'go build', 'go test',
47
47
  'git clone', 'git submodule',
48
48
  ]);
49
- // Referenced to mirror the module-level constant in the Python original
49
+ // Referenced to mirror the module-level constant in the retired Python implementation
50
50
  // (it is defined but unused there); keeps the symbol "live" for the linter.
51
51
  void BUILTIN_COMMANDS;
52
52
 
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Redact captured hook payloads for the verified-platforms roadmap.
4
4
  *
5
- * TypeScript twin of `redact_hook_capture.py` (Phase 8 / Wave 8g).
5
+ * Ported from the retired Python `redact_hook_capture.py` (Phase 8 / Wave 8g).
6
6
  *
7
7
  * Reads JSON capture files written by `dispatch_hook.py` (when
8
8
  * `AGENT_HOOK_CAPTURE_DIR` is set) and produces a redacted version
@@ -299,7 +299,7 @@ export function main(argv: string[] | null = null): number {
299
299
  return 2;
300
300
  }
301
301
  // Mirror `sorted(src.glob("*.json"))` — glob matches any entry whose
302
- // name ends in `.json`; no is_file() filter in the Python original.
302
+ // name ends in `.json`; no is_file() filter in the retired Python implementation.
303
303
  const files = fs
304
304
  .readdirSync(src)
305
305
  .filter((name) => name.endsWith('.json') && !name.endsWith('.redacted.json'))
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Deterministic detection helper for the refine-ticket skill.
4
4
  *
5
- * TypeScript twin of `refine_ticket_detect.py` (Phase 8 / Wave 8g).
5
+ * Ported from the retired Python `refine_ticket_detect.py` (Phase 8 / Wave 8g).
6
6
  *
7
7
  * Reads the detection-map.yml from
8
8
  * .agent-src.uncondensed/skills/refine-ticket/ (or the projected copy),
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * End-to-end release automation for `event4u/agent-config` (TypeScript twin).
4
4
  *
5
- * TypeScript twin of `src/scripts/release.py` (ADR-200, py2ts migration).
6
- * The CLI contract mirrors the Python original EXACTLY — same flags, same
5
+ * Ported from the retired Python `src/scripts/release.py` (ADR-200).
6
+ * The CLI contract pins the historical contract exactly — same flags, same
7
7
  * exit codes, same stdout/stderr split, byte-identical emitted output, same
8
8
  * subprocess argv/cwd/env. No behaviour changes — latent quirks are
9
9
  * replicated and flagged inline, not fixed.
@@ -145,7 +145,7 @@ class ArgparseExit extends Error {
145
145
 
146
146
  /**
147
147
  * Mirror of `subprocess.CalledProcessError`. Thrown by `run()` when a command
148
- * fails with `check=True` and output is NOT captured — the Python original
148
+ * fails with `check=True` and output is NOT captured — the retired Python implementation
149
149
  * lets `CalledProcessError` propagate in that path. The CLI entry guard does
150
150
  * NOT catch this, so it surfaces (non-zero exit + traceback), matching Python.
151
151
  */
@@ -680,7 +680,7 @@ function latest_tag(): string | null {
680
680
  *
681
681
  * `test_trend_line` — optional pre-computed `Tests: N (+M …)` footer
682
682
  * (road-to-feedback-followups P3.2). Computed by the caller so tests don't
683
- * trigger a recursive pytest collection.
683
+ * trigger a recursive vitest collection.
684
684
  */
685
685
  function render_changelog_entry(
686
686
  version: string,
@@ -770,32 +770,40 @@ function _changelog_line(c: Commit): string {
770
770
  // ─── test-count trend (road-to-feedback-followups P3.2) ───────────────────────
771
771
 
772
772
  const _TEST_COUNT_LINE_RE = /^Tests:\s+(\d+)/m;
773
- const _PYTEST_COLLECTED_RE = /^(\d+)\s+tests?\s+collected/m;
774
773
 
775
774
  /**
776
- * Return the count from `pytest --collect-only -q` on the current tree.
777
- * Returns null when pytest isn't available or collection fails — the trend
778
- * line is informational, never a release blocker.
775
+ * Return the collected vitest test-case count on the current tree
776
+ * (`npx vitest list`, one line per case; ~14s wall). Returns null when
777
+ * collection fails — the trend line is informational, never a release
778
+ * blocker. (Replaced the dead `pytest --collect-only` probe on 2026-07-08,
779
+ * road-to-truth-and-reference-hygiene Phase 3: the Python suite was retired
780
+ * with ADR-200, so the old probe always degraded to null and the `Tests:`
781
+ * footer silently vanished from release notes.)
779
782
  */
780
783
  function _count_tests_current(): number | null {
781
- // Release-time pytest-collection probe: python-test-tooling, not package
782
- // runtime — there is no tsx equivalent of pytest collection. Degrades to
783
- // null (informational trend line dropped) when python3/pytest is absent.
784
- const res = spawnSync('python3', ['-m', 'pytest', '--collect-only', '-q'], {
784
+ // Recursion/cost guard: `npx vitest list` inside a vitest-driven release
785
+ // test would collect the whole suite from within the suite (the child
786
+ // inherits VITEST=… from the runner) — the exact recursion the caller
787
+ // comment warns about. Degrade to null there, same as any other
788
+ // collection failure.
789
+ if (process.env['VITEST'] !== undefined) {
790
+ return null;
791
+ }
792
+ const res = spawnSync('npx', ['vitest', 'list'], {
785
793
  cwd: REPO_ROOT,
786
794
  encoding: 'utf-8',
787
795
  stdio: ['ignore', 'pipe', 'pipe'],
788
- timeout: 120_000,
796
+ timeout: 180_000,
789
797
  });
790
798
  if (res.error) {
791
- // FileNotFoundError (ENOENT) or TimeoutExpired (ETIMEDOUT) → None.
799
+ // ENOENT or ETIMEDOUT → null (informational line dropped).
792
800
  return null;
793
801
  }
794
802
  if ((res.status ?? 1) !== 0) {
795
803
  return null;
796
804
  }
797
- const match = _PYTEST_COLLECTED_RE.exec(res.stdout ?? '');
798
- return match ? Number.parseInt(match[1] as string, 10) : null;
805
+ const lines = (res.stdout ?? '').split('\n').filter((l) => l.trim().length > 0);
806
+ return lines.length > 0 ? lines.length : null;
799
807
  }
800
808
 
801
809
  /**
@@ -1833,7 +1841,10 @@ function main(argv: readonly string[] | null = null): number {
1833
1841
  }
1834
1842
 
1835
1843
  const today = todayIso();
1836
- const test_trend_line = _render_test_trend_line(prev);
1844
+ // Dry-run stays fast: the trend line costs a full vitest collection
1845
+ // (~15s+), which `--dry-run exits 0 without needing …` contracts (and
1846
+ // the release test) assume never runs. Real releases compute it.
1847
+ const test_trend_line = args.dry_run ? null : _render_test_trend_line(prev);
1837
1848
  const [full, body] = render_changelog_entry(target, prev, commits, today, {
1838
1849
  test_trend_line,
1839
1850
  });
@@ -1922,8 +1933,8 @@ if (_isCliEntry() || process.argv[1] === _HERE) {
1922
1933
  try {
1923
1934
  // main() can return an int directly OR throw SystemExitError via die();
1924
1935
  // both flow into process.exitCode. CalledProcessError is intentionally
1925
- // NOT caught here, so it propagates (non-zero + traceback), matching the
1926
- // Python original letting subprocess.CalledProcessError raise.
1936
+ // NOT caught here, so it propagates (non-zero + traceback) — the historical
1937
+ // contract let subprocess errors raise.
1927
1938
  process.exitCode = main(process.argv.slice(2));
1928
1939
  } catch (e) {
1929
1940
  if (e instanceof SystemExitError || e instanceof ArgparseExit) {
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Render `docs/benchmark.md` from the latest paired A/B bench reports.
4
4
  *
5
- * TypeScript twin of `src/scripts/render_benchmark_md.py` (ADR-200, Phase 8 /
5
+ * Ported from the retired Python `src/scripts/render_benchmark_md.py` (ADR-200, Phase 8 /
6
6
  * Wave 8b). Mirrors the CLI contract EXACTLY — the `--quiet` flag, exit code,
7
7
  * the stdout/stderr split, byte-identical stdout AND byte-identical rendered
8
8
  * `docs/benchmark.md`. The renderer is deterministic — it does not run any
@@ -15,7 +15,7 @@
15
15
  * If no reports exist yet, the script writes a placeholder document — never
16
16
  * errors out, so the file is always a real description of the bench state.
17
17
  *
18
- * No behaviour changes — latent Python quirks replicated. The only volatile
18
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour. The only volatile
19
19
  * value is the embedded `utc_iso()` timestamp; golden parity for this script
20
20
  * pins on structure + the deterministic placeholder/report shape, not on the
21
21
  * second-precision timestamp.