@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
@@ -17,7 +17,6 @@ collision_ok:
17
17
  "src/skills/": "skill prose must not name derivation sources"
18
18
  "src/rules/": "rule prose must not name derivation sources"
19
19
  "agents/roadmaps/": "harvest/comparison roadmaps stay anonymized"
20
- # obligation: line 46
21
20
  obligation_frequency: "per-edit"
22
21
  ---
23
22
 
@@ -20,7 +20,6 @@ packs: [engineering-base]
20
20
  collision_ok:
21
21
  "endpoint": "an unconfirmed endpoint shape needs evidence before code"
22
22
  "schema": "a DB schema is the canonical structure to verify from a real source"
23
- # obligation: line 44
24
23
  obligation_frequency: "per-edit"
25
24
  ---
26
25
 
@@ -16,7 +16,6 @@ enforced_by:
16
16
  - "validator:src/scripts/check_condensation.ts"
17
17
  collision_ok:
18
18
  ".augment/": "the projection is read-only — edits belong in src/"
19
- # obligation: line 44
20
19
  obligation_frequency: "per-edit"
21
20
  ---
22
21
 
@@ -14,7 +14,6 @@ workspaces:
14
14
  - finance
15
15
  packs:
16
16
  - finance-basic
17
- # obligation: line 49
18
17
  obligation_frequency: "per-edit"
19
18
  ---
20
19
 
@@ -60,5 +59,5 @@ Entering, updating, or charting **financial figures** in a spreadsheet / model.
60
59
  ## See also
61
60
 
62
61
  - [`spreadsheet-authoring`](../skills/spreadsheet-authoring/SKILL.md) — the spreadsheet surface floor this rule's sourcing discipline plugs into.
63
- - [`surface-agent-contracts`](../docs/contracts/surface-agent-contracts.md) — the spreadsheet surface's invariants + truth source.
62
+ - `docs/contracts/surface-agent-contracts.md` — the spreadsheet surface's invariants + truth source.
64
63
  - [`finance-safety-floor`](finance-safety-floor.md) — the finance-pack advisory floor (not-investment-advice, sensitivity) this complements.
@@ -36,7 +36,6 @@ trust:
36
36
  human_review_required: true
37
37
  collision_ok:
38
38
  "category": "'category' is positioning vocabulary (category design) in the strategy pack"
39
- # obligation: line 55
40
39
  obligation_frequency: "per-task"
41
40
  ---
42
41
  <!-- agent-config:human-review-banner -->
@@ -16,7 +16,6 @@ trust:
16
16
  install:
17
17
  default: false
18
18
  removable: true
19
- # obligation: line 23
20
19
  obligation_frequency: "none"
21
20
  ---
22
21
 
@@ -24,5 +23,5 @@ obligation_frequency: "none"
24
23
 
25
24
  **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
25
 
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).
26
+ Body migrated to `skill:symfony-workflow`. Disambiguates the laravel ↔ symfony-workflow cluster head per `docs/contracts/adr-architectural-consensus-mechanism.md`.
28
27
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
@@ -22,7 +22,6 @@ collision_ok:
22
22
  "implement": "analyze-first floor on any implementation"
23
23
  "debug": "targeted inspection over brute force while debugging"
24
24
  "fix": "no blind trial-and-error on fixes — max 2 retries"
25
- # obligation: line 50
26
25
  obligation_frequency: "per-edit"
27
26
  ---
28
27
 
@@ -8,7 +8,6 @@ triggers:
8
8
  self_contained: true
9
9
  workspaces: [agent-config-maintainer]
10
10
  packs: [meta]
11
- # obligation: line 43
12
11
  obligation_frequency: "per-edit"
13
12
  ---
14
13
 
@@ -32,15 +31,10 @@ TO THE FULL FRUGALITY CANON (telegraph-speak, thin-projector).
32
31
  | `standard` | — | Balanced condensation | Not trimmed if priority ≥ 60 | 500–2000 tokens |
33
32
  | `rich` | Must be declared + justified | **Exempt** | **Never trimmed** | 2000–3500 tokens |
34
33
 
