@event4u/agent-config 16.3.0 → 16.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) 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 +178 -78
  5. package/README.md +2 -2
  6. package/agents/templates/.ai-council.yml.example +26 -8
  7. package/dist/agent-src/commands/analyze/inbox.md +10 -7
  8. package/dist/agent-src/commands/bug/investigate.md +1 -1
  9. package/dist/agent-src/commands/commit/in-chunks.md +40 -31
  10. package/dist/agent-src/commands/commit.md +72 -33
  11. package/dist/agent-src/commands/condense.md +2 -8
  12. package/dist/agent-src/commands/council/debate.md +11 -7
  13. package/dist/agent-src/commands/council/default.md +10 -9
  14. package/dist/agent-src/commands/council.md +1 -1
  15. package/dist/agent-src/commands/design.md +1 -1
  16. package/dist/agent-src/commands/estimate-ticket.md +1 -1
  17. package/dist/agent-src/commands/feature/explore.md +3 -3
  18. package/dist/agent-src/commands/feature/plan.md +1 -1
  19. package/dist/agent-src/commands/fix/ci.md +17 -3
  20. package/dist/agent-src/commands/fix/commit-messages.md +48 -23
  21. package/dist/agent-src/commands/fix/pr-comments.md +3 -6
  22. package/dist/agent-src/commands/implement-ticket.md +3 -3
  23. package/dist/agent-src/commands/memory/add.md +4 -16
  24. package/dist/agent-src/commands/memory/load.md +5 -6
  25. package/dist/agent-src/commands/memory/promote.md +3 -16
  26. package/dist/agent-src/commands/mission/upgrade.md +3 -2
  27. package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
  28. package/dist/agent-src/commands/optimize/deep.md +4 -2
  29. package/dist/agent-src/commands/optimize/rtk.md +4 -26
  30. package/dist/agent-src/commands/pr/create/description-only.md +18 -15
  31. package/dist/agent-src/commands/pr/create.md +42 -34
  32. package/dist/agent-src/commands/pr/merge.md +136 -9
  33. package/dist/agent-src/commands/prepare-for-review.md +13 -11
  34. package/dist/agent-src/commands/project/analyze.md +7 -35
  35. package/dist/agent-src/commands/refine-ticket.md +1 -1
  36. package/dist/agent-src/commands/review/changes.md +14 -19
  37. package/dist/agent-src/commands/roadmap/next.md +10 -1
  38. package/dist/agent-src/commands/roadmap/process-full.md +52 -38
  39. package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
  40. package/dist/agent-src/commands/worktree/create.md +7 -3
  41. package/dist/agent-src/commands/worktree/verify.md +2 -1
  42. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
  43. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
  44. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
  45. package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
  46. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
  47. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
  48. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  49. package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
  50. package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
  51. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
  52. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
  53. package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
  54. package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
  55. package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
  56. package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
  57. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  58. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  59. package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  60. package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  61. package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  62. package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
  63. package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  64. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  65. package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
  66. package/dist/agent-src/guidelines/design-antipatterns.md +1 -1
  67. package/dist/agent-src/guidelines/php/git.md +15 -2
  68. package/dist/agent-src/rules/active-remediation.md +0 -1
  69. package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
  70. package/dist/agent-src/rules/architecture.md +0 -1
  71. package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
  72. package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
  73. package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
  74. package/dist/agent-src/rules/autonomous-execution.md +0 -1
  75. package/dist/agent-src/rules/brand-consistency.md +0 -1
  76. package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
  77. package/dist/agent-src/rules/broken-access-control.md +0 -1
  78. package/dist/agent-src/rules/cli-output-handling.md +0 -1
  79. package/dist/agent-src/rules/code-comment-discipline.md +0 -1
  80. package/dist/agent-src/rules/code-provenance.md +0 -1
  81. package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
  82. package/dist/agent-src/rules/commit-conventions.md +1 -2
  83. package/dist/agent-src/rules/communication-through-line.md +1 -2
  84. package/dist/agent-src/rules/content-quoting-floor.md +1 -2
  85. package/dist/agent-src/rules/context-hygiene.md +5 -5
  86. package/dist/agent-src/rules/copilot-routing.md +1 -2
  87. package/dist/agent-src/rules/council-availability.md +4 -4
  88. package/dist/agent-src/rules/cross-source-consistency.md +4 -6
  89. package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
  90. package/dist/agent-src/rules/delegation-policy.md +2 -3
  91. package/dist/agent-src/rules/design-fidelity.md +0 -1
  92. package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
  93. package/dist/agent-src/rules/devcontainer-routing.md +1 -2
  94. package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
  95. package/dist/agent-src/rules/docker-commands.md +0 -1
  96. package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
  97. package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
  98. package/dist/agent-src/rules/domain-safety-pii.md +0 -1
  99. package/dist/agent-src/rules/domain-safety-retention.md +0 -1
  100. package/dist/agent-src/rules/downstream-changes.md +0 -1
  101. package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
  102. package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
  103. package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
  104. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
  105. package/dist/agent-src/rules/finance-safety-floor.md +0 -1
  106. package/dist/agent-src/rules/fix-what-you-see.md +6 -32
  107. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
  108. package/dist/agent-src/rules/git-history-discipline.md +1 -2
  109. package/dist/agent-src/rules/guidelines.md +0 -1
  110. package/dist/agent-src/rules/history-discipline.md +0 -1
  111. package/dist/agent-src/rules/icon-consistency.md +0 -1
  112. package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
  113. package/dist/agent-src/rules/improve-before-implement.md +0 -1
  114. package/dist/agent-src/rules/invite-challenge.md +0 -1
  115. package/dist/agent-src/rules/laravel-routing.md +1 -2
  116. package/dist/agent-src/rules/laravel-translations.md +0 -1
  117. package/dist/agent-src/rules/legal-safety-floor.md +0 -1
  118. package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
  119. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
  120. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
  121. package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
  122. package/dist/agent-src/rules/media-governance-routing.md +1 -2
  123. package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
  124. package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
  125. package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
  126. package/dist/agent-src/rules/missing-tool-handling.md +0 -1
  127. package/dist/agent-src/rules/model-recommendation.md +0 -1
  128. package/dist/agent-src/rules/neighbour-precedence.md +64 -0
  129. package/dist/agent-src/rules/no-attribution-footers.md +0 -1
  130. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
  131. package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
  132. package/dist/agent-src/rules/no-roadmap-references.md +0 -1
  133. package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
  134. package/dist/agent-src/rules/onboarding-gate.md +0 -1
  135. package/dist/agent-src/rules/output-discipline.md +0 -1
  136. package/dist/agent-src/rules/package-ci-checks.md +0 -1
  137. package/dist/agent-src/rules/persona-governance.md +2 -3
  138. package/dist/agent-src/rules/php-coding.md +0 -1
  139. package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
  140. package/dist/agent-src/rules/preservation-guard.md +0 -1
  141. package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
  142. package/dist/agent-src/rules/question-not-instruction.md +0 -1
  143. package/dist/agent-src/rules/reviewer-awareness.md +0 -1
  144. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
  145. package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
  146. package/dist/agent-src/rules/role-mode-adherence.md +0 -1
  147. package/dist/agent-src/rules/rule-type-governance.md +0 -1
  148. package/dist/agent-src/rules/runtime-safety.md +0 -1
  149. package/dist/agent-src/rules/scale-discipline.md +0 -1
  150. package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
  151. package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
  152. package/dist/agent-src/rules/self-repair-loop.md +0 -1
  153. package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
  154. package/dist/agent-src/rules/session-canary.md +0 -1
  155. package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
  156. package/dist/agent-src/rules/size-enforcement.md +0 -1
  157. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
  158. package/dist/agent-src/rules/skill-quality.md +0 -1
  159. package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
  160. package/dist/agent-src/rules/source-confidentiality.md +0 -1
  161. package/dist/agent-src/rules/source-discovery-gate.md +0 -1
  162. package/dist/agent-src/rules/source-of-truth.md +0 -1
  163. package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
  164. package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
  165. package/dist/agent-src/rules/symfony-routing.md +1 -2
  166. package/dist/agent-src/rules/think-before-action.md +0 -1
  167. package/dist/agent-src/rules/token-budget-discipline.md +14 -48
  168. package/dist/agent-src/rules/token-efficiency.md +0 -1
  169. package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
  170. package/dist/agent-src/rules/tool-safety.md +0 -1
  171. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  172. package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
  173. package/dist/agent-src/rules/upstream-proposal.md +0 -1
  174. package/dist/agent-src/rules/user-interaction.md +0 -1
  175. package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
  176. package/dist/agent-src/scripts/gate_budget.ts +47 -23
  177. package/dist/agent-src/scripts/gate_execute.ts +12 -4
  178. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +2 -0
  179. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  180. package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
  181. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
  182. package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
  183. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  184. package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
  185. package/dist/agent-src/skills/canvas-design/SKILL.md +4 -2
  186. package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
  187. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
  188. package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
  189. package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
  190. package/dist/agent-src/skills/database/data/manifest.json +2 -2
  191. package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
  192. package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +13 -10
  193. package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
  194. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  195. package/dist/agent-src/skills/fe-design/references/design-patterns.md +49 -2
  196. package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
  197. package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
  198. package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
  199. package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
  200. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
  201. package/dist/agent-src/skills/iconography/SKILL.md +4 -2
  202. package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
  203. package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
  204. package/dist/agent-src/skills/logo-generation/SKILL.md +12 -8
  205. package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
  206. package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
  207. package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
  208. package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
  209. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
  210. package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
  211. package/dist/agent-src/skills/svg-authoring/SKILL.md +318 -0
  212. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
  213. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  214. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  215. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  216. package/dist/agent-src/skills/wireframe/SKILL.md +5 -2
  217. package/dist/agent-src/templates/AGENTS.md +1 -1
  218. package/dist/agent-src/templates/agent-settings.md +46 -129
  219. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  220. package/dist/agent-src/templates/command.md +2 -2
  221. package/dist/agent-src/templates/roadmaps.md +6 -1
  222. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  223. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  224. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  225. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  226. package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  227. package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  228. package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  229. package/dist/agent-src/templates/skill.md +1 -1
  230. package/dist/cli/commands/uiRender.js +201 -4
  231. package/dist/cli/commands/uiRenderAsset.js +1308 -0
  232. package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
  233. package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
  234. package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
  235. package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
  236. package/dist/cli/commands/uiRenderAssetTypes.js +145 -0
  237. package/dist/cli/main.js +47 -1
  238. package/dist/cli/registry.js +2 -1
  239. package/dist/cli-delegate/check_update_banner.js +195 -119
  240. package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-4DBG5K7M.js} +5 -5
  241. package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
  242. package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
  243. package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
  244. package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
  245. package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
  246. package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
  247. package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
  248. package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
  249. package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
  250. package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
  251. package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
  252. package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
  253. package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
  254. package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
  255. package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
  256. package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
  257. package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
  258. package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
  259. package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-TMWYUOK4.js} +75 -12
  260. package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
  261. package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
  262. package/dist/cli-delegate/cmd_analyze_session.js +223 -43
  263. package/dist/cli-delegate/cmd_brand_status.js +3 -2
  264. package/dist/cli-delegate/cmd_conformance.js +489 -238
  265. package/dist/cli-delegate/cmd_converge.js +3 -3
  266. package/dist/cli-delegate/cmd_doctor.js +15 -12
  267. package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
  268. package/dist/cli-delegate/cmd_explain.js +43 -19
  269. package/dist/cli-delegate/cmd_export.js +10 -10
  270. package/dist/cli-delegate/cmd_git_convention.js +1851 -0
  271. package/dist/cli-delegate/cmd_handoff.js +40 -21
  272. package/dist/cli-delegate/cmd_mcp_available.js +3 -2
  273. package/dist/cli-delegate/cmd_migrate.js +3 -3
  274. package/dist/cli-delegate/cmd_packs_active.js +4 -3
  275. package/dist/cli-delegate/cmd_prune.js +10 -10
  276. package/dist/cli-delegate/cmd_route_audit.js +7 -7
  277. package/dist/cli-delegate/cmd_route_explain.js +5 -5
  278. package/dist/cli-delegate/cmd_session_recycle.js +9 -7
  279. package/dist/cli-delegate/cmd_settings_check.js +54 -7
  280. package/dist/cli-delegate/cmd_settings_get.js +18 -8
  281. package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
  282. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  283. package/dist/cli-delegate/cmd_sync.js +10 -10
  284. package/dist/cli-delegate/cmd_uninstall.js +10 -10
  285. package/dist/cli-delegate/cmd_update.js +7 -7
  286. package/dist/cli-delegate/cmd_upgrade.js +7 -7
  287. package/dist/cli-delegate/cmd_validate.js +10 -10
  288. package/dist/cli-delegate/cmd_versions.js +5 -5
  289. package/dist/cli-delegate/gate_budget.js +1 -1
  290. package/dist/cli-delegate/gate_execute.js +2 -2
  291. package/dist/cli-delegate/roadmap_gates.js +2 -2
  292. package/dist/discovery/deprecation-report.md +1 -1
  293. package/dist/discovery/discovery-manifest.json +171 -107
  294. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  295. package/dist/discovery/discovery-manifest.summary.md +7 -7
  296. package/dist/discovery/dormancy-report.md +1 -1
  297. package/dist/discovery/orphan-report.md +1 -1
  298. package/dist/discovery/packs.json +41 -22
  299. package/dist/discovery/trust-report.md +3 -3
  300. package/dist/discovery/workspaces.json +16 -11
  301. package/dist/hooks/dispatch.js +2520 -1924
  302. package/dist/hooks/dispatch.sha256 +1 -1
  303. package/dist/hooks/svg_rules.chunk.cjs +1626 -0
  304. package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
  305. package/dist/install/install.mjs +462 -431
  306. package/dist/install/installThinLayer.js +40 -12
  307. package/dist/install/installedRuleLinks.js +105 -19
  308. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  309. package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
  310. package/dist/mcp/registry-manifest.json +5 -5
  311. package/dist/mcp/server.json +2 -2
  312. package/dist/mcp/server.mjs +3063 -2160
  313. package/dist/router.json +1 -1
  314. package/dist/scripts/_lib/agent_settings.js +15 -120
  315. package/dist/scripts/_lib/compile_time_toggles.js +12 -21
  316. package/dist/scripts/_lib/git_convention.js +232 -0
  317. package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
  318. package/dist/scripts/_lib/installed_layer.js +344 -18
  319. package/dist/scripts/_lib/package_root.js +68 -0
  320. package/dist/scripts/_lib/rule_law_section.js +1 -1
  321. package/dist/scripts/_lib/scan_scope.js +105 -0
  322. package/dist/scripts/_lib/settings_removed_keys.js +168 -0
  323. package/dist/scripts/_lib/svg_dom.js +284 -0
  324. package/dist/scripts/_lib/svg_geometry.js +477 -0
  325. package/dist/scripts/_lib/svg_motion.js +179 -0
  326. package/dist/scripts/_lib/svg_rules.js +1337 -0
  327. package/dist/scripts/_lib/svg_urls.js +67 -0
  328. package/dist/scripts/_lib/thin_rules.js +80 -3
  329. package/dist/scripts/lint_svg_asset.js +324 -0
  330. package/dist/server/app.js +2 -1
  331. package/dist/server/gitKeysGate.js +105 -0
  332. package/dist/server/routes/settings.js +67 -8
  333. package/dist/server/routes/wizard.js +4 -0
  334. package/dist/server/schemas/settings.js +23 -81
  335. package/dist/shared/skillRanking.js +30 -4
  336. package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
  337. package/dist/ui/index.html +1 -1
  338. package/docs/MIGRATION.md +72 -1
  339. package/docs/contracts/settings-classes.md +35 -65
  340. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
  341. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
  342. package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
  343. package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
  344. package/docs/guidelines/agent-infra/layered-settings.md +13 -1
  345. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
  346. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
  347. package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
  348. package/docs/guidelines/design-antipatterns.md +1 -1
  349. package/docs/guidelines/php/git.md +15 -2
  350. package/package.json +4 -3
  351. package/src/agent-src/scripts/gate_budget.ts +47 -23
  352. package/src/agent-src/scripts/gate_execute.ts +12 -4
  353. package/src/agent-src/templates/AGENTS.md +1 -1
  354. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
  355. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
  356. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
  357. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
  358. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
  359. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
  360. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
  361. package/src/config/agent-settings.template.yml +79 -312
  362. package/src/config/agents-paths.yml +16 -0
  363. package/src/config/assurance-capability-registry.json +7 -3
  364. package/src/config/ci-local-parity.yml +3 -0
  365. package/src/config/continuity-surface.json +3 -3
  366. package/src/config/discovery/packs.yml +17 -1
  367. package/src/config/evaluator-budgets.json +19 -6
  368. package/src/config/gate-coverage.yml +65 -23
  369. package/src/config/gate-violation-baselines.json +56 -16
  370. package/src/config/gitignore-block.txt +19 -0
  371. package/src/config/hook-bundle-budget.json +1 -1
  372. package/src/config/release-gate-locality.yml +2 -1
  373. package/src/config/routing-coverage-seed.json +55 -6
  374. package/src/config/rule-law-ceilings.json +12 -6
  375. package/src/config/rule-obligations.json +833 -0
  376. package/src/install/installThinLayer.ts +76 -10
  377. package/src/install/installedRuleLinks.ts +105 -17
  378. package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
  379. package/src/scripts/_cli/cmd_conformance.ts +13 -2
  380. package/src/scripts/_cli/cmd_doctor.ts +10 -10
  381. package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
  382. package/src/scripts/_cli/cmd_explain.ts +72 -14
  383. package/src/scripts/_cli/cmd_git_convention.ts +637 -0
  384. package/src/scripts/_cli/cmd_settings_check.ts +66 -8
  385. package/src/scripts/_cli/cmd_settings_get.ts +18 -3
  386. package/src/scripts/_cli/doctor_execution.ts +72 -1
  387. package/src/scripts/_dispatch.bash +37 -2
  388. package/src/scripts/_lib/agent_settings.ts +15 -124
  389. package/src/scripts/_lib/blocked_by_marker.ts +1 -1
  390. package/src/scripts/_lib/compile_time_toggles.ts +12 -21
  391. package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
  392. package/src/scripts/_lib/git_base_ref.ts +92 -0
  393. package/src/scripts/_lib/git_convention.ts +291 -0
  394. package/src/scripts/_lib/git_convention_carrier.ts +389 -0
  395. package/src/scripts/_lib/git_convention_grammar.ts +246 -0
  396. package/src/scripts/_lib/git_convention_measure.ts +344 -0
  397. package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
  398. package/src/scripts/_lib/graph_feeder_record.ts +236 -13
  399. package/src/scripts/_lib/installed_layer.ts +448 -23
  400. package/src/scripts/_lib/knowledge_global.ts +14 -1
  401. package/src/scripts/_lib/module_reach.ts +456 -0
  402. package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
  403. package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
  404. package/src/scripts/_lib/ratification_artifact.ts +220 -1
  405. package/src/scripts/_lib/ratification_subject.ts +92 -0
  406. package/src/scripts/_lib/release_findings_ingest.ts +15 -7
  407. package/src/scripts/_lib/release_highlights.ts +5 -0
  408. package/src/scripts/_lib/rule_law_section.ts +1 -1
  409. package/src/scripts/_lib/rule_obligations.ts +205 -0
  410. package/src/scripts/_lib/self_repair.ts +1 -1
  411. package/src/scripts/_lib/settings_removed_keys.ts +173 -0
  412. package/src/scripts/_lib/svg_dom.ts +318 -0
  413. package/src/scripts/_lib/svg_geometry.ts +480 -0
  414. package/src/scripts/_lib/svg_motion.ts +208 -0
  415. package/src/scripts/_lib/svg_rules.ts +1453 -0
  416. package/src/scripts/_lib/svg_urls.ts +72 -0
  417. package/src/scripts/_lib/test_red_state.ts +5 -0
  418. package/src/scripts/_lib/thin_rules.ts +83 -3
  419. package/src/scripts/_lib/touched_file_quality.ts +142 -6
  420. package/src/scripts/_lib/verification_command.ts +59 -0
  421. package/src/scripts/_lib/verify_clause.ts +27 -17
  422. package/src/scripts/_lib/worker_budget.ts +1 -1
  423. package/src/scripts/adr/regenerate_index.ts +16 -1
  424. package/src/scripts/ai_council/config.ts +7 -7
  425. package/src/scripts/ai_council/modification_review.ts +100 -0
  426. package/src/scripts/ai_council/modification_review_questions.ts +90 -0
  427. package/src/scripts/ai_council/orchestrator.ts +5 -5
  428. package/src/scripts/ai_council/spend_gate.ts +18 -7
  429. package/src/scripts/ai_team/config.ts +11 -16
  430. package/src/scripts/audit_user_type_axis.ts +20 -8
  431. package/src/scripts/bench_ab_clone.ts +1 -2
  432. package/src/scripts/bench_concern_spawn_path.ts +129 -0
  433. package/src/scripts/bench_graph_feeder_latency.ts +584 -0
  434. package/src/scripts/check_agent_artifact_location.ts +36 -0
  435. package/src/scripts/check_branch_freshness.ts +147 -24
  436. package/src/scripts/check_enforcement_coverage.ts +130 -0
  437. package/src/scripts/check_evaluator_budgets.ts +4 -0
  438. package/src/scripts/check_finding_dispositions.ts +88 -25
  439. package/src/scripts/check_gate_coverage.ts +4 -3
  440. package/src/scripts/check_gate_reachability.ts +48 -1
  441. package/src/scripts/check_generator_sync.ts +48 -0
  442. package/src/scripts/check_hook_bundle_composition.ts +107 -0
  443. package/src/scripts/check_kernel_edit_ratified.ts +86 -6
  444. package/src/scripts/check_pack_size.ts +1 -1
  445. package/src/scripts/check_release_manifest_content.ts +189 -0
  446. package/src/scripts/check_standing_rule_delivery.ts +96 -0
  447. package/src/scripts/check_suppression_hygiene.ts +2 -5
  448. package/src/scripts/ci_settle.ts +42 -5
  449. package/src/scripts/classify_merge_risk.ts +320 -0
  450. package/src/scripts/closure_scan.ts +91 -1
  451. package/src/scripts/command_suggester/settings.ts +8 -108
  452. package/src/scripts/command_suggester/types.ts +4 -5
  453. package/src/scripts/consumer_matrix.ts +102 -0
  454. package/src/scripts/context_hygiene_hook.ts +13 -23
  455. package/src/scripts/cost/preflight.mjs +12 -1
  456. package/src/scripts/council_cli.ts +7 -7
  457. package/src/scripts/dispatch_r2_reviewer.ts +24 -11
  458. package/src/scripts/explain_run.ts +8 -13
  459. package/src/scripts/generate_git_convention_grammar.ts +127 -0
  460. package/src/scripts/generate_host_cost_table.ts +20 -3
  461. package/src/scripts/handoff_context_hook.ts +86 -37
  462. package/src/scripts/hook_manifest.json +1 -1
  463. package/src/scripts/hook_manifest.yaml +25 -6
  464. package/src/scripts/hooks/block_config_weakening.ts +48 -5
  465. package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
  466. package/src/scripts/hooks/block_speaking_inbox_dir.ts +16 -1
  467. package/src/scripts/hooks/concern_registry.ts +2 -0
  468. package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
  469. package/src/scripts/hooks/design_pass_hook.ts +157 -3
  470. package/src/scripts/hooks/evidence_independence.ts +12 -4
  471. package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
  472. package/src/scripts/hooks/push_settle_hook.ts +4 -3
  473. package/src/scripts/hooks/rule_inject_hook.ts +44 -3
  474. package/src/scripts/hooks/state_io.ts +8 -4
  475. package/src/scripts/hooks/svg_obligation.ts +497 -0
  476. package/src/scripts/hooks/svg_rules_loader.ts +133 -0
  477. package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
  478. package/src/scripts/hooks/turn_end_gate_hook.ts +6 -3
  479. package/src/scripts/install-hooks.sh +42 -14
  480. package/src/scripts/install.ts +7 -31
  481. package/src/scripts/lint_blocker_citations.ts +198 -0
  482. package/src/scripts/lint_consolidation_lineage.ts +6 -3
  483. package/src/scripts/lint_design_quality.ts +60 -12
  484. package/src/scripts/lint_evidence_artifacts.ts +9 -0
  485. package/src/scripts/lint_hook_concern_budget.ts +10 -21
  486. package/src/scripts/lint_motion_authority_drift.ts +27 -0
  487. package/src/scripts/lint_pack_boundaries.ts +406 -28
  488. package/src/scripts/lint_roadmap_blockers.ts +282 -29
  489. package/src/scripts/lint_roadmap_complexity.ts +4 -2
  490. package/src/scripts/lint_rule_law_section.ts +151 -21
  491. package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
  492. package/src/scripts/lint_settings_classes.ts +1 -1
  493. package/src/scripts/lint_svg_asset.ts +365 -0
  494. package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
  495. package/src/scripts/lint_workflow_security.ts +12 -1
  496. package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
  497. package/src/scripts/model_rule_injection.ts +3 -3
  498. package/src/scripts/onboarding_gate_hook.ts +7 -6
  499. package/src/scripts/print_required_checks.ts +15 -3
  500. package/src/scripts/probe_host_compliance.ts +33 -5
  501. package/src/scripts/probe_turnaround.ts +183 -3
  502. package/src/scripts/ratification_header.ts +77 -0
  503. package/src/scripts/refusal_envelope.ts +138 -0
  504. package/src/scripts/release_publication.ts +29 -3
  505. package/src/scripts/report_dispatch_import_closure.ts +76 -0
  506. package/src/scripts/report_installed_rule_links.ts +118 -1
  507. package/src/scripts/report_module_reach.ts +212 -0
  508. package/src/scripts/report_obligation_mechanism.ts +16 -18
  509. package/src/scripts/report_parked_blockers.ts +222 -0
  510. package/src/scripts/report_required_checks_drift.ts +196 -0
  511. package/src/scripts/report_skill_ranker_confusion.ts +103 -2
  512. package/src/scripts/report_standing_payload_by_host.ts +1 -1
  513. package/src/scripts/routing_doctor.ts +2 -2
  514. package/src/scripts/schemas/agent-settings.schema.json +17 -31
  515. package/src/scripts/schemas/command.schema.json +1 -1
  516. package/src/scripts/schemas/skill.schema.json +1 -1
  517. package/src/scripts/self_review_gate.ts +39 -2
  518. package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
  519. package/src/scripts/sync_pr_branch.ts +403 -132
  520. package/src/scripts/trigger_eval_grandfather.json +0 -16
  521. package/src/server/schemas/settings.ts +33 -177
  522. package/src/shared/skillRanking.ts +53 -4
  523. package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
  524. package/src/scripts/_lib/config_chain.ts +0 -477
  525. package/src/scripts/_lib/conformance_report.ts +0 -403
  526. package/src/scripts/_lib/eval_discrimination.ts +0 -95
  527. package/src/scripts/_lib/evaluator_promotion.ts +0 -225
  528. package/src/scripts/_lib/file_slicer.ts +0 -117
  529. package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
  530. package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
  531. package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
  532. package/src/scripts/_lib/role_split.ts +0 -338
