@event4u/agent-config 14.12.0 → 14.13.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 (466) 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 +234 -0
  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 +109 -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-provenance.md +4 -0
  30. package/dist/agent-src/rules/design-fidelity.md +1 -1
  31. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  32. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  33. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  34. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  35. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  36. package/dist/agent-src/rules/laravel-routing.md +1 -1
  37. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  38. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  39. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  40. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  41. package/dist/agent-src/rules/symfony-routing.md +1 -1
  42. package/dist/agent-src/rules/token-efficiency.md +14 -0
  43. package/dist/agent-src/rules/tool-safety.md +4 -0
  44. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  45. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  46. package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
  47. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  48. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  49. package/dist/agent-src/scripts/stubs_due.ts +400 -0
  50. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  51. package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
  52. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  53. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  54. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  55. package/dist/agent-src/skills/database/SKILL.md +8 -0
  56. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  57. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  58. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  60. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  61. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  62. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  63. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  64. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  65. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  66. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  67. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  68. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  69. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  70. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  71. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  72. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  73. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  74. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  75. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  76. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  77. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  78. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  79. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  80. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  81. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  82. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  83. package/dist/agent-src/templates/roadmaps.md +97 -3
  84. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  85. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  86. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  87. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  88. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  93. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  94. package/dist/cli/commands/uiAudit.js +124 -5
  95. package/dist/cli/registry.js +2 -0
  96. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  97. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  98. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  99. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  100. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  101. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  102. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  103. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  104. package/dist/cli-delegate/cmd_conformance.js +42 -10
  105. package/dist/cli-delegate/cmd_doctor.js +3 -3
  106. package/dist/cli-delegate/cmd_export.js +3 -2
  107. package/dist/cli-delegate/cmd_fleet.js +2 -2
  108. package/dist/cli-delegate/cmd_handoff.js +1 -1
  109. package/dist/cli-delegate/cmd_preflight.js +2 -2
  110. package/dist/cli-delegate/cmd_prune.js +3 -2
  111. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  112. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  113. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  114. package/dist/cli-delegate/cmd_sync.js +3 -2
  115. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  116. package/dist/cli-delegate/cmd_validate.js +3 -2
  117. package/dist/discovery/deprecation-report.md +1 -1
  118. package/dist/discovery/discovery-manifest.json +57 -57
  119. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  120. package/dist/discovery/discovery-manifest.summary.md +1 -1
  121. package/dist/discovery/dormancy-report.md +1 -1
  122. package/dist/discovery/orphan-report.md +1 -1
  123. package/dist/discovery/packs.json +2 -2
  124. package/dist/discovery/trust-report.md +1 -1
  125. package/dist/discovery/workspaces.json +2 -2
  126. package/dist/hooks/dispatch.js +1836 -712
  127. package/dist/install/claudeRuleRewrite.js +254 -0
  128. package/dist/install/detect.js +29 -16
  129. package/dist/install/detect_php_shape.js +159 -0
  130. package/dist/install/install.mjs +634 -428
  131. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  132. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  133. package/dist/mcp/registry-manifest.json +3 -3
  134. package/dist/mcp/server.json +3 -3
  135. package/dist/mcp/server.mjs +4818 -2645
  136. package/dist/server/schemas/settings.js +3 -0
  137. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  138. package/dist/ui/index.html +1 -1
  139. package/docs/MIGRATION.md +1 -1
  140. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  141. package/docs/contracts/provider-lifecycle.md +1 -1
  142. package/docs/contracts/settings-classes.md +10 -4
  143. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  144. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  145. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  146. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  147. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  148. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  149. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  150. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  151. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  152. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  153. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  154. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  155. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  156. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  157. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  158. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  159. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  160. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  161. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  162. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  163. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  164. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  165. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  166. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  167. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  168. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  169. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  170. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  171. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  172. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  173. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  174. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  175. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  176. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  177. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  178. package/docs/guidelines/augment-portability-patterns.md +6 -4
  179. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  180. package/docs/guidelines/cross-role-handoff.md +2 -2
  181. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  182. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  183. package/docs/guidelines/php/database.md +90 -7
  184. package/docs/guidelines/prompt-templates.md +7 -7
  185. package/llms.txt +2 -2
  186. package/package.json +5 -2
  187. package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  188. package/src/agent-src/scripts/guarded_baseline.ts +328 -0
  189. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  190. package/src/agent-src/scripts/stub_queue.ts +82 -0
  191. package/src/agent-src/scripts/stubs_due.ts +400 -0
  192. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  193. package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
  194. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  195. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  196. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  197. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  198. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  199. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  202. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  203. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  204. package/src/config/agent-settings.template.yml +32 -3
  205. package/src/config/assurance-capability-registry.json +21 -9
  206. package/src/config/canonical-terms.yml +119 -0
  207. package/src/config/capability-native-outcome-bars.json +81 -0
  208. package/src/config/ci-local-parity.yml +80 -0
  209. package/src/config/drafting-channels.yml +43 -0
  210. package/src/config/estate-count-budget.json +38 -36
  211. package/src/config/evaluator-budgets.json +14 -14
  212. package/src/config/gate-coverage.yml +579 -63
  213. package/src/config/gate-reachability-exemptions.json +21 -0
  214. package/src/config/gate-violation-baselines.json +37 -19
  215. package/src/config/harness-evolution-budget.json +25 -0
  216. package/src/config/lapsed-beta-baseline.json +96 -0
  217. package/src/config/memory-twin-verdicts.yml +129 -0
  218. package/src/config/metric-registry.yml +124 -0
  219. package/src/config/pack-size-budget.json +16 -15
  220. package/src/config/preamble-payload-budget.json +8 -8
  221. package/src/config/profiles/balanced.ini +27 -0
  222. package/src/config/profiles/full.ini +27 -0
  223. package/src/config/profiles/minimal.ini +27 -0
  224. package/src/config/publish-surface.json +9 -2
  225. package/src/config/routing-coverage-seed.json +16 -2
  226. package/src/config/rule-stub-ceilings.json +126 -112
  227. package/src/config/turnaround-budget.json +66 -0
  228. package/src/install/claudeRuleRewrite.ts +288 -0
  229. package/src/install/detect.ts +60 -17
  230. package/src/install/detect_php_shape.ts +191 -0
  231. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  232. package/src/scripts/_dispatch.bash +27 -0
  233. package/src/scripts/_lib/activation_ladder.ts +211 -0
  234. package/src/scripts/_lib/activation_states.ts +88 -0
  235. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  236. package/src/scripts/_lib/arith_claims.ts +181 -0
  237. package/src/scripts/_lib/arm_ranking.ts +62 -0
  238. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  239. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  240. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  241. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  242. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  243. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  244. package/src/scripts/_lib/candidate_record.ts +601 -0
  245. package/src/scripts/_lib/capture_rate.ts +319 -0
  246. package/src/scripts/_lib/collector_denominator.ts +771 -0
  247. package/src/scripts/_lib/collector_record.ts +340 -0
  248. package/src/scripts/_lib/collector_store.ts +664 -0
  249. package/src/scripts/_lib/collector_supervision.ts +827 -0
  250. package/src/scripts/_lib/concern_estate.ts +77 -0
  251. package/src/scripts/_lib/config_chain.ts +477 -0
  252. package/src/scripts/_lib/config_cost.ts +209 -0
  253. package/src/scripts/_lib/council_settings_block.ts +6 -0
  254. package/src/scripts/_lib/curator_ops.ts +172 -0
  255. package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
  256. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  257. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  258. package/src/scripts/_lib/empty_cycles.ts +88 -0
  259. package/src/scripts/_lib/eval_publication.ts +354 -0
  260. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  261. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  262. package/src/scripts/_lib/evidence_basis.ts +118 -0
  263. package/src/scripts/_lib/exec_evidence.ts +8 -0
  264. package/src/scripts/_lib/experience_card.ts +272 -0
  265. package/src/scripts/_lib/experience_report.ts +151 -0
  266. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  267. package/src/scripts/_lib/generated_by.ts +66 -0
  268. package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
  269. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  270. package/src/scripts/_lib/host_denominator.ts +687 -0
  271. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  272. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  273. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  274. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  275. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  276. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  277. package/src/scripts/_lib/loop_guards.ts +299 -0
  278. package/src/scripts/_lib/loss_class.ts +129 -0
  279. package/src/scripts/_lib/machine_wake.ts +51 -0
  280. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  281. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  282. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  283. package/src/scripts/_lib/orchestration_record.ts +253 -5
  284. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  285. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  286. package/src/scripts/_lib/paired_stats.ts +245 -0
  287. package/src/scripts/_lib/paired_verdict.ts +226 -0
  288. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  289. package/src/scripts/_lib/privacy_class.ts +47 -0
  290. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  291. package/src/scripts/_lib/repeated_failure.ts +105 -0
  292. package/src/scripts/_lib/repo_root.ts +111 -0
  293. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  294. package/src/scripts/_lib/role_split.ts +338 -0
  295. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  296. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  297. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  298. package/src/scripts/_lib/source_digest.ts +200 -0
  299. package/src/scripts/_lib/source_redact.ts +260 -0
  300. package/src/scripts/_lib/source_shape.ts +502 -0
  301. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  302. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  303. package/src/scripts/_lib/strip_comments.mjs +65 -0
  304. package/src/scripts/_lib/test_red_state.ts +154 -0
  305. package/src/scripts/_lib/trigger_shift.ts +144 -0
  306. package/src/scripts/_lib/untrusted_content.ts +82 -7
  307. package/src/scripts/adoption_report.ts +1 -1
  308. package/src/scripts/adr/evidence_census.ts +1 -1
  309. package/src/scripts/adr/regenerate_index.ts +26 -2
  310. package/src/scripts/adr_cite_check.ts +164 -1
  311. package/src/scripts/ai_council/blind_review.ts +11 -1
  312. package/src/scripts/ai_council/clients.ts +4 -0
  313. package/src/scripts/ai_council/config.ts +3 -0
  314. package/src/scripts/ai_council/consensus.ts +28 -8
  315. package/src/scripts/ai_council/consensus_round.ts +226 -0
  316. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  317. package/src/scripts/ai_council/inline_findings.ts +340 -0
  318. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  319. package/src/scripts/ai_council/orchestrator.ts +16 -203
  320. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  321. package/src/scripts/ai_council/pricing.ts +106 -0
  322. package/src/scripts/ai_council/prompts.ts +74 -7
  323. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  324. package/src/scripts/ai_council/py_format.ts +14 -3
  325. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  326. package/src/scripts/ai_council/response_record.ts +50 -0
  327. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  328. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  329. package/src/scripts/asset_delivery_ledger.ts +157 -0
  330. package/src/scripts/attest_artifact.ts +193 -0
  331. package/src/scripts/audit_auto_rules.ts +2 -1
  332. package/src/scripts/audit_command_surface.ts +1 -1
  333. package/src/scripts/audit_mcp_tools.ts +2 -2
  334. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  335. package/src/scripts/audit_user_type_axis.ts +2 -1
  336. package/src/scripts/bench_ab_clone.ts +215 -10
  337. package/src/scripts/bench_ab_integrity.ts +119 -5
  338. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  339. package/src/scripts/build_archive_index.ts +1 -1
  340. package/src/scripts/build_linear_digest.ts +1 -1
  341. package/src/scripts/build_proof.ts +11 -4
  342. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  343. package/src/scripts/build_source_digests.ts +157 -0
  344. package/src/scripts/cache_realization_report.ts +103 -0
  345. package/src/scripts/check_adr_frontmatter.ts +126 -0
  346. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  347. package/src/scripts/check_beta_review_markers.ts +235 -6
  348. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  349. package/src/scripts/check_claims.ts +576 -6
  350. package/src/scripts/check_composite_arming.ts +35 -0
  351. package/src/scripts/check_concern_admissions.ts +365 -0
  352. package/src/scripts/check_enforcement_coverage.ts +28 -0
  353. package/src/scripts/check_estate_count.ts +142 -1
  354. package/src/scripts/check_gate_reachability.ts +383 -0
  355. package/src/scripts/check_host_loadability.ts +104 -0
  356. package/src/scripts/check_loss_class_declared.ts +308 -0
  357. package/src/scripts/check_md_language.ts +15 -98
  358. package/src/scripts/check_memory_proposal.ts +18 -11
  359. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  360. package/src/scripts/check_no_external_sources.ts +281 -6
  361. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  362. package/src/scripts/check_pack_size.ts +59 -2
  363. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  364. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  365. package/src/scripts/check_publish_surface.ts +10 -1
  366. package/src/scripts/check_references.ts +24 -1
  367. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  368. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  369. package/src/scripts/check_score_contract.ts +26 -3
  370. package/src/scripts/check_static_parity.ts +285 -0
  371. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  372. package/src/scripts/check_suppression_hygiene.ts +15 -0
  373. package/src/scripts/ci_settle.ts +39 -2
  374. package/src/scripts/code_graph/build.ts +60 -3
  375. package/src/scripts/code_graph/extract.ts +44 -0
  376. package/src/scripts/code_graph/types.ts +24 -0
  377. package/src/scripts/collector_daemon.ts +714 -0
  378. package/src/scripts/config_cost_report.ts +302 -0
  379. package/src/scripts/consumer_matrix.ts +74 -1
  380. package/src/scripts/cost/budget.mjs +10 -3
  381. package/src/scripts/cost/track.mjs +10 -3
  382. package/src/scripts/council_cli.ts +37 -54
  383. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  384. package/src/scripts/evolution_lab.ts +980 -0
  385. package/src/scripts/external_sources_denylist.json +5 -18
  386. package/src/scripts/extract_audit_patterns.ts +21 -0
  387. package/src/scripts/fold_intake.ts +12 -1
  388. package/src/scripts/gen_discovery_baseline.ts +1 -1
  389. package/src/scripts/generate_capabilities_index.ts +12 -5
  390. package/src/scripts/generate_capability_matrix.ts +3 -3
  391. package/src/scripts/generate_command_flows.ts +2 -2
  392. package/src/scripts/generate_cookbook.ts +2 -2
  393. package/src/scripts/generate_index.ts +8 -1
  394. package/src/scripts/generate_knowledge_index.ts +2 -1
  395. package/src/scripts/generate_ownership_matrix.ts +2 -1
  396. package/src/scripts/generate_pack_manifests.ts +10 -2
  397. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  398. package/src/scripts/generate_settings_reference.ts +1 -1
  399. package/src/scripts/git_authorization_hook.ts +22 -1
  400. package/src/scripts/grade_target_readiness.ts +48 -5
  401. package/src/scripts/hook_effect_doctor.ts +261 -0
  402. package/src/scripts/hook_manifest.json +1 -1
  403. package/src/scripts/hook_manifest.yaml +98 -11
  404. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  405. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  406. package/src/scripts/hooks/concern_registry.ts +4 -0
  407. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  408. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  409. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  410. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  411. package/src/scripts/hooks/shims/install.sh +61 -0
  412. package/src/scripts/hooks/shims/php +101 -0
  413. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  414. package/src/scripts/hot_context_hook.ts +16 -0
  415. package/src/scripts/install-hooks.sh +20 -5
  416. package/src/scripts/install.ts +17 -35
  417. package/src/scripts/inventory_frontmatter.ts +2 -1
  418. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  419. package/src/scripts/lint_canonical_terms.ts +604 -0
  420. package/src/scripts/lint_composition_review.ts +619 -0
  421. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  422. package/src/scripts/lint_eval_specs.ts +593 -0
  423. package/src/scripts/lint_hook_manifest.ts +19 -0
  424. package/src/scripts/lint_host_portability.ts +373 -0
  425. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  426. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  427. package/src/scripts/lint_metric_consumers.ts +355 -0
  428. package/src/scripts/lint_skill_descriptions.ts +18 -1
  429. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  430. package/src/scripts/lint_skill_link_reach.ts +252 -0
  431. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  432. package/src/scripts/lint_ticket_buildable.ts +17 -1
  433. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  434. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  435. package/src/scripts/measure_docs_dead_links.ts +348 -0
  436. package/src/scripts/measure_host_capture.ts +461 -0
  437. package/src/scripts/migration_status.ts +3 -3
  438. package/src/scripts/model_rule_injection.ts +60 -0
  439. package/src/scripts/orchestration_record.ts +14 -0
  440. package/src/scripts/preamble_byte_census.ts +139 -10
  441. package/src/scripts/prepack-check.mjs +4 -1
  442. package/src/scripts/probe_turnaround.ts +384 -0
  443. package/src/scripts/probe_unblocked_ask.ts +279 -0
  444. package/src/scripts/render_benchmark_md.ts +1 -1
  445. package/src/scripts/rule_activation_census.ts +70 -9
  446. package/src/scripts/rule_backlinks.ts +1 -1
  447. package/src/scripts/run_lifecycle_suite.ts +208 -0
  448. package/src/scripts/run_skill_evals.ts +40 -0
  449. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  450. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  451. package/src/scripts/schemas/evals.schema.json +24 -1
  452. package/src/scripts/schemas/rule.schema.json +52 -1
  453. package/src/scripts/schemas/skill.schema.json +17 -2
  454. package/src/scripts/skill_overlap.ts +7 -1
  455. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  456. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  457. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  458. package/src/scripts/skill_usage_report.ts +2 -1
  459. package/src/scripts/stubs_due.ts +211 -0
  460. package/src/scripts/sweep_source_surfaces.ts +678 -0
  461. package/src/scripts/sync_pr_branch.ts +3 -3
  462. package/src/scripts/trigger_eval_grandfather.json +202 -222
  463. package/src/scripts/utilization_report.ts +22 -2
  464. package/src/server/schemas/settings.ts +5 -0
  465. package/src/templates/marketing-copy.yml +1 -1
  466. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -25,6 +25,10 @@ enforced_by:
