@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
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Measure rtk's token savings on a fixed corpus of verbose CLI invocations.
4
4
  *
5
- * TypeScript twin of `src/scripts/bench_rtk_savings.py` (ADR-200 py2ts
6
- * Phase 8 / Wave 8d). The CLI contract mirrors the Python original
5
+ * Ported from the retired Python `src/scripts/bench_rtk_savings.py` (ADR-200 py2ts
6
+ * Phase 8 / Wave 8d). The CLI contract mirrors the retired Python implementation
7
7
  * EXACTLY — `--corpus`, `--out`, `--quiet`, exit codes, stdout/stderr
8
8
  * split, the one-line headline summary, and byte-identical written
9
9
  * reports (`json.dumps(indent=2, ensure_ascii=False)` + trailing
@@ -53,7 +53,7 @@ type Dict = Record<string, unknown>;
53
53
  * Marker for a value that is a Python `float`. CPython's `json.dumps`
54
54
  * renders a float `0.0` as `0.0` (not `0`); JS numbers lose that
55
55
  * distinction. Wrapping the report's float fields keeps the written
56
- * JSON byte-identical with the Python original.
56
+ * JSON byte-identical with the retired Python implementation.
57
57
  */
58
58
  class PyFloat {
59
59
  constructor(readonly value: number) {}
@@ -366,7 +366,7 @@ export function run(corpus_path: string = DEFAULT_CORPUS, out_dir: string = DEFA
366
366
 
367
367
  /**
368
368
  * Mirror Path.relative_to(REPO_ROOT) — raises (ValueError-equivalent) when
369
- * the path is not under REPO_ROOT, matching the Python original's behaviour.
369
+ * the path is not under REPO_ROOT, matching the retired Python implementation's behaviour.
370
370
  */
371
371
  function _relativeToRepo(p: string): string {
372
372
  const resolvedRoot = path.resolve(REPO_ROOT);
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Bench orchestrator — step-4 measurement-and-benchmark Phase 2.
4
4
  *
5
- * TypeScript twin of `src/scripts/bench_run.py` (ADR-200, Phase 8 /
6
- * Wave 8d). The CLI contract mirrors the Python original EXACTLY — same
5
+ * Ported from the retired Python `src/scripts/bench_run.py` (ADR-200, Phase 8 /
6
+ * Wave 8d). The CLI contract pins the historical contract exactly — same
7
7
  * flags, exit codes, stdout/stderr split, byte-identical headline / Markdown
8
8
  * stdout and byte-identical written report JSON
9
9
  * (`json.dumps(indent=2) + "\n"`). No behaviour changes — latent Python
@@ -23,7 +23,7 @@
23
23
  * `ai_council.clients` module (it carries no legacy source-tree literal, so
24
24
  * ADR-051 does not require porting it in this wave). The `--telegraph-dry-run`
25
25
  * path is fully self-contained; the live path degrades to the same "cannot
26
- * build Anthropic client" exit-2 surface the Python original produces when the
26
+ * build Anthropic client" exit-2 surface the retired Python implementation produces when the
27
27
  * client can't be built. Flagged as a divergence candidate.
28
28
  */
29
29
  import * as fs from 'node:fs';
@@ -390,7 +390,7 @@ function _run_telegraph(args: Args): number {
390
390
  /**
391
391
  * Live-API telegraph path. Builds the Anthropic client; on any failure prints
392
392
  * the same "cannot build Anthropic client" message and returns 2, mirroring
393
- * the Python original's `try/except Exception` guard. Because the
393
+ * the retired Python implementation's `try/except Exception` guard. Because the
394
394
  * `ai_council.clients` twin is not yet present, this currently always takes
395
395
  * the failure branch (flagged divergence — the live happy path is unreachable
396
396
  * until that module is ported).
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Bench runner for the eval corpora — step-4 measurement-and-benchmark Phase 1.
4
4
  *
5
- * TypeScript twin of `src/scripts/bench_runner.py` (ADR-200 Python→TS
5
+ * Ported from the retired Python `src/scripts/bench_runner.py` (ADR-200 Python→TS
6
6
  * migration, Phase 8 / Wave 8d). Mirrors the CLI contract EXACTLY: flags
7
7
  * (`--corpus`, `--top-k`, `--json`), exit codes (0 PASS / 1 FAIL / 2 corpus
8
8
  * not found), byte-identical stdout/stderr, and byte-identical JSON
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * build_cloud_bundle.ts — package skills as Anthropic Skills ZIP bundles.
4
4
  *
5
- * TypeScript twin of `src/scripts/build_cloud_bundle.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/build_cloud_bundle.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8b). The CLI contract is mirrored
7
7
  * EXACTLY — the mutually-exclusive `--skill` / `--all` / `--check` flags,
8
8
  * `--out` / `--strict-budget` / `--clean`, exit codes, the stdout/stderr
@@ -12,7 +12,7 @@
12
12
  * CONTENTS written into each ZIP are byte-identical.
13
13
  *
14
14
  * Imports the `audit_cloud_compatibility` twin (the SAME `scan` /
15
- * `detect_cloud_marker` surfaces the Python original imports) for tier
15
+ * `detect_cloud_marker` surfaces the retired Python implementation imports) for tier
16
16
  * classification.
17
17
  *
18
18
  * DIVERGENCE CANDIDATE (documented under the ADR-200 process):
@@ -25,7 +25,7 @@
25
25
  * compares decompressed entry maps (name → bytes), the manifest JSON, and the
26
26
  * console output — not the raw archive bytes.
27
27
  *
28
- * Note on error semantics: the Python original raises bare
28
+ * Note on error semantics: the retired Python implementation raises bare
29
29
  * `SystemExit("❌ …")` for budget / source / T3-H failures. A string
30
30
  * SystemExit prints the message to stderr and exits with code 1 (NOT the
31
31
  * 2/3/4/5 codes named in the docstring, which never fire). This twin
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Release-time discovery scanner — produces discovery-manifest.json.
4
4
  *
5
- * TypeScript twin of `src/scripts/build_discovery_manifest.py` (ADR-200,
6
- * Phase 5). The CLI contract is mirrored EXACTLY — every flag (`--write`,
5
+ * Ported from the retired Python `src/scripts/build_discovery_manifest.py` (ADR-200,
6
+ * Phase 5). The CLI contract is pinned — every flag (`--write`,
7
7
  * `--out`, `--summary`, `--deprecation-report`, `--trust-report`,
8
8
  * `--orphan-report`, `--workspaces-json`, `--packs-json`, `--strict`,
9
9
  * `--quiet`), the CI-strict env override, exit codes, the stdout/stderr
@@ -20,18 +20,17 @@
20
20
  *
21
21
  * Imports the `_lib/agent_src` twin for the artefact walk and the
22
22
  * `validate_frontmatter` twin for frontmatter parse + schema-default
23
- * injection (the SAME functions the Python original imports). The checksum
23
+ * injection (the SAME functions the retired Python implementation imports). The checksum
24
24
  * primitive `_artefact_checksum` / `_CATEGORY_SCHEMA` / `_FRONTMATTER_RE` are
25
25
  * replicated here EXACTLY and kept in agreement with the inline copy in
26
26
  * `check_artefact_checksums.ts`.
27
27
  *
28
- * No behaviour changes — latent Python quirks replicated.
28
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
29
29
  *
30
30
  * DIVERGENCE CANDIDATE (documented under the ADR-200 process):
31
- * `_scanner_version()` in the Python original hashes the scanner file's OWN
32
- * bytes (`Path(__file__).read_bytes()`). For the TS-built manifest to remain
33
- * byte-identical to the Python-built one — and to keep passing the
34
- * Python-rebuild diff in `validate_discovery_manifest.py` — this twin hashes
31
+ * `_scanner_version()` in the retired Python implementation hashes the scanner file's OWN
32
+ * bytes (`Path(__file__).read_bytes()`). During the migration the TS-built
33
+ * manifest had to match the Python-built one byte-for-byte, so this port hashes
35
34
  * the SIBLING `build_discovery_manifest.py` bytes (falling back to its own
36
35
  * `.ts` bytes only when the `.py` is absent, e.g. after the same-PR deletion).
37
36
  * Until the `.py` is deleted the manifest is byte-identical; after deletion
@@ -68,7 +67,7 @@ const _HERE = fileURLToPath(import.meta.url);
68
67
 
69
68
  // --- Module-level path config (mutable to mirror Python monkeypatch seam) ----
70
69
  //
71
- // The Python original derives ROOT / SRC / VOCAB_DIR / DEFAULT_* as
70
+ // the retired Python implementation derives ROOT / SRC / VOCAB_DIR / DEFAULT_* as
72
71
  // module-level constants and `tests/test_build_discovery_manifest.py`
73
72
  // reassigns `mod.ROOT`, `mod.SRC`, `mod.VOCAB_DIR`, `mod.artefact_roots`, and
74
73
  // `mod.resolve_logical` via monkeypatch. To preserve that injection surface,
@@ -314,11 +313,10 @@ function _vocab(): [VocabEntry[], VocabEntry[], Record<string, string>] {
314
313
  }
315
314
 
316
315
  function _scanner_version(): string {
317
- // DIVERGENCE CANDIDATE: hash the SIBLING build_discovery_manifest.py bytes
318
- // so the manifest stays byte-identical to the Python-built one (and keeps
319
- // passing the Python-rebuild diff in validate_discovery_manifest.py). Fall
320
- // back to this twin's own bytes once the .py is deleted (same-PR; the
321
- // manifest is regenerated then anyway).
316
+ // Scanner version = hash of this file's own bytes (the .py-sibling branch
317
+ // below is inert since the teardown — no sibling exists; kept because the
318
+ // manifest checksum gates pin the current output and removing the branch
319
+ // is a behaviour-neutral cleanup for its own change).
322
320
  const pyPath = path.join(path.dirname(_HERE), 'build_discovery_manifest.py');
323
321
  const target = _isFile(pyPath) ? pyPath : _HERE;
324
322
  const h = crypto.createHash('sha256').update(fs.readFileSync(target)).digest('hex');
@@ -827,7 +825,7 @@ function _cmpStr(a: string, b: string): number {
827
825
  * 0, "" and the EMPTY array/object — distinct from JS, where `[]`/`{}` are
828
826
  * truthy. Used at the optional-field emission sites in `_build` so an empty
829
827
  * `optional_packs` / `example_roles` / `suggests` is omitted exactly as the
830
- * Python original omits it.
828
+ * retired Python implementation omitted it.
831
829
  */
832
830
  function _pyTruthy(v: Json): boolean {
833
831
  if (v === undefined || v === null || v === false || v === '' || v === 0) {
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * build_linear_digest.ts — build the Linear AI rules digest.
4
4
  *
5
- * TypeScript twin of `src/scripts/build_linear_digest.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/build_linear_digest.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8b). The CLI contract is mirrored
7
7
  * EXACTLY — the `--max-bytes` / `--out-dir` / `--strict-missing` flags,
8
8
  * exit codes (0 ok · 2 over-budget · 3 missing rule file · 4
@@ -12,7 +12,7 @@
12
12
  * Concatenates a curated set of cloud-safe rules from `dist/agent-src/rules/`
13
13
  * into three Markdown files under `dist/linear/`.
14
14
  *
15
- * No behaviour changes — latent Python quirks replicated.
15
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
16
16
  */
17
17
  import * as fs from 'node:fs';
18
18
  import * as path from 'node:path';
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Build `dist/mcp/registry-manifest.json` + the two rendered payloads.
4
4
  *
5
- * TypeScript twin of `src/scripts/build_mcp_registry_manifest.py` (ADR-200,
6
- * Phase 5). The CLI contract is mirrored EXACTLY — every flag (`--write`,
5
+ * Ported from the retired Python `src/scripts/build_mcp_registry_manifest.py` (ADR-200,
6
+ * Phase 5). The CLI contract is pinned — every flag (`--write`,
7
7
  * `--strict`, `--quiet`), exit codes (0 = ok; 2 = `--strict` drift without
8
8
  * `--write`; 1 = missing discovery prereq via SystemExit), the stdout/stderr
9
9
  * split, byte-identical messages, AND byte-identical generated output:
@@ -16,7 +16,7 @@
16
16
  * (`status`, `submitted_at`, `pr_url`, `last_verified`) is preserved from the
17
17
  * previous manifest.
18
18
  *
19
- * No behaviour changes — latent Python quirks replicated.
19
+ * Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
20
20
  *
21
21
  * Schema: `docs/contracts/mcp-registry-manifest.schema.json`
22
22
  */
@@ -83,6 +83,12 @@ function render(): string {
83
83
  }
84
84
  L.push('');
85
85
  L.push(`**${backed.length} backed claim(s)** — all evidence pointers resolve in CI.`);
86
+ L.push('');
87
+ L.push('Artefact counts in public prose (skills, commands, governed rules,');
88
+ L.push('guidelines, personas) are **generated from source and CI-drift-checked**:');
89
+ L.push('`update_counts.ts` writes the numbers, `check_artefact_count_messaging.ts`');
90
+ L.push('fails the build on any count-shaped prose mention that drifts from the');
91
+ L.push('source count — or on two different numbers for the same artefact kind.');
86
92
  if (unbacked.length > 0) {
87
93
  L.push('');
88
94
  L.push(`We also publish our **debt**: ${unbacked.length} claim(s) are logged as`);
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Build agents/settings/contexts/rule-trigger-matrix.md.
4
4
  *
5
- * TypeScript twin of `src/scripts/build_rule_trigger_matrix.py` (ADR-200,
5
+ * Ported from the retired Python `src/scripts/build_rule_trigger_matrix.py` (ADR-200,
6
6
  * Phase 8 / Wave 8g). Mirrors the Python contract EXACTLY — same generated
7
7
  * markdown (byte-identical), same `CLASSIFICATION` table, same stdout
8
8
  * (`✅ Wrote …` line) + stderr (unclassified-rule warning) split, exit codes
@@ -340,7 +340,7 @@ function emit(): number {
340
340
  lines.push('');
341
341
  lines.push('**Source:** Phase 1 of `road-to-rule-hardening.md` (self-check audit) +');
342
342
  lines.push('Phase 1 of `road-to-context-layer-maturity.md` (`load_context:` inventory).');
343
- lines.push('**Generated by:** `scripts/build_rule_trigger_matrix.py` — re-run after rule');
343
+ lines.push('**Generated by:** `src/scripts/build_rule_trigger_matrix.ts` — re-run after rule');
344
344
  lines.push("set changes. Manual classifications live in the script's `CLASSIFICATION`");
345
345
  lines.push('table; size and context-chain columns are derived from the rule files.');
346
346
  lines.push('');
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * capture_showcase_session.ts — wrap and measure showcase sessions.
4
4
  *
5
- * TypeScript twin of `src/scripts/capture_showcase_session.py` (ADR-200 —
5
+ * Ported from the retired Python `src/scripts/capture_showcase_session.py` (ADR-200 —
6
6
  * Python→TS migration, Phase 8 / Wave 8g). Mirrors the Python CLI contract
7
7
  * EXACTLY — the `capture` / `metrics` subcommands, every flag, exit codes
8
8
  * (0 success / 1 user error / 2 metric-gate pending), the stdout/stderr
@@ -24,8 +24,8 @@
24
24
  *
25
25
  * `commit_sha` (git HEAD) and `started`/`ended` (now) are non-deterministic;
26
26
  * golden parity supplies fixed timestamps via `--started`/`--ended` and
27
- * excludes `commit_sha`. No behaviour changes — latent Python quirks
28
- * replicated.
27
+ * excludes `commit_sha`. No behaviour changes — historical quirks
28
+ * preserved.
29
29
  */
30
30
  import { spawnSync } from 'node:child_process';
31
31
  import * as fs from 'node:fs';
@@ -1,6 +1,6 @@
1
1
  // Persistent chat-history log for crash recovery.
2
2
  //
3
- // TypeScript twin of `src/scripts/chat_history.py` (ADR-200 — Python→TS
3
+ // Ported from the retired Python `src/scripts/chat_history.py` (ADR-200 — Python→TS
4
4
  // migration). Public API mirrors the Python module exactly (snake_case kept
5
5
  // deliberately) so callers — including the MCP tools layer
6
6
  // (`src/scripts/mcp_server/tools.ts`) — depend on one source of truth.
@@ -3,7 +3,7 @@
3
3
  * Always-rule budget gate (Phases 7.1 + 7.4 of road-to-pr-34-followups,
4
4
  * extended by Phase 0.2 of road-to-structural-optimization).
5
5
  *
6
- * TypeScript twin of `src/scripts/check_always_budget.py` (ADR-200 —
6
+ * Ported from the retired Python `src/scripts/check_always_budget.py` (ADR-200 —
7
7
  * Python→TS migration, Phase 4 / Wave 4a). Mirrors the Python CLI
8
8
  * contract exactly: flags (`--quiet`, `--no-trend`), exit codes
9
9
  * (0 = pass/warn, 1 = fail, 3 = internal error), stdout/stderr split,
@@ -2,14 +2,14 @@
2
2
  /**
3
3
  * Phase-6 checksum-stability gate (monorepo Phase 2, ADR-015).
4
4
  *
5
- * TypeScript twin of `src/scripts/check_artefact_checksums.py` (ADR-200,
6
- * Phase 4 / Wave 4c). The CLI contract is mirrored EXACTLY — `--manifest`
5
+ * Ported from the retired Python `src/scripts/check_artefact_checksums.py` (ADR-200,
6
+ * Phase 4 / Wave 4c). The CLI contract is pinned — `--manifest`
7
7
  * / `--quiet` flags, exit codes (0 match, 1 drift / malformed / missing),
8
8
  * stdout/stderr split, byte-identical messages, the same per-artefact
9
9
  * checksum recomputation and the same error truncation (first 20 + "… and N
10
- * more"). No behaviour changes — latent bugs replicated.
10
+ * more"). Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
11
11
  *
12
- * The Python original imports `_artefact_checksum` + `_CATEGORY_SCHEMA` from
12
+ * the retired Python implementation imports `_artefact_checksum` + `_CATEGORY_SCHEMA` from
13
13
  * `build_discovery_manifest.py` (which has no TS twin yet). To keep the TS
14
14
  * twin self-contained AND in lockstep, the checksum primitive is ported
15
15
  * inline here from `build_discovery_manifest._artefact_checksum` /
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Artefact-count messaging gate (road-to-truth-and-reference-hygiene Phase 1).
4
+ *
5
+ * Generalises `check_command_count_messaging.ts` (which stays wired as
6
+ * `task check-command-count` — its badge/browse anchors are required-check
7
+ * contract surface and are NOT removed here) from commands-only to every
8
+ * artefact kind: any count-shaped prose mention of skills / commands /
9
+ * governed rules / guidelines / personas on a flagship public surface must
10
+ * equal the canonical source count, and no surface may carry two DIFFERENT
11
+ * numbers for the same kind (the 150-vs-162-vs-166 failure mode that
12
+ * motivated this gate).
13
+ *
14
+ * Ownership split:
15
+ * - `update_counts.ts` GENERATES the numbers into anchored positions
16
+ * (badges + prose) and `--check`s those exact anchors.
17
+ * - THIS gate SCANS the flagship surfaces for any count-shaped phrase —
18
+ * anchored or not — so a hand-typed new sentence with a stale number
19
+ * fails CI even though no anchor covers it yet.
20
+ * - `check_command_count_messaging.ts` keeps the command-specific
21
+ * active-vs-shim split checks.
22
+ *
23
+ * Scope: flagship surfaces only (SURFACES below). Dated census / analysis
24
+ * snapshots (SKILL_CENSUS, skills-taxonomy, positioning-evidence, …) carry
25
+ * point-in-time counts by design and are deliberately out of scope — the
26
+ * gate's charter is the surfaces a fresh reader treats as current.
27
+ *
28
+ * Exit codes: 0 clean · 1 drift or internal inconsistency.
29
+ */
30
+
31
+ import * as fs from 'node:fs';
32
+ import * as path from 'node:path';
33
+ import { fileURLToPath, pathToFileURL } from 'node:url';
34
+
35
+ import { canonical_counts } from './check_command_count_messaging.js';
36
+ import { count } from './update_counts.js';
37
+
38
+ const _HERE = fileURLToPath(import.meta.url);
39
+ export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
40
+
41
+ /** Flagship public prose surfaces (repo-relative). Missing files are skipped
42
+ * with a warning so a doc rename does not hard-break the gate. */
43
+ export const SURFACES: readonly string[] = [
44
+ 'README.md',
45
+ 'AGENTS.md',
46
+ 'llms.txt',
47
+ 'docs/CLAIMS.md',
48
+ 'docs/getting-started.md',
49
+ 'docs/getting-started-by-role.md',
50
+ 'docs/architecture.md',
51
+ 'docs/command-flows.md',
52
+ 'docs/governance-advantage.md',
53
+ 'docs/featured-skills.md',
54
+ 'docs/featured-commands.md',
55
+ 'docs/proof.md',
56
+ 'site/src/content/docs/index.mdx',
57
+ 'site/src/content/docs/claims.md',
58
+ ];
59
+
60
+ /** kind → canonical-count resolver. "governed rules" is the canonical total
61
+ * phrasing for rules; bare "N rules" is NOT matched (too many legitimate
62
+ * subset scopes: kernel rules, router rules, maintainer-only rules …). */
63
+ const KIND_PATTERNS: ReadonlyArray<[string, RegExp]> = [
64
+ ['skills', /(~?)(\d+)\+?\s+skills\b/g],
65
+ ['commands', /(~?)(\d+)\+?\s+commands\b/g],
66
+ ['rules', /(~?)(\d+)\+?\s+governed rules\b/g],
67
+ ['guidelines', /(~?)(\d+)\+?\s+guidelines\b/g],
68
+ ['personas', /(~?)(\d+)\+?\s+personas\b/g],
69
+ ];
70
+
71
+ export interface Finding {
72
+ file: string;
73
+ line: number;
74
+ kind: string;
75
+ found: number;
76
+ expected: number;
77
+ approx: boolean;
78
+ }
79
+
80
+ export function canonical_for(kind: string): number {
81
+ if (kind === 'commands') {
82
+ // Prose command mentions carry the ACTIVE count (total − shims),
83
+ // matching the hero badge owned by check_command_count_messaging.
84
+ const [, , active] = canonical_counts();
85
+ return active;
86
+ }
87
+ return count(kind);
88
+ }
89
+
90
+ /** Scan one text body; returns findings + the per-kind numbers seen. */
91
+ export function scan_text(
92
+ rel: string,
93
+ text: string,
94
+ expected: Readonly<Record<string, number>>,
95
+ ): { findings: Finding[]; seen: Record<string, Set<number>> } {
96
+ const findings: Finding[] = [];
97
+ const seen: Record<string, Set<number>> = {};
98
+ const lines = text.split('\n');
99
+ for (const [kind, pattern] of KIND_PATTERNS) {
100
+ for (let i = 0; i < lines.length; i++) {
101
+ const re = new RegExp(pattern.source, pattern.flags);
102
+ for (const m of lines[i]!.matchAll(re)) {
103
+ const found = Number.parseInt(m[2]!, 10);
104
+ (seen[kind] ??= new Set()).add(found);
105
+ const exp = expected[kind]!;
106
+ const approx = m[1] === '~';
107
+ if (found !== exp || approx) {
108
+ findings.push({ file: rel, line: i + 1, kind, found, expected: exp, approx });
109
+ }
110
+ }
111
+ }
112
+ }
113
+ return { findings, seen };
114
+ }
115
+
116
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
117
+ const QUIET = argv.includes('--quiet');
118
+ const expected: Record<string, number> = {};
119
+ for (const [kind] of KIND_PATTERNS) {
120
+ expected[kind] = canonical_for(kind);
121
+ }
122
+ process.stdout.write(
123
+ `Canonical: skills=${expected['skills']} commands=${expected['commands']} ` +
124
+ `rules=${expected['rules']} guidelines=${expected['guidelines']} ` +
125
+ `personas=${expected['personas']}\n`,
126
+ );
127
+
128
+ const allFindings: Finding[] = [];
129
+ const global_seen: Record<string, Set<number>> = {};
130
+ for (const rel of SURFACES) {
131
+ const p = path.join(ROOT, rel);
132
+ if (!fs.existsSync(p)) {
133
+ process.stderr.write(` ⚠️ surface missing (skipped): ${rel}\n`);
134
+ continue;
135
+ }
136
+ const { findings, seen } = scan_text(rel, fs.readFileSync(p, 'utf-8'), expected);
137
+ allFindings.push(...findings);
138
+ for (const [kind, nums] of Object.entries(seen)) {
139
+ for (const n of nums) (global_seen[kind] ??= new Set()).add(n);
140
+ }
141
+ }
142
+
143
+ // Internal-inconsistency check — the regression case this gate exists
144
+ // for: multiple DIFFERENT numbers for one kind across the surfaces.
145
+ const inconsistent: string[] = [];
146
+ for (const [kind, nums] of Object.entries(global_seen)) {
147
+ if (nums.size > 1) {
148
+ inconsistent.push(`${kind}: {${[...nums].sort((a, b) => a - b).join(', ')}}`);
149
+ }
150
+ }
151
+
152
+ if (allFindings.length === 0 && inconsistent.length === 0) {
153
+ if (!QUIET) {
154
+ process.stdout.write('✅ All artefact-count prose in sync with source.\n');
155
+ }
156
+ return 0;
157
+ }
158
+
159
+ process.stdout.write(
160
+ `❌ Artefact-count messaging drift — ${allFindings.length} mismatch(es):\n`,
161
+ );
162
+ for (const f of allFindings) {
163
+ const tag = f.approx ? ' (approximation "~" not allowed on flagship surfaces)' : '';
164
+ process.stdout.write(
165
+ ` ${f.file}:${f.line}: ${f.kind} says ${f.found}, expected ${f.expected}${tag}\n`,
166
+ );
167
+ }
168
+ for (const line of inconsistent) {
169
+ process.stdout.write(` internal inconsistency — ${line}\n`);
170
+ }
171
+ process.stdout.write(
172
+ '\nFix: run `./scripts-run src/scripts/update_counts` for anchored positions,\n' +
173
+ 'or correct the prose to the canonical number (never hand-type a new one).\n',
174
+ );
175
+ return 1;
176
+ }
177
+
178
+ function _isCliEntry(): boolean {
179
+ if (process.argv[1] === undefined) {
180
+ return false;
181
+ }
182
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
183
+ if (import.meta.url === argvUrl) {
184
+ return true;
185
+ }
186
+ try {
187
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
188
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
189
+ return here === argv;
190
+ } catch {
191
+ return false;
192
+ }
193
+ }
194
+
195
+ if (_isCliEntry() || process.argv[1] === _HERE) {
196
+ process.exit(main(process.argv.slice(2)));
197
+ }
@@ -3,11 +3,11 @@
3
3
  * Auto-rule description-length CI gate (Phase 1.3 of
4
4
  * road-to-augment-limit-fit).
5
5
  *
6
- * TypeScript twin of `src/scripts/check_augment_description_cap.py` (ADR-200,
7
- * Phase 4 / Wave 4c). The CLI contract is mirrored EXACTLY — no flags, exit
6
+ * Ported from the retired Python `src/scripts/check_augment_description_cap.py` (ADR-200,
7
+ * Phase 4 / Wave 4c). The CLI contract is pinned — no flags, exit
8
8
  * codes (0 pass, 1 over-cap), stdout/stderr split, byte-identical finding
9
9
  * messages, same scan scope (`.agent-src.uncondensed/rules/*.md`) and file
10
- * ordering. No behaviour changes — latent bugs replicated.
10
+ * ordering. Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
11
11
  *
12
12
  * For every `type: auto` rule under `.agent-src.uncondensed/rules/`,
13
13
  * fail CI when the frontmatter `description:` exceeds DESC_CAP chars.
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Advisory check for `.augmentignore` (road-to-governance-cleanup F6.3).
4
4
  *
5
- * TypeScript twin of `src/scripts/check_augmentignore.py` (ADR-200,
5
+ * Ported from the retired Python `src/scripts/check_augmentignore.py` (ADR-200,
6
6
  * Phase 4 / Wave 4c). CLI contract mirrored EXACTLY — `--quiet` flag,
7
7
  * always exits 0, byte-identical advisory messages, same staleness /
8
8
  * min-useful-lines thresholds, stdout-only output.
@@ -2,12 +2,12 @@
2
2
  /**
3
3
  * Beta-review-marker checker for `docs/contracts/`.
4
4
  *
5
- * TypeScript twin of `src/scripts/check_beta_review_markers.py` (ADR-200,
6
- * Phase 4 / Wave 4c). The CLI contract is mirrored EXACTLY — `--json`
5
+ * Ported from the retired Python `src/scripts/check_beta_review_markers.py` (ADR-200,
6
+ * Phase 4 / Wave 4c). The CLI contract is pinned — `--json`
7
7
  * flag, exit codes (0 clean, 1 violations, 3 internal error), stdout/stderr
8
8
  * split, byte-identical messages, the same scan order and the same date
9
9
  * arithmetic (`keep-beta-until` ≤ today + 90 days). No behaviour changes —
10
- * latent bugs replicated.
10
+ * historical quirks preserved (consumers pin the exact behaviour).
11
11
  *
12
12
  * Every contract whose frontmatter declares `stability: beta` MUST carry
13
13
  * exactly one of `promote-to: stable` | `keep-beta-until: YYYY-MM-DD` |
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Bite-sized task granularity gate for structural roadmaps (P1.5).
4
4
  *
5
- * TypeScript twin of `src/scripts/check_bite_sized_granularity.py` (ADR-200,
5
+ * Ported from the retired Python `src/scripts/check_bite_sized_granularity.py` (ADR-200,
6
6
  * Phase 4 / Wave 4c). This module is a pure library (no CLI / main); the
7
7
  * Python module is imported as a test surface. The exported API mirrors the
8
8
  * Python public API EXACTLY:
@@ -2,17 +2,22 @@
2
2
  /**
3
3
  * Cluster-pattern compliance check.
4
4
  *
5
- * TypeScript twin of `src/scripts/check_cluster_patterns.py` (ADR-200,
6
- * Phase 4 / Wave 4c). The CLI contract is mirrored EXACTLY — no flags,
5
+ * Ported from the retired Python `src/scripts/check_cluster_patterns.py` (ADR-200,
6
+ * Phase 4 / Wave 4c). The CLI contract is pinned — no flags,
7
7
  * exit codes (0 clean, 1 pattern violations, 3 internal error),
8
8
  * stdout/stderr split, byte-identical finding messages, the same
9
9
  * locked-clusters table parse, the same domains slug map (via the
10
10
  * `_lib/agent_src` twin), and the same dispatcher-structure checks. No
11
- * behaviour changes — latent bugs replicated.
11
+ * behaviour changes — historical quirks preserved (consumers pin the exact behaviour).
12
12
  *
13
13
  * Compares each cluster dispatcher against the Phase 1 reference patterns
14
14
  * (`fix`, `optimize`, `feature`).
15
15
  *
16
+ * Phase 4 additions (ADR-115): every `routes_to:` entry on a dispatcher must
17
+ * resolve to a real src/domains command slug, and the `## Dispatch` section
18
+ * must document the bare-invocation behaviour (menu / default route /
19
+ * detection fallback) per command-clusters.md § Bare invocation.
20
+ *
16
21
  * Exit codes: 0 = clean, 1 = pattern violations, 3 = internal error.
17
22
  */
18
23
 
@@ -212,6 +217,45 @@ export function check_dispatcher(cluster: string, slug_map: Map<string, string>)
212
217
  if (body.includes('## Sub-commands') && !TABLE_HEADER_RE.test(body)) {
213
218
  rep.errors.push('Sub-commands table header must be `| Sub-command | Routes to | Purpose |`');
214
219
  }
220
+
221
+ // routes_to entries must resolve to real commands (Phase 4 / ADR-115).
222
+ const routesRaw = fm['routes_to'];
223
+ if (routesRaw !== undefined) {
224
+ const m = /^\[(.*)\]$/.exec(routesRaw.trim());
225
+ const entries = m
226
+ ? (m[1] as string)
227
+ .split(',')
228
+ .map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
229
+ .filter((s) => s.length > 0)
230
+ : [];
231
+ for (const entry of entries) {
232
+ // routes_to entries name either a command slug or a skill
233
+ // (e.g. `git-commit` routes to the `git-workflow` skill).
234
+ const skillPath = path.join(ROOT, 'src', 'skills', entry, 'SKILL.md');
235
+ if (!slug_map.has(entry) && !_isFile(skillPath)) {
236
+ rep.errors.push(
237
+ `routes_to entry \`${entry}\` resolves to no src/domains command slug ` +
238
+ 'and no src/skills skill',
239
+ );
240
+ }
241
+ }
242
+ }
243
+
244
+ // Bare-invocation story (Phase 4 / ADR-115): the Dispatch section must say
245
+ // what a bare `/<cluster>` does — a menu, a default route, or detection.
246
+ const dispatchIdx = body.indexOf('## Dispatch');
247
+ if (dispatchIdx !== -1) {
248
+ const rest = body.slice(dispatchIdx + '## Dispatch'.length);
249
+ const nextSection = rest.search(/\n## /);
250
+ const section = nextSection === -1 ? rest : rest.slice(0, nextSection);
251
+ if (!/menu|bare|no argument|unknown or missing|detection|default/i.test(section)) {
252
+ rep.errors.push(
253
+ '`## Dispatch` must document the bare-invocation behaviour ' +
254
+ '(menu, default route, or detection fallback) per ' +
255
+ 'command-clusters.md § Bare invocation',
256
+ );
257
+ }
258
+ }
215
259
  return rep;
216
260
  }
217
261
 
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * Command-count messaging gate (road-to-pr-34-followups 1.2).
4
4
  *
5
- * TypeScript twin of `src/scripts/check_command_count_messaging.py`
6
- * (ADR-200, Phase 4 / Wave 4c). Mirrors the Python CLI contract EXACTLY —
5
+ * Ported from the retired Python `src/scripts/check_command_count_messaging.py`
6
+ * (ADR-200, Phase 4 / Wave 4c). The CLI contract is pinned —
7
7
  * `--quiet` flag (positional anywhere in argv), exit codes (0 clean,
8
8
  * 1 drift, 1 no-commands-dir via stderr), stdout/stderr split,
9
9
  * byte-identical messages, same canonical-count derivation