35
- Read `tokens.rich_skills` from `.agent-settings.yml` (default `on`) — the project
36
- layer of a cascade that starts user-global, so `agent-config settings:get
37
- tokens.rich_skills` is the read that answers it, file included — to determine
38
- whether rich skills may load in full. If `off`, treat them as `standard`. If
39
- `ask`, the question's shape is
40
- [`settings-ask-protocol`](settings-ask-protocol.md)'s, not this rule's; what only
41
- this rule knows is the number to put in it — the estimated token delta, ≈ skill
42
- file size in chars / 4. The answer is cached for the session and never persisted
43
- (`tokens.rich_skills` is class C).
34
+ Rich skills always load in full — there is no setting to read. The
35
+ `tokens.rich_skills` key that once allowed `off` / `ask` was retired on 2026-10-09
36
+ with its default (`on`) as the fixed behavior; the skill's own
37
+ `token_budget_class: rich` declaration plus the CI ceiling below is what decides.
44
38
 
45
39
  ## Requirements for `token_budget_class: rich`
46
40
 
@@ -57,15 +51,15 @@ A skill claiming `rich` MUST satisfy ALL three:
57
51
  carry a `load_context` pointer instead.
58
52
 
59
53
  3. **≤ 15 % of the suite's skills may claim `rich`** — the CI linter counts
60
- rich-tagged skills and hard-fails if the ratio is exceeded. With 299 skills
61
- the cap is ~44. Do not claim `rich` for convenience; claim it only for
54
+ rich-tagged skills and hard-fails if the ratio is exceeded. With 300 skills
55
+ the cap is ~45. Do not claim `rich` for convenience; claim it only for
62
56
  irreducible-complexity skills.
63
57
 
64
58
  ## Telegraph-speak amendment
65
59
 
66
- The telegraph-speak rule is **dormant by default** — absent
67
- `telegraph.speak` it does not project at all, so there is nothing to exempt
68
- from. Where a consumer has enabled it, it **exempts** skills marked
60
+ The telegraph-speak rule is **dormant** — it does not project at all (a
61
+ package-level decision in `compile_time_toggles.ts`), so there is nothing to
62
+ exempt from. If it ever ships again, it **exempts** skills marked
69
63
  `token_budget_class: rich`. When such a skill is active:
70
64
 
71
65
  - Do not apply telegraph-speak condensation to its guidance prose
@@ -75,8 +69,7 @@ from. Where a consumer has enabled it, it **exempts** skills marked
75
69
 
76
70
  This exemption is limited to the skill's guidance content; reply prose from the
77
71
  *agent* (not from the skill body) remains subject to telegraph-speak wherever
78
- that rule ships at all (`telegraph.speak`), within the carve-outs the rule
79
- itself names.
72
+ that rule ships at all, within the carve-outs the rule itself names.
80
73
 
81
74
  ## Value-over-budget escalation
82
75
 
@@ -104,17 +97,6 @@ canon: a near-miss where a net-positive frontend/design change was
104
97
  almost dropped purely on token-budget grounds is the canonical failure
105
98
  this escalation exists to prevent.
106
99
 
107
- ## Candidate rich skills (justified, not exhaustive)
108
-
109
- These skills are approved `rich` by this roadmap's council:
110
-
111
- | Skill | Justification summary |
112
- |---|---|
113
- | `design-intelligence` | 11 corpus CSVs + 16 design-language prose specs + a 10-category checklist; grounded selection needs the full reference to avoid random corpus subsets |
114
- | `typography-system` | Modular-scale math + 6 worked example type systems; condensing to "use 1.25 ratio" produces agents that invent arbitrary px values |
115
- | `accessibility-auditor` | WCAG criteria are non-negotiable detail; every criterion has a testable condition + failure mode; compression loses the test procedures |
116
- | `design-system-capture` (Phase 6) | Writes + maintains DESIGN.md + PRODUCT.md; needs full templates + worked examples to generate useful artifacts |
117
-
118
100
  ## Rich artifacts lead with a non-negotiable band
119
101
 
