@event4u/agent-config 14.12.0 → 14.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +118 -155
  5. package/CONTRIBUTING.md +38 -0
  6. package/CREDITS.md +135 -0
  7. package/NOTICE +13 -0
  8. package/README.md +8 -6
  9. package/dist/agent-src/commands/analyze/inbox.md +145 -2
  10. package/dist/agent-src/commands/feature/dev.md +7 -2
  11. package/dist/agent-src/commands/ghostwriter/write.md +5 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  14. package/dist/agent-src/commands/orchestrate.md +2 -2
  15. package/dist/agent-src/commands/post-as/me.md +5 -1
  16. package/dist/agent-src/commands/pr/merge.md +19 -6
  17. package/dist/agent-src/commands/roadmap/process-full.md +19 -5
  18. package/dist/agent-src/commands/tdd/red.md +12 -2
  19. package/dist/agent-src/commands/work.md +1 -1
  20. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
  21. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
  22. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
  23. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
  24. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  25. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  26. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  27. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  28. package/dist/agent-src/rules/broken-access-control.md +4 -0
  29. package/dist/agent-src/rules/code-comment-discipline.md +6 -0
  30. package/dist/agent-src/rules/code-provenance.md +4 -0
  31. package/dist/agent-src/rules/design-fidelity.md +1 -1
  32. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  33. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  34. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  35. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  36. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  37. package/dist/agent-src/rules/laravel-routing.md +1 -1
  38. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  39. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  40. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  41. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  42. package/dist/agent-src/rules/symfony-routing.md +1 -1
  43. package/dist/agent-src/rules/token-efficiency.md +14 -0
  44. package/dist/agent-src/rules/tool-safety.md +4 -0
  45. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  46. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
  47. package/dist/agent-src/scripts/guarded_baseline.ts +343 -0
  48. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  49. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  50. package/dist/agent-src/scripts/stubs_due.ts +516 -0
  51. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  52. package/dist/agent-src/scripts/update_roadmap_progress.ts +16 -12
  53. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  54. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  55. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  56. package/dist/agent-src/skills/database/SKILL.md +8 -0
  57. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  58. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  59. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  60. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  61. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  62. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  63. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  64. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  65. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  66. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  67. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  68. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  69. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  70. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  71. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  72. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  73. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  74. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  75. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  76. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  77. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  78. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  79. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  80. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  81. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  82. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  83. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  84. package/dist/agent-src/templates/roadmaps.md +97 -3
  85. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  86. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  87. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  88. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  93. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  94. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  95. package/dist/cli/commands/uiAudit.js +124 -5
  96. package/dist/cli/registry.js +2 -0
  97. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  98. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  99. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  100. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  101. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  102. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  103. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  104. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  105. package/dist/cli-delegate/cmd_conformance.js +80 -11
  106. package/dist/cli-delegate/cmd_doctor.js +3 -3
  107. package/dist/cli-delegate/cmd_export.js +3 -2
  108. package/dist/cli-delegate/cmd_fleet.js +2 -2
  109. package/dist/cli-delegate/cmd_handoff.js +1 -1
  110. package/dist/cli-delegate/cmd_preflight.js +2 -2
  111. package/dist/cli-delegate/cmd_prune.js +3 -2
  112. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  113. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  114. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  115. package/dist/cli-delegate/cmd_sync.js +3 -2
  116. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  117. package/dist/cli-delegate/cmd_validate.js +3 -2
  118. package/dist/discovery/deprecation-report.md +1 -1
  119. package/dist/discovery/discovery-manifest.json +58 -58
  120. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  121. package/dist/discovery/discovery-manifest.summary.md +1 -1
  122. package/dist/discovery/dormancy-report.md +1 -1
  123. package/dist/discovery/orphan-report.md +1 -1
  124. package/dist/discovery/packs.json +2 -2
  125. package/dist/discovery/trust-report.md +1 -1
  126. package/dist/discovery/workspaces.json +2 -2
  127. package/dist/hooks/dispatch.js +2900 -1049
  128. package/dist/install/claudeRuleRewrite.js +254 -0
  129. package/dist/install/detect.js +29 -16
  130. package/dist/install/detect_php_shape.js +159 -0
  131. package/dist/install/install.mjs +634 -428
  132. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  133. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  134. package/dist/mcp/registry-manifest.json +3 -3
  135. package/dist/mcp/server.json +3 -3
  136. package/dist/mcp/server.mjs +4895 -2627
  137. package/dist/server/schemas/settings.js +3 -0
  138. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  139. package/dist/ui/index.html +1 -1
  140. package/docs/MIGRATION.md +1 -1
  141. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  142. package/docs/contracts/provider-lifecycle.md +1 -1
  143. package/docs/contracts/settings-classes.md +10 -4
  144. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  145. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  146. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  147. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  148. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  149. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  150. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  151. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  152. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  153. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  154. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  155. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  156. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  157. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  158. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  159. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  160. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  161. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  162. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  163. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  164. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  165. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  166. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  167. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  168. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  169. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  170. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  171. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  172. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  173. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  174. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  175. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  176. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  177. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  178. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  179. package/docs/guidelines/augment-portability-patterns.md +6 -4
  180. package/docs/guidelines/code-clarity.md +18 -0
  181. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  182. package/docs/guidelines/cross-role-handoff.md +2 -2
  183. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  184. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  185. package/docs/guidelines/php/database.md +90 -7
  186. package/docs/guidelines/prompt-templates.md +7 -7
  187. package/llms.txt +2 -2
  188. package/package.json +5 -2
  189. package/src/agent-src/scripts/archive_completed_roadmaps.ts +252 -8
  190. package/src/agent-src/scripts/guarded_baseline.ts +343 -0
  191. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  192. package/src/agent-src/scripts/stub_queue.ts +82 -0
  193. package/src/agent-src/scripts/stubs_due.ts +516 -0
  194. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  195. package/src/agent-src/scripts/update_roadmap_progress.ts +16 -12
  196. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  197. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  198. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  199. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  202. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  203. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  204. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  205. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  206. package/src/config/agent-settings.template.yml +32 -3
  207. package/src/config/assurance-capability-registry.json +21 -9
  208. package/src/config/canonical-terms.yml +119 -0
  209. package/src/config/capability-native-outcome-bars.json +81 -0
  210. package/src/config/ci-local-parity.yml +80 -0
  211. package/src/config/drafting-channels.yml +43 -0
  212. package/src/config/estate-count-budget.json +57 -36
  213. package/src/config/evaluator-budgets.json +14 -14
  214. package/src/config/gate-coverage.yml +729 -63
  215. package/src/config/gate-reachability-exemptions.json +21 -0
  216. package/src/config/gate-violation-baselines.json +42 -19
  217. package/src/config/harness-evolution-budget.json +25 -0
  218. package/src/config/lapsed-beta-baseline.json +96 -0
  219. package/src/config/memory-twin-verdicts.yml +129 -0
  220. package/src/config/metric-registry.yml +124 -0
  221. package/src/config/pack-size-budget.json +16 -15
  222. package/src/config/preamble-payload-budget.json +12 -4
  223. package/src/config/profiles/balanced.ini +27 -0
  224. package/src/config/profiles/full.ini +27 -0
  225. package/src/config/profiles/minimal.ini +27 -0
  226. package/src/config/publish-surface.json +9 -2
  227. package/src/config/routing-coverage-seed.json +16 -2
  228. package/src/config/rule-stub-ceilings.json +133 -112
  229. package/src/config/turnaround-budget.json +66 -0
  230. package/src/install/claudeRuleRewrite.ts +288 -0
  231. package/src/install/detect.ts +60 -17
  232. package/src/install/detect_php_shape.ts +191 -0
  233. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  234. package/src/scripts/_dispatch.bash +23 -0
  235. package/src/scripts/_lib/activation_ladder.ts +255 -0
  236. package/src/scripts/_lib/activation_receipt_producer.ts +341 -0
  237. package/src/scripts/_lib/activation_states.ts +88 -0
  238. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  239. package/src/scripts/_lib/adr_frontmatter.ts +26 -0
  240. package/src/scripts/_lib/arith_claims.ts +181 -0
  241. package/src/scripts/_lib/arm_ranking.ts +62 -0
  242. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  243. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  244. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  245. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  246. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  247. package/src/scripts/_lib/candidate_pair_delta.ts +349 -0
  248. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  249. package/src/scripts/_lib/candidate_record.ts +601 -0
  250. package/src/scripts/_lib/capture_rate.ts +319 -0
  251. package/src/scripts/_lib/carrier_status.ts +118 -0
  252. package/src/scripts/_lib/cascade_stage_enumeration.ts +92 -0
  253. package/src/scripts/_lib/collector_denominator.ts +771 -0
  254. package/src/scripts/_lib/collector_record.ts +340 -0
  255. package/src/scripts/_lib/collector_store.ts +664 -0
  256. package/src/scripts/_lib/collector_supervision.ts +827 -0
  257. package/src/scripts/_lib/concern_estate.ts +77 -0
  258. package/src/scripts/_lib/config_chain.ts +477 -0
  259. package/src/scripts/_lib/config_cost.ts +209 -0
  260. package/src/scripts/_lib/corpus_manifest.ts +726 -0
  261. package/src/scripts/_lib/council_settings_block.ts +6 -0
  262. package/src/scripts/_lib/curator_ops.ts +172 -0
  263. package/src/scripts/_lib/delivery_arm_experiment.ts +282 -0
  264. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  265. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  266. package/src/scripts/_lib/empty_cycles.ts +88 -0
  267. package/src/scripts/_lib/estate_carrier_cases.ts +72 -0
  268. package/src/scripts/_lib/eval_publication.ts +354 -0
  269. package/src/scripts/_lib/evaluation_cascade.ts +452 -0
  270. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  271. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  272. package/src/scripts/_lib/evidence_basis.ts +118 -0
  273. package/src/scripts/_lib/evolution_roi.ts +562 -0
  274. package/src/scripts/_lib/exec_evidence.ts +8 -0
  275. package/src/scripts/_lib/experience_card.ts +272 -0
  276. package/src/scripts/_lib/experience_report.ts +151 -0
  277. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  278. package/src/scripts/_lib/generated_by.ts +66 -0
  279. package/src/scripts/_lib/harness_evolution_guards.ts +239 -0
  280. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  281. package/src/scripts/_lib/host_denominator.ts +687 -0
  282. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  283. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  284. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  285. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  286. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  287. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  288. package/src/scripts/_lib/lexical_shortlist.ts +215 -0
  289. package/src/scripts/_lib/llm_candidate_proposer.ts +461 -0
  290. package/src/scripts/_lib/llm_proposer_transport.ts +153 -0
  291. package/src/scripts/_lib/loop_guards.ts +299 -0
  292. package/src/scripts/_lib/loss_class.ts +129 -0
  293. package/src/scripts/_lib/machine_wake.ts +51 -0
  294. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  295. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  296. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  297. package/src/scripts/_lib/orchestration_record.ts +253 -5
  298. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  299. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  300. package/src/scripts/_lib/paired_stats.ts +245 -0
  301. package/src/scripts/_lib/paired_verdict.ts +226 -0
  302. package/src/scripts/_lib/pathology_archive.ts +393 -0
  303. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  304. package/src/scripts/_lib/privacy_class.ts +47 -0
  305. package/src/scripts/_lib/promotion_capability.ts +315 -0
  306. package/src/scripts/_lib/promotion_evidence.ts +414 -0
  307. package/src/scripts/_lib/promotion_review.ts +294 -0
  308. package/src/scripts/_lib/prompt_shape.ts +92 -0
  309. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  310. package/src/scripts/_lib/release_highlights.ts +70 -1
  311. package/src/scripts/_lib/release_material.ts +125 -2
  312. package/src/scripts/_lib/repeated_failure.ts +105 -0
  313. package/src/scripts/_lib/repo_root.ts +111 -0
  314. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  315. package/src/scripts/_lib/role_split.ts +338 -0
  316. package/src/scripts/_lib/routing_corpus.ts +307 -0
  317. package/src/scripts/_lib/routing_index_input.ts +104 -0
  318. package/src/scripts/_lib/rule_injection.ts +22 -1
  319. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  320. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  321. package/src/scripts/_lib/semantic_noop.ts +167 -0
  322. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  323. package/src/scripts/_lib/source_digest.ts +200 -0
  324. package/src/scripts/_lib/source_redact.ts +260 -0
  325. package/src/scripts/_lib/source_shape.ts +502 -0
  326. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  327. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  328. package/src/scripts/_lib/strip_comments.mjs +65 -0
  329. package/src/scripts/_lib/test_red_state.ts +154 -0
  330. package/src/scripts/_lib/trigger_shift.ts +144 -0
  331. package/src/scripts/_lib/untrusted_content.ts +82 -7
  332. package/src/scripts/activation_receipt.ts +258 -0
  333. package/src/scripts/adoption_report.ts +1 -1
  334. package/src/scripts/adr/evidence_census.ts +1 -1
  335. package/src/scripts/adr/regenerate_index.ts +26 -2
  336. package/src/scripts/adr_cite_check.ts +164 -1
  337. package/src/scripts/ai_council/blind_review.ts +11 -1
  338. package/src/scripts/ai_council/clients.ts +4 -0
  339. package/src/scripts/ai_council/config.ts +3 -0
  340. package/src/scripts/ai_council/consensus.ts +28 -8
  341. package/src/scripts/ai_council/consensus_round.ts +226 -0
  342. package/src/scripts/ai_council/cross_exam.ts +128 -0
  343. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  344. package/src/scripts/ai_council/explain_route.ts +157 -0
  345. package/src/scripts/ai_council/information_gain.ts +293 -0
  346. package/src/scripts/ai_council/inline_findings.ts +340 -0
  347. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  348. package/src/scripts/ai_council/leakage_corpus.ts +385 -0
  349. package/src/scripts/ai_council/leakage_patterns.ts +453 -0
  350. package/src/scripts/ai_council/minority_retention.ts +171 -0
  351. package/src/scripts/ai_council/orchestrator.ts +16 -203
  352. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  353. package/src/scripts/ai_council/pricing.ts +106 -0
  354. package/src/scripts/ai_council/prompts.ts +74 -7
  355. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  356. package/src/scripts/ai_council/py_format.ts +14 -3
  357. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  358. package/src/scripts/ai_council/recouncil_savings.ts +299 -0
  359. package/src/scripts/ai_council/replay_route.ts +223 -0
  360. package/src/scripts/ai_council/response_record.ts +50 -0
  361. package/src/scripts/ai_council/reviewer_assignment.ts +279 -0
  362. package/src/scripts/ai_council/routing_training_row.ts +197 -0
  363. package/src/scripts/ai_council/synthesis_strategy.ts +159 -0
  364. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  365. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  366. package/src/scripts/asset_delivery_ledger.ts +157 -0
  367. package/src/scripts/attest_artifact.ts +193 -0
  368. package/src/scripts/audit_auto_rules.ts +2 -1
  369. package/src/scripts/audit_command_surface.ts +1 -1
  370. package/src/scripts/audit_mcp_tools.ts +2 -2
  371. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  372. package/src/scripts/audit_user_type_axis.ts +2 -1
  373. package/src/scripts/bench_ab_clone.ts +215 -10
  374. package/src/scripts/bench_ab_integrity.ts +119 -5
  375. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  376. package/src/scripts/build_archive_index.ts +1 -1
  377. package/src/scripts/build_linear_digest.ts +1 -1
  378. package/src/scripts/build_proof.ts +11 -4
  379. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  380. package/src/scripts/build_source_digests.ts +157 -0
  381. package/src/scripts/cache_realization_report.ts +103 -0
  382. package/src/scripts/check_adr_frontmatter.ts +131 -10
  383. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  384. package/src/scripts/check_beta_review_markers.ts +235 -6
  385. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  386. package/src/scripts/check_claims.ts +576 -6
  387. package/src/scripts/check_composite_arming.ts +35 -0
  388. package/src/scripts/check_concern_admissions.ts +365 -0
  389. package/src/scripts/check_enforcement_coverage.ts +28 -0
  390. package/src/scripts/check_estate_count.ts +347 -25
  391. package/src/scripts/check_gate_reachability.ts +383 -0
  392. package/src/scripts/check_host_loadability.ts +104 -0
  393. package/src/scripts/check_loss_class_declared.ts +308 -0
  394. package/src/scripts/check_md_language.ts +15 -98
  395. package/src/scripts/check_memory_proposal.ts +18 -11
  396. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  397. package/src/scripts/check_no_external_sources.ts +281 -6
  398. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  399. package/src/scripts/check_pack_size.ts +59 -2
  400. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  401. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  402. package/src/scripts/check_publish_surface.ts +10 -1
  403. package/src/scripts/check_references.ts +24 -1
  404. package/src/scripts/check_release_highlights.ts +96 -13
  405. package/src/scripts/check_roadmap_trackable.ts +17 -2
  406. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  407. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  408. package/src/scripts/check_score_contract.ts +26 -3
  409. package/src/scripts/check_static_parity.ts +285 -0
  410. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  411. package/src/scripts/check_suppression_hygiene.ts +15 -0
  412. package/src/scripts/ci_settle.ts +39 -2
  413. package/src/scripts/code_graph/build.ts +60 -3
  414. package/src/scripts/code_graph/extract.ts +44 -0
  415. package/src/scripts/code_graph/types.ts +24 -0
  416. package/src/scripts/collector_daemon.ts +714 -0
  417. package/src/scripts/config_cost_report.ts +302 -0
  418. package/src/scripts/consumer_matrix.ts +74 -1
  419. package/src/scripts/corpus_manifest.ts +235 -0
  420. package/src/scripts/cost/budget.mjs +10 -3
  421. package/src/scripts/cost/track.mjs +10 -3
  422. package/src/scripts/council_cli.ts +37 -54
  423. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  424. package/src/scripts/evolution_lab.ts +1153 -0
  425. package/src/scripts/external_sources_denylist.json +5 -18
  426. package/src/scripts/extract_audit_patterns.ts +21 -0
  427. package/src/scripts/fold_intake.ts +12 -1
  428. package/src/scripts/gen_discovery_baseline.ts +1 -1
  429. package/src/scripts/generate_capabilities_index.ts +12 -5
  430. package/src/scripts/generate_capability_matrix.ts +3 -3
  431. package/src/scripts/generate_command_flows.ts +2 -2
  432. package/src/scripts/generate_cookbook.ts +2 -2
  433. package/src/scripts/generate_index.ts +8 -1
  434. package/src/scripts/generate_knowledge_index.ts +2 -1
  435. package/src/scripts/generate_ownership_matrix.ts +2 -1
  436. package/src/scripts/generate_pack_manifests.ts +10 -2
  437. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  438. package/src/scripts/generate_settings_reference.ts +1 -1
  439. package/src/scripts/git_authorization_hook.ts +22 -1
  440. package/src/scripts/grade_target_readiness.ts +48 -5
  441. package/src/scripts/hook_effect_doctor.ts +261 -0
  442. package/src/scripts/hook_manifest.json +1 -1
  443. package/src/scripts/hook_manifest.yaml +125 -16
  444. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  445. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  446. package/src/scripts/hooks/comment_discipline_hook.ts +146 -0
  447. package/src/scripts/hooks/concern_registry.ts +6 -0
  448. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  449. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  450. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  451. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  452. package/src/scripts/hooks/shims/install.sh +61 -0
  453. package/src/scripts/hooks/shims/php +101 -0
  454. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  455. package/src/scripts/hooks/turn_end_gate_hook.ts +9 -1
  456. package/src/scripts/hot_context_hook.ts +16 -0
  457. package/src/scripts/install-hooks.sh +20 -5
  458. package/src/scripts/install.ts +17 -35
  459. package/src/scripts/inventory_frontmatter.ts +2 -1
  460. package/src/scripts/language_mirror_hook.ts +14 -2
  461. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  462. package/src/scripts/lint_canonical_terms.ts +604 -0
  463. package/src/scripts/lint_carrier_integrity.ts +820 -0
  464. package/src/scripts/lint_code_comments.ts +643 -0
  465. package/src/scripts/lint_composition_review.ts +619 -0
  466. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  467. package/src/scripts/lint_eval_specs.ts +593 -0
  468. package/src/scripts/lint_hook_manifest.ts +19 -0
  469. package/src/scripts/lint_host_portability.ts +373 -0
  470. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  471. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  472. package/src/scripts/lint_metric_consumers.ts +355 -0
  473. package/src/scripts/lint_plan_risk_register.ts +39 -19
  474. package/src/scripts/lint_promotion_paths.ts +779 -0
  475. package/src/scripts/lint_skill_descriptions.ts +18 -1
  476. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  477. package/src/scripts/lint_skill_link_reach.ts +252 -0
  478. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  479. package/src/scripts/lint_ticket_buildable.ts +17 -1
  480. package/src/scripts/llm_propose.ts +256 -0
  481. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  482. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  483. package/src/scripts/measure_delivery_sets.ts +361 -0
  484. package/src/scripts/measure_docs_dead_links.ts +348 -0
  485. package/src/scripts/measure_host_capture.ts +461 -0
  486. package/src/scripts/measure_routing_signal.ts +307 -0
  487. package/src/scripts/migration_status.ts +3 -3
  488. package/src/scripts/model_rule_injection.ts +76 -0
  489. package/src/scripts/orchestration_record.ts +14 -0
  490. package/src/scripts/preamble_byte_census.ts +139 -10
  491. package/src/scripts/prepack-check.mjs +4 -1
  492. package/src/scripts/probe_council_retention.ts +495 -0
  493. package/src/scripts/probe_turnaround.ts +384 -0
  494. package/src/scripts/probe_unblocked_ask.ts +279 -0
  495. package/src/scripts/release.ts +21 -37
  496. package/src/scripts/release_drill.ts +143 -0
  497. package/src/scripts/release_env.ts +35 -0
  498. package/src/scripts/release_publication.ts +84 -0
  499. package/src/scripts/render_benchmark_md.ts +1 -1
  500. package/src/scripts/rule_activation_census.ts +70 -9
  501. package/src/scripts/rule_backlinks.ts +1 -1
  502. package/src/scripts/run_lifecycle_suite.ts +208 -0
  503. package/src/scripts/run_skill_evals.ts +40 -0
  504. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  505. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  506. package/src/scripts/schemas/evals.schema.json +24 -1
  507. package/src/scripts/schemas/rule.schema.json +52 -1
  508. package/src/scripts/schemas/skill.schema.json +17 -2
  509. package/src/scripts/skill_overlap.ts +7 -1
  510. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  511. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  512. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  513. package/src/scripts/skill_usage_report.ts +2 -1
  514. package/src/scripts/stubs_due.ts +211 -0
  515. package/src/scripts/sweep_source_surfaces.ts +678 -0
  516. package/src/scripts/sync_pr_branch.ts +3 -3
  517. package/src/scripts/trigger_eval_grandfather.json +202 -222
  518. package/src/scripts/utilization_report.ts +22 -2
  519. package/src/server/schemas/settings.ts +5 -0
  520. package/src/templates/marketing-copy.yml +1 -1
  521. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -12,8 +12,8 @@
