@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
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Census of open blockers in parked roadmaps — measures, never gates.
4
+ *
5
+ * `lint_roadmap_blockers` and `/roadmap:resolve-blockers` both exclude
6
+ * the parked directory (`later/`) by a recorded decision ("history rather than
7
+ * debt"). This report reads exactly that directory so the decision can be
8
+ * revisited on a number rather than a guess: every `### blocker:` entry whose
9
+ * `Status:` is not `resolved`, with its file, its raw `Owner:` value and
10
+ * whether that owner is the owner (maintainer / user / owner — the same set
11
+ * `lint_roadmap_blockers` treats as a user decision) or a condition an agent
12
+ * can reach. Separately it lists every blockquote that names an owner
13
+ * question or owner decision, because such a question is invisible to any
14
+ * blocker reader even when its directory is in scope.
15
+ *
16
+ * The raw `Owner:` value is printed beside its classification: the field is
17
+ * free text, and a misread must be visible to whoever reads the report.
18
+ *
19
+ * Usage:
20
+ * ./scripts-run src/scripts/report_parked_blockers
21
+ * ./scripts-run src/scripts/report_parked_blockers --format json
22
+ * ./scripts-run src/scripts/report_parked_blockers --dir <path>
23
+ *
24
+ * Exit codes: 0 report emitted · 2 usage error.
25
+ */
26
+ import * as fs from 'node:fs';
27
+ import * as path from 'node:path';
28
+ import { fileURLToPath, pathToFileURL } from 'node:url';
29
+
30
+ import { REPO_ROOT, _stripFencedCode } from './lint_roadmap_blockers.js';
31
+
32
+ type OwnerWait = 'owner' | 'agent';
33
+
34
+ interface ParkedBlocker {
35
+ file: string;
36
+ id: string;
37
+ status: string;
38
+ owner: string;
39
+ wait: OwnerWait;
40
+ }
41
+
42
+ interface OwnerQuestion {
43
+ file: string;
44
+ line: number;
45
+ text: string;
46
+ blocker_entries_in_file: number;
47
+ }
48
+
49
+ interface Census {
50
+ dir: string;
51
+ files_scanned: number;
52
+ files_with_open_blockers: number;
53
+ blockers: ParkedBlocker[];
54
+ owner_questions: OwnerQuestion[];
55
+ }
56
+
57
+ const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
58
+ const NEXT_H2_RE = /^##[ \t]+\S/m;
59
+ const BLOCKER_HEADING_RE = /^###[ \t]+blocker:[ \t]*(.+?)[ \t]*$/gim;
60
+ const STATUS_RE = /^-[ \t]*\*\*Status:\*\*[ \t]*(.*)$/im;
61
+ const OWNER_RE = /^-[ \t]*\*\*Owner:\*\*[ \t]*(.*)$/im;
62
+ const OWNER_WAIT_RE = /^(maintainer|user|owner)\b/i;
63
+ const OWNER_QUESTION_RE = /owner[ \t]+(question|decision)/i;
64
+
65
+ function _classifyOwner(raw: string): OwnerWait {
66
+ return OWNER_WAIT_RE.test(raw.trim()) ? 'owner' : 'agent';
67
+ }
68
+
69
+ /** Every blocker entry in one file's `## Blockers` section, open or not. */
70
+ function _blockerEntries(text: string): Array<{ id: string; status: string; owner: string }> {
71
+ const stripped = _stripFencedCode(text);
72
+ const sectionMatch = BLOCKERS_SECTION_RE.exec(stripped);
73
+ if (!sectionMatch) {
74
+ return [];
75
+ }
76
+ const start = sectionMatch.index + sectionMatch[0].length;
77
+ const rest = stripped.slice(start);
78
+ const h2 = NEXT_H2_RE.exec(rest);
79
+ const section = h2 ? rest.slice(0, h2.index) : rest;
80
+
81
+ const heads: Array<{ start: number; end: number; id: string }> = [];
82
+ BLOCKER_HEADING_RE.lastIndex = 0;
83
+ let hm: RegExpExecArray | null;
84
+ while ((hm = BLOCKER_HEADING_RE.exec(section)) !== null) {
85
+ heads.push({ start: hm.index, end: hm.index + hm[0].length, id: (hm[1] as string).trim() });
86
+ if (hm.index === BLOCKER_HEADING_RE.lastIndex) {
87
+ BLOCKER_HEADING_RE.lastIndex++;
88
+ }
89
+ }
90
+ return heads.map((cur, i) => {
91
+ const next = heads[i + 1];
92
+ const body = section.slice(cur.end, next ? next.start : section.length);
93
+ return {
94
+ id: cur.id,
95
+ status: (STATUS_RE.exec(body)?.[1] ?? '').trim(),
96
+ owner: (OWNER_RE.exec(body)?.[1] ?? '').trim(),
97
+ };
98
+ });
99
+ }
100
+
101
+ /** Blockquote lines that name an owner question or owner decision. */
102
+ function _ownerQuestionLines(text: string): Array<{ line: number; text: string }> {
103
+ const out: Array<{ line: number; text: string }> = [];
104
+ let inFence = false;
105
+ text.split('\n').forEach((raw, i) => {
106
+ if (/^[ \t]*```/.test(raw)) {
107
+ inFence = !inFence;
108
+ return;
109
+ }
110
+ if (!inFence && /^[ \t]*>/.test(raw) && OWNER_QUESTION_RE.test(raw)) {
111
+ out.push({ line: i + 1, text: raw.trim() });
112
+ }
113
+ });
114
+ return out;
115
+ }
116
+
117
+ function collect(dir: string, root: string = REPO_ROOT): Census {
118
+ const files = fs.existsSync(dir)
119
+ ? fs
120
+ .readdirSync(dir, { withFileTypes: true })
121
+ .filter((e) => e.isFile() && e.name.endsWith('.md'))
122
+ .map((e) => path.join(dir, e.name))
123
+ .sort()
124
+ : [];
125
+ const blockers: ParkedBlocker[] = [];
126
+ const ownerQuestions: OwnerQuestion[] = [];
127
+ const filesWithOpen = new Set<string>();
128
+ for (const abs of files) {
129
+ const rel = path.relative(root, abs).split(path.sep).join('/');
130
+ const text = fs.readFileSync(abs, 'utf8');
131
+ const entries = _blockerEntries(text);
132
+ for (const e of entries) {
133
+ if (/^resolved\b/i.test(e.status)) {
134
+ continue;
135
+ }
136
+ filesWithOpen.add(rel);
137
+ blockers.push({ file: rel, id: e.id, status: e.status, owner: e.owner, wait: _classifyOwner(e.owner) });
138
+ }
139
+ for (const q of _ownerQuestionLines(text)) {
140
+ ownerQuestions.push({ file: rel, line: q.line, text: q.text, blocker_entries_in_file: entries.length });
141
+ }
142
+ }
143
+ return {
144
+ dir: path.relative(root, dir).split(path.sep).join('/'),
145
+ files_scanned: files.length,
146
+ files_with_open_blockers: filesWithOpen.size,
147
+ blockers,
148
+ owner_questions: ownerQuestions,
149
+ };
150
+ }
151
+
152
+ function format(c: Census): string {
153
+ const owner = c.blockers.filter((b) => b.wait === 'owner');
154
+ const agent = c.blockers.filter((b) => b.wait === 'agent');
155
+ const lines: string[] = [];
156
+ lines.push(`Parked blockers under ${c.dir}/`);
157
+ lines.push(
158
+ `files scanned: ${c.files_scanned} · files with an open blocker: ${c.files_with_open_blockers} · open blockers: ${c.blockers.length} (owner-wait ${owner.length}, agent-wait ${agent.length})`,
159
+ );
160
+ for (const [label, group] of [
161
+ ['owner-wait', owner],
162
+ ['agent-wait', agent],
163
+ ] as const) {
164
+ lines.push('');
165
+ lines.push(`## ${label} (${group.length})`);
166
+ for (const b of group) {
167
+ lines.push(`- ${b.file} · ${b.id} · Owner: ${b.owner || '(none)'} · Status: ${b.status || '(none)'}`);
168
+ }
169
+ }
170
+ lines.push('');
171
+ lines.push(`## owner questions in blockquotes (${c.owner_questions.length})`);
172
+ for (const q of c.owner_questions) {
173
+ lines.push(`- ${q.file}:${q.line} · blocker entries in file: ${q.blocker_entries_in_file} · ${q.text.slice(0, 120)}`);
174
+ }
175
+ return `${lines.join('\n')}\n`;
176
+ }
177
+
178
+ function fail(message: string): never {
179
+ process.stderr.write(`report_parked_blockers: ${message}\n`);
180
+ process.exit(2);
181
+ }
182
+
183
+ function main(argv: string[] = process.argv.slice(2)): number {
184
+ let fmt: 'text' | 'json' = 'text';
185
+ let dir = path.join(REPO_ROOT, 'agents', 'roadmaps', 'later');
186
+ for (let i = 0; i < argv.length; i += 1) {
187
+ const arg = argv[i];
188
+ if (arg === '--format') {
189
+ const v = argv[i + 1];
190
+ if (v !== 'text' && v !== 'json') fail(`--format must be 'text' or 'json'`);
191
+ fmt = v;
192
+ i += 1;
193
+ } else if (arg === '--dir') {
194
+ const v = argv[i + 1];
195
+ if (v === undefined) fail('--dir requires a value');
196
+ dir = path.resolve(v);
197
+ i += 1;
198
+ } else {
199
+ fail(`unknown argument: ${arg}`);
200
+ }
201
+ }
202
+ const census = collect(dir);
203
+ process.stdout.write(fmt === 'json' ? `${JSON.stringify(census, null, 2)}\n` : format(census));
204
+ return 0;
205
+ }
206
+
207
+ if (process.argv[1] !== undefined) {
208
+ try {
209
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
210
+ const argv1 = fs.realpathSync(path.resolve(process.argv[1]));
211
+ if (here === argv1) {
212
+ process.exit(main());
213
+ }
214
+ } catch {
215
+ if (import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
216
+ process.exit(main());
217
+ }
218
+ }
219
+ }
220
+
221
+ export { _classifyOwner, _blockerEntries, _ownerQuestionLines, collect, format, main };
222
+ export type { Census, ParkedBlocker, OwnerQuestion };
@@ -0,0 +1,196 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Required-check drift report — compares the live ruleset to the contract.
4
+ *
5
+ * `print_required_checks.ts` carries the list of status contexts the `main
6
+ * protection` ruleset requires, and it is contractually offline: it never calls
7
+ * `gh`. So nothing compared that list to the ruleset, and it drifted — it named
8
+ * one required context for a month after the ruleset gained a second. This
9
+ * report is the comparison: it reads the ruleset through `gh api`, extracts the
10
+ * required status contexts, and exits non-zero when they differ from
11
+ * `ENFORCED_CHECKS`.
12
+ *
13
+ * READ-ONLY. It writes nothing and changes nothing on the ruleset. It is run by
14
+ * hand or on a schedule and is NOT wired as a required check — a network read
15
+ * cannot sit on the path of every pull request, and the token it needs is a
16
+ * repository-read token, not something each PR should depend on.
17
+ *
18
+ * Usage:
19
+ * ./scripts-run src/scripts/report_required_checks_drift
20
+ * ./scripts-run src/scripts/report_required_checks_drift --repo <owner/name>
21
+ * ./scripts-run src/scripts/report_required_checks_drift --from-json <file>
22
+ *
23
+ * `--from-json` reads a ruleset object (the shape `gh api
24
+ * repos/{owner}/{repo}/rulesets/{id}` returns) from a file instead of the
25
+ * network, so the comparison itself is testable offline.
26
+ *
27
+ * Exit codes: 0 the lists agree · 1 they differ · 2 usage error, or the ruleset
28
+ * could not be read or carries no required-status-checks rule.
29
+ */
30
+ import { spawnSync } from 'node:child_process';
31
+ import * as fs from 'node:fs';
32
+ import * as path from 'node:path';
33
+ import { fileURLToPath, pathToFileURL } from 'node:url';
34
+
35
+ import { ENFORCED_CHECKS } from './print_required_checks.js';
36
+
37
+ const _HERE = fileURLToPath(import.meta.url);
38
+
39
+ export const RULESET_NAME = 'main protection';
40
+ const DEFAULT_REPO = 'event4u-app/agent-config';
41
+
42
+ export interface Drift {
43
+ readonly missingFromContract: readonly string[];
44
+ readonly missingFromRuleset: readonly string[];
45
+ }
46
+
47
+ class ReadError extends Error {}
48
+
49
+ /** The required status contexts of one ruleset object, sorted. */
50
+ export function requiredContexts(ruleset: unknown): string[] {
51
+ const rules = (ruleset as { rules?: unknown }).rules;
52
+ if (!Array.isArray(rules)) {
53
+ throw new ReadError('the ruleset object carries no `rules` array');
54
+ }
55
+ const lists = rules
56
+ .filter(
57
+ (r): r is { parameters?: { required_status_checks?: unknown } } =>
58
+ typeof r === 'object' && r !== null && (r as { type?: unknown }).type === 'required_status_checks',
59
+ )
60
+ .map((r) => r.parameters?.required_status_checks)
61
+ .filter((c): c is unknown[] => Array.isArray(c));
62
+ if (lists.length === 0) {
63
+ throw new ReadError('the ruleset has no `required_status_checks` rule');
64
+ }
65
+ // Every such rule counts: a context required by any of them blocks the merge.
66
+ const contexts = new Set(
67
+ lists
68
+ .flat()
69
+ .map((c) => (c as { context?: unknown }).context)
70
+ .filter((c): c is string => typeof c === 'string'),
71
+ );
72
+ return [...contexts].sort();
73
+ }
74
+
75
+ /** Set difference in both directions; empty both ways means agreement. */
76
+ export function compare(live: readonly string[], contract: readonly string[]): Drift {
77
+ const liveSet = new Set(live);
78
+ const contractSet = new Set(contract);
79
+ return {
80
+ missingFromContract: live.filter((c) => !contractSet.has(c)).sort(),
81
+ missingFromRuleset: contract.filter((c) => !liveSet.has(c)).sort(),
82
+ };
83
+ }
84
+
85
+ function ghJson(endpoint: string, paginate = false): unknown {
86
+ const args = paginate ? ['api', '--paginate', '--slurp', endpoint] : ['api', endpoint];
87
+ const r = spawnSync('gh', args, { encoding: 'utf-8', maxBuffer: 16 * 1024 * 1024 });
88
+ if (r.status !== 0) {
89
+ throw new ReadError(`gh api ${endpoint} failed: ${(r.stderr ?? '').trim() || `exit ${String(r.status)}`}`);
90
+ }
91
+ return JSON.parse(r.stdout) as unknown;
92
+ }
93
+
94
+ function readLiveRuleset(repo: string): unknown {
95
+ // --paginate --slurp: one array per page, so a ruleset past the first page
96
+ // of 30 is still found.
97
+ const pages = ghJson(`repos/${repo}/rulesets`, true);
98
+ if (!Array.isArray(pages) || !pages.every((p) => Array.isArray(p))) {
99
+ throw new ReadError('the rulesets listing is not an array of pages');
100
+ }
101
+ const list = (pages as unknown[][]).flat();
102
+ const hit = list.find((r) => (r as { name?: unknown }).name === RULESET_NAME) as { id?: unknown } | undefined;
103
+ if (hit === undefined || typeof hit.id !== 'number') {
104
+ throw new ReadError(`no ruleset named "${RULESET_NAME}" on ${repo}`);
105
+ }
106
+ return ghJson(`repos/${repo}/rulesets/${String(hit.id)}`);
107
+ }
108
+
109
+ interface Options {
110
+ repo: string;
111
+ fromJson: string | null;
112
+ }
113
+
114
+ function parseArgs(argv: readonly string[]): Options | string {
115
+ let repo = DEFAULT_REPO;
116
+ let fromJson: string | null = null;
117
+ for (let i = 0; i < argv.length; i++) {
118
+ const a = argv[i] as string;
119
+ if (a === '--repo' || a === '--from-json') {
120
+ const v = argv[i + 1];
121
+ if (v === undefined || v.startsWith('--')) {
122
+ return `${a} needs a value`;
123
+ }
124
+ if (a === '--repo') {
125
+ repo = v;
126
+ } else {
127
+ fromJson = v;
128
+ }
129
+ i++;
130
+ } else {
131
+ return `unknown argument: ${a}`;
132
+ }
133
+ }
134
+ return { repo, fromJson };
135
+ }
136
+
137
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
138
+ const opts = parseArgs(argv);
139
+ if (typeof opts === 'string') {
140
+ process.stderr.write(`❌ report_required_checks_drift: ${opts}\n`);
141
+ process.stderr.write('usage: report_required_checks_drift [--repo OWNER/NAME] [--from-json FILE]\n');
142
+ return 2;
143
+ }
144
+ let live: string[];
145
+ try {
146
+ const ruleset =
147
+ opts.fromJson === null
148
+ ? readLiveRuleset(opts.repo)
149
+ : (JSON.parse(fs.readFileSync(opts.fromJson, 'utf-8')) as unknown);
150
+ live = requiredContexts(ruleset);
151
+ } catch (e) {
152
+ process.stderr.write(`❌ report_required_checks_drift: ${e instanceof Error ? e.message : String(e)}\n`);
153
+ return 2;
154
+ }
155
+ const drift = compare(live, ENFORCED_CHECKS);
156
+ const source = opts.fromJson === null ? `${opts.repo} ruleset "${RULESET_NAME}"` : opts.fromJson;
157
+ process.stdout.write(`required contexts read from ${source}: ${String(live.length)}\n`);
158
+ for (const c of live) {
159
+ process.stdout.write(` - ${c}\n`);
160
+ }
161
+ if (drift.missingFromContract.length === 0 && drift.missingFromRuleset.length === 0) {
162
+ process.stdout.write(
163
+ '✅ agrees with ENFORCED_CHECKS in src/scripts/print_required_checks.ts\n',
164
+ );
165
+ return 0;
166
+ }
167
+ for (const c of drift.missingFromContract) {
168
+ process.stdout.write(` ❌ required by the ruleset, absent from the contract: ${c}\n`);
169
+ }
170
+ for (const c of drift.missingFromRuleset) {
171
+ process.stdout.write(` ❌ named by the contract, not required by the ruleset: ${c}\n`);
172
+ }
173
+ process.stdout.write(
174
+ '❌ drift — update ENFORCED_CHECKS and docs/contracts/branch-protection-policy.md ' +
175
+ 'together, with the date the ruleset was read.\n',
176
+ );
177
+ return 1;
178
+ }
179
+
180
+ function _isCliEntry(): boolean {
181
+ if (process.argv[1] === undefined) {
182
+ return false;
183
+ }
184
+ if (pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url) {
185
+ return true;
186
+ }
187
+ try {
188
+ return fs.realpathSync(path.resolve(process.argv[1])) === fs.realpathSync(_HERE);
189
+ } catch {
190
+ return false;
191
+ }
192
+ }
193
+
194
+ if (_isCliEntry()) {
195
+ process.exitCode = main();
196
+ }
@@ -55,7 +55,7 @@ import {
55
55
  sliceForId,
56
56
  sliceSizes,
57
57
  } from './measure_skill_ranker_baseline.js';
58
- import { _globSkillMd, rank, type RankRow } from './skill_tools/score_skill_relevance.js';
58
+ import { _globSkillMd, rank, rankDetailed, type RankRow } from './skill_tools/score_skill_relevance.js';
59
59
 
60
60
  /** How deep "outside the top ten" is. 1.3's own number, not a derived one. */
61
61
  export const DEEP_MISS_DEPTH = 10;
@@ -92,6 +92,38 @@ export interface RowReading {
92
92
  rankedFirst: string | null;
93
93
  topScore: number;
94
94
  rankOfExpected: number;
95
+ /** An expected skill shares the winner's integer score (hit or miss). */
96
+ expectedInTopScoreBlock: boolean;
97
+ /** An expected skill shares the winner's whole ordering key and loses on name. */
98
+ lostOnTie: boolean;
99
+ }
100
+
101
+ /**
102
+ * The two tie readings for one ranking.
103
+ *
104
+ * `inBlock` asks whether an expected skill scored the winner's INTEGER — the
105
+ * block the alphabet orders under `keyword-v1`. `lostOnTie` asks whether the
106
+ * row was a top-1 miss that nothing but the name decided: the expected skill
107
+ * shares the winner's integer score and, under `tieBreakUnrounded`, its
108
+ * unrounded score too. Without the flag the two keys coincide, so `lostOnTie`
109
+ * is the evidence page's "scored exactly the winner's score and lost on its
110
+ * initial" class; with it, `lostOnTie` is what the unrounded score left.
111
+ */
112
+ export function tieReading(
113
+ rows: readonly RankRow[],
114
+ raw: ReadonlyMap<string, number>,
115
+ expected: readonly string[],
116
+ tieBreakUnrounded: boolean,
117
+ ): { inBlock: boolean; lostOnTie: boolean } {
118
+ const first = rows[0];
119
+ if (!first) return { inBlock: false, lostOnTie: false };
120
+ const block = rows.filter((r) => r[1] === first[1]);
121
+ const inBlock = block.some((r) => expected.includes(r[0]));
122
+ if (!inBlock || expected.includes(first[0])) return { inBlock, lostOnTie: false };
123
+ const lostOnTie = block.some(
124
+ (r) => expected.includes(r[0]) && (!tieBreakUnrounded || raw.get(r[0]) === raw.get(first[0])),
125
+ );
126
+ return { inBlock, lostOnTie };
95
127
  }
96
128
 
97
129
  export function readRows(
@@ -101,13 +133,16 @@ export function readRows(
101
133
  ): RowReading[] {
102
134
  const opts = rankOptionsFor(ranker);
103
135
  return prompts.map((p) => {
104
- const rows = rank(p.prompt, skillsDir, opts);
136
+ const { rows, raw } = rankDetailed(p.prompt, skillsDir, opts);
137
+ const tie = tieReading(rows, raw, p.expected, Boolean(opts.tieBreakUnrounded));
105
138
  return {
106
139
  id: p.id,
107
140
  expected: p.expected,
108
141
  rankedFirst: rows[0]?.[0] ?? null,
109
142
  topScore: rows[0]?.[1] ?? 0,
110
143
  rankOfExpected: firstExpectedRank(rows, p.expected),
144
+ expectedInTopScoreBlock: tie.inBlock,
145
+ lostOnTie: tie.lostOnTie,
111
146
  };
112
147
  });
113
148
  }
@@ -262,6 +297,41 @@ export function falseActivation(
262
297
  };
263
298
  }
264
299
 
300
+ export interface AbstentionReading {
301
+ empties: number;
302
+ /** Empties whose top score is 0 — the ranker already abstains. */
303
+ noSkill: number;
304
+ threshold: number | null;
305
+ /** Empties whose top score is below `threshold`. */
306
+ abstainedEmpties: number;
307
+ correctHits: number;
308
+ /** Correct top-1 hits whose top score is below `threshold`. */
309
+ hitsLost: number;
310
+ }
311
+
312
+ /**
313
+ * What abstaining below one threshold buys on the empties and costs on the hits.
314
+ *
315
+ * A `null` threshold reads the no-skill rate only: with no correct hit there is
316
+ * no recall to cost, and inventing a cutoff would put a number chosen here
317
+ * beside a measured one.
318
+ */
319
+ export function abstentionReading(
320
+ labelled: readonly RowReading[],
321
+ emptyTopScores: readonly number[],
322
+ threshold: number | null,
323
+ ): AbstentionReading {
324
+ const hits = labelled.filter((r) => r.rankOfExpected === 1);
325
+ return {
326
+ empties: emptyTopScores.length,
327
+ noSkill: emptyTopScores.filter((s) => s === 0).length,
328
+ threshold,
329
+ abstainedEmpties: threshold === null ? 0 : emptyTopScores.filter((s) => s < threshold).length,
330
+ correctHits: hits.length,
331
+ hitsLost: threshold === null ? 0 : hits.filter((r) => r.topScore < threshold).length,
332
+ };
333
+ }
334
+
265
335
  function interval(successes: number, trials: number): string {
266
336
  const raw = wilsonInterval(successes, trials);
267
337
  return `${round3(raw.lower).toFixed(3)} – ${round3(raw.upper).toFixed(3)}`;
@@ -286,6 +356,8 @@ export function renderReport(opts: {
286
356
  const misses = readings.filter((r) => r.rankOfExpected !== 1);
287
357
  const deep = misses.filter((r) => r.rankOfExpected === 0 || r.rankOfExpected > DEEP_MISS_DEPTH).length;
288
358
  const mrr = meanReciprocalRank(readings);
359
+ const tieLoss = readings.filter((r) => r.lostOnTie).length;
360
+ const inBlock = readings.filter((r) => r.expectedInTopScoreBlock).length;
289
361
 
290
362
  const empties = emptyRowIds(opts.repo, opts.slice);
291
363
  const rankOpts = rankOptionsFor(opts.ranker);
@@ -368,6 +440,18 @@ export function renderReport(opts: {
368
440
  L.push('of the existing signal can recover a skill the formula never surfaces. The two');
369
441
  L.push('take different fixes, which is why the split is reported rather than an average.');
370
442
  L.push('');
443
+ L.push('## Ties');
444
+ L.push('');
445
+ L.push('| metric | rows | share of rows read |');
446
+ L.push('|---|---:|---:|');
447
+ L.push(`| \`top1_loss_due_to_tie\` | ${String(tieLoss)} | ${pct(tieLoss, n)} |`);
448
+ L.push(`| \`expected_in_top_score_block\` | ${String(inBlock)} | ${pct(inBlock, n)} |`);
449
+ L.push('');
450
+ L.push('`top1_loss_due_to_tie` counts top-1 misses where an expected skill shares the');
451
+ L.push('winner\'s whole ordering key and loses on the name alone — the integer score, and');
452
+ L.push('under `tieBreakUnrounded` the unrounded score as well. `expected_in_top_score_block`');
453
+ L.push('counts rows, hit or miss, whose expected skill scores the winner\'s integer.');
454
+ L.push('');
371
455
  L.push('## False activation on the no-skill prompts');
372
456
  L.push('');
373
457
  L.push('| | |');
@@ -393,6 +477,23 @@ export function renderReport(opts: {
393
477
  L.push('populations at all. A share near one half means it does not: a prompt a seat');
394
478
  L.push('judged to have no skill answer is scored as confidently as a prompt it got right.');
395
479
  L.push('');
480
+ const ab = abstentionReading(readings, emptyScores, fa.correct_hits > 0 ? fa.median_correct_hit_score : null);
481
+ L.push('## Abstention, beside its cost');
482
+ L.push('');
483
+ L.push('| | |');
484
+ L.push('|---|---:|');
485
+ L.push(`| empties the ranker already returns nothing for (no-skill rate) | ${String(ab.noSkill)} of ${String(ab.empties)} (${pct(ab.noSkill, ab.empties)}) |`);
486
+ if (ab.threshold === null) {
487
+ L.push('| abstention threshold | n/a — no correct top-1 hit, so no threshold |');
488
+ } else {
489
+ L.push(`| abstention threshold (abstain below the median correct-hit score) | ${String(ab.threshold)} |`);
490
+ L.push(`| empties that threshold abstains on | ${String(ab.abstainedEmpties)} of ${String(ab.empties)} (${pct(ab.abstainedEmpties, ab.empties)}) |`);
491
+ L.push(`| correct top-1 hits it would suppress (recall cost) | ${String(ab.hitsLost)} of ${String(ab.correctHits)} (${pct(ab.hitsLost, ab.correctHits)}) |`);
492
+ }
493
+ L.push('');
494
+ L.push('One threshold, the same median the false-activation table compares against, so');
495
+ L.push('the gain on the empties and the recall it costs are read off one number.');
496
+ L.push('');
396
497
  L.push(`## Per-pack top-1, worst first`);
397
498
  L.push('');
398
499
  L.push('| pack | labelled rows | top-1 |');
@@ -229,7 +229,7 @@ export const HOST_SURFACES: readonly HostSurface[] = [
229
229
  },
230
230
  {
231
231
  host: 'codex', surface: '.codex/agent-config.md', perRuleTree: false,
232
- writer: 'src/scripts/install.ts:1382',
232
+ writer: 'src/scripts/install.ts:1377',
233
233
  // Scoped to `.codex` rather than the bare filename: nine other lines in
234
234
  // `install.ts` write an `agent-config.md` for some other host, so the
235
235
  // unscoped anchor would have accepted a drift onto any of them — the
@@ -355,10 +355,10 @@ export function collect_orchestration(
355
355
  platform_assumed: boolean,
356
356
  ): OrchestrationReport {
357
357
  const settings = load_agent_settings({ cwd: workspace_root });
358
- const sub = (settings["subagents"] ?? {}) as Record<string, unknown>;
359
358
  const emergency = (settings["emergency"] ?? {}) as Record<string, unknown>;
360
359
  const halted = emergency["orchestration_halt"] === true;
361
- const downshift = sub["downshift"] !== false;
360
+ // Fixed on: the `subagents.downshift` key was retired with this default.
361
+ const downshift = true;
362
362
  const { manifest: host_manifest, sources: host_manifest_sources } =
363
363
  describeHostCapabilities(platform);
364
364
  const activationInputs: ActivationInputs = {
@@ -11,17 +11,6 @@
11
11
  "enum": ["minimal", "balanced", "full", "custom"],
12
12
  "description": "Rule-tier loading footprint. See docs/contracts/cost-profile-defaults.md and docs/contracts/rule-router.md. NOT a memory or model lever."
13
13
  },
14
- "memory": {
15
- "type": "object",
16
- "additionalProperties": true,
17
- "properties": {
18
- "cadence": {
19
- "type": "string",
20
- "enum": ["auto", "always", "never"],
21
- "description": "Cadence of the 🧠 memory-visibility line. See docs/contracts/memory-visibility-v1.md. Owns its own key since the 2026-06-01 untangle; previously collided with rule_loading_tier."
22
- }
23
- }
24
- },
25
14
  "model": {
26
15
  "type": "object",
27
16
  "additionalProperties": true,
@@ -79,25 +68,34 @@
79
68
  }
80
69
  }
81
70
  },
82
- "design": {
71
+ "git": {
83
72
  "type": "object",
84
73
  "additionalProperties": true,
85
74
  "properties": {
86
- "fidelity_mode": {
75
+ "commit_format": {
87
76
  "type": "string",
88
- "enum": ["strict", "structural", "hard-floor"],
89
- "description": "How strictly the agent must follow a user-provided prototype / mockup / design system. Consumed by the design-fidelity rule. strict = build 1:1, every visible deviation needs confirmation; structural = structure locked, silent gaps fillable with a stated assumption; hard-floor = any deviation is never autonomous."
77
+ "enum": ["ticket-scope", "ticket-conventional"],
78
+ "description": "Where a ticket id goes in a commit subject. ticket-scope (default) = `feat(DEV-1234): …`; ticket-conventional = `DEV-1234 feat(area): …`, a ticket is never a scope."
79
+ },
80
+ "branch_pattern": {
81
+ "type": "string",
82
+ "description": "Shape of a branch name the agent creates. Placeholders {type}, {ticket}, {slug}. Default {type}/{slug}."
83
+ },
84
+ "update_strategy": {
85
+ "type": "string",
86
+ "enum": ["merge", "rebase"],
87
+ "description": "How a feature branch is brought up to date with its base. merge (default) = merge the base in; rebase = rebase onto origin/<base> and push with --force-with-lease, still asked for each time per git-history-discipline."
90
88
  }
91
89
  }
92
90
  },
93
- "consistency": {
91
+ "design": {
94
92
  "type": "object",
95
93
  "additionalProperties": true,
96
94
  "properties": {
97
- "cross_source": {
95
+ "fidelity_mode": {
98
96
  "type": "string",
99
- "enum": ["on", "auto", "off"],
100
- "description": "Consumed by the cross-source-consistency rule. When the agent works from multiple sources (ticket text, an attached image/mockup, the spec, the codebase) it checks them against each other and asks before proceeding on a discrepancy. on (default) = surface every real cross-source contradiction / silent-scope-expansion as one question; auto = surface only high-confidence contradictions, state low-confidence as an assumption; off = no cross-source checking."
97
+ "enum": ["strict", "structural", "hard-floor"],
98
+ "description": "How strictly the agent must follow a user-provided prototype / mockup / design system. Consumed by the design-fidelity rule. strict = build 1:1, every visible deviation needs confirmation; structural = structure locked, silent gaps fillable with a stated assumption; hard-floor = any deviation is never autonomous."
101
99
  }
102
100
  }
103
101
  },
@@ -158,18 +156,6 @@
158
156
  }
159
157
  }
160
158
  },
161
- "tokens": {
162
- "type": "object",
163
- "additionalProperties": true,
164
- "description": "Token-spend governance for skills marked token_budget_class: rich. See token-budget-discipline rule.",
165
- "properties": {
166
- "rich_skills": {
167
- "type": "string",
168
- "enum": ["on", "ask", "off"],
169
- "description": "Controls whether skills marked token_budget_class: rich may load in full (exempt from telegraph-speak and thin-projector trimming). on = allowed (default); off = fall back to standard condensed behavior; ask = surface an estimated token delta (tokens, not dollars) and ask the user once per session before loading."
170
- }
171
- }
172
- },
173
159
  "commands": {
174
160
  "type": "object",
175
161
  "additionalProperties": true,