120
102
  ```
@@ -138,34 +120,18 @@ be shorter — that is the ceiling, gated below, and the two controls are
138
120
  independent: an artifact can sit comfortably under the ceiling and still bury
139
121
  its obligation on line 300.
140
122
 
141
- ## The size band is measured, and only its ceiling is gated
142
-
143
- The `rich` band is **2,000–3,500 tokens** (ADR-217, `docs/decisions/ADR-217-rich-class-band-measured-and-enforced.md`).
144
- It was 2,000–5,000 and enforced by nothing until that record: measured with the
145
- exact BPE tokenizer, the largest rich artifact in the tree is 3,331 tokens, so
146
- the old ceiling described no artifact that existed. An unused permission costs
147
- nothing until someone uses it.
148
-
149
- `lint_token_budget_discipline.ts` gates the **ceiling** and publishes every rich
150
- artifact's size on the green path. It does **not** gate the floor, and that is a
151
- finding rather than an omission: running the check once surfaced a 1,931-token
152
- skill legitimately holding the class, because `rich` buys exemption from
153
- condensation — a claim about what compression would *lose*, not about file size.
154
- The published study supplies a degradation threshold, which is a ceiling.
155
- Nothing measures a minimum.
123
+ ## The size band
156
124
 
157
- Measurement is exact where `js-tiktoken` resolves and the character proxy where
158
- it does not; the gate says which, and a proxy reading within its own error
159
- margin of the ceiling is reported **unresolved** rather than classified.
125
+ `rich` is **2,000–3,500 tokens** (ADR-217); only the ceiling is gated, by
126
+ `lint_token_budget_discipline.ts`. Why no floor, and the approved candidate
127
+ list: `guideline:agent-infra/size-and-scope` § Rich-class size band.
160
128
 
161
129
  ## Governed by
162
130
 
163
- - `tokens.rich_skills` setting in `.agent-settings.yml` (consumer override)
164
131
  - `lint_token_budget_discipline.ts` (cap + justification + ceiling CI check)
165
132
  - the telegraph-speak rule, where enabled (amended to except rich-tagged skills)
166
133
 
167
134
  ## See also
168
135
 
169
136
  - `token_budget_class` key in `src/scripts/schemas/skill.schema.json`
170
- - `tokens.rich_skills` in `src/config/agent-settings.template.yml`
171
137
  - the telegraph-speak rule, where enabled — the frugality canon this rule amends
@@ -11,7 +11,6 @@ triggers:
11
11
  self_contained: true
12
12
  workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
13
13
  packs: [meta]
14
- # obligation: line 21
15
14
  obligation_frequency: "per-edit"
16
15
  ---
17
16
 
@@ -19,7 +19,6 @@ workspaces: [agent-config-maintainer]
19
19
  packs: [meta]
20
20
  enforced_by:
21
21
  - "validator:src/scripts/check_token_optimizer_freshness.ts"
22
- # obligation: line 29
23
22
  obligation_frequency: "per-commit"
24
23
  ---
25
24
 
@@ -11,7 +11,6 @@ workspaces: [agent-config-maintainer, engineering]
11
11
  packs: [meta]
12
12
  enforced_by:
13
13
  - "validator:src/scripts/lint_agent_security.ts"
14
- # obligation: line 19
15
14
  obligation_frequency: "per-edit"
16
15
  evidence:
17
16
  source_type: external-standard
@@ -45,7 +45,6 @@ collision_ok:
45
45
  "*.tsx": "one component file, two obligations: inventory before the write, review after it"
46
46
  "*.jsx": "one component file, two obligations: inventory before the write, review after it"
47
47
  "*.blade.php": "one template file, two obligations: inventory before the write, review after it"
48
- # obligation: line 39
49
48
  obligation_frequency: "per-edit"
50
49
  ---
51
50
 
@@ -155,7 +154,7 @@ Warn-only, capped at two per session, default-OFF, and bound only in the three
155
154
  (**clarified 2026-08-17**: "where a slot exists" read as a host property, and it
156
155
  is a manifest one; three further hosts alias a native pre-tool event without a
157
156
  binding, and only claude honours a deny at all — the four states are tabulated
158
- in [`hook-architecture-v1 § Which hosts carry pre_tool_use`](../docs/contracts/hook-architecture-v1.md)).
157
+ in `docs/contracts/hook-architecture-v1.md` § Which hosts carry pre_tool_use).
159
158
  None of that changes the verdict here: a reminder that can be ignored is not a
160
159
  gate, so `enforced_by:` stays `none`. Run `agent-config hooks:status` for the
161
160
  host you are on rather than trusting this sentence.
@@ -20,7 +20,6 @@ workspaces: [engineering]
20
20
  packs: [engineering-base]
21
21
  enforced_by:
22
22
  - "instruction-only: no deterministic gate inspects fetched content for injected instructions; injection_scan_hook is warn-only and default-OFF"
23
- # obligation: line 38
24
23
  obligation_frequency: "per-event"
25
24
  evidence:
26
25
  source_type: external-standard
@@ -10,7 +10,6 @@ routes_to:
10
10
  - "skill:upstream-contribute"
11
11
  workspaces: [agent-config-maintainer, engineering]
12
12
  packs: [meta]
13
- # obligation: line 17
14
13
  obligation_frequency: "per-task"
15
14
  ---
16
15
 
@@ -13,7 +13,6 @@ triggers:
13
13
  self_contained: true
14
14
  workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
15
15
  packs: [meta]
16
- # obligation: line 40
17
16
  obligation_frequency: "per-turn"
18
17
  ---
19
18
 
@@ -19,7 +19,6 @@ load_context:
19
19
  self_contained: true
20
20
  workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
21
21
  packs: [meta]
22
- # obligation: line 38
23
22
  obligation_frequency: "per-turn"
24
23
  ---
25
24
 
@@ -56,9 +56,16 @@ export function gateBudgetLedgerPath(workspaceRoot: string): string {
56
56
  }
57
57
 
58
58
  /** The two caps decided by option (a). Both are USD. */
59
+ /**
60
+ * The two standing caps, each independently settable.
61
+ *
62
+ * Both figures are **US dollars**. Either may be `null`, meaning that cap was
63
+ * not set and therefore bounds nothing; `readGateBudgetCaps` returns `null`
64
+ * for the whole object only when NEITHER was set.
65
+ */
59
66
  export interface GateBudgetCaps {
60
- maxCostPerRunUsd: number;
61
- maxCostPerRolling7dUsd: number;
67
+ maxCostPerRunUsd: number | null;
68
+ maxCostPerRolling7dUsd: number | null;
62
69
  }
63
70
 
64
71
  /**
@@ -105,18 +112,26 @@ function _dig(settings: unknown, keys: readonly string[]): unknown {
105
112
  /**
106
113
  * Read the caps out of an already-merged settings dict.
107
114
  *
108
- * Returns `null` when either cap is absent or non-numeric — deliberately NOT a
109
- * fallback to the template numbers. An install whose settings do not carry the
110
- * caps has not authorised a standing budget, and inventing one from the
111
- * template default would authorise spend nobody configured. The caller renders
112
- * the consent line instead.
115
+ * Each cap is returned on its own. Returns `null` only when NEITHER is set,
116
+ * which means no ceiling on money was configured — not that the run is
117
+ * unauthorised. Still deliberately NOT a fallback to the template numbers:
118
+ * inventing a cap from a template default would bound a run by a figure
119
+ * nobody chose.
120
+ *
121
+ * Until 2026-10-06 this returned `null` unless BOTH caps were numeric, with
122
+ * two consequences. A person who set one cap and left the other alone was
123
+ * bounded by NEITHER — the stricter-looking rule produced the laxer result.
124
+ * And absent caps were read by the caller as a refusal, so the gate would not
125
+ * run at all without them. ADR-279 supersedes that second reading: absence of
126
+ * a bound is not a bound, and `--confirm` remains the authorisation the caps
127
+ * only ever sized.
113
128
  */
114
129
  export function readGateBudgetCaps(settings: unknown): GateBudgetCaps | null {
115
130
  const perRun = _num(_dig(settings, ['roadmap', 'gate_budget', 'max_cost_per_run_usd']));
116
131
  const rolling = _num(
117
132
  _dig(settings, ['roadmap', 'gate_budget', 'max_cost_per_rolling_7d_usd']),
118
133
  );
119
- if (perRun === null || rolling === null) {
134
+ if (perRun === null && rolling === null) {
120
135
  return null;
121
136
  }
122
137
  return { maxCostPerRunUsd: perRun, maxCostPerRolling7dUsd: rolling };
@@ -216,13 +231,15 @@ export function rollingSpendUsd(records: readonly GateBudgetReceipt[], now: Date
216
231
  }
217
232
 
218
233
  export type GateBudgetRefusal =
219
- | 'no_caps'
234
+ // 'no_caps' was removed on 2026-10-06 with ADR-279: the absence of a cap
235
+ // is no longer a refusal, so no path can produce it and leaving it in the
236
+ // union would advertise a verdict nothing returns.
220
237
  | 'no_estimate'
221
238
  | 'over_per_run'
222
239
  | 'over_rolling_7d';
223
240
 
224
241
  export type GateBudgetVerdict =
225
- | { ok: true; estimateUsd: number; rollingUsd: number }
242
+ | { ok: true; estimateUsd: number | null; rollingUsd: number }
226
243
  | { ok: false; reason: GateBudgetRefusal; detail: string };
227
244
 
228
245
  /**
@@ -230,6 +247,12 @@ export type GateBudgetVerdict =
230
247
  *
231
248
  * Every refusal path renders rather than runs — the blocker's own prescription
232
249
  * for a missing ledger, generalised to every way the budget can say no.
250
+ *
251
+ * What is NOT a refusal, per ADR-279: the absence of a cap. With no cap
252
+ * configured there is no ceiling on money to compare anything against, so the
253
+ * verdict is `ok` and the run proceeds on the authorisation `--confirm`
254
+ * already carries. A cap that WAS set still bounds exactly as its contract
255
+ * describes, and each bounds alone.
233
256
  */
234
257
  export function evaluateGateBudget(opts: {
235
258
  caps: GateBudgetCaps | null;
@@ -238,16 +261,17 @@ export function evaluateGateBudget(opts: {
238
261
  now: Date;
239
262
  }): GateBudgetVerdict {
240
263
  const { caps, records, estimateUsd, now } = opts;
241
- if (caps === null) {
242
- return {
243
- ok: false,
244
- reason: 'no_caps',
245
- detail:
246
- 'no standing class-1 budget is configured ' +
247
- '(`roadmap.gate_budget.max_cost_per_run_usd` and ' +
248
- '`roadmap.gate_budget.max_cost_per_rolling_7d_usd`)',
249
- };
264
+ const perRunCap = caps === null ? null : caps.maxCostPerRunUsd;
265
+ const rollingCap = caps === null ? null : caps.maxCostPerRolling7dUsd;
266
+ // No ceiling on money was set anywhere, so nothing here can say no.
267
+ // `rollingUsd` is still computed and reported — recording spend never
268
+ // depended on bounding it.
269
+ if (perRunCap === null && rollingCap === null) {
270
+ return { ok: true, estimateUsd, rollingUsd: rollingSpendUsd(records, now) };
250
271
  }
272
+ // A missing estimate refuses only because a cap exists that nothing can be
273
+ // compared against. With no cap there is no comparison to fail, which is
274
+ // why this sits BELOW the no-cap branch rather than above it.
251
275
  if (estimateUsd === null) {
252
276
  return {
253
277
  ok: false,
@@ -257,17 +281,17 @@ export function evaluateGateBudget(opts: {
257
281
  'can be compared against it',
258
282
  };
259
283
  }
260
- if (estimateUsd > caps.maxCostPerRunUsd) {
284
+ if (perRunCap !== null && estimateUsd > perRunCap) {
261
285
  return {
262
286
  ok: false,
263
287
  reason: 'over_per_run',
264
288
  detail:
265
289
  `the estimate ($${estimateUsd.toFixed(2)}) exceeds the per-run cap ` +
266
- `($${caps.maxCostPerRunUsd.toFixed(2)})`,
290
+ `($${perRunCap.toFixed(2)})`,
267
291
  };
268
292
  }
269
293
  const spent = rollingSpendUsd(records, now);
270
- if (spent + estimateUsd > caps.maxCostPerRolling7dUsd) {
294
+ if (rollingCap !== null && spent + estimateUsd > rollingCap) {
271
295
  return {
272
296
  ok: false,
273
297
  reason: 'over_rolling_7d',
@@ -275,7 +299,7 @@ export function evaluateGateBudget(opts: {
275
299
  `$${spent.toFixed(2)} is already receipted in the last ` +
276
300
  `${String(ROLLING_WINDOW_DAYS)} days and this run would add ` +
277
301
  `$${estimateUsd.toFixed(2)}, over the rolling cap ` +
278
- `($${caps.maxCostPerRolling7dUsd.toFixed(2)})`,
302
+ `($${rollingCap.toFixed(2)})`,
279
303
  };
280
304
  }
281
305
  return { ok: true, estimateUsd, rollingUsd: spent };
@@ -297,7 +297,12 @@ function execute(
297
297
  // generalised to every way the budget can say no. The `--confirm`
298
298
  // requirement below is untouched: the caps bound the size of an authorised
299
299
  // spend, they never supply the authorisation.
300
- let budgeted: { estimateUsd: number } | null = null;
300
+ // `estimateUsd` is null only on the one path that reaches here without a
301
+ // USD figure: a class-1 entry that states no estimate AND an install with
302
+ // no cap set, so there was no cap for the missing estimate to fail
303
+ // against. A receipt needs a number, and inventing 0 would understate the
304
+ // ledger, so that path runs and reports that nothing was receipted.
305
+ let budgeted: { estimateUsd: number | null } | null = null;
301
306
  if (cls === '1') {
302
307
  const verdict = evaluateGateBudget({
303
308
  caps: readGateBudgetCaps(load_agent_settings({ cwd: repoRoot })),
@@ -388,7 +393,7 @@ function execute(
388
393
  code: 1,
389
394
  };
390
395
  }
391
- if (budgeted !== null) {
396
+ if (budgeted !== null && budgeted.estimateUsd !== null) {
392
397
  // Written BEFORE the file rewrite: an unreceipted spend is invisible to
393
398
  // the rolling cap, and the cap failing open is the one way this
394
399
  // mechanism could become a blank cheque. `actual_usd` is null because
@@ -421,8 +426,11 @@ function execute(
421
426
  `and the status flipped to resolved ${when}.\n` +
422
427
  (budgeted === null
423
428
  ? ''
424
- : `Receipt appended to ${LEDGER_REL} ` +
425
- `($${budgeted.estimateUsd.toFixed(2)} estimated).\n`) +
429
+ : budgeted.estimateUsd === null
430
+ ? `No receipt appended to ${LEDGER_REL}: the entry states no USD ` +
431
+ 'estimate and no cap is configured, so there is no figure to record.\n'
432
+ : `Receipt appended to ${LEDGER_REL} ` +
433
+ `($${budgeted.estimateUsd.toFixed(2)} estimated).\n`) +
426
434
  // The dashboard is derived from the file this just rewrote, so it
427
435
  // is now stale. Saying so is the same follow-up `renderResumed`
428
436
  // already prints for its own file-move suggestion.
@@ -11,3 +11,5 @@ Skip link & landmarks,skip link landmark main nav banner region,landmarks + skip
11
11
  Drag and drop / reorder,drag drop reorder sortable kanban move,keyboard-equivalent commands,Every drag operation has a keyboard path (move-up/move-down buttons or grab mode with arrows + announcements); aria-live announces position changes,"WCAG 2.1.1, 2.5.7",Pointer-only reordering,https://www.w3.org/WAI/ARIA/apg/patterns/listbox/
12
12
  Loading / busy state,loading spinner skeleton busy progress,aria-busy + progressbar/status,Region marked aria-busy during load OR role=progressbar with valuenow; announce completion via status region; skeletons are aria-hidden,WCAG 4.1.3,Spinner gif with no text alternative; focus lost on content swap,https://www.w3.org/WAI/ARIA/apg/patterns/meter/
13
13
  Icon-only button,icon button close edit delete aria-label svg,accessible name on control,aria-label (or visually-hidden text) on the button; svg aria-hidden=true focusable=false; hit area ≥44px,"WCAG 4.1.2, 2.5.8",title attribute as the only name; emoji as icon,https://www.w3.org/WAI/ARIA/apg/patterns/button/
14
+ Meaningful standalone graphic,svg graphic chart diagram illustration logo standalone meaningful accessible name title desc,role=img + referenced title/desc,"role=img on the svg; a direct child title (plus optional desc) referenced by aria-labelledby using ids namespaced per instance; never aria-label together with title; delivered through img, the host alt is the accessible name and the inline title is unreachable","WCAG 1.1.1, 4.1.2","Generic id=""title"" reused by two inline graphics, so both announce the first one's name; title present without role=img; aria-label and title on the same element",https://www.w3.org/WAI/tutorials/images/complex/
15
+ Decorative graphic,decorative ornament flourish background presentational aria-hidden empty alt svg,aria-hidden + empty host alt,"aria-hidden=true and focusable=false on the svg; delivered through img, an empty alt (never a missing alt, which lets the file name become the name); the graphic carries no title",WCAG 1.1.1,Alt text describing an ornament; aria-hidden on a graphic carrying the only copy of its information,https://www.w3.org/WAI/tutorials/images/decorative/
@@ -27,8 +27,8 @@
27
27
  "owner": "package-maintainer",
28
28
  "refresh_cadence": "quarterly",
29
29
  "upstream": {
30
- "repo": "derived: W3C ARIA Authoring Practices Guide + WCAG 2.2",
31
- "sha": "WCAG 2.2 W3C-REC-2024-12-12; APG continuously-published, menu-button canonical slug",
32
- "last_checked": "2026-10-01"
30
+ "repo": "derived: W3C ARIA Authoring Practices Guide + WCAG 2.2 + W3C WAI Images Tutorial",
31
+ "sha": "WCAG 2.2 W3C-REC-2024-12-12; APG continuously-published, menu-button canonical slug; the two graphic rows re-derived 2026-10-11 from the WAI Images Tutorial (complex, decorative) against WCAG 1.1.1 / 4.1.2, and both retrieval queries re-run after the append — 'meaningful standalone svg chart graphic accessible name' moved off the icon-button row, 'icon only close button' kept it",
32
+ "last_checked": "2026-10-11"
33
33
  }
34
34
  }
@@ -67,7 +67,10 @@ things follow, and the first is the one under pressure:
67
67
  2. **Do not bounce to the user just because the council failed.** An
68
68
  unreachable council does not upgrade a decidable question into a
69
69
  user-required one. Decide it, label it own analysis, state the reason the
70
- council was unavailable, and name what would change the answer.
70
+ council was unavailable, and name what would change the answer. Not for a
71
+ modification review (a change to the gated surface or one the learning
72
+ lanes originate, ADR-281): there an unavailable council stops the run for
73
+ the user per `docs/contracts/ratification-artifact.md`.
71
74
  3. **Escalate only if it is genuinely undecidable without them** — the two
72
75
  options are close AND the cost of being wrong is high AND nothing in the tree
73
76
  separates them. Then say the council was attempted and why it failed, so the
@@ -311,9 +314,9 @@ attributed to the host.
311
314
  identity — that primes the reviewer and collapses diversity.
312
315
  - Do NOT silently truncate a too-large bundle — surface the size and
313
316
  ask for narrower scope.
314
- - Do NOT spend against an unbounded budget without asking — a billable
315
- member with neither `max_total_usd` nor `daily_limit_usd` set has no
316
- ceiling, and autonomy is not a ceiling.
317
+ - Do NOT ask for permission because no cap is set. ADR-279: a spend bound
318
+ applies only where one was set, and the absence of one is not a reason
319
+ to ask. Show the estimate as information and run.
317
320
  - Do NOT reuse SDK clients across invocations — re-load keys via
318
321
  `load_*_key()` each call.
319
322
 
@@ -47,6 +47,10 @@ table)` and render a per-member table. Heuristic: `len(text) / 4` for
47
47
  input, member's `max_tokens` ceiling for output (actual spend is