@@ -8,8 +8,16 @@
8
8
  *
9
9
  * 1. Every `### blocker: <id>` entry declares all five required fields
10
10
  * (Status, Owner, Blocks, What to do, Resolved when).
11
- * 2. Every inline `<!-- blocked-by: <id> -->` annotation resolves to a
12
- * `### blocker: <id>` entry declared in the SAME file.
11
+ * 2. Every inline `<!-- blocked-by: <id> -->` annotation — on the checkbox
12
+ * line or a continuation line — resolves to an OPEN `### blocker: <id>`
13
+ * declared in the SAME file; `<!-- blocked-by: <roadmap-stem>#<id> -->`
14
+ * resolves to an open blocker in the named active roadmap or stub. A
15
+ * resolved target (stale), a missing file or id, a target found only in
16
+ * `later/`/`archive/`/`skipped/`, an ambiguous stem, a self-qualified
17
+ * reference, an unparseable marker, and a `### ` heading under
18
+ * `## Blockers` without the `blocker:` prefix are all hard findings —
19
+ * each used to pass with nothing validated (AI council 2026-10-07,
20
+ * authority-routing roadmap 4.1-4.3).
13
21
  * 3. An entry that declares `- **Class:**` declares a class the taxonomy
14
22
  * knows (0-3), and a class-0 or class-1 entry says HOW it runs