25
25
  - "instruction-only: close-the-source-and-re-derive is a pre-write reasoning step only the model observes; CI checks the ledger, never the derivation"
26
26
  # obligation: line 40
27
27
  obligation_frequency: "per-edit"
28
+ evidence:
29
+ source_type: external-research
30
+ verified_on: 2026-08-30
31
+ normative_level: informative
28
32
  ---
29
33
 
30
34
  # Code Provenance
@@ -98,7 +98,7 @@ MANDATE, NEVER A **PIXEL** MANDATE — WHATEVER `design.fidelity_mode` SAYS.
98
98
  REPRODUCING A WIREFRAME'S GREYS 1:1 HONOURS THE WRONG HALF OF THE ARTEFACT.
99
99
  ```
100
100
 
101
- `strict` means *do not redesign*; never *reproduce a wireframe's placeholder greys*, which
101
+ `strict` means *do not redesign*; never *reproduce a wireframe's placeholder grays*, which
102
102
  are **non-decisions** ([`wireframe`](../skills/wireframe/SKILL.md) § Gotchas).
103
103
  **The discriminator reads the ARTEFACT, never the prose.** A finished comp whose prose
104
104
  mentions a wireframe it replaces routes **strictly** — a reference to a previous artefact,
@@ -44,6 +44,10 @@ workspaces: [agent-config-maintainer, construction, engineering, finance, founde
44
44
  packs: [meta]
45
45
  # obligation: line 52
46
46
  obligation_frequency: "per-task"
47
+ evidence:
48
+ source_type: external-standard
49
+ verified_on: 2026-08-30
50
+ normative_level: mandatory
47
51
  ---
48
52
 
49
53
  # Domain Safety — PII Redaction
@@ -29,6 +29,10 @@ workspaces: [agent-config-maintainer, construction, engineering, finance, founde
29
29
  packs: [meta]
30
30
  # obligation: line 47
31
31
  obligation_frequency: "per-turn"
32
+ evidence:
33
+ source_type: external-standard
34
+ verified_on: 2026-08-30
35
+ normative_level: mandatory
32
36
  ---
33
37
 
34
38
  # Domain Safety — Data Retention
@@ -30,6 +30,8 @@ collision_ok:
30
30
  "migration": "a prod migration is a hard-floor evidence surface (rollback path, blast radius)"
31
31
  # obligation: line 49
32
32
  obligation_frequency: "per-commit"
33
+ evidence:
34
+ source_type: own-analysis
33
35
  ---
34
36
 
35
37
  # Engineering Safety Floor
@@ -24,13 +24,12 @@ obligation_frequency: "per-turn"
24
24
  # External Code-Graph Interop
25
25
 
26
26
  Some repos commit a pre-built code-intelligence index — a `graph.json`-shaped
27
- artifact or a SCIP index (`index.scip`, `*.scip`). When one exists, it already
28
- answers "who calls X", "where is Y used", "what does this import" far more
29
- precisely than a fresh `grep`. This suite is an **orchestrator first, owner
30
- where it wins** (ADR-124): query a consumer-shipped index when it is present
31
- and fresh; where none is shipped or ours is measurably better, the suite's own
32
- native code-graph engine (default-off, benchmark-gated) covers the gap. Either
33
- way — query first, grep as fallback, and name which source answered.
27
+ artifact or a SCIP index (`index.scip`, `*.scip`). One that exists is already
28
+ built and structured, so it is the cheap first question for "who calls X",
29
+ "where is Y used", "what does this import". This suite is an **orchestrator
30
+ first, owner where it wins** (ADR-124): query a consumer-shipped index when it
31
+ is present and fresh; where none is shipped, the native engine (default-off,
32
+ benchmark-gated) covers the gap.
34
33
 
35
34
  ## The rule
36
35
 
@@ -59,6 +58,11 @@ AND the repo contains a detectable index:
59
58
  3. **Fall back to `grep`/read** only for what the index does not cover, and say
60
59
  so ("the index has no entry for X, so I grepped").
61
60
 
61
+ Query-first is an **ordering** heuristic, never a claim the index answers better:
62
+ measured 2026-08-28, zero of four graph-shaped classes beat `grep`, so no class
63
+ is graph-first. Routing changes; permission does not. Figures:
64
+ [`code-intelligence`](../skills/code-intelligence/SKILL.md) § Measured.
65
+
62
66
  ## When NOT to fire
63
67
 
64
68
  - No such index in the repo — normal `grep`/read is the right first move.
@@ -67,11 +71,9 @@ AND the repo contains a detectable index:
67
71
  ## See also
68
72
 
69
73
  - [`code-intelligence`](../skills/code-intelligence/SKILL.md) — the executable
70
- routing skill: `agent-config code-graph detect|query|affected|path` over the
71
- native engine or a consumer-shipped index, grep as the stated fallback. On
72
- hook-capable hosts the PreToolUse `code-graph` nudge surfaces this once per
73
- session; on instruction-file hosts this rule is the surface. Which of the two
74
- you are on is `agent-config hooks:status`, not a guess from the host name.
74
+ routing skill (`agent-config code-graph detect|query|affected|path`), the
75
+ measured per-class figures, and the hook-vs-instruction-file surface question
76
+ (`agent-config hooks:status`, never a guess from the host name).
75
77
  - [`discovery_graph`](../scripts/discovery_graph.ts) — this suite's OWN artefact
76
78
  relation-graph (`affected`/`explain`); the external code-graph is the
77
79
  *source-code* analogue this rule defers to for code questions.
@@ -64,16 +64,14 @@ Trigger-set above activates this routing on demand, independent of the disciplin
64
64
  **Challenge to improve, never to refuse.**
65
65
 
66
66
  The agent is a thought partner, not a gatekeeper. After presenting concerns:
67
- - User picks an option → execute immediately
68
- - User says "just do it" → execute immediately
67
+ - User picks an option, or says "just do it" → execute immediately
69
68
  - Never argue twice about the same point
70
69
  - Never block work — delay is only justified if it prevents a clear mistake
71
70
 
72
71
  ## Creating new agent artifacts
73
72
 
74
- When the request is to create or significantly rewrite a skill, rule, command,
75
- or guideline, the "fit the existing architecture" check is handled by
76
- [`artifact-drafting-protocol`](artifact-drafting-protocol.md)'s Phase B
77
- (Research). Follow that protocol instead of improvising a one-shot check — it
78
- scans `src/` for overlap and reports candidates to extend
79
- before creating a new file.
73
+ When the request is to create or significantly rewrite a skill, rule, command, or
74
+ guideline, the "fit the existing architecture" check is handled by
75
+ [`artifact-drafting-protocol`](artifact-drafting-protocol.md)'s Phase B (Research).
76
+ Follow that protocol instead of improvising a one-shot check — it scans `src/` for
77
+ overlap and reports candidates to extend before creating a new file.
@@ -26,7 +26,7 @@ obligation_frequency: "none"
26
26
 
27
27
  # Laravel Routing
28
28
 
29
- **Iron Law.** Laravel-flavoured PHP (Eloquent, Artisan, FormRequest, jobs, events, policies) → load the `laravel` skill, not `symfony-workflow` and not `php-coder`.
29
+ **Iron Law.** Laravel-flavoured PHP → `laravel`. Discriminator: entry point and router, not the dependency list — `illuminate/*` with no skeleton marker is the third verdict.
30
30
 
31
31
  Body migrated to `skill:laravel`. Disambiguates the laravel ↔ symfony-workflow cluster head per [`adr-architectural-consensus-mechanism`](../docs/contracts/adr-architectural-consensus-mechanism.md).
32
32
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
@@ -22,6 +22,10 @@ collision_ok:
22
22
  "src/agent-src/commands/": "command authoring reviews the three trifecta legs"
23
23
  # obligation: line 60
24
24
  obligation_frequency: "per-edit"
25
+ evidence:
26
+ source_type: external-standard
27
+ verified_on: 2026-08-30
28
+ normative_level: recommended
25
29
  ---
26
30
 
27
31
  # Lethal-Trifecta Guard
@@ -29,6 +29,8 @@ collision_ok:
29
29
  "commit": "committing is the credential-leak moment this guard exists for"
30
30
  # obligation: line 43
31
31
  obligation_frequency: "per-edit"
32
+ evidence:
33
+ source_type: own-analysis
32
34
  ---
33
35
 
34
36
  # Secret-in-VCS Guard
@@ -28,6 +28,8 @@ collision_ok:
28
28
  "tenant": "tenancy is a threat-model-before-edit surface"
29
29
  # obligation: line 36
30
30
  obligation_frequency: "per-edit"
31
+ evidence:
32
+ source_type: own-analysis
31
33
  ---
32
34
 
33
35
  # Security-Sensitive Stop Rule
@@ -91,43 +91,21 @@ substitute for not writing the attribution in the first place.
91
91
 
92
92
  ## Why this rule is not path-scoped
93
93
 
94
- Under ADR-236 (`docs/decisions/ADR-236-one-artefact-one-layer.md`) this rule is
95
- delivered by the PROJECT layer only — it exists to maintain this package, so the
96
- global layer no longer carries an unscoped twin of it. A `paths:`-scoped rule is
97
- **not re-injected after `/compact`** (ADR-227:79-80), so scoping it would mean the
98
- obligation silently disappears mid-session with nothing left to reload it.
99
-
100
- It is therefore delivered unconditionally, and the path triggers were removed
101
- rather than worked around. **This section is the shared record for all four such
102
- rules** — `no-roadmap-references`, `rule-type-governance` and `skill-quality` carry
103
- the same change and no note of their own. Two reasons: four copies of the rationale
104
- cost more standing context than the decision they explain, and the other three are
105
- migrated POINTER stubs held at their pointer's size by
106
- `check_rule_stub_ceiling` — prose added there is prose in the wrong place by that
107
- gate's own contract, which is what caught the first attempt to duplicate it.
108
-
109
- AI council 2026-08-20, 2/2 convergent on this option over three alternatives, with
110
- two independent decisive arguments. First: the obligation governs an **authoring
111
- decision**, which happens before any file exists for a path trigger to match — so
112
- path-scoping fails at greenfield creation whether or not a compaction ever occurs.
113
- Second: the measured cost is small against what the partition returns. Keeping an
114
- unscoped global copy was rejected because it re-creates the duplication the
115
- partition exists to remove; splitting the four by "has a CI gate" was rejected by
116
- both seats as the wrong axis — a validator observes an outcome, it does not hold an
117
- obligation during the session, and `rule-type-governance` has no gate at all.
118
-
119
- **Cost, measured and corrected.** An earlier revision of this note claimed 1,754
120
- tokens (1.8 % of the partition's 96,584-token saving). That figure was a
121
- `chars / 4` proxy over the projected files and **understated the real cost by about
122
- half**: `check_rule_activation_census`, which counts with the exact BPE tokenizer,
123
- measures the unconditional corpus growing **108,130 → 111,642, i.e. +3,512 tokens
124
- (3.6 %)** — and that number includes this rationale, which is why it lives in one
125
- place instead of four. The verdict does not depend on the figure: one seat argued
126
- the token axis was the wrong one entirely, the other that cost is a legitimate axis
127
- which simply loses this particular comparison. Both readings survive 3.6 %.
94
+ Delivered unconditionally by the PROJECT layer, with no `paths:` triggers: the
95
+ obligation governs an **authoring decision** taken before any file exists for a
96
+ path trigger to match, and a path-scoped rule is not re-injected after
97
+ `/compact`, so scoping it would make the obligation vanish mid-session. The
98
+ measurement, the AI-council record of 2026-08-20, the three rejected
99
+ alternatives and the +3,512-token cost this shared note carries for four rules
100
+ live in
101
+ [`source-confidentiality-mechanics`](../docs/guidelines/agent-infra/source-confidentiality-mechanics.md)
102
+ § Why these four rules are unconditional — moved there 2026-08-29 because a
103
+ rationale paid on every subagent spawn is the most expensive place to keep an
104
+ argument nobody re-reads.
128
105
 
129
106
  ## See also
130
107
 
108
+ - [`source-confidentiality-mechanics`](../docs/guidelines/agent-infra/source-confidentiality-mechanics.md) — the claim/residual honesty clause, the two-class split by path, and the gate's shape checks and tiering.
131
109
  - [`source-of-truth`](source-of-truth.md) — edit `src/`, never the projections.
132
110
  - [`augment-edit-discipline`](augment-edit-discipline.md) — portability + cross-ref sync.
133
111
  - `src/scripts/_lib/link_crypto.ts` — encrypted link storage.
@@ -22,7 +22,7 @@ obligation_frequency: "none"
22
22
 
23
23
  # Symfony Routing
24
24
 
25
- **Iron Law.** Symfony-flavoured PHP (DI container, bundles, Doctrine entities, Messenger, Security voters, console commands) → load the `symfony-workflow` skill, not `laravel` and not `php-coder`.
25
+ **Iron Law.** Symfony-flavoured PHP → `symfony-workflow`. Discriminator: entry point and router, not the dependency list — `symfony/*` with no skeleton marker is the third verdict.
26
26
 
27
27
  Body migrated to `skill:symfony-workflow`. Disambiguates the laravel ↔ symfony-workflow cluster head per [`adr-architectural-consensus-mechanism`](../docs/contracts/adr-architectural-consensus-mechanism.md).
28
28
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
@@ -28,6 +28,20 @@ NEVER CALL THE SAME TOOL >2 TIMES IN A ROW WITH SIMILAR PARAMETERS.
28
28
  IF YOU CATCH YOURSELF REPEATING → STOP, RETHINK, ASK.
29
29
  ```
30
30
 
31
+ ## Independent calls go in ONE block
32
+
33
+ ```
34
+ CALLS WITH NO DEPENDENCY BETWEEN THEM GO IN THE SAME BLOCK.
35
+ A CALL THAT DOES NOT READ THE PREVIOUS RESULT IS NOT A SECOND TURN.
36
+ ```
37
+
38
+ The ceiling above forbids repetition; this forbids splitting work that had no
39
+ reason to be split — measured mean batch size **1.01**, i.e. fully serial. The
40
+ discriminator is the dependency, never the count. NOT "write shorter commands":
41
+ the long commands are already the batching. `instruction-only` — nothing can
42
+ observe a call that was not batched. Evidence + the absent-cause finding:
43
+ [`token-efficiency-mechanics`](../contexts/communication/rules-auto/token-efficiency-mechanics.md).
44
+
31
45
  ## Enumerated file sets are ONE operation, not N repetitions
32
46
 
33
47
  The same-tool ceiling counts *repetition without new information* — the loop where the agent re-runs a tool because it did not learn from the last result. Reading N **declared, enumerated** files is the opposite: each read returns different content and the set was known before the first call. Counting it as N repetitions puts this rule in direct conflict with [`downstream-changes`](downstream-changes.md) ("find **ALL** callers, tests, imports") and with [`source-discovery-gate`](source-discovery-gate.md), which cannot be satisfied in two calls.
@@ -12,6 +12,10 @@ enforced_by:
12
12
  - "validator:src/scripts/lint_agent_security.ts"
13
13
  # obligation: line 19
14
14
  obligation_frequency: "per-edit"
15
+ evidence:
16
+ source_type: external-standard
17
+ verified_on: 2026-08-30
18
+ normative_level: recommended
15
19
  ---
16
20
 
17
21
  # Tool Safety
@@ -21,6 +21,10 @@ enforced_by:
21
21
  - "instruction-only: no deterministic gate inspects fetched content for injected instructions; injection_scan_hook is warn-only and default-OFF"
22
22
  # obligation: line 38
23
23
  obligation_frequency: "per-event"
24
+ evidence:
25
+ source_type: external-standard
26
+ verified_on: 2026-08-30
27
+ normative_level: recommended
24
28
  ---
25
29
 
26
30
  <!-- security-lint: allow instruction-smuggling "defense rule: quotes role-takeover phrases (ignore previous instructions, you are now, <IMPORTANT>) to teach refusal" -->
@@ -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
 
@@ -144,7 +145,7 @@ 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
+ * Measured 2026-08-11: archiving one roadmap rewrote four frozen artifacts
148
149
  * under `agents/evidence/reviews/`, including the `diff.patch` headers of a
149
150
  * recorded review input. Nothing caught it — the sweep reported it as
150
151
  * "4 ref(s) migrated", which reads like success.
@@ -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
+ 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