48
48
  usually lower).
49
49
 
50
+ This block is **information shown before the run**, not a prompt. Per
51
+ ADR-279 the absence of a cap is not a reason to ask, so there are no
52
+ numbered options here and nothing waits for an answer.
53
+
50
54
  > External council call — billable
51
55
  >
52
56
  > Mode: roadmap · Target: `agents/roadmaps/<name>.md` (~3 KB after redaction)
@@ -57,21 +61,27 @@ usually lower).
57
61
  > | openai / gpt-4o | ~750 / 1024 | $0.0121 |
58
62
  > | **total** | | **$0.0297** |
59
63
  >
60
- > Budget: 50k in / 20k out tokens · USD ceiling: $0.50
61
- >
62
- > 1. Run the consultation
63
- > 2. Cancel
64
+ > Budget: no cap set — token and USD ceilings are `0`.
65
+
66
+ The `Budget:` line states whatever the user configured. With nothing
67
+ configured it says so plainly, as above; with a cap set it names the
68
+ figure and its unit (`50k in / 20k out tokens · USD ceiling: $0.50`).
69
+ A cap that exists is what `on_overrun` fires against, below.
64
70
 
65
- ### Stale price-table gate
71
+ ### Stale price table — stated, not asked
66
72
 
67
- If `pricing.is_stale(table)` returns true, ask before proceeding:
73
+ If `pricing.is_stale(table)` returns true, say so in the same block and
74
+ proceed. ADR-237 § 3 already requires that a cost which cannot be
75
+ determined exactly is estimated conservatively and asked nothing about,
76
+ and a stale table is exactly that case:
68
77
 