15
23
  * (`- **Run:**`). A gate that claims to be executable without naming the
@@ -71,12 +79,33 @@
71
79
  * and not WHAT it can parse; the second half is the sibling defect recorded in
72
80
  * `stubs/road-to-blocker-parse-visibility.md`, and it is untouched here.
73
81
  *
74
- * `later/`, `archive/` and `skipped/` stay OUT, and the reason is not symmetry:
75
- * those record decisions already taken (parked, closed, dropped), so a blocker
76
- * left unresolved there is history rather than debt. A stub records a decision
77
- * still to take. The polarity is pinned in both directions by
78
- * `tests/scripts/lint_roadmap_blockers.test.ts` § the scanned scope, so
79
- * widening further cannot happen by accident.
82
+ * `archive/` and `skipped/` stay OUT, and so does `later/` with ONE exception.
83
+ * The reason is not symmetry: those record decisions already taken (parked,
84
+ * closed, dropped), so a blocker left unresolved there is history rather than
85
+ * debt. A stub records a decision still to take.
86
+ *
87
+ * THE EXCEPTION — `later/*-carried.md`, added 2026-10-10 by D6 of
88
+ * `road-to-parked-blockers-that-get-asked`, blocker `later-blockers-in-scope`,
89
+ * option (b'). AI council round 2, 2026-10-08, anthropic + openai, 2/2.
90
+ * A `-carried` file holds steps a closing roadmap could not finish: that is
91
+ * open work which was MOVED, not a decision taken, so the argument excluding
92
+ * the rest of `later/` does not reach it. Round 1 had SPLIT — one seat for the
93
+ * widening on the condition the carried files already pass, one for keeping
94
+ * the exclusion with report-only observability — and the condition was then
95
+ * measured true: 7 of 7 carried files, 0 hard findings. So this lands on
96
+ * nothing, the same "no backlog to grandfather" argument the `stubs/` widening
97
+ * made.
98
+ *
99
+ * Deliberately NOT widened with it: `/roadmap:resolve-blockers` keeps its
100
+ * scope. Option (b) would have moved both together; (b') moves the gate and
101
+ * leaves the command, because a gate that reports is a different commitment
102
+ * from a command that asks an owner to decide.
103
+ *
104
+ * The polarity is pinned in BOTH directions by
105
+ * `tests/scripts/lint_roadmap_blockers.test.ts` § the scanned scope — a
106
+ * carried file is judged, an ordinary `later/` roadmap beside it is not, and
107
+ * the suffix does not leak into `archive/` or `skipped/` — so widening further
108
+ * cannot happen by accident.
80
109
  *
81
110
  * One consequence worth naming rather than discovering: `_archiveOverlap`
82
111
  * defaults its ACTIVE corpus to this glob, so a stub declaring a blocker open
@@ -106,20 +135,60 @@ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
106
135
  * expression: nothing globs with this string, and a `{,stubs/}` empty
107
136
  * alternative is bash-only syntax that would mislead anyone who tried.
108
137
  */
109
- const ROADMAP_GLOB = 'agents/roadmaps/*.md + agents/roadmaps/stubs/*.md';
110
- /** The one subdirectory inside the glob. See § SCOPE for why only this one. */
138
+ const ROADMAP_GLOB =
139
+ 'agents/roadmaps/*.md + agents/roadmaps/stubs/*.md + agents/roadmaps/later/*-carried.md';
140
+ /** The one subdirectory wholly inside the glob; the scope section says why only this one. */
111
141
  const SCANNED_SUBDIRS: readonly string[] = ['stubs'];
142
+ /**
143
+ * `later/` is in scope for ONE filename shape and no other.
144
+ *
145
+ * A `-carried` file holds steps a closing roadmap could not finish, so it is
146
+ * open work that was moved — not a decision already taken, which is what the
147
+ * rest of `later/` records. It is the same distinction the scope section above
148
+ * draws for `stubs/`, applied to a file rather than a directory.
149
+ */
150
+ const CARRIED_DIR = 'later';
151
+ const CARRIED_SUFFIX = '-carried.md';
152
+ /** Roadmap directories a qualified reference may NAME but never resolve into. */
153
+ const OUT_OF_SCOPE_SUBDIRS: readonly string[] = ['later', 'archive', 'skipped'];
112
154
 
113
155
  const FENCED_CODE_RE = /^[ \t]*```[^\n]*\n[\s\S]*?^[ \t]*```[ \t]*$/gm;
114
156
  const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
115
157
  const NEXT_H2_RE = /^##[ \t]+\S/m;
116
158
  const BLOCKER_HEADING_RE = /^###[ \t]+blocker:[ \t]*(.+?)[ \t]*$/gim;
117
- // Only a real checkbox line (`- [ ] … <!-- blocked-by: id -->`) counts — a
118
- // wrapped continuation line or inline-code documentation example of the
119
- // syntax (as this very lint script's own roadmap step describes it) must
120
- // not be mistaken for a live cross-reference.
159
+ const UNPREFIXED_HEADING_RE = /^###[ \t]+(?!blocker:)\S.*$/gim;
160
+ // Every line carrying a real HTML-comment marker counts — the checkbox line
161
+ // AND a wrapped continuation line of the same step. Anchoring to the checkbox
162
+ // line alone read nothing on a continuation line and still printed the file
163
+ // clean (authority-routing council record, defect 1). Inline-code
164
+ // documentation of the syntax is blanked before matching, so a quoted example
165
+ // stays prose rather than a live reference.
121
166
  const BLOCKED_BY_LINE_RE =
122
- /^-[ \t]*\[[ xX~-]\].*<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[\u2014-][ \t]*([^>]*?))?[ \t]*)?-->/i;
167
+ /<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+(?:#[a-z0-9-]+)?)[ \t]*(?:\|[ \t]*asked:[ \t]*(yes|no)[ \t]*(?:[\u2014-][ \t]*([^>]*?))?[ \t]*)?-->/i;
168
+ /** A marker opening the full grammar above failed to parse — reported, never skipped. */
169
+ const MARKER_OPEN_RE = /<!--[ \t]*blocked-by:/i;
170
+
171
+ /**
172
+ * Where a qualified `<roadmap-stem>#<id>` reference may resolve.
173
+ *
174
+ * The AI council, 2026-10-07, 2/2 present, both on the qualified form: only an
175
+ * in-scope roadmap (active or stub) is a legal target. A target found only in
176
+ * `later/`, `archive/` or `skipped/` is out of scope — directory placement is a
177
+ * different state machine from blocker status, so it is named in the error and
178
+ * never read as "resolved" or "still held".
179
+ */
180
+ interface TargetFile {
181
+ rel: string;
182
+ declared: ReadonlySet<string>;
183
+ open: ReadonlySet<string>;
184
+ userDecision: ReadonlySet<string>;
185
+ }
186
+ interface TargetIndex {
187
+ /** Roadmap stem → every in-scope file with that stem (more than one is ambiguous). */
188
+ inScope: ReadonlyMap<string, readonly TargetFile[]>;
189
+ /** Roadmap stem → the out-of-scope directory it was found in. */
190
+ outOfScope: ReadonlyMap<string, string>;
191
+ }
123
192
 
124
193
  /**
125
194
  * The owners whose blockers are the USER-DECISION class.
@@ -249,8 +318,8 @@ function _stripFencedCode(text: string): string {
249
318
  return text.replace(FENCED_CODE_RE, (m) => '\n'.repeat((m.match(/\n/g) ?? []).length));
250
319
  }
251
320
 
252
- function _scan(rawText: string): Violation[] {
253
- return _scanBoth(rawText).hard;
321
+ function _scan(rawText: string, ctx?: ScanContext): Violation[] {
322
+ return _scanBoth(rawText, ctx).hard;
254
323
  }
255
324
 
256
325
  interface ScanResult {
@@ -260,12 +329,20 @@ interface ScanResult {
260
329
  decidability: Violation[];
261
330
  }
262
331
 
263
- function _scanBoth(rawText: string): ScanResult {
332
+ /** What a scan needs to resolve a qualified reference: who it is, and where it may point. */
333
+ interface ScanContext {
334
+ /** The scanned file's own roadmap stem, so a self-qualified reference is caught. */
335
+ selfStem?: string;
336
+ index?: TargetIndex;
337
+ }
338
+
339
+ function _scanBoth(rawText: string, ctx: ScanContext = {}): ScanResult {
264
340
  const violations: Violation[] = [];
265
341
  const decidability: Violation[] = [];
266
342
  const text = _stripFencedCode(rawText);
267
343
  const declaredIds = new Set<string>();
268
344
  const userDecisionIds = new Set<string>();
345
+ const openIds = new Set<string>();
269
346
 
270
347
  const sectionMatch = BLOCKERS_SECTION_RE.exec(text);
271
348
  if (sectionMatch) {
@@ -288,9 +365,27 @@ function _scanBoth(rawText: string): ScanResult {
288
365
  BLOCKER_HEADING_RE.lastIndex++;
289
366
  }
290
367
  }
368
+ // A `### <id>` heading without the `blocker:` prefix parses to no
369
+ // blocker at all, so the file used to pass with nothing validated.
370
+ for (const bare of section.matchAll(UNPREFIXED_HEADING_RE)) {
371
+ violations.push({
372
+ line: _lineAt(text, sectionStart + (bare.index ?? 0)),
373
+ message:
374
+ `'${(bare[0] as string).trim()}' sits under ## Blockers without the ` +
375
+ "'blocker:' prefix, so it declares no blocker — write '### blocker: <id>'",
376
+ });
377
+ }
291
378
  for (let i = 0; i < heads.length; i++) {
292
379
  const cur = heads[i] as { start: number; end: number; id: string };
293
380
  declaredIds.add(cur.id);
381
+ if (cur.id.includes('#')) {
382
+ violations.push({
383
+ line: _lineAt(text, sectionStart + cur.start),
384
+ message:
385
+ `blocker id '${cur.id}' contains '#', the separator of a qualified ` +
386
+ "'<roadmap-stem>#<id>' reference — rename it",
387
+ });
388
+ }
294
389
  const bodyEnd = i + 1 < heads.length ? (heads[i + 1] as { start: number }).start : section.length;
295
390
  const body = section.slice(cur.end, bodyEnd);
296
391
  if (USER_DECISION_OWNER_RE.test(body)) {
@@ -307,6 +402,7 @@ function _scanBoth(rawText: string): ScanResult {
307
402
  // made would be churn, and the ratchet would never reach zero.
308
403
  const isResolved = /^-[ \t]*\*\*Status:\*\*[ \t]*resolved/im.test(body);
309
404
  if (!isResolved) {
405
+ openIds.add(cur.id);
310
406
  // The class/run contract is HARD rather than ratcheted, and it
311
407
  // can be: `Class:` is a new opt-in field, so on the day it
312
408
  // ships no entry in the tree declares one and the rule fires on
@@ -382,18 +478,23 @@ function _scanBoth(rawText: string): ScanResult {
382
478
  const cleaned = (lines[i] as string).replace(/`[^`\n]*`/g, (m) => ' '.repeat(m.length));
383
479
  const m = BLOCKED_BY_LINE_RE.exec(cleaned);
384
480
  if (!m) {
481
+ if (MARKER_OPEN_RE.test(cleaned)) {
482
+ violations.push({
483
+ line: i + 1,
484
+ message:
485
+ 'blocked-by marker does not parse — write ' +
486
+ "'<!-- blocked-by: <id> -->' or '<!-- blocked-by: <roadmap-stem>#<id> -->'",
487
+ });
488
+ }
385
489
  continue;
386
490
  }
387
- const id = m[1] as string;
388
- if (!declaredIds.has(id)) {
389
- violations.push({
390
- line: i + 1,
391
- message:
392
- `blocked-by references unknown blocker id '${id}' ` +
393
- `(no matching '### blocker: ${id}' in this file)`,
394
- });
491
+ const ref = m[1] as string;
492
+ const r = _resolveRef(ref, { declaredIds, openIds, userDecisionIds }, ctx);
493
+ if (r.error !== null) {
494
+ violations.push({ line: i + 1, message: r.error });
395
495
  }
396
- if (userDecisionIds.has(id)) {
496
+ const id = ref;
497
+ if (r.userDecision) {
397
498
  const asked = m[2] === undefined ? null : (m[2] as string).toLowerCase();
398
499
  const reason = ((m[3] as string | undefined) ?? '').trim();
399
500
  if (asked === null) {
@@ -420,6 +521,149 @@ function _scanBoth(rawText: string): ScanResult {
420
521
  return { hard: violations, decidability };
421
522
  }
422
523
 
524
+ interface LocalBlockers {
525
+ declaredIds: ReadonlySet<string>;
526
+ openIds: ReadonlySet<string>;
527
+ userDecisionIds: ReadonlySet<string>;
528
+ }
529
+
530
+ /**
531
+ * Resolve one marker reference to its legal state, or the error naming why not.
532
+ *
533
+ * Bare `<id>` resolves in the same file only, unchanged. Qualified
534
+ * `<roadmap-stem>#<id>` resolves against the in-scope target named — never
535
+ * estate-wide, so an unrelated roadmap adding a same-named blocker cannot change
536
+ * what an existing marker means. A target that is declared but resolved makes
537
+ * the marker STALE: `run-continuation` treats every marker as blocked, so a
538
+ * marker on a resolved blocker would hold a step nothing holds any more.
539
+ * "Superseded" is not a state — the format has no replacement pointer, so a
540
+ * moved blocker is a reference to update, reported here as missing.
541
+ */
542
+ function _resolveRef(
543
+ ref: string,
544
+ local: LocalBlockers,
545
+ ctx: ScanContext,
546
+ ): { error: string | null; userDecision: boolean } {
547
+ const hash = ref.indexOf('#');
548
+ if (hash === -1) {
549
+ if (!local.declaredIds.has(ref)) {
550
+ return {
551
+ error:
552
+ `blocked-by references unknown blocker id '${ref}' ` +
553
+ `(no matching '### blocker: ${ref}' in this file; a blocker declared in ` +
554
+ "another roadmap is referenced as '<roadmap-stem>#<id>')",
555
+ userDecision: false,
556
+ };
557
+ }
558
+ if (!local.openIds.has(ref)) {
559
+ return { error: _staleMessage(ref, 'this file'), userDecision: false };
560
+ }
561
+ return { error: null, userDecision: local.userDecisionIds.has(ref) };
562
+ }
563
+ const stem = ref.slice(0, hash);
564
+ const id = ref.slice(hash + 1);
565
+ if (ctx.selfStem !== undefined && stem === ctx.selfStem) {
566
+ return {
567
+ error: `blocked-by '${ref}' qualifies a blocker in this same file — write the bare id '${id}'`,
568
+ userDecision: false,
569
+ };
570
+ }
571
+ const hits = ctx.index?.inScope.get(stem) ?? [];
572
+ if (hits.length > 1) {
573
+ return {
574
+ error:
575
+ `blocked-by '${ref}' is ambiguous — roadmap stem '${stem}' names ` +
576
+ `${hits.map((h) => h.rel).join(' and ')}`,
577
+ userDecision: false,
578
+ };
579
+ }
580
+ const target = hits[0];
581
+ if (target === undefined) {
582
+ const parked = ctx.index?.outOfScope.get(stem);
583
+ return {
584
+ error:
585
+ parked === undefined
586
+ ? `blocked-by '${ref}' names no roadmap '${stem}.md' in agents/roadmaps/ or stubs/`
587
+ : `blocked-by '${ref}' names a roadmap only found in ${parked}/, which is not a ` +
588
+ 'resolvable target — only an active roadmap or a stub can hold a step',
589
+ userDecision: false,
590
+ };
591
+ }
592
+ if (!target.declared.has(id)) {
593
+ return {
594
+ error: `blocked-by '${ref}' names no '### blocker: ${id}' in ${target.rel}`,
595
+ userDecision: false,
596
+ };
597
+ }
598
+ if (!target.open.has(id)) {
599
+ return { error: _staleMessage(ref, target.rel), userDecision: false };
600
+ }
601
+ return { error: null, userDecision: target.userDecision.has(id) };
602
+ }
603
+
604
+ function _staleMessage(ref: string, where: string): string {
605
+ return (
606
+ `blocked-by '${ref}' points at a blocker resolved in ${where} — if the step can ` +
607
+ 'proceed, remove the marker; if it is still held, reopen the blocker and say why'
608
+ );
609
+ }
610
+
611
+ /** Declared, open and user-decision blocker ids of one roadmap text. */
612
+ function _blockerSets(text: string): { declared: Set<string>; open: Set<string>; userDecision: Set<string> } {
613
+ const declared = new Set<string>();
614
+ const userDecision = new Set<string>();
615
+ const stripped = _stripFencedCode(text);
616
+ const sectionMatch = BLOCKERS_SECTION_RE.exec(stripped);
617
+ if (sectionMatch) {
618
+ const sectionStart = sectionMatch.index + sectionMatch[0].length;
619
+ const rest = stripped.slice(sectionStart);
620
+ const h2 = NEXT_H2_RE.exec(rest);
621
+ const section = stripped.slice(sectionStart, h2 ? sectionStart + h2.index : stripped.length);
622
+ const heads = [...section.matchAll(BLOCKER_HEADING_RE)];
623
+ heads.forEach((hm, i) => {
624
+ const id = (hm[1] as string).trim();
625
+ declared.add(id);
626
+ const next = heads[i + 1];
627
+ const body = section.slice((hm.index ?? 0) + hm[0].length, next ? next.index : section.length);
628
+ if (USER_DECISION_OWNER_RE.test(body)) {
629
+ userDecision.add(id);
630
+ }
631
+ });
632
+ }
633
+ return { declared, open: _openBlockerIds(text), userDecision };
634
+ }
635
+
636
+ /** The qualified-reference target map over a roadmap tree. See {@link TargetIndex}. */
637
+ function _targetIndex(roadmapRoot: string = path.join(REPO_ROOT, 'agents', 'roadmaps')): TargetIndex {
638
+ const inScope = new Map<string, TargetFile[]>();
639
+ for (const f of _globRoadmaps(roadmapRoot)) {
640
+ const stem = path.basename(f, '.md');
641
+ const sets = _blockerSets(fs.readFileSync(f, 'utf-8'));
642
+ const entry: TargetFile = {
643
+ rel: _relPosix(f, REPO_ROOT),
644
+ declared: sets.declared,
645
+ open: sets.open,
646
+ userDecision: sets.userDecision,
647
+ };
648
+ const list = inScope.get(stem);
649
+ if (list === undefined) {
650
+ inScope.set(stem, [entry]);
651
+ } else {
652
+ list.push(entry);
653
+ }
654
+ }
655
+ const outOfScope = new Map<string, string>();
656
+ for (const dir of OUT_OF_SCOPE_SUBDIRS) {
657
+ for (const f of _globFlat(path.join(roadmapRoot, dir))) {
658
+ const stem = path.basename(f, '.md');
659
+ if (!inScope.has(stem) && !outOfScope.has(stem)) {
660
+ outOfScope.set(stem, dir);
661
+ }
662
+ }
663
+ }
664
+ return { inScope, outOfScope };
665
+ }
666
+
423
667
  /** Sorted `*.md` directly inside `dir` — never recursive. */
424
668
  function _globFlat(dir: string): string[] {
425
669
  let entries: fs.Dirent[];
@@ -451,6 +695,13 @@ function _globRoadmaps(roadmapRoot: string = path.join(REPO_ROOT, 'agents', 'roa
451
695
  for (const sub of SCANNED_SUBDIRS) {
452
696
  out.push(..._globFlat(path.join(roadmapRoot, sub)));
453
697
  }
698
+ // The suffix is checked against `later/` alone, never applied tree-wide: a
699
+ // carried name under `archive/` or `skipped/` is still a decision taken.
700
+ out.push(
701
+ ..._globFlat(path.join(roadmapRoot, CARRIED_DIR)).filter((f) =>
702
+ path.basename(f).endsWith(CARRIED_SUFFIX),
703
+ ),
704
+ );
454
705
  return out;
455
706
  }
456
707
 
@@ -631,12 +882,13 @@ function main(): number {
631
882
  }
632
883
  return 0;
633
884
  }
885
+ const index = _targetIndex();
634
886
  let failed = 0;
635
887
  const undecidable: Array<{ rel: string; v: Violation }> = [];
636
888
  for (const roadmap of roadmaps) {
637
889
  const rel = _relPosix(roadmap, REPO_ROOT);
638
890
  const text = fs.readFileSync(roadmap, 'utf-8');
639
- const { hard, decidability } = _scanBoth(text);
891
+ const { hard, decidability } = _scanBoth(text, { selfStem: path.basename(roadmap, '.md'), index });
640
892
  for (const v of decidability) {
641
893
  undecidable.push({ rel, v });
642
894
  }
@@ -763,10 +1015,11 @@ export {
763
1015
  _hasExecutableSubstance,
764
1016
  _scan,
765
1017
  _scanBoth,
1018
+ _targetIndex,
766
1019
  _globRoadmaps,
767
1020
  _globArchivedRoadmaps,
768
1021
  _openBlockerIds,
769
1022
  _archiveOverlap,
770
1023
  main,
771
1024
  };
772
- export type { Violation, ScanResult, Overlap };
1025
+ export type { Violation, ScanResult, Overlap, ScanContext, TargetIndex };
@@ -154,8 +154,10 @@ function _check_lightweight(text: string, line_count: number, problems: string[]
154
154
  if (line_count > LIGHTWEIGHT_LINE_CAP) {
155
155
  problems.push(
156
156
  `lightweight cap exceeded: ${line_count} lines ` +
157
- `(max ${LIGHTWEIGHT_LINE_CAP}); consider tagging structural ` +
158
- `or trimming`,
157
+ `(max ${LIGHTWEIGHT_LINE_CAP}); move dated evidence paragraphs ` +
158
+ `verbatim to a page under agents/evidence/analysis/, leaving a ` +
159
+ `one-line pointer — an agent may not retag this file structural ` +
160
+ `to clear the cap (roadmap-complexity-standard.md)`,
159
161
  );
160
162
  }
161
163
  const phases = _countMatches(PHASE_PAT, text);