@event4u/agent-config 16.1.0 → 16.3.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 (467) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +98 -257
  5. package/README.md +14 -12
  6. package/dist/agent-src/commands/analyze/inbox.md +1 -1
  7. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  8. package/dist/agent-src/commands/bug/fix.md +17 -2
  9. package/dist/agent-src/commands/feature/plan.md +1 -1
  10. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  11. package/dist/agent-src/commands/fix/ci.md +1 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/jira-ticket.md +1 -1
  14. package/dist/agent-src/commands/roadmap/create.md +1 -1
  15. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  16. package/dist/agent-src/commands/roadmap/process-full.md +5 -5
  17. package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
  18. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  19. package/dist/agent-src/commands/roadmap.md +18 -4
  20. package/dist/agent-src/commands/tests/create.md +17 -3
  21. package/dist/agent-src/commands/tests/execute.md +22 -5
  22. package/dist/agent-src/commands/work.md +4 -0
  23. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  25. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  27. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  28. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  29. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  30. package/dist/agent-src/rules/active-remediation.md +1 -1
  31. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  32. package/dist/agent-src/rules/broken-access-control.md +1 -0
  33. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  34. package/dist/agent-src/rules/context-hygiene.md +1 -1
  35. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  36. package/dist/agent-src/rules/design-fidelity.md +13 -16
  37. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  39. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  40. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  43. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  44. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  45. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  46. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  47. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  48. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  49. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  50. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  51. package/dist/agent-src/rules/persona-governance.md +2 -2
  52. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  53. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  54. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  55. package/dist/agent-src/rules/runtime-safety.md +1 -0
  56. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  57. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  58. package/dist/agent-src/rules/session-canary.md +8 -62
  59. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  60. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  61. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  62. package/dist/agent-src/rules/tool-safety.md +1 -0
  63. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  64. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  65. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  66. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  67. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  68. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  69. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  70. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  71. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  72. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  74. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  75. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  76. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  77. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
  78. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  79. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  80. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  81. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  82. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  83. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  84. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  85. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  86. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  87. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  88. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  89. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  90. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  91. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  92. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  93. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  94. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  95. package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
  96. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  97. package/dist/agent-src/templates/roadmaps.md +30 -0
  98. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  99. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  100. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  101. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  102. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  103. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  104. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  105. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  106. package/dist/cli/python/knowledge_ingest.js +1 -1
  107. package/dist/cli/python/workspace_drive.js +1 -1
  108. package/dist/cli/registry.js +1 -1
  109. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  110. package/dist/cli-delegate/check_update_banner.js +12 -1
  111. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  112. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  113. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  114. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  115. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  116. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  117. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  118. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  119. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
  120. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  121. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  122. package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
  123. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  124. package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
  125. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  126. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  127. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  128. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  129. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
  131. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
  132. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  133. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
  134. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  135. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  136. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  137. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  138. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  139. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  140. package/dist/cli-delegate/cmd_conformance.js +1862 -809
  141. package/dist/cli-delegate/cmd_doctor.js +13 -6
  142. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  143. package/dist/cli-delegate/cmd_explain.js +5 -5
  144. package/dist/cli-delegate/cmd_export.js +11 -8
  145. package/dist/cli-delegate/cmd_fleet.js +3 -3
  146. package/dist/cli-delegate/cmd_handoff.js +10 -7
  147. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  148. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  149. package/dist/cli-delegate/cmd_migrate.js +2 -2
  150. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  151. package/dist/cli-delegate/cmd_preflight.js +6 -6
  152. package/dist/cli-delegate/cmd_prune.js +11 -8
  153. package/dist/cli-delegate/cmd_refresh.js +2 -1
  154. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  155. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  156. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  157. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  158. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  159. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  160. package/dist/cli-delegate/cmd_sync.js +11 -8
  161. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  162. package/dist/cli-delegate/cmd_update.js +1 -1
  163. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  164. package/dist/cli-delegate/cmd_validate.js +11 -8
  165. package/dist/cli-delegate/cmd_versions.js +1 -1
  166. package/dist/cli-delegate/deferral_carry.js +16 -0
  167. package/dist/cli-delegate/gate_execute.js +2 -2
  168. package/dist/cli-delegate/roadmap_gates.js +5 -5
  169. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  170. package/dist/discovery/deprecation-report.md +1 -1
  171. package/dist/discovery/discovery-manifest.json +132 -80
  172. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  173. package/dist/discovery/discovery-manifest.summary.md +3 -3
  174. package/dist/discovery/dormancy-report.md +1 -1
  175. package/dist/discovery/orphan-report.md +1 -1
  176. package/dist/discovery/packs.json +7 -5
  177. package/dist/discovery/trust-report.md +2 -2
  178. package/dist/discovery/workspaces.json +6 -4
  179. package/dist/hooks/dispatch.js +7972 -5186
  180. package/dist/hooks/dispatch.sha256 +1 -0
  181. package/dist/install/claudePathsPlan.js +47 -6
  182. package/dist/install/claudeRuleRewrite.js +7 -0
  183. package/dist/install/emit_host_rules_cli.js +39 -36
  184. package/dist/install/globalRuleScope.js +87 -0
  185. package/dist/install/host_rule_ownership.js +160 -0
  186. package/dist/install/install.mjs +2226 -1055
  187. package/dist/install/installThinLayer.js +261 -0
  188. package/dist/install/installedRuleLinks.js +176 -0
  189. package/dist/install/wizard-plan.js +24 -0
  190. package/dist/mcp/registry-manifest.json +3 -3
  191. package/dist/mcp/server.json +2 -2
  192. package/dist/mcp/server.mjs +40913 -34865
  193. package/dist/scripts/_lib/agent_settings.js +11 -0
  194. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  195. package/dist/scripts/_lib/installed_layer.js +378 -0
  196. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  197. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  198. package/dist/scripts/_lib/rule_injection.js +67 -10
  199. package/dist/scripts/_lib/rule_law_section.js +122 -0
  200. package/dist/scripts/_lib/thin_rules.js +458 -0
  201. package/dist/scripts/_lib/windsurf_render.js +60 -0
  202. package/dist/scripts/condense.js +14 -26
  203. package/dist/scripts/project_thin_rules.js +14 -294
  204. package/dist/server/schemas/settings.js +29 -0
  205. package/dist/shared/skillRanking.js +74 -13
  206. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  207. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  208. package/dist/ui/index.html +2 -2
  209. package/docs/contracts/settings-classes.md +10 -6
  210. package/package.json +4 -4
  211. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  212. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  213. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  214. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  215. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  216. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  217. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  218. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  219. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  220. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  221. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  222. package/src/config/agent-settings.template.yml +91 -22
  223. package/src/config/ci-local-parity.yml +18 -0
  224. package/src/config/continuity-surface.json +9 -2
  225. package/src/config/evaluator-budgets.json +4 -4
  226. package/src/config/gate-coverage.yml +327 -3
  227. package/src/config/gate-violation-baselines.json +21 -9
  228. package/src/config/hook-bundle-budget.json +25 -0
  229. package/src/config/hook-latency-budget.json +21 -0
  230. package/src/config/hook-token-budget.json +8 -3
  231. package/src/config/host-instruction-limits.json +33 -0
  232. package/src/config/metric-registry.yml +114 -0
  233. package/src/config/placeholder-drift-budget.json +10 -0
  234. package/src/config/routing-coverage-seed.json +38 -3
  235. package/src/config/rule-activation-census.json +7 -3
  236. package/src/config/rule-consequence-class.json +161 -0
  237. package/src/config/rule-law-ceilings.json +99 -0
  238. package/src/install/claudePathsPlan.ts +46 -4
  239. package/src/install/claudeRuleRewrite.ts +10 -1
  240. package/src/install/emit_host_rules_cli.ts +43 -34
  241. package/src/install/globalRuleScope.ts +109 -0
  242. package/src/install/host_rule_ownership.ts +170 -0
  243. package/src/install/installThinLayer.ts +312 -0
  244. package/src/install/installedRuleLinks.ts +220 -0
  245. package/src/install/wizard-plan.ts +24 -0
  246. package/src/scripts/_cli/cmd_doctor.ts +28 -90
  247. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  248. package/src/scripts/_cli/doctor_execution.ts +100 -17
  249. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  250. package/src/scripts/_dispatch.bash +16 -2
  251. package/src/scripts/_lib/agent_settings.ts +11 -0
  252. package/src/scripts/_lib/body_portable.ts +102 -0
  253. package/src/scripts/_lib/cc_transcript.ts +132 -1
  254. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  255. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  256. package/src/scripts/_lib/estate_offsets.ts +241 -0
  257. package/src/scripts/_lib/exemption_shape.ts +143 -0
  258. package/src/scripts/_lib/fnv.ts +23 -0
  259. package/src/scripts/_lib/foreign_scan.ts +106 -0
  260. package/src/scripts/_lib/forge_protection.ts +114 -0
  261. package/src/scripts/_lib/forge_reader.ts +558 -0
  262. package/src/scripts/_lib/gitignore_block.ts +314 -0
  263. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  264. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  265. package/src/scripts/_lib/hook_settings.ts +73 -0
  266. package/src/scripts/_lib/host_capability.ts +40 -19
  267. package/src/scripts/_lib/host_env_write.ts +111 -0
  268. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  269. package/src/scripts/_lib/installed_layer.ts +538 -0
  270. package/src/scripts/_lib/json_merge.ts +82 -0
  271. package/src/scripts/_lib/json_pointers.ts +93 -11
  272. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  273. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  274. package/src/scripts/_lib/machine_wake.ts +16 -3
  275. package/src/scripts/_lib/neighbour_census.ts +760 -0
  276. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  277. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  278. package/src/scripts/_lib/obligations.ts +119 -8
  279. package/src/scripts/_lib/probe_inputs.ts +271 -0
  280. package/src/scripts/_lib/prompt_shape.ts +46 -0
  281. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  282. package/src/scripts/_lib/release_highlights.ts +2 -1
  283. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  284. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  285. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  286. package/src/scripts/_lib/review_coverage.ts +134 -0
  287. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  288. package/src/scripts/_lib/rule_injection.ts +130 -10
  289. package/src/scripts/_lib/rule_law_section.ts +147 -0
  290. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  291. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  292. package/src/scripts/_lib/skill_origin.ts +254 -0
  293. package/src/scripts/_lib/structural_hiding.ts +622 -0
  294. package/src/scripts/_lib/structured_ask.ts +64 -21
  295. package/src/scripts/_lib/thin_rules.ts +540 -0
  296. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  297. package/src/scripts/_lib/turn_end_refusals.ts +600 -4
  298. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  299. package/src/scripts/_lib/verification_command.ts +324 -0
  300. package/src/scripts/_lib/verification_evidence.ts +647 -0
  301. package/src/scripts/_lib/verify_clause.ts +280 -0
  302. package/src/scripts/_lib/windsurf_render.ts +63 -0
  303. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  304. package/src/scripts/ai_council/clients.ts +26 -57
  305. package/src/scripts/ai_council/config.ts +1 -1
  306. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  307. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  308. package/src/scripts/audit_skill_overlap.ts +261 -0
  309. package/src/scripts/before_complete_hook.ts +573 -25
  310. package/src/scripts/bench_hook_latency.ts +412 -5
  311. package/src/scripts/bench_touched_file_quality.ts +238 -0
  312. package/src/scripts/cache_realization_report.ts +61 -1
  313. package/src/scripts/check_argument_hint.ts +287 -0
  314. package/src/scripts/check_claims.ts +125 -1
  315. package/src/scripts/check_enforcement_coverage.ts +38 -9
  316. package/src/scripts/check_enforcement_matrix.ts +621 -22
  317. package/src/scripts/check_estate_count.ts +130 -153
  318. package/src/scripts/check_finding_dispositions.ts +138 -7
  319. package/src/scripts/check_generator_sync.ts +71 -0
  320. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  321. package/src/scripts/check_host_docs_digest.ts +786 -0
  322. package/src/scripts/check_host_format_column.ts +559 -0
  323. package/src/scripts/check_input_references.ts +228 -0
  324. package/src/scripts/check_inputs_parity.ts +235 -0
  325. package/src/scripts/check_kernel_edit_ratified.ts +89 -9
  326. package/src/scripts/check_kill_switch_table.ts +294 -0
  327. package/src/scripts/check_memory.ts +7 -1
  328. package/src/scripts/check_placeholder_drift.ts +221 -0
  329. package/src/scripts/check_read_surface_coverage.ts +515 -0
  330. package/src/scripts/check_release_highlights.ts +10 -0
  331. package/src/scripts/check_release_holds.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +38 -15
  333. package/src/scripts/check_routing_coverage.ts +378 -11
  334. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  335. package/src/scripts/check_static_parity.ts +17 -0
  336. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  337. package/src/scripts/ci_settle.ts +145 -19
  338. package/src/scripts/closure_scan.ts +115 -1
  339. package/src/scripts/code_graph/detect.ts +127 -7
  340. package/src/scripts/code_graph/foreign.ts +194 -0
  341. package/src/scripts/code_graph/query.ts +217 -4
  342. package/src/scripts/code_graph/types.ts +26 -2
  343. package/src/scripts/code_graph/validate.ts +3 -1
  344. package/src/scripts/code_graph/verbs.ts +103 -0
  345. package/src/scripts/compile_hook_manifest.ts +90 -14
  346. package/src/scripts/condense.ts +14 -27
  347. package/src/scripts/estate_exemption_shape.ts +202 -0
  348. package/src/scripts/external_sources_denylist.json +29 -4
  349. package/src/scripts/generate_host_cost_table.ts +1 -1
  350. package/src/scripts/hook_manifest.json +1 -1
  351. package/src/scripts/hook_manifest.yaml +192 -14
  352. package/src/scripts/hooks/block_config_weakening.ts +294 -4
  353. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  354. package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
  355. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  356. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  357. package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
  358. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  359. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  360. package/src/scripts/hooks/concern_registry.ts +2 -0
  361. package/src/scripts/hooks/concern_timings.ts +94 -0
  362. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  363. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  364. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  365. package/src/scripts/hooks/dispatch_hook.ts +77 -71
  366. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  367. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  368. package/src/scripts/hooks/evidence_independence.ts +1 -2
  369. package/src/scripts/hooks/exit_codes.ts +129 -0
  370. package/src/scripts/hooks/host_lowering.json +1 -0
  371. package/src/scripts/hooks/host_lowering.ts +146 -3
  372. package/src/scripts/hooks/host_lowering.yaml +262 -46
  373. package/src/scripts/hooks/host_semantics.ts +30 -2
  374. package/src/scripts/hooks/injection_budget.ts +9 -2
  375. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  376. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  377. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  378. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  379. package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
  380. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  381. package/src/scripts/hooks/payload_stub.ts +10 -1
  382. package/src/scripts/hooks/permission_gate.ts +1 -2
  383. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  384. package/src/scripts/hooks/replay_hook.ts +2 -1
  385. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  386. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  387. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  388. package/src/scripts/hooks/rule_inject_hook.ts +765 -68
  389. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  390. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  391. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  392. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  393. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  394. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  395. package/src/scripts/hooks/table_fingerprint.ts +70 -0
  396. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  397. package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
  398. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  399. package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
  400. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  401. package/src/scripts/hooks_status.ts +112 -0
  402. package/src/scripts/injection_scan_hook.ts +7 -0
  403. package/src/scripts/install.ts +75 -189
  404. package/src/scripts/installed_layer_report.ts +103 -0
  405. package/src/scripts/language_mirror_hook.ts +15 -6
  406. package/src/scripts/learning_sidecar.ts +119 -8
  407. package/src/scripts/lint_deny_text.ts +419 -0
  408. package/src/scripts/lint_exit_codes.ts +262 -0
  409. package/src/scripts/lint_hook_manifest.ts +108 -0
  410. package/src/scripts/lint_major_migration_sections.ts +156 -26
  411. package/src/scripts/lint_pack_boundaries.ts +63 -5
  412. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  413. package/src/scripts/lint_rule_law_section.ts +517 -0
  414. package/src/scripts/lint_skill_descriptions.ts +1 -1
  415. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  416. package/src/scripts/lint_workflow_security.ts +161 -5
  417. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  418. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  419. package/src/scripts/mcp_server/prompts.ts +142 -1
  420. package/src/scripts/measure_routing_signal.ts +54 -16
  421. package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
  422. package/src/scripts/measure_turn_end_gate.ts +193 -0
  423. package/src/scripts/memory_learn_hook.ts +91 -6
  424. package/src/scripts/memory_lookup.ts +1 -1
  425. package/src/scripts/model_rule_injection.ts +52 -5
  426. package/src/scripts/prepack-check.mjs +53 -0
  427. package/src/scripts/project_thin_rules.ts +34 -327
  428. package/src/scripts/release_publication.ts +13 -1
  429. package/src/scripts/report_evidence_temperature.ts +657 -0
  430. package/src/scripts/report_installed_rule_links.ts +157 -0
  431. package/src/scripts/report_invocation_surface.ts +383 -0
  432. package/src/scripts/report_label_agreement.ts +233 -0
  433. package/src/scripts/report_obligation_carriers.ts +699 -0
  434. package/src/scripts/report_obligation_mechanism.ts +230 -0
  435. package/src/scripts/report_obligation_writer_split.ts +236 -0
  436. package/src/scripts/report_single_token_triggers.ts +277 -0
  437. package/src/scripts/report_skill_menu_census.ts +208 -0
  438. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  439. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  440. package/src/scripts/report_verification_record_coverage.ts +306 -0
  441. package/src/scripts/roadmap_verify_share.ts +213 -0
  442. package/src/scripts/rule_activation_census.ts +5 -2
  443. package/src/scripts/rule_trigger_eval.ts +9 -9
  444. package/src/scripts/schemas/command.schema.json +44 -0
  445. package/src/scripts/schemas/review-findings.schema.json +7 -2
  446. package/src/scripts/schemas/rule.schema.json +5 -0
  447. package/src/scripts/schemas/skill.schema.json +44 -0
  448. package/src/scripts/self_review_gate.ts +421 -17
  449. package/src/scripts/semantic_parity_census.ts +314 -0
  450. package/src/scripts/session_eol_report.ts +54 -1
  451. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  452. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  453. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  454. package/src/scripts/sync_gitignore.ts +29 -235
  455. package/src/scripts/trigger_eval_grandfather.json +0 -7
  456. package/src/scripts/trigger_eval_rotation.ts +122 -27
  457. package/src/scripts/ui_conformance_probe.ts +156 -4
  458. package/src/scripts/update_prices.ts +85 -3
  459. package/src/scripts/write_bundle_digest.mjs +74 -0
  460. package/src/server/schemas/settings.ts +41 -0
  461. package/src/shared/skillRanking.ts +117 -11
  462. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  463. package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
  464. package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
  465. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  466. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  467. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