69
- > Price table is stale (last_updated: YYYY-MM-DD)
70
- > 1. Refresh now (`./scripts-run src/scripts/update_prices`)
71
- > 2. Continue with the stale table
72
- > 3. Cancel
78
+ > Note: price table last updated YYYY-MM-DD and may be stale, so the
79
+ > figures above are an estimate. Refresh with
80
+ > `./scripts-run src/scripts/update_prices`.
73
81
 
74
- Do not silently auto-refresh — the user keeps control.
82
+ Do not silently auto-refresh — the user keeps control of when prices
83
+ change. Stating the staleness is what keeps that control without
84
+ turning it into a question.
75
85
 
76
86
  ### Mid-flow overrun callback (`on_overrun`)
77
87
 
@@ -45,14 +45,20 @@ have not migrated yet).
45
45
  authorization the user already gave. Render the estimate and fan out.
46
46
  `on_overrun` still fires per member on breach (below) — that is where
47
47
  the user regains the decision.
48
- - **Billable members with no ceiling at all** (`max_total_usd: 0` AND
49
- `daily_limit_usd: 0`) → unbounded paid spend, so surface the estimate
50
- and require an explicit `1`. Nothing bounds the call, so the user must.
48
+ - **Billable members with no cap set** (`max_total_usd: 0` AND
49
+ `daily_limit_usd: 0`, which is the shipped default) → render the
50
+ estimate as information and fan out. **No ask.** Per ADR-279 a spend
51
+ bound applies only where one was set, and the absence of one is not
52
+ a reason to ask.
51
53
 