12
12
  * `urp.collect()` completion criterion, and exit code 0. snake_case kept.
13
13
  *
14
14
  * A roadmap that has reached `count_open == 0` and `count_deferred == 0` is
15
- * **complete**. This sweep moves it to `agents/roadmaps/archive/`, rewrites
16
- * inbound references (`agents/roadmaps/<x>.md` → `agents/roadmaps/archive/<x>.md`)
15
+ * **complete**. This sweep moves it to `agents/roadmaps/archive/`, rewrites code-comment-allow provenance-comment -- the sweep's own operand
16
+ * inbound references (`agents/roadmaps/<x>.md` → `agents/roadmaps/archive/<x>.md`) code-comment-allow provenance-comment -- the rewrite this sweep performs
17
17
  * across tracked files so links never break, and regenerates the dashboard.
18
18
  *
19
19
  * It replaces the old **merge-gate** (keep one item open + a manual post-merge
@@ -59,6 +59,7 @@ import process from 'node:process';
59
59
  import { fileURLToPath, pathToFileURL } from 'node:url';
60
60
 
61
61
  import { collect } from './update_roadmap_progress.js';
62
+ import { guardedBaselineProblems, parseGuardedBaselines } from './guarded_baseline.js';
62
63
 
63
64
  const _HERE = fileURLToPath(import.meta.url);
64
65
 
@@ -135,7 +136,7 @@ function _branch_touched_paths(root: string, base: string): Set<string> | null {
135
136
  *
136
137
  * Two classes, and the second is why this predicate exists at all:
137
138
  *
138
- * - `agents/evidence/**` — a committed record of what was true, or of what a
139
+ * - `agents/evidence/**` — a committed record of what was true, or of what a code-comment-allow provenance-comment -- the predicate's operand set
139
140
  * reviewer was shown, at one point in time. Retroactively editing it makes it
140
141
  * claim something that did not happen, which is the failure
141
142
  * `evaluator-independence` exists to prevent ("the prompt ships with the
@@ -144,8 +145,8 @@ function _branch_touched_paths(root: string, base: string): Set<string> | null {
144
145
  * the payload. Rewriting them detaches the patch from the commit it records
145
146
  * AND makes `git apply` target a path the diff never created.
146
147
  *
147
- * Measured 2026-08-11: archiving one roadmap rewrote four frozen artefacts
148
- * under `agents/evidence/reviews/`, including the `diff.patch` headers of a
148
+ * Measured 2026-08-11: archiving one roadmap rewrote four frozen artifacts
149
+ * under `agents/evidence/reviews/`, including the `diff.patch` headers of a code-comment-allow provenance-comment -- names what the predicate protects
149
150
  * recorded review input. Nothing caught it — the sweep reported it as
150
151
  * "4 ref(s) migrated", which reads like success.
151
152
  */
@@ -311,7 +312,202 @@ interface ArchiveRecord {
311
312
  refs_migrated: string[];
312
313
  }
313
314
 
314
- /** Archive every complete active roadmap (count_open==0, count_deferred==0). */
315
+
316
+ /** One `[~]` step and whatever resolution annotation follows it. */
317
+ export interface DeferredItem {
318
+ /** The step text, trimmed, for the operator message. */
319
+ text: string;
320
+ /** `carried-to` / `merged-into`, or `null` when no annotation was found. */
321
+ kind: 'carried-to' | 'merged-into' | null;
322
+ /** Destination roadmap slug, or `null`. */
323
+ destination: string | null;
324
+ }
325
+
326
+ /**
327
+ * `<!-- deferred-resolution: carried-to=<slug> -->` — the resolved-deferral
328
+ * annotation. `merged-into=<slug>` is the second accepted form.
329
+ */
330
+ const DEFERRED_RESOLUTION_RE = /<!--\s*deferred-resolution:\s*(carried-to|merged-into)\s*=\s*([A-Za-z0-9._-]+)\s*-->/;
331
+
332
+ /** `- [~] …` — a deferred step, at any indent, with `-` or `*`. */
333
+ const DEFERRED_STEP_RE = /^[ \t]*[-*][ \t]+\[~\][ \t]*(.*)$/;
334
+ /** Any other checkbox, or a heading — where a step's block ends. */
335
+ const BLOCK_END_RE = /^[ \t]*[-*][ \t]+\[[ xX~-]\]|^#{1,6}[ \t]/;
336
+
337
+ /** Escape a string for literal use inside a `RegExp`. */
338
+ function _escapeRe(v: string): string {
339
+ return v.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
340
+ }
341
+
342
+ /**
343
+ * Does this frontmatter declare a `relates:` row naming `slug`?
344
+ *
345
+ * Structured, not textual: the slug has to appear as a `- slug: <name>` row or a
346
+ * bare `- <name>` item inside the `relates:` block, which is a declaration the
347
+ * author made deliberately. A mention anywhere else in the file does not count.
348
+ */
349
+ export function _relatesTo(text: string, slug: string): boolean {
350
+ const lines = text.split('\n');
351
+ const start = lines.findIndex((l) => /^relates:/.test(l));
352
+ if (start === -1) return false;
353
+ const re = new RegExp(`^\\s*-\\s*(slug:\\s*)?${_escapeRe(slug)}\\s*$`);
354
+ for (let i = start + 1; i < lines.length; i++) {
355
+ const line = lines[i] as string;
356
+ if (/^\S/.test(line)) break;
357
+ if (re.test(line)) return true;
358
+ }
359
+ return false;
360
+ }
361
+
362
+ /** Every `[~]` step in a roadmap, with the annotation that follows it (if any). */
363
+ export function parseDeferredItems(text: string): DeferredItem[] {
364
+ const lines = text.split('\n');
365
+ const out: DeferredItem[] = [];
366
+ for (let i = 0; i < lines.length; i++) {
367
+ const m = DEFERRED_STEP_RE.exec(lines[i] as string);
368
+ if (m === null) continue;
369
+ // The annotation may sit on the step line itself or anywhere in the
370
+ // step's continuation block, which ends at the next checkbox or heading.
371
+ let block = lines[i] as string;
372
+ for (let j = i + 1; j < lines.length; j++) {
373
+ if (BLOCK_END_RE.test(lines[j] as string)) break;
374
+ block += '\n' + (lines[j] as string);
375
+ }
376
+ const a = DEFERRED_RESOLUTION_RE.exec(block);
377
+ out.push({
378
+ text: (m[1] ?? '').trim().slice(0, 120),
379
+ kind: a === null ? null : (a[1] as 'carried-to' | 'merged-into'),
380
+ destination: a === null ? null : (a[2] as string),
381
+ });
382
+ }
383
+ return out;
384
+ }
385
+
386
+ /**
387
+ * Decide whether a roadmap's `[~]` items are RESOLVED, per the AI council of
388
+ * 2026-08-27 (2 seats, convergent on option (c)).
389
+ *
390
+ * Iron Law 3 says a deferral must be resolved before archival, and the
391
+ * preservation test routes four dispositions to the council — but three of them
392
+ * (carry to a follow-up, merge into existing work, restore to open) leave the
393
+ * `[~]` glyph in place, and this sweep used to require `deferred === 0`
394
+ * unconditionally. So a genuinely UNEXECUTABLE item — one needing elapsed time
395
+ * rather than effort — had no council-reachable path to an archived roadmap, and
396
+ * the only glyph that cleared the gate was `[-]`, which is owner-reserved AND
397
+ * pinned to mean "won't happen at all". Using it for a carried item would make
398
+ * cancellation and transfer indistinguishable to every later reader.
399
+ *
400
+ * **Fail-closed at every step**, which is the condition both seats attached to
401
+ * their verdict: a bare `[~]` blocks, a malformed annotation blocks, a
402
+ * destination that does not exist blocks, a destination that is itself archived
403
+ * or skipped blocks, and a missing back-link blocks. The annotation is cheap to
404
+ * write and must therefore be expensive to satisfy.
405
+ *
406
+ * NOT checked, and named rather than implied: that the destination's copy of the
407
+ * criterion is faithful. Both seats asked for stable item identity over verbatim
408
+ * text matching, and neither a text match nor an id exists today — the back-link
409
+ * plus the source-slug mention is the strongest link this sweep can verify
410
+ * without inventing an identity scheme. The reviewer of the carry still reads it.
411
+ *
412
+ * @returns `problems` empty ⇒ every deferral is resolved and archival may proceed.
413
+ */
414
+ export function deferralProblems(
415
+ root: string,
416
+ rel: string,
417
+ text: string,
418
+ /**
419
+ * Slugs this same sweep is about to archive. A destination in this set is
420
+ * about to become dead, so accepting it would leave the carried item with no
421
+ * live receiver — the exact loss the annotation exists to prevent, produced
422
+ * by the mechanism meant to prevent it. Found by an independent review, with
423
+ * two reproducers: a roadmap naming ITSELF as destination, and two roadmaps
424
+ * both complete in one run where the parent carries to the child.
425
+ *
426
+ * Optional so the unit tests can call this with one roadmap in view; the
427
+ * sweep always passes the real set.
428
+ */
429
+ alsoArchiving: ReadonlySet<string> = new Set(),
430
+ ): string[] {
431
+ const sourceSlug = rel.replace(/\.md$/, '');
432
+ const problems: string[] = [];
433
+ for (const item of parseDeferredItems(text)) {
434
+ const label = item.text === '' ? '(unnamed step)' : item.text;
435
+ if (item.kind === null || item.destination === null) {
436
+ problems.push(
437
+ `deferred step ${JSON.stringify(label)} carries no ` +
438
+ '`<!-- deferred-resolution: carried-to=<slug> -->` annotation',
439
+ );
440
+ continue;
441
+ }
442
+ // Active or parked are both live. Archived and skipped are not: carrying
443
+ // an item into a dead roadmap is the silent loss the annotation exists
444
+ // to prevent, and it is exactly the "broken promise" case one seat asked
445
+ // to be detectable.
446
+ const candidates = [
447
+ path.join(root, 'agents', 'roadmaps', `${item.destination}.md`),
448
+ path.join(root, 'agents', 'roadmaps', 'later', `${item.destination}.md`),
449
+ ];
450
+ // Self-reference is never a carry. It passes every other check — the
451
+ // file exists, and a `parent_roadmap:` naming itself would satisfy the
452
+ // back-link — and then the sweep archives it, so the destination is dead
453
+ // the moment the source is.
454
+ if (item.destination === sourceSlug) {
455
+ problems.push(
456
+ `deferred step ${JSON.stringify(label)} names its OWN roadmap as the destination — ` +
457
+ 'a carry needs a different receiver, or the item is not carried at all',
458
+ );
459
+ continue;
460
+ }
461
+ if (alsoArchiving.has(item.destination)) {
462
+ problems.push(
463
+ `destination \`${item.destination}\` is being archived by this same sweep, so it would be ` +
464
+ 'dead the moment the carry lands — archive it first and re-run, or carry to a roadmap that stays active',
465
+ );
466
+ continue;
467
+ }
468
+ const found = candidates.find((c) => fs.existsSync(c));
469
+ if (found === undefined) {
470
+ const dead = ['archive', 'skipped'].find((d) =>
471
+ fs.existsSync(path.join(root, 'agents', 'roadmaps', d, `${item.destination ?? ''}.md`)),
472
+ );
473
+ problems.push(
474
+ dead === undefined
475
+ ? `deferred step ${JSON.stringify(label)} names destination \`${item.destination}\`, which does not exist`
476
+ : `deferred step ${JSON.stringify(label)} names destination \`${item.destination}\`, which is in \`${dead}/\` — a dead roadmap cannot receive a carried item`,
477
+ );
478
+ continue;
479
+ }
480
+ const destText = fs.readFileSync(found, 'utf-8');
481
+ // ESCAPED. The slug was interpolated raw, so `road.parent` matched
482
+ // `roadXparent` and a slug containing `[` or `(` made `new RegExp` THROW
483
+ // and abort the whole sweep — in a function whose entire contract is
484
+ // failing closed. Found by an independent review; both seats named it.
485
+ const backlink = new RegExp(`^parent_roadmap:[ \t]*${_escapeRe(sourceSlug)}[ \t]*$`, 'm');
486
+ if (item.kind === 'carried-to' && !backlink.test(destText)) {
487
+ problems.push(
488
+ `destination \`${item.destination}\` carries no \`parent_roadmap: ${sourceSlug}\` back-link — ` +
489
+ 'the link must be verifiable from both ends',
490
+ );
491
+ continue;
492
+ }
493
+ // A STRUCTURED link, not a substring. `destText.includes(sourceSlug)` was
494
+ // satisfied by any incidental mention — a filename, an example, an HTML
495
+ // comment — so `merged-into` proved nothing about a merge. Both review
496
+ // seats called it trivially spoofable. The link now has to be a
497
+ // frontmatter declaration: a `relates:` row naming the source, or a
498
+ // `parent_roadmap:` back-link. Prose cannot satisfy it.
499
+ if (item.kind === 'merged-into' && !backlink.test(destText) && !_relatesTo(destText, sourceSlug)) {
500
+ problems.push(
501
+ `destination \`${item.destination}\` carries no structured link back to \`${sourceSlug}\` — ` +
502
+ 'add a `relates:` row naming it (with a `relation:`) or a `parent_roadmap:` line. A mention ' +
503
+ 'in prose is not a link: it is satisfied by a filename or an example.',
504
+ );
505
+ }
506
+ }
507
+ return problems;
508
+ }
509
+
510
+ /** Archive every complete active roadmap: no open steps, and every `[~]` resolved. */
315
511
  function archive_completed(
316
512
  root: string,
317
513
  opts: { changed_only: boolean; base: string; dry_run: boolean },
@@ -331,11 +527,59 @@ function archive_completed(
331
527
  return [];
332
528
  }
333
529
 
530
+ // Every slug this sweep will consider archiving, computed BEFORE any of them
531
+ // is judged. Without it, a deferral carried to another roadmap that is also
532
+ // complete passes validation and then loses its receiver in the same run.
533
+ const sweepSet = new Set(
534
+ collect(roadmap_root)
535
+ .filter((s2) => s2.open_ === 0)
536
+ .map((s2) => s2.rel.replace(/\.md$/, '')),
537
+ );
538
+
334
539
  const archived: ArchiveRecord[] = [];
335
540
  for (const stats of collect(roadmap_root)) {
336
- if (stats.open_ !== 0 || stats.deferred !== 0) {
541
+ // `guarded-baseline` is INCOMPLETE by construction (council 2026-08-31,
542
+ // 2/2 convergent) — checked BEFORE the open-step test on purpose. A
543
+ // well-formed record keeps its box `[ ]` and would be skipped silently as
544
+ // "not complete", which is the right verdict reached for the wrong reason
545
+ // and invisible in a sweep that only reports what it moved; a MALFORMED
546
+ // one on `[x]` would otherwise archive with an annotation claiming the
547
+ // opposite. Both are named here instead.
548
+ const guarded = parseGuardedBaselines(
549
+ fs.readFileSync(path.join(roadmap_root, stats.rel), 'utf-8'),
550
+ );
551
+ if (guarded.length > 0) {
552
+ process.stderr.write(
553
+ ` ⚠️ ${stats.rel}: ${guarded.length} guarded-baseline step(s) — ` +
554
+ 'not archived. Verify against the real mechanism, then flip to ' +
555
+ '`[x]`.\n',
556
+ );
557
+ for (const p of guardedBaselineProblems(guarded)) {
558
+ process.stderr.write(` · ${p}\n`);
559
+ }
560
+ continue;
561
+ }
562
+ if (stats.open_ !== 0) {
337
563
  continue; // not complete
338
564
  }
565
+ // A `[~]` no longer blocks unconditionally: it blocks unless it carries a
566
+ // validated resolution annotation. See `deferralProblems` for why, and
567
+ // for every way that check fails closed.
568
+ if (stats.deferred !== 0) {
569
+ const abs = path.join(roadmap_root, stats.rel);
570
+ // The source's own slug is removed: it is trivially in `sweepSet`,
571
+ // and self-reference is reported by its own, clearer message.
572
+ const others = new Set(sweepSet);
573
+ others.delete(stats.rel.replace(/\.md$/, ''));
574
+ const problems = deferralProblems(root, stats.rel, fs.readFileSync(abs, 'utf-8'), others);
575
+ if (problems.length > 0) {
576
+ process.stderr.write(
577
+ ` ⚠️ ${stats.rel}: ${problems.length} unresolved deferral(s) — not archived.\n`,
578
+ );
579
+ for (const p of problems) process.stderr.write(` · ${p}\n`);
580
+ continue;
581
+ }
582
+ }
339
583
  // An unresolved blocker outlives its steps. Closing every box does not
340
584
  // answer a question the roadmap raised for a human, and archiving on
341
585
  // step-count alone is how `b-highlights-mechanism` left the active tree
@@ -410,7 +654,7 @@ function _regen_dashboard(root: string, dry_run: boolean): void {
410
654
  /**
411
655
  * Rebuild the archive index after a move, when the builder is present.
412
656
  *
413
- * The sweep is the one operation that changes what `agents/roadmaps/archive/`
657
+ * The sweep is the one operation that changes what `agents/roadmaps/archive/` code-comment-allow provenance-comment -- the directory this function writes
414
658
  * contains, so it is the one operation that can leave the generated index
415
659
  * stale — and the drift gate on that index runs in the same PR the sweep runs
416
660
  * in. Regenerating here keeps the two from disagreeing by construction rather
@@ -0,0 +1,343 @@
1
+ /**
2
+ * `guarded-baseline` — the third machine-readable step state, and its evidence
3
+ * contract (AI council 2026-08-31, 2/2 convergent: anthropic/claude-sonnet-4-5 +
4
+ * openai/codex-default, option C).
5
+ *
6
+ * A roadmap step whose `verify:` asserts a property of a mechanism that DOES NOT
7
+ * YET EXIST may not close `[x]` — that overstates the evidence. It keeps the
8
+ * canonical unchecked box, carries an annotation, and carries a structured
9
+ * evidence record next to it:
10
+ *
11
+ * - [ ] <!-- roadmap-status: guarded-baseline -->
12
+ * **7.3** …step text…
13
+ * ```yaml
14
+ * guarded_baseline:
15
+ * category: future-mechanism
16
+ * scope: src/scripts/ai_council/**
17
+ * command: npx vitest run tests/scripts/x.test.ts
18
+ * red_proof: sabotage run 2026-08-31 — 2 failed
19
+ * sabotage_model: added a `--topology` flag to the option table
20
+ * recheck_when: src/scripts/ai_council/topology_selector.ts
21
+ * discharged_ac: the baseline is pinned and RED-proven
22
+ * pending_ac: the constraint under real topology selection
23
+ * ```
24
+ *
25
+ * BOTH SEATS MADE THE TOOLING A CONDITION OF THE VERDICT — "C is acceptable only
26
+ * if its tooling lands atomically; otherwise use ordinary `[ ]` with structured
27
+ * evidence" — so the annotation is worth nothing without the five semantics
28
+ * below, and they live here rather than duplicated in the two consumers:
29
+ *
30
+ * 1. reported separately and NEVER counted as done — the canonical box stays
31
+ * `[ ]`, so `count_checkboxes` already excludes it; `reportGuardedBaselines`
32
+ * is the separate surface that makes the state visible rather than silent;
33
+ * 2. `archive_completed_roadmaps` treats it as incomplete and refuses archival;
34
+ * 3. a `recheck_when` trigger that now RESOLVES in the tree marks the evidence
35
+ * STALE — the guard was written against an absence that has since ended;
36
+ * 4. only verification against the real mechanism permits `[x]`;
37
+ * 5. a baseline that has not demonstrably gone RED is an ordinary open item —
38
+ * hence `red_proof` is mandatory and its absence REJECTS the annotation.
39
+ *
40
+ * The two legal categories are the council's own split. An `absence-assertion`
41
+ * step asserts something directly observable today and MAY close `[x]` once
42
+ * sabotage-verified; a `future-mechanism` step is what this state exists for. No
43
+ * third value is accepted and absence is not defaulted: defaulting would silently
44
+ * promote the strict case into the lax one, which is the overstatement the whole
45
+ * verdict is against.
46
+ */
47
+
48
+ import * as fs from 'node:fs';
49
+ import * as path from 'node:path';
50
+
51
+ /** The annotation itself. Tolerant of internal spacing, nothing else. */
52
+ export const GUARDED_BASELINE_RE = /<!--[ \t]*roadmap-status:[ \t]*guarded-baseline[ \t]*-->/;
53
+
54
+ /** The only two legal `category:` values — see the header on why absence is not a default. */
55
+ export const GUARDED_CATEGORIES: readonly string[] = ['future-mechanism', 'absence-assertion'];
56
+
57
+ /**
58
+ * `- [<glyph>] …` at any indent, with `-` or `*`.
59
+ *
60
+ * Deliberately neither of the two checkbox patterns already in this directory:
61
+ * the dashboard's `CHECKBOX_RE` is `g`-sticky and requires trailing whitespace,
62
+ * and the sweep's `DEFERRED_STEP_RE` pins `[~]`. This one has to CAPTURE the
63
+ * glyph an annotation sits on — including `[x]` — because refusing that case is
64
+ * the whole point of the validator below.
65
+ */
66
+ const ANY_CHECKBOX_RE = /^[ \t]*[-*][ \t]+\[([ xX~-])\]/;
67
+
68
+ /** A following step or any heading ends the annotated step's span. */
69
+ const SPAN_END_RE = /^[ \t]*[-*][ \t]+\[[ xX~-]\]|^#{1,6}[ \t]/;
70
+
71
+ const BLOCK_START_RE = /^[ \t]*guarded_baseline:[ \t]*$/;
72
+ const FIELD_RE = /^[ \t]*([a-z_]+):[ \t]*(.*)$/;
73
+ const FENCE_RE = /^[ \t]*(?:```|~~~)/;
74
+
75
+ /**
76
+ * A record annotates a STEP, so it is only recognised on a list item.
77
+ *
78
+ * Measured, not defensive: without this the very roadmap that SPECIFIES this
79
+ * state reddened its own dashboard, because its verdict paragraph names the
80
+ * annotation in prose. Same discipline `parse_blockers` already applies with
81
+ * `_stripFencedCode` — a documentation example of a shape is not an instance of
82
+ * it — extended to the two prose forms that actually occur, an inline code span
83
+ * and a fenced example.
84
+ */
85
+ const LIST_ITEM_RE = /^[ \t]*[-*][ \t]+/;
86
+ const INLINE_CODE_RE = /`[^`]*`/g;
87
+
88
+ /** One annotated step, as both consumers need it. */
89
+ export interface GuardedBaselineItem {
90
+ /** 1-based line of the annotated line, for the messages. */
91
+ line: number;
92
+ /** Step text, from the annotated line or its first continuation line. */
93
+ label: string;
94
+ /**
95
+ * The checkbox glyph the annotation actually sits on, or `null` when the
96
+ * annotation is not on a checkbox line at all. Both non-`' '` and `null` are
97
+ * rejections — recorded rather than normalised, so the message can say which.
98
+ */
99
+ glyph: string | null;
100
+ /** Did the span carry a `guarded_baseline:` block at all? */
101
+ hasBlock: boolean;
102
+ fields: Readonly<Record<string, string>>;
103
+ }
104
+
105
+ function _label(annotatedLine: string, lines: readonly string[], i: number): string {
106
+ const own = annotatedLine
107
+ .replace(ANY_CHECKBOX_RE, '')
108
+ .replace(GUARDED_BASELINE_RE, '')
109
+ .replace(/\*\*/g, '')
110
+ .trim();
111
+ if (own !== '') {
112
+ return own;
113
+ }
114
+ // The council's mechanical form puts the step text on the NEXT line.
115
+ for (let j = i + 1; j < lines.length; j++) {
116
+ const next = (lines[j] as string).trim();
117
+ if (next === '') {
118
+ continue;
119
+ }
120
+ if (SPAN_END_RE.test(lines[j] as string)) {
121
+ break;
122
+ }
123
+ return next.replace(/\*\*/g, '').trim();
124
+ }
125
+ return '(unlabelled)';
126
+ }
127
+
128
+ /** Every `guarded-baseline`-annotated step in one roadmap, with its evidence block. */
129
+ export function parseGuardedBaselines(text: string): GuardedBaselineItem[] {
130
+ const lines = text.split('\n');
131
+ const out: GuardedBaselineItem[] = [];
132
+ let inFence = false;
133
+ for (let i = 0; i < lines.length; i++) {
134
+ const raw = lines[i] as string;
135
+ if (FENCE_RE.test(raw)) {
136
+ inFence = !inFence;
137
+ }
138
+ // Inside a fence it is an example; inside backticks it is prose; off a
139
+ // list item it is not a step at all. See LIST_ITEM_RE for the measurement.
140
+ if (inFence || !LIST_ITEM_RE.test(raw)) {
141
+ continue;
142
+ }
143
+ if (!GUARDED_BASELINE_RE.test(raw.replace(INLINE_CODE_RE, ''))) {
144
+ continue;
145
+ }
146
+ const box = ANY_CHECKBOX_RE.exec(raw);
147
+ const fields: Record<string, string> = {};
148
+ let hasBlock = false;
149
+ for (let j = i + 1; j < lines.length; j++) {
150
+ const line = lines[j] as string;
151
+ if (SPAN_END_RE.test(line)) {
152
+ break; // the next step — this one's span is over
153
+ }
154
+ if (FENCE_RE.test(line)) {
155
+ continue; // a ```yaml wrapper is optional, and not the data
156
+ }
157
+ if (!hasBlock) {
158
+ hasBlock = BLOCK_START_RE.test(line);
159
+ continue;
160
+ }
161
+ const f = FIELD_RE.exec(line);
162
+ if (f) {
163
+ fields[f[1] as string] = (f[2] as string).trim();
164
+ }
165
+ }
166
+ out.push({
167
+ line: i + 1,
168
+ label: _label(raw, lines, i),
169
+ glyph: box ? (box[1] as string) : null,
170
+ hasBlock,
171
+ fields,
172
+ });
173
+ }
174
+ return out;
175
+ }
176
+
177
+ /**
178
+ * Every reason this annotation is REJECTED. Empty means the record is well
179
+ * formed — never that the acceptance criterion is discharged.
180
+ */
181
+ export function guardedBaselineProblems(items: readonly GuardedBaselineItem[]): string[] {
182
+ const problems: string[] = [];
183
+ for (const it of items) {
184
+ const at = `line ${it.line} (${it.label})`;
185
+ if (it.glyph === null) {
186
+ problems.push(
187
+ `${at}: the guarded-baseline annotation is not on a checkbox step — ` +
188
+ 'it is only legal on an unchecked `- [ ]` line',
189
+ );
190
+ } else if (it.glyph !== ' ') {
191
+ problems.push(
192
+ `${at}: the guarded-baseline annotation sits on \`[${it.glyph}]\` — ` +
193
+ 'the canonical checkbox stays UNCHECKED; only verification against ' +
194
+ 'the real mechanism permits `[x]`',
195
+ );
196
+ }
197
+ if (!it.hasBlock) {
198
+ problems.push(`${at}: carries no adjacent \`guarded_baseline:\` evidence block`);
199
+ }
200
+ if ((it.fields['red_proof'] ?? '') === '') {
201
+ problems.push(
202
+ `${at}: records no \`red_proof\` — a baseline that has not demonstrably ` +
203
+ 'gone RED is an ordinary open item, not a guarded one',
204
+ );
205
+ }
206
+ const category = it.fields['category'] ?? '';
207
+ if (category === '') {
208
+ problems.push(
209
+ `${at}: records no \`category\` — one of ${GUARDED_CATEGORIES.join(', ')} ` +
210
+ 'is required, and absence is not defaulted',
211
+ );
212
+ } else if (!GUARDED_CATEGORIES.includes(category)) {
213
+ problems.push(
214
+ `${at}: records category \`${category}\`, which is not one of ` +
215
+ GUARDED_CATEGORIES.join(', '),
216
+ );
217
+ }
218
+ }
219
+ return problems;
220
+ }
221
+
222
+ /**
223
+ * Which records are STALE, i.e. whose `recheck_when` trigger now resolves in the
224
+ * tree — the mechanism the baseline was written against has arrived, so the
225
+ * evidence describes a world that no longer exists.
226
+ *
227
+ * HONEST SCOPE. Only a PATH trigger is machine-checkable: a token containing `/`
228
+ * is resolved against the repo root and stale iff it exists. A bare symbol name
229
+ * cannot be decided from a path, so a record carrying ONLY symbol tokens is
230
+ * returned as `unverifiable` rather than silently reading as "not stale" — an
231
+ * unchecked trigger that looks checked is the failure this whole state exists
232
+ * to avoid.
233
+ *
234
+ * A record whose trigger carries AT LEAST ONE path token is decided by that
235
+ * path and is NOT reported as unverifiable, even when a companion symbol token
236
+ * sits beside it. Reporting it would be the mirror of the failure above: a
237
+ * checked trigger that looks unchecked. Measured 2026-09-01 — three of the four
238
+ * lines the dashboard printed as "not machine-checkable" carried a path token
239
+ * and were therefore already decidable, which is noise that trains a reader to
240
+ * skip the section where the one genuinely undecidable trigger also lives.
241
+ */
242
+ export function guardedBaselineStaleness(
243
+ items: readonly GuardedBaselineItem[],
244
+ repo_root: string,
245
+ ): { stale: string[]; unverifiable: string[] } {
246
+ const stale: string[] = [];
247
+ const unverifiable: string[] = [];
248
+ for (const it of items) {
249
+ const trigger = it.fields['recheck_when'] ?? '';
250
+ if (trigger === '') {
251
+ continue;
252
+ }
253
+ const tokens = trigger.split(/[\s,]+/).filter((t) => t !== '');
254
+ const paths = tokens.filter((t) => t.includes('/'));
255
+ for (const token of paths) {
256
+ if (fs.existsSync(path.join(repo_root, token))) {
257
+ stale.push(
258
+ `line ${it.line} (${it.label}): recheck_when \`${token}\` now exists — ` +
259
+ 're-verify against the real mechanism',
260
+ );
261
+ }
262
+ }
263
+ if (paths.length > 0) {
264
+ continue;
265
+ }
266
+ for (const token of tokens) {
267
+ unverifiable.push(`line ${it.line} (${it.label}): recheck_when \`${token}\``);
268
+ }
269
+ }
270
+ return { stale, unverifiable };
271
+ }
272
+
273
+ /** One roadmap, as the report needs it — structural, so `RoadmapStats` fits as-is. */
274
+ export interface GuardedBaselineHost {
275
+ readonly rel: string;
276
+ readonly path: string;
277
+ }
278
+
279
+ export interface GuardedBaselineReport {
280
+ /** Dashboard section, appended to the rendered markdown. `''` when nothing is annotated. */
281
+ section: string;
282
+ /** Rejections across every roadmap — `--check` must fail on these. */
283
+ problems: number;
284
+ }
285
+
286
+ /**
287
+ * Report every guarded baseline in the estate: a dashboard section, and the
288
+ * rejections + staleness on stderr. Side-effecting on purpose, and named for it
289
+ * — the sibling `_warn_merge_gated` does the same, and it keeps the caller at
290
+ * one line in a file that sits at its size cap.
291
+ */
292
+ export function reportGuardedBaselines(
293
+ roadmaps: readonly GuardedBaselineHost[],
294
+ repo_root: string,
295
+ write: (s: string) => void = (s) => process.stderr.write(s),
296
+ ): GuardedBaselineReport {
297
+ const rows: string[] = [];
298
+ let problems = 0;
299
+ for (const r of roadmaps) {
300
+ let items: GuardedBaselineItem[];
301
+ try {
302
+ items = parseGuardedBaselines(fs.readFileSync(r.path, { encoding: 'utf-8' }));
303
+ } catch {
304
+ continue;
305
+ }
306
+ if (items.length === 0) {
307
+ continue;
308
+ }
309
+ const bad = guardedBaselineProblems(items);
310
+ const { stale, unverifiable } = guardedBaselineStaleness(items, repo_root);
311
+ problems += bad.length;
312
+ rows.push(
313
+ `| [${r.rel}](roadmaps/${r.rel}) | ${items.length} | ${stale.length} | ${bad.length} |`,
314
+ );
315
+ write(
316
+ `🛡️ ${r.rel}: ${items.length} guarded-baseline step(s) — RED-proven, ` +
317
+ 'NOT complete, and blocking archival:\n',
318
+ );
319
+ for (const it of items) {
320
+ write(` - ${it.label} (category ${it.fields['category'] ?? '—'})\n`);
321
+ }
322
+ for (const p of bad) write(` ❌ ${p}\n`);
323
+ for (const s of stale) write(` ⚠️ ${s}\n`);
324
+ for (const u of unverifiable) write(` · not machine-checkable: ${u}\n`);
325
+ }
326
+ if (rows.length === 0) {
327
+ return { section: '', problems };
328
+ }
329
+ return {
330
+ section:
331
+ '\n## 🛡️ Guarded baselines — RED-proven, not complete\n\n' +
332
+ 'These steps carry `<!-- roadmap-status: guarded-baseline -->`: an ' +
333
+ 'executable guard exists and has been shown to go RED under a named ' +
334
+ 'sabotage, but the acceptance criterion names a mechanism that does not ' +
335
+ 'exist yet. They are **not** done, they are **not** counted as done, and ' +
336
+ 'they **block archival** until the real mechanism is verified (council ' +
337
+ '2026-08-31, 2/2 convergent).\n\n' +
338
+ '| Roadmap | Guarded | Stale | Rejected |\n|---|---:|---:|---:|\n' +
339
+ rows.join('\n') +
340
+ '\n',
341
+ problems,
342
+ };
343
+ }