@@ -0,0 +1,280 @@
1
+ /**
2
+ * The `verify:` clause — one grammar, one parser, two importers.
3
+ *
4
+ * THE DEFECT THIS EXISTS TO NAME. A `verify:` clause names a command and never
5
+ * names what the command must produce. `verify: `cat notes.md`` is a legal,
6
+ * green, fully-conforming step field whose oracle cannot say no: the step gets
7
+ * flipped on a command that was never able to fail. Measured 2026-09-29 across
8
+ * the 22 active roadmaps: 230 clauses, 93 naming a command, and 6 naming an
9
+ * expectation — so 59.6% of clauses cannot even be RUN, and 97.4% state no
10
+ * oracle. The absence is the norm, not an outlier.
11
+ *
12
+ * The denominator moves with archival and is not the finding. An earlier
13
+ * reading the same day over 27 roadmaps gave 264 / 100 / 6; five archived in
14
+ * between, and the count of EXPECTATIONS did not move. That is why the ratio
15
+ * carries and the raw totals do not.
16
+ *
17
+ * ALL SIX predate this parser, and the split is the interesting part. Three sit
18
+ * in an unrelated roadmap and were written by an author nobody prompted. The
19
+ * other three are the verify lines of the roadmap that commissioned this work —
20
+ * which asserted, in the same document, that ZERO clauses carried an
21
+ * expectation. It was carrying three of them. This grammar therefore DOCUMENTS
22
+ * a form already in use; it does not introduce one, and the number here is the
23
+ * measured one so that it carries its producing command:
24
+ * `./scripts-run src/scripts/roadmap_verify_share`.
25
+ *
26
+ * THE GRAMMAR. The expectation half is OPTIONAL and attaches with the arrow
27
+ * `exec:` evidence already carries — not a new symbol:
28
+ *
29
+ * verify: `<cmd>` -> 0 the command must exit 0
30
+ * verify: `<cmd>` -> 2 … or any declared exit code
31
+ * verify: `<cmd>` -> /regex/ the command's output must match
32
+ * verify: `<cmd>` runnable, but the oracle is unstated
33
+ * verify: <prose> MANUAL — a human reads it
34
+ *
35
+ * Prose stays legal deliberately. Forbidding it would have silently invalidated
36
+ * the large majority of lines already in the tree, and a grammar change that
37
+ * reds every existing producer gets weakened until it finds nothing. What the
38
+ * three shapes buy instead is that they are TELLABLE APART, which is what lets
39
+ * `closure_scan` report the unfalsifiable share as a number rather than an
40
+ * impression.
41
+ *
42
+ * WHY ONE PARSER. Two importers read this grammar — the run-continuation hook
43
+ * (which names the next step and its verify line) and `closure_scan` (which
44
+ * reports the share that cannot fail). A second copy of the arrow regex is how
45
+ * those two drift, and a drifted grammar fails silently: an expectation simply
46
+ * stops being read and the clause reads as unstated. {@link VERIFY_ARROW_SOURCE}
47
+ * is exported so a duplicate is detectable by a test rather than by a bug
48
+ * report.
49
+ */
50
+
51
+ /** What a clause says the command must produce. */
52
+ export type Expectation =
53
+ | { readonly kind: 'exit'; readonly code: number }
54
+ | { readonly kind: 'regex'; readonly source: string };
55
+
56
+ export interface VerifyClause {
57
+ /**
58
+ * The command, or `null` for the prose (MANUAL) form. A clause with no
59
+ * command cannot be run by anything, which is precisely what makes it
60
+ * unfalsifiable rather than merely unstated.
61
+ */
62
+ readonly command: string | null;
63
+ /** The `-> 0` / `-> /re/` half, or `null` where the clause carries none. */
64
+ readonly expect: Expectation | null;
65
+ /**
66
+ * The clause body, whitespace-normalised — the clause, never the step.
67
+ *
68
+ * For the prose form that is the clause's own paragraph: a detector reading
69
+ * this must not see text the clause did not write.
70
+ */
71
+ readonly raw: string;
72
+ }
73
+
74
+ /**
75
+ * The expectation half, as a source string.
76
+ *
77
+ * Exported rather than kept private so the "nothing may parse the arrow a
78
+ * second time" test has something to compare against. Two alternatives only:
79
+ * a bare exit code, or a slash-delimited regex. A bare word (`-> green`) is
80
+ * deliberately NOT an expectation — it would read as one while deciding
81
+ * nothing, which is the defect wearing the fix's clothes.
82
+ */
83
+ export const VERIFY_ARROW_SOURCE = '(?:->|→)[ \\t]*(\\d+|\\/.+\\/)[ \\t]*$';
84
+
85
+ /** The arrow alone, anchored at both ends of a clause tail. */
86
+ const ARROW_RE = new RegExp(`^${VERIFY_ARROW_SOURCE}`);
87
+
88
+ /** A clause body split into its command head and its trailing expectation. */
89
+ const TAIL_RE = new RegExp(`^(.*?)[ \\t]*${VERIFY_ARROW_SOURCE}`);
90
+
91
+ /** The annotation form. Machine-readable, so it wins when both are present. */
92
+ const HTML_RE = /<!--\s*verify:\s*(.*?)\s*-->/g;
93
+
94
+ /**
95
+ * The step's LAST match, not its first.
96
+ *
97
+ * A step that DISCUSSES the clause carries the token before the clause that
98
+ * counts — the roadmap introducing this grammar shows `verify: `<cmd>` -> 0`
99
+ * in its own prose, two lines above its own verify line. First-match-wins
100
+ * parsed the illustration and reported its expectation as the step's. The
101
+ * clause is written last by convention, after the prose, so last wins.
102
+ */
103
+ function lastMatch(re: RegExp, text: string): RegExpExecArray | null {
104
+ re.lastIndex = 0;
105
+ let found: RegExpExecArray | null = null;
106
+ let m = re.exec(text);
107
+ while (m !== null) {
108
+ found = m;
109
+ if (m.index === re.lastIndex) re.lastIndex += 1;
110
+ m = re.exec(text);
111
+ }
112
+ return found;
113
+ }
114
+
115
+ /**
116
+ * The backticked form, plus at most ONE token of expectation after it.
117
+ *
118
+ * The label is an ALTERNATION with a lookahead, not two independent optional
119
+ * backticks. The inherited form — ``` `?verify:`? ``` — let the parser skip the
120
+ * trailing backtick and use the LABEL's closing backtick to open the command,
121
+ * so ``` `verify:` stays legal … verify: `cmd` ``` captured the whole
122
+ * intervening sentence as the command. Nothing failed: a garbage command is
123
+ * still a string, and the hook printed it into a continuation message as the
124
+ * step's proof. The alternation alone did not fix it — the bare branch could
125
+ * start one character later and borrow the same backtick — so the bare branch
126
+ * carries `(?!`)`: a label followed by a backtick is the delimited form, which
127
+ * branch one already owns.
128
+ *
129
+ * The tail is capped at a single non-space token on purpose. A caller may hand
130
+ * this parser a whole step BLOCK already joined into one line, so "the rest of
131
+ * the line" can mean "the rest of the step" — and a step that continues after
132
+ * its verify clause would then push the expectation away from the end anchor
133
+ * and lose it silently. The cost is that a regex expectation here may not
134
+ * contain a space; `/[1-9]/` and `/unfalsifiable-verify/` are the shapes in
135
+ * use, and a space-bearing expectation loses its arrow loudly (it parses as no
136
+ * expectation) rather than half-matching.
137
+ *
138
+ * THE CAP IS THIS FORM'S, NOT THE GRAMMAR'S — said plainly because an earlier
139
+ * revision of this comment implied otherwise. The annotation form is
140
+ * `$`-anchored through {@link VERIFY_ARROW_SOURCE} and DOES keep `-> /a b/`;
141
+ * this form does not. The two agree on every space-free expectation, which is
142
+ * every expectation in the tree. Both directions are pinned by test, so closing
143
+ * the gap is a deliberate act against a failing assertion rather than a silent
144
+ * drift — which is the failure the WHY ONE PARSER note above exists to prevent,
145
+ * and it applies to this module's own two readers first.
146
+ */
147
+ const BACKTICKED_RE = /(?:`verify:`|verify:(?!`))\s*`([^`]+)`[ \t]*((?:->|→)[ \t]*\S+)?/g;
148
+
149
+ /** Prose after the label. The MANUAL form; the body is bounded separately. */
150
+ const PROSE_RE = /(?:`verify:`|verify:(?!`))[ \t]*/g;
151
+
152
+ /**
153
+ * A prose clause runs to the end of its PARAGRAPH — never to the end of the step.
154
+ *
155
+ * "To end of line" is too little: a prose clause wraps, and the quantity it
156
+ * asserts can sit on the wrap. The rest of the step is far too much, and that
157
+ * was the live defect — a step's evidence block sits under its clause, so a
158
+ * clause that named no number inherited every number written beneath it, and
159
+ * `unfalsifiable-verify` reported 46 hits on quantities no clause had written.
160
+ *
161
+ * A blank line is the boundary because that is what separates a clause from the
162
+ * evidence recorded under it in this tree. Input with no newlines at all — a
163
+ * caller that already joined the block — degrades to the whole string, which is
164
+ * the previous behaviour and keeps such a caller working rather than silently
165
+ * truncating it at a boundary that is not there.
166
+ */
167
+ function proseBody(rest: string): string {
168
+ const end = rest.search(/\n[ \t]*(?:\r?\n|$)/);
169
+ return (end === -1 ? rest : rest.slice(0, end)).replace(/\s+/g, ' ').trim();
170
+ }
171
+
172
+ /** Build an expectation from the already-isolated arrow value. */
173
+ function fromValue(value: string): Expectation | null {
174
+ if (/^\d+$/.test(value)) return { kind: 'exit', code: Number(value) };
175
+ const re = /^\/(.+)\/$/.exec(value);
176
+ if (re === null) return null;
177
+ const source = re[1] as string;
178
+ // An expectation that cannot compile is not an oracle — it is a crash
179
+ // waiting for the first reader that tries to apply it.
180
+ try {
181
+ new RegExp(source);
182
+ } catch {
183
+ return null;
184
+ }
185
+ return { kind: 'regex', source };
186
+ }
187
+
188
+ /**
189
+ * Parse an expectation from a clause tail such as `-> 0` or `-> /re/`.
190
+ *
191
+ * @returns `null` when the tail carries no arrow, or carries one whose value is
192
+ * neither an exit code nor a slash-delimited regex.
193
+ */
194
+ export function parseExpectation(tail: string): Expectation | null {
195
+ const m = ARROW_RE.exec(tail.trim());
196
+ return m === null ? null : fromValue(m[1] as string);
197
+ }
198
+
199
+ /** Split a command-bearing body into its command and its expectation. */
200
+ function splitBody(body: string): { command: string; expect: Expectation | null } {
201
+ const m = TAIL_RE.exec(body);
202
+ if (m === null) return { command: body.trim(), expect: null };
203
+ const expect = fromValue(m[2] as string);
204
+ // An arrow whose value decides nothing leaves the whole body as the
205
+ // command, rather than silently truncating it at a `->` that was prose.
206
+ return expect === null ? { command: body.trim(), expect: null } : { command: (m[1] as string).trim(), expect };
207
+ }
208
+
209
+ /**
210
+ * Parse the `verify:` clause carried by `stepText`.
211
+ *
212
+ * @param stepText one step block — the line plus its continuation lines, which
213
+ * is where the tree conventionally writes the clause.
214
+ * @returns the clause, or `null` when the text carries no `verify:` token.
215
+ */
216
+ export function parseVerifyClause(stepText: string): VerifyClause | null {
217
+ const html = lastMatch(HTML_RE, stepText);
218
+ if (html !== null) {
219
+ const body = (html[1] as string).trim();
220
+ // An EMPTY annotation is not a clause and must not mask one. Returning
221
+ // null here — the inherited behaviour — let `<!-- verify: -->` hide a
222
+ // real backticked clause further along the same step, and now that two
223
+ // readers consume this parser it would hide it from the share too.
224
+ if (body !== '') {
225
+ const { command, expect } = splitBody(body);
226
+ return { command: command === '' ? null : command, expect, raw: body };
227
+ }
228
+ }
229
+
230
+ const backticked = lastMatch(BACKTICKED_RE, stepText);
231
+ if (backticked !== null) {
232
+ const command = (backticked[1] as string).trim();
233
+ if (command !== '') {
234
+ const tail = (backticked[2] ?? '').trim();
235
+ return { command, expect: parseExpectation(tail), raw: `\`${command}\`${tail === '' ? '' : ` ${tail}`}` };
236
+ }
237
+ }
238
+
239
+ const prose = lastMatch(PROSE_RE, stepText);
240
+ if (prose === null) return null;
241
+ const body = proseBody(stepText.slice(prose.index + prose[0].length));
242
+ if (body === '') return null;
243
+ return { command: null, expect: null, raw: body };
244
+ }
245
+
246
+ /**
247
+ * The clause's command half only — `null` where the clause is prose or absent.
248
+ *
249
+ * The narrowing the run-continuation hook wants: it renders a command for the
250
+ * next step, and a prose clause is not one. Kept here rather than at the call
251
+ * site so the hook imports a decision rather than re-deriving it.
252
+ */
253
+ export function commandBearing(stepText: string): VerifyClause | null {
254
+ const clause = parseVerifyClause(stepText);
255
+ if (clause === null || clause.command === null) return null;
256
+ return clause;
257
+ }
258
+
259
+ /** Render an expectation back to its written form, for messages and evidence. */
260
+ export function formatExpectation(expect: Expectation): string {
261
+ return expect.kind === 'exit' ? `-> ${String(expect.code)}` : `-> /${expect.source}/`;
262
+ }
263
+
264
+ /**
265
+ * The clause as a continuation-message line, empty when there is nothing to say.
266
+ *
267
+ * The expectation rides along with the command, and that is the point rather
268
+ * than a formatting nicety: a re-engagement told only the command can run it,
269
+ * see exit 0, and flip the box regardless — the whole defect the arrow exists
270
+ * to close. Told the expectation too, it has an oracle.
271
+ *
272
+ * Lives beside the grammar rather than at the one call site so that one module
273
+ * owns how a clause is read AND how it is written back, which is also what
274
+ * keeps the over-cap hook from paying these lines.
275
+ */
276
+ export function renderVerifyLine(clause: VerifyClause | null): string {
277
+ if (clause === null) return '';
278
+ const expect = clause.expect === null ? '' : ` ${formatExpectation(clause.expect)}`;
279
+ return `\n verify: ${clause.command ?? ''}${expect}`;
280
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The windsurf single-file surface, rendered — one renderer, two callers.
3
+ *
4
+ * `road-to-a-hook-bundle-with-one-yaml-reader` 3.1. `condense.generate_windsurfrules`
5
+ * WRITES `.windsurfrules`; the standing-payload census needs the same bytes to
6
+ * report windsurf's figure without reading that file, because it is an untracked
7
+ * generated projection and reading it published a number that tracked when the
8
+ * checkout last ran `task generate-tools` rather than anything about the tree.
9
+ *
10
+ * Both callers share THIS function. A second renderer living in the census would
11
+ * have measured a file nobody receives, which is Risk 3 of that roadmap.
12
+ *
13
+ * WHY A SEPARATE MODULE rather than an export from `condense.ts`: that file sits
14
+ * 1,228 lines over the 1,500-line cap `check_source_size_budget` ratchets, so
15
+ * every line added there is a new violation. Splitting the renderer out moves
16
+ * `condense.ts` DOWN. The file is small on purpose and carries only what the
17
+ * render needs.
18
+ *
19
+ * `strip_frontmatter` moved here with it — it is the render's one non-trivial
20
+ * dependency, it has exactly one caller left inside `condense.ts`, and leaving it
21
+ * behind would have meant either an import cycle or a second copy.
22
+ * `condense.ts` re-exports it, so `src/install/emit_host_rules_cli.ts` and every
23
+ * other importer keeps its path.
24
+ */
25
+ import * as fs from 'node:fs';
26
+ import * as path from 'node:path';
27
+
28
+ /** Python `str.lstrip("\n")` — strip only leading newlines. Mirrors `condense._lstripNewlines`. */
29
+ function lstripNewlines(s: string): string {
30
+ return s.replace(/^\n+/, '');
31
+ }
32
+
33
+ /** Python `str.strip()` with no args — strip leading/trailing Unicode whitespace. Mirrors `condense._strip`. */
34
+ function strip(s: string): string {
35
+ return s.replace(/^\s+/u, '').replace(/\s+$/u, '');
36
+ }
37
+
38
+ /** Drop a leading `---` frontmatter block, if the content opens with one. */
39
+ export function strip_frontmatter(content: string): string {
40
+ if (content.startsWith('---')) {
41
+ const end = content.indexOf('---', 3);
42
+ if (end !== -1) {
43
+ content = lstripNewlines(content.slice(end + 3));
44
+ }
45
+ }
46
+ return content;
47
+ }
48
+
49
+ /**
50
+ * The exact bytes `generate_windsurfrules` writes, for a given rule set.
51
+ *
52
+ * `rulesSource` is a parameter rather than `condense.MODULE_STATE.RULES_SOURCE`
53
+ * so a caller can render a tree it names — the census renders the projection
54
+ * source directly, with no module state to set up.
55
+ */
56
+ export function render_windsurfrules(rulesSource: string, rules: readonly string[]): string {
57
+ const parts = ['# Auto-generated from dist/agent-src/rules/ — do not edit directly\n'];
58
+ for (const rule of rules) {
59
+ const content = strip_frontmatter(fs.readFileSync(path.join(rulesSource, rule), 'utf-8'));
60
+ parts.push(`---\n\n${strip(content)}\n`);
61
+ }
62
+ return parts.join('\n') + '\n';
63
+ }
@@ -29,15 +29,23 @@ import * as path from 'node:path';
29
29
  export const CLI_CALLS_ATTRIBUTION_SUFFIX = '.attribution.json';
30
30
 
31
31
  /**
32
- * Who booked a call. Enumerated because the consumer set is closed: exactly two
33
- * files in the tree construct a `CliClient`.
32
+ * Who booked a call. Enumerated because the consumer set is closed: exactly
33
+ * three files in the tree construct a `CliClient`.
34
34
  *
35
- * `unknown` is a FINDING when it appears — it means a third booking path exists
36
- * that this enumeration does not know about. That is how the test suite was
37
- * caught spending the operator's live budget.
35
+ * `unknown` is a FINDING when it appears — it means a booking path exists that
36
+ * this enumeration does not know about. That is how the test suite was caught
37
+ * spending the operator's live budget.
38
38
  */
39
39
  export const CLI_CONSUMER_COUNCIL = 'council';
40
40
  export const CLI_CONSUMER_TEAM = 'team';
41
+ /**
42
+ * The dogfooded self-review gate. Third because `self_review_gate.ts` is
43
+ * CLI-first since this constant was added: the subscription transport is tried
44
+ * before the API one, so a local or self-hosted run books here rather than
45
+ * spending API credit. A hosted CI runner has no vendor CLI on PATH and falls
46
+ * through to the API transport, which books nothing against this counter.
47
+ */
48
+ export const CLI_CONSUMER_SELF_REVIEW = 'self-review';
41
49
  export const CLI_CONSUMER_UNKNOWN = 'unknown';
42
50
 
43
51
  /**
@@ -88,6 +88,7 @@ import * as user_global_paths from '../_lib/user_global_paths.js';
88
88
  import { jsonDumpsIndent2 as _jsonDumpsIndent2 } from './_py_json.js';
89
89
  import * as budget from './cli_call_budget.js';
90
90
  import { appendEvent } from './events_log.js';
91
+ import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
91
92
 
92
93
  export const ANTHROPIC_KEY_FILENAME = 'anthropic.key';
93
94
  export const OPENAI_KEY_FILENAME = 'openai.key';
@@ -124,23 +125,12 @@ export const DEFAULT_PERPLEXITY_MODEL = 'sonar-pro';
124
125
  // divergence is a one-line change, not a hunt through inline literals.
125
126
  // (`xai` / `perplexity` CLI reuse their API constants: their CLIs are
126
127
  // community wrappers around the same paid API, so the values do not diverge.)
127
- /**
128
- * Sentinel: let the codex CLI pick its own model, by omitting `--model`.
129
- *
130
- * This is not a placeholder for a value nobody looked up. Measured
131
- * 2026-08-15 against `codex exec --json` on a ChatGPT-account (subscription)
132
- * transport, every explicitly named candidate was refused with
133
- * `400 invalid_request_error: The '<model>' model is not supported when using
134
- * Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
135
- * value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
136
- *
137
- * So the only value known to work on this transport is "whatever the CLI
138
- * chooses", and pinning ANY name here would re-break the seat the next time
139
- * the vendor rotates its lineup. The label is carried into records as-is so a
140
- * reader can see that no model was pinned, rather than a name being implied
141
- * that nobody verified.
142
- */
143
- export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';
128
+ // `OPENAI_CLI_VENDOR_DEFAULT` lives in `vendor_defaults.ts`, re-exported here
129
+ // so every existing importer keeps resolving. It moved because `config.ts`
130
+ // wanted that one string and was charged this whole module for it in the
131
+ // composed hook bundle — 51,523 bytes on every dispatch; the reasoning and the
132
+ // measurement are in that file's header.
133
+ export { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
144
134
 
145
135
  /**
146
136
  * Models MEASURED to be refused by the codex subscription transport, with the
@@ -1011,6 +1001,7 @@ export const CLI_CALLS_FILENAME = 'cli-calls.json';
1011
1001
  export {
1012
1002
  CLI_CALLS_ATTRIBUTION_SUFFIX,
1013
1003
  CLI_CONSUMER_COUNCIL,
1004
+ CLI_CONSUMER_SELF_REVIEW,
1014
1005
  CLI_CONSUMER_TEAM,
1015
1006
  CLI_CONSUMER_UNKNOWN,
1016
1007
  QUOTA_SOURCE_LOCAL_BUDGET,
@@ -1678,16 +1669,22 @@ export function _foldSystemPrompt(system_prompt: string, user_prompt: string): s
1678
1669
  export class AnthropicCliClient extends CliClient {
1679
1670
  override subscription_label = 'claude-pro';
1680
1671
 
1672
+ // `...opts` rather than a field list, in all five CLI subclasses, and the
1673
+ // spread IS the fix rather than a tidy. Each of these constructors used to
1674
+ // name six option fields explicitly and forward those — so when
1675
+ // `CliClientOptions` grew a seventh, `consumer`, every subclass silently
1676
+ // dropped it. Both construction sites passed it, `CliClient` read
1677
+ // `opts.consumer ?? CLI_CONSUMER_UNKNOWN`, and the sidecar recorded
1678
+ // `unknown` for every CLI call ever booked: measured 2026-10-05 as
1679
+ // `{"anthropic":{"unknown":2},"openai":{"unknown":2}}` after a council
1680
+ // round. A field list can forget a field. A spread cannot, so the eighth
1681
+ // option needs no edit here and cannot repeat this.
1682
+ //
1683
+ // `model` stays explicit because it is the one field each subclass
1684
+ // overrides with its own pinned default; everything else passes through.
1681
1685
  constructor(opts: CliClientOptions = {}) {
1682
1686
  super(
1683
- {
1684
- model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL,
1685
- binary: opts.binary,
1686
- timeout_seconds: opts.timeout_seconds,
1687
- max_calls_per_day: opts.max_calls_per_day,
1688
- warn_at: opts.warn_at,
1689
- cli_calls_path: opts.cli_calls_path,
1690
- },
1687
+ { ...opts, model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL },
1691
1688
  { name: 'anthropic', default_binary: 'claude' },
1692
1689
  );
1693
1690
  }
@@ -1817,14 +1814,7 @@ export class OpenAICliClient extends CliClient {
1817
1814
 
1818
1815
  constructor(opts: CliClientOptions = {}) {
1819
1816
  super(
1820
- {
1821
- model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL,
1822
- binary: opts.binary,
1823
- timeout_seconds: opts.timeout_seconds,
1824
- max_calls_per_day: opts.max_calls_per_day,
1825
- warn_at: opts.warn_at,
1826
- cli_calls_path: opts.cli_calls_path,
1827
- },
1817
+ { ...opts, model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL },
1828
1818
  { name: 'openai', default_binary: 'codex' },
1829
1819
  );
1830
1820
  }
@@ -2064,14 +2054,7 @@ export class GeminiCliClient extends CliClient {
2064
2054
 
2065
2055
  constructor(opts: CliClientOptions = {}) {
2066
2056
  super(
2067
- {
2068
- model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL,
2069
- binary: opts.binary,
2070
- timeout_seconds: opts.timeout_seconds,
2071
- max_calls_per_day: opts.max_calls_per_day,
2072
- warn_at: opts.warn_at,
2073
- cli_calls_path: opts.cli_calls_path,
2074
- },
2057
+ { ...opts, model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL },
2075
2058
  { name: 'gemini', default_binary: 'gemini' },
2076
2059
  );
2077
2060
  }
@@ -2217,14 +2200,7 @@ export class XAICliClient extends CliClient {
2217
2200
 
2218
2201
  constructor(opts: CliClientOptions = {}) {
2219
2202
  super(
2220
- {
2221
- model: opts.model ?? DEFAULT_XAI_MODEL,
2222
- binary: opts.binary,
2223
- timeout_seconds: opts.timeout_seconds,
2224
- max_calls_per_day: opts.max_calls_per_day,
2225
- warn_at: opts.warn_at,
2226
- cli_calls_path: opts.cli_calls_path,
2227
- },
2203
+ { ...opts, model: opts.model ?? DEFAULT_XAI_MODEL },
2228
2204
  { name: 'xai', default_binary: 'grok' },
2229
2205
  );
2230
2206
  }
@@ -2289,14 +2265,7 @@ export class PerplexityCliClient extends CliClient {
2289
2265
 
2290
2266
  constructor(opts: CliClientOptions = {}) {
2291
2267
  super(
2292
- {
2293
- model: opts.model ?? DEFAULT_PERPLEXITY_MODEL,
2294
- binary: opts.binary,
2295
- timeout_seconds: opts.timeout_seconds,
2296
- max_calls_per_day: opts.max_calls_per_day,
2297
- warn_at: opts.warn_at,
2298
- cli_calls_path: opts.cli_calls_path,
2299
- },
2268
+ { ...opts, model: opts.model ?? DEFAULT_PERPLEXITY_MODEL },
2300
2269
  { name: 'perplexity', default_binary: 'perplexity' },
2301
2270
  );
2302
2271
  }
@@ -82,7 +82,7 @@ import * as budget from './cli_call_budget.js';
82
82
  // `import type` and is erased at build, so there is no runtime cycle today.
83
83
  // Converting it to a value import — or adding any other runtime import from
84
84
  // quorum into config — creates a real ESM cycle in the loader's init path.
85
- import { OPENAI_CLI_VENDOR_DEFAULT } from './clients.js';
85
+ import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
86
86
  import { parseSeatFields, type PolicyExclusion } from './seat_policy.js';
87
87
  import type { ContentClass } from './content_ceiling.js';
88
88
  import { SOLO_FLOOR_MIN_PRESENT } from './quorum.js';
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Vendor-CLI sentinel values that are DATA, carried in a module with no
3
+ * dependencies of its own.
4
+ *
5
+ * WHY THIS FILE EXISTS, measured rather than argued. `OPENAI_CLI_VENDOR_DEFAULT`
6
+ * is a single string, and it used to live in `clients.ts` beside the transport
7
+ * classes that compare against it. `ai_council/config.ts` imports that one
8
+ * string and nothing else from `clients.ts`; `config.ts` is reachable from
9
+ * `council-availability`, which is bound on `session_start`. So every hook
10
+ * dispatch on every slot carried the whole council transport layer —
11
+ * `clients.ts` and its closure, **51,523 bytes** of the composed
12
+ * `dist/hooks/dispatch.js` — to compare one string against another. Breaking
13
+ * that one import edge removes exactly that, with no capability removed
14
+ * anywhere: every entry point that actually talks to a vendor CLI imports
15
+ * `clients.ts` directly and still does.
16
+ *
17
+ * The bytes are not an abstraction. `src/config/hook-bundle-budget.json` caps
18
+ * the composed bundle, the cap is a shrink-only ratchet, and on 2026-10-02 the
19
+ * tree stood 75 bytes under it — a state in which no concern anywhere could add
20
+ * a line. This module is how `road-to-a-rule-carrier-that-works-outside-the-repo`
21
+ * Phase 1 paid for its own runtime code instead of asking for a raise.
22
+ *
23
+ * WHAT BELONGS HERE: a vendor-facing constant that a CONFIGURATION reader needs
24
+ * and a TRANSPORT reader also happens to use. Nothing that imports anything.
25
+ * The moment this file gains an import it stops being the cheap half of the
26
+ * split and the split stops being worth its own file.
27
+ */
28
+
29
+ /**
30
+ * Sentinel: let the codex CLI pick its own model, by omitting `--model`.
31
+ *
32
+ * This is not a placeholder for a value nobody looked up. Measured
33
+ * 2026-08-15 against `codex exec --json` on a ChatGPT-account (subscription)
34
+ * transport, every explicitly named candidate was refused with
35
+ * `400 invalid_request_error: The '<model>' model is not supported when using
36
+ * Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
37
+ * value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
38
+ *
39
+ * So the only value known to work on this transport is "whatever the CLI
40
+ * chooses", and pinning ANY name here would re-break the seat the next time
41
+ * the vendor rotates its lineup. The label is carried into records as-is so a
42
+ * reader can see that no model was pinned, rather than a name being implied
43
+ * that nobody verified.
44
+ */
45
+ export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';
@@ -37,6 +37,10 @@
37
37
  * shape of an Apache-2.0 upstream — attribution in the repo-root NOTICE file.
38
38
  */
39
39
  import { spawnSync } from 'node:child_process';
40
+ // read-surface: inter-agent-reply — a teammate's reply arrives through a HOST
41
+ // primitive this package does not own, so no call site here spells the inbound
42
+ // fetch. Declared rather than inferred; the coverage verdict is still read from
43
+ // the import below.
40
44
  import { sanitize_text } from '../_lib/retrieval_sanitize.js';
41
45
  import * as fs from 'node:fs';
42
46
  import * as path from 'node:path';