52
- Autonomy settings do not *create* a bound and do not lift the last case.
53
- Consumers who want the old per-run gate back set a small
54
+ All three cases now behave the same way: the estimate is information,
55
+ never a prompt. What differs is only whether a cap exists for
56
+ `on_overrun` to fire against.
57
+
58
+ Consumers who want a per-run gate set a small
54
59
  `cost_budget.max_total_usd`: every call then breaches and `on_overrun`
55
- asks, per member.
60
+ asks, per member. That is a bound they chose, which is the only kind
61
+ this procedure recognises.
56
62
  4. **Fan out.** Dispatch the bundle to each enabled council member via
57
63
  `scripts/ai_council/orchestrator.ts`. Each member receives the
58
64
  neutrality preamble from `prompts.ts` plus the artefact — nothing
@@ -109,7 +109,7 @@ Constraint: **attack the biggest unknown first** (not breadth-first). Repeat unt
109
109
  | New evidence appears | Re-evaluate all conclusions |
110
110
  | Stuck in one skill | Broaden — switch to `universal-project-analysis` |
111
111
  | Clear pattern recognized | Narrow — go deep with the right specialist |
112
- | 3 failed attempts | Stop — summarize state, ask user for direction |
112
+ | 3 failed attempts | Change approach — `autonomous-execution`'s mandatory strategy shift, never a stop |
113
113
 
114
114
  ## Learning from past analyses
115
115
 
@@ -53,7 +53,7 @@ Pattern matching:
53
53
  - `fix/DEV-1234/description` → extract `DEV-1234`
54
54
  - `fix/PROJ-567-some-bug` → extract `PROJ-567`
55
55
  - `hotfix/DEV-999` → extract `DEV-999`
56
- - Regex: `[A-Z]+-[0-9]+`
56
+ - Read it with `agent-config git:convention ticket` — [`commit-subject`](../git-workflow/references/commit-subject.md) § Reading the ticket
57
57
 
58
58
  If found, auto-fetch the ticket and confirm with the user.
59
59
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  model_tier: inherit
3
3
  name: canvas-design
4
- description: "Creating static visual art — posters, marketing visuals, brand assets, PDF/PNG design pieces — on 'design a poster' or 'mach uns ein Visual'. Grounded by design-intelligence."
4
+ description: "Static visual art — posters, marketing visuals, brand assets, PDF/PNG pieces — on 'design a poster' or 'mach uns ein Visual'."
5
5
  domain: product
6
6
  workspaces:
7
7
  - small-business
@@ -73,7 +73,9 @@ Document it in `philosophy.md` under `## Subtle reference`.
73
73
 
74
74
  Produce `agents/design-assets/{slug}/{slug}.{pdf|png}`:
75
75
 
76
- 1. Pick the execution tool (Pillow, matplotlib, SVG, or framework-native)
76
+ 1. Pick the execution tool (Pillow, matplotlib, SVG, or framework-native). When
77
+ it is SVG, author it under [`svg-authoring`](../svg-authoring/SKILL.md) —
78
+ the canvas is still an asset and gets the same static check and witness
77
79
  2. **Font selection** — pick a font that earns the philosophy. Inspect a working dir (e.g. `agents/design-assets/{slug}/fonts/` — create if missing) and place the chosen file there before render. System defaults (Arial, Helvetica, DejaVu, the matplotlib default sans) are the AI-template tell; reach for them only as deliberate fallback, never as the unexamined default
78
80
  3. Limited palette — 2–5 colors, intentional and cohesive
79
81
  4. Geometric or organic forms per philosophy