@event4u/agent-config 9.9.0 → 9.11.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 (479) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +212 -194
  3. package/README.md +13 -16
  4. package/agents/templates/.ai-council.yml.example +481 -0
  5. package/agents/templates/.ai-video.xml.example +247 -0
  6. package/dist/agent-src/commands/agent-status.md +12 -11
  7. package/dist/agent-src/commands/agents/user/accept.md +115 -30
  8. package/dist/agent-src/commands/agents/user/delete.md +147 -0
  9. package/dist/agent-src/commands/agents/user/review.md +65 -28
  10. package/dist/agent-src/commands/agents/user/show.md +82 -29
  11. package/dist/agent-src/commands/agents/user/update.md +2 -2
  12. package/dist/agent-src/commands/agents/user.md +16 -3
  13. package/dist/agent-src/commands/check-current-md.md +0 -10
  14. package/dist/agent-src/commands/condense.md +28 -97
  15. package/dist/agent-src/commands/cost/report.md +7 -0
  16. package/dist/agent-src/commands/fix/portability.md +0 -8
  17. package/dist/agent-src/commands/fix/refs.md +0 -8
  18. package/dist/agent-src/commands/humanize.md +2 -2
  19. package/dist/agent-src/commands/jira-ticket.md +1 -1
  20. package/dist/agent-src/commands/memory/load.md +11 -0
  21. package/dist/agent-src/commands/optimize/skills.md +1 -1
  22. package/dist/agent-src/commands/pr/create.md +4 -4
  23. package/dist/agent-src/commands/profile/show.md +3 -3
  24. package/dist/agent-src/commands/rule-compliance-audit.md +5 -4
  25. package/dist/agent-src/commands/security-audit-config.md +1 -1
  26. package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
  27. package/dist/agent-src/commands/tdd.md +21 -0
  28. package/dist/agent-src/commands/team/delegate.md +2 -2
  29. package/dist/agent-src/commands/team-knowledge/bootstrap.md +9 -8
  30. package/dist/agent-src/commands/team-knowledge/consolidate.md +8 -7
  31. package/dist/agent-src/commands/team.md +4 -1
  32. package/dist/agent-src/commands/upstream-contribute.md +0 -1
  33. package/dist/agent-src/contexts/authority/commit-mechanics.md +7 -0
  34. package/dist/agent-src/contexts/authority/destructive-mechanics.md +16 -0
  35. package/dist/agent-src/contexts/authority/scope-mechanics.md +61 -0
  36. package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +20 -18
  37. package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
  38. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -1
  39. package/dist/agent-src/contexts/communication/rules-auto/source-of-truth-mechanics.md +9 -10
  40. package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +1 -1
  41. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +11 -0
  42. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +26 -15
  43. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +3 -0
  44. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +67 -37
  45. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
  46. package/dist/agent-src/contexts/execution/autonomy-examples.md +1 -1
  47. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +7 -6
  48. package/dist/agent-src/contexts/execution/evidence-discipline.md +92 -77
  49. package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +22 -21
  50. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +24 -0
  51. package/dist/agent-src/contexts/execution/project-intelligence.md +122 -103
  52. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +23 -21
  53. package/dist/agent-src/contexts/execution/subagent-response-contract.md +5 -5
  54. package/dist/agent-src/contexts/execution/subagent-routing.md +11 -0
  55. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +13 -13
  56. package/dist/agent-src/contexts/execution/subagent-steering.md +36 -34
  57. package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
  58. package/dist/agent-src/contexts/execution/user-memory-channels.md +189 -0
  59. package/dist/agent-src/contexts/execution/verification-mechanics.md +9 -0
  60. package/dist/agent-src/contexts/model-recommendations.md +3 -2
  61. package/dist/agent-src/contexts/subagent-configuration.md +3 -3
  62. package/dist/agent-src/ghostwriter/README.md +2 -2
  63. package/dist/agent-src/packs/README.md +1 -1
  64. package/dist/agent-src/personas/README.md +5 -5
  65. package/dist/agent-src/personas/_template-specialist/persona.md +3 -3
  66. package/dist/agent-src/personas/backend-architect.md +24 -23
  67. package/dist/agent-src/personas/eloquent-tamer.md +30 -30
  68. package/dist/agent-src/personas/frontend-engineer.md +30 -30
  69. package/dist/agent-src/personas/product-owner.md +41 -38
  70. package/dist/agent-src/personas/qa.md +13 -13
  71. package/dist/agent-src/personas/security-engineer.md +22 -22
  72. package/dist/agent-src/presets/README.md +3 -3
  73. package/dist/agent-src/profiles/README.md +3 -3
  74. package/dist/agent-src/rules/active-remediation.md +2 -2
  75. package/dist/agent-src/rules/artifact-engagement-recording.md +4 -4
  76. package/dist/agent-src/rules/ask-when-uncertain.md +0 -4
  77. package/dist/agent-src/rules/augment-edit-discipline.md +1 -1
  78. package/dist/agent-src/rules/broken-access-control.md +4 -4
  79. package/dist/agent-src/rules/code-comment-discipline.md +1 -1
  80. package/dist/agent-src/rules/code-provenance.md +2 -2
  81. package/dist/agent-src/rules/commit-policy.md +4 -9
  82. package/dist/agent-src/rules/communication-through-line.md +5 -5
  83. package/dist/agent-src/rules/decision-revisit-gate.md +1 -1
  84. package/dist/agent-src/rules/design-fidelity.md +1 -1
  85. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
  86. package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
  87. package/dist/agent-src/rules/domain-safety-pii.md +1 -1
  88. package/dist/agent-src/rules/external-code-graph-interop.md +1 -1
  89. package/dist/agent-src/rules/fast-path-marker-visibility.md +43 -7
  90. package/dist/agent-src/rules/finance-safety-floor.md +1 -1
  91. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -3
  92. package/dist/agent-src/rules/history-discipline.md +1 -1
  93. package/dist/agent-src/rules/legal-safety-floor.md +1 -1
  94. package/dist/agent-src/rules/lethal-trifecta-guard.md +5 -5
  95. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +10 -8
  96. package/dist/agent-src/rules/media-governance-routing.md +13 -13
  97. package/dist/agent-src/rules/media-sync-ground-truth.md +29 -11
  98. package/dist/agent-src/rules/no-cheap-questions.md +7 -7
  99. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +29 -18
  100. package/dist/agent-src/rules/non-destructive-by-default.md +5 -23
  101. package/dist/agent-src/rules/onboarding-gate.md +14 -4
  102. package/dist/agent-src/rules/persona-governance.md +2 -2
  103. package/dist/agent-src/rules/prefer-enums-over-literals.md +9 -9
  104. package/dist/agent-src/rules/preservation-guard.md +10 -2
  105. package/dist/agent-src/rules/question-not-instruction.md +1 -1
  106. package/dist/agent-src/rules/roadmap-progress-sync.md +6 -6
  107. package/dist/agent-src/rules/rule-type-governance.md +1 -1
  108. package/dist/agent-src/rules/scale-discipline.md +1 -1
  109. package/dist/agent-src/rules/scope-control.md +1 -1
  110. package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
  111. package/dist/agent-src/rules/security-sensitive-stop.md +17 -11
  112. package/dist/agent-src/rules/senior-engineering-discipline.md +17 -17
  113. package/dist/agent-src/rules/session-canary.md +1 -1
  114. package/dist/agent-src/rules/skill-quality.md +1 -1
  115. package/dist/agent-src/rules/source-confidentiality.md +21 -19
  116. package/dist/agent-src/rules/source-of-truth.md +6 -5
  117. package/dist/agent-src/rules/spreadsheet-source-quality.md +2 -2
  118. package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
  119. package/dist/agent-src/rules/think-before-action.md +5 -5
  120. package/dist/agent-src/rules/token-budget-discipline.md +5 -3
  121. package/dist/agent-src/rules/token-efficiency.md +2 -2
  122. package/dist/agent-src/rules/untrusted-input-defense.md +4 -4
  123. package/dist/agent-src/rules/user-interaction.md +12 -0
  124. package/dist/agent-src/rules/verify-before-complete.md +4 -24
  125. package/dist/agent-src/skills/adversarial-review/SKILL.md +2 -2
  126. package/dist/agent-src/skills/agent-security-review/SKILL.md +52 -45
  127. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
  128. package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +20 -20
  129. package/dist/agent-src/skills/ai-council/SKILL.md +185 -128
  130. package/dist/agent-src/skills/analysis-skill-router/SKILL.md +3 -3
  131. package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
  132. package/dist/agent-src/skills/artisan-commands/SKILL.md +2 -2
  133. package/dist/agent-src/skills/async-python-patterns/SKILL.md +8 -7
  134. package/dist/agent-src/skills/authz-review/SKILL.md +16 -15
  135. package/dist/agent-src/skills/aws-infrastructure/SKILL.md +5 -5
  136. package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
  137. package/dist/agent-src/skills/bug-analyzer/SKILL.md +30 -12
  138. package/dist/agent-src/skills/code-intelligence/SKILL.md +0 -1
  139. package/dist/agent-src/skills/code-intelligence/evals/triggers.json +52 -0
  140. package/dist/agent-src/skills/code-review/SKILL.md +6 -6
  141. package/dist/agent-src/skills/command-routing/SKILL.md +5 -4
  142. package/dist/agent-src/skills/composer-packages/SKILL.md +2 -2
  143. package/dist/agent-src/skills/condense-memory/SKILL.md +43 -41
  144. package/dist/agent-src/skills/context-document/SKILL.md +23 -21
  145. package/dist/agent-src/skills/copilot-config/SKILL.md +6 -1
  146. package/dist/agent-src/skills/decision-record/SKILL.md +20 -18
  147. package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
  148. package/dist/agent-src/skills/design-review/SKILL.md +15 -14
  149. package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +28 -25
  150. package/dist/agent-src/skills/devcontainer/SKILL.md +2 -2
  151. package/dist/agent-src/skills/docker/SKILL.md +1 -1
  152. package/dist/agent-src/skills/docx-authoring/evals/triggers.json +52 -0
  153. package/dist/agent-src/skills/emit-tickets/SKILL.md +2 -2
  154. package/dist/agent-src/skills/error-handling-patterns/SKILL.md +1 -1
  155. package/dist/agent-src/skills/estimate-ticket/SKILL.md +2 -2
  156. package/dist/agent-src/skills/evaluate-llm-feature/SKILL.md +0 -1
  157. package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +52 -0
  158. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +21 -7
  159. package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
  160. package/dist/agent-src/skills/feature-planning/SKILL.md +2 -2
  161. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +3 -3
  162. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  163. package/dist/agent-src/skills/frontend-render-security/SKILL.md +13 -13
  164. package/dist/agent-src/skills/git-workflow/SKILL.md +33 -33
  165. package/dist/agent-src/skills/grafana/SKILL.md +5 -0
  166. package/dist/agent-src/skills/humanizer/SKILL.md +83 -66
  167. package/dist/agent-src/skills/humanizer/data/patterns.md +14 -14
  168. package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +4 -4
  169. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +82 -37
  170. package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +17 -5
  171. package/dist/agent-src/skills/judge-injection-defense/SKILL.md +63 -25
  172. package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -0
  173. package/dist/agent-src/skills/judge-synthesis/SKILL.md +72 -28
  174. package/dist/agent-src/skills/laravel-horizon/SKILL.md +5 -0
  175. package/dist/agent-src/skills/laravel-mail/SKILL.md +5 -4
  176. package/dist/agent-src/skills/laravel-middleware/SKILL.md +5 -4
  177. package/dist/agent-src/skills/laravel-notifications/SKILL.md +10 -9
  178. package/dist/agent-src/skills/laravel-pennant/SKILL.md +1 -1
  179. package/dist/agent-src/skills/laravel-pulse/SKILL.md +9 -8
  180. package/dist/agent-src/skills/laravel-reverb/SKILL.md +6 -5
  181. package/dist/agent-src/skills/laravel-scheduling/SKILL.md +6 -1
  182. package/dist/agent-src/skills/laravel-validation/SKILL.md +12 -0
  183. package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
  184. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +7 -7
  185. package/dist/agent-src/skills/learning-tutor/SKILL.md +44 -43
  186. package/dist/agent-src/skills/learning-tutor/evals/triggers.json +52 -0
  187. package/dist/agent-src/skills/license-compliance-audit/SKILL.md +7 -7
  188. package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +3 -3
  189. package/dist/agent-src/skills/license-compliance-credits/SKILL.md +4 -4
  190. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +0 -1
  191. package/dist/agent-src/skills/memory-consolidation/SKILL.md +69 -64
  192. package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -6
  193. package/dist/agent-src/skills/pdf-tools/evals/triggers.json +52 -0
  194. package/dist/agent-src/skills/performance-analysis/SKILL.md +7 -3
  195. package/dist/agent-src/skills/persona-improvement/SKILL.md +0 -2
  196. package/dist/agent-src/skills/persona-improvement/evals/triggers.json +52 -0
  197. package/dist/agent-src/skills/php-coder/SKILL.md +10 -0
  198. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +129 -120
  199. package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +36 -35
  200. package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +45 -41
  201. package/dist/agent-src/skills/project-analysis-core/SKILL.md +4 -4
  202. package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +3 -3
  203. package/dist/agent-src/skills/project-analysis-react/SKILL.md +1 -1
  204. package/dist/agent-src/skills/project-analysis-symfony/SKILL.md +1 -1
  205. package/dist/agent-src/skills/project-analysis-zend-laminas/SKILL.md +2 -2
  206. package/dist/agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -1
  207. package/dist/agent-src/skills/prompt-validator/SKILL.md +39 -39
  208. package/dist/agent-src/skills/quality-tools/SKILL.md +15 -15
  209. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +55 -19
  210. package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +29 -27
  211. package/dist/agent-src/skills/readme-writing-package/SKILL.md +2 -2
  212. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +25 -25
  213. package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -5
  214. package/dist/agent-src/skills/refine-prompt/SKILL.md +1 -1
  215. package/dist/agent-src/skills/refine-ticket/SKILL.md +20 -2
  216. package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
  217. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  218. package/dist/agent-src/skills/roadmap-management/SKILL.md +80 -66
  219. package/dist/agent-src/skills/roadmap-writing/SKILL.md +84 -77
  220. package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
  221. package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +52 -0
  222. package/dist/agent-src/skills/security-audit/SKILL.md +26 -9
  223. package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +38 -16
  224. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +14 -11
  225. package/dist/agent-src/skills/skill-writing/SKILL.md +9 -8
  226. package/dist/agent-src/skills/song-to-script/SKILL.md +93 -85
  227. package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
  228. package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +4 -3
  229. package/dist/agent-src/skills/standards-from-config/SKILL.md +61 -43
  230. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +22 -8
  231. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +28 -2
  232. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +13 -13
  233. package/dist/agent-src/skills/systematic-debugging/SKILL.md +22 -21
  234. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  235. package/dist/agent-src/skills/technical-specification/SKILL.md +5 -0
  236. package/dist/agent-src/skills/terraform/SKILL.md +2 -2
  237. package/dist/agent-src/skills/terragrunt/SKILL.md +8 -8
  238. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +1 -1
  239. package/dist/agent-src/skills/threat-modeling/SKILL.md +19 -13
  240. package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  241. package/dist/agent-src/skills/upstream-contribute/SKILL.md +0 -1
  242. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +9 -9
  243. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -1
  244. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +4 -6
  245. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +67 -61
  246. package/dist/agent-src/skills/video-director/SKILL.md +7 -7
  247. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +3 -3
  248. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  249. package/dist/agent-src/templates/contexts/knowledge-pages.md +47 -45
  250. package/dist/agent-src/templates/contexts/lesson-card.md +2 -2
  251. package/dist/agent-src/templates/contexts/tenant-boundaries.md +2 -2
  252. package/dist/agent-src/templates/contexts.md +1 -1
  253. package/dist/agent-src/templates/features.md +1 -1
  254. package/dist/agent-src/templates/roadmaps.md +125 -116
  255. package/dist/agent-src/templates/rule.md +2 -1
  256. package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  257. package/dist/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
  258. package/dist/agent-src/templates/scripts/tier_usage_report.ts +2 -2
  259. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
  260. package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
  261. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
  262. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
  263. package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
  264. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
  265. package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
  266. package/dist/agent-src/user-types/README.md +8 -8
  267. package/dist/agent-src/user-types/galabau-field-crew.md +34 -33
  268. package/dist/agent-src/user-types/metalworking-shop.md +35 -34
  269. package/dist/agent-src/user-types/truck-driver.md +22 -20
  270. package/dist/cli/initRouting.js +74 -11
  271. package/dist/cli/initRouting.js.map +1 -1
  272. package/dist/cli/main.js +14 -3
  273. package/dist/cli/main.js.map +1 -1
  274. package/dist/cli/python/workspace_roles.js +2 -2
  275. package/dist/cli/python/workspace_roles.js.map +1 -1
  276. package/dist/cli-delegate/chunk-4SV3XGFA.js +6910 -0
  277. package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
  278. package/dist/cli-delegate/chunk-7DSAMZFU.js +356 -0
  279. package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
  280. package/dist/cli-delegate/chunk-BJGXZNPM.js +266 -0
  281. package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
  282. package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
  283. package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
  284. package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
  285. package/dist/cli-delegate/chunk-IR7P7JWA.js +872 -0
  286. package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
  287. package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
  288. package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
  289. package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
  290. package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
  291. package/dist/cli-delegate/chunk-RDGRHAAB.js +259 -0
  292. package/dist/cli-delegate/chunk-TFG57JJM.js +1969 -0
  293. package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
  294. package/dist/cli-delegate/chunk-YMFO6FDN.js +10603 -0
  295. package/dist/cli-delegate/cmd_analyze_session.js +294 -0
  296. package/dist/cli-delegate/cmd_conformance.js +646 -0
  297. package/dist/cli-delegate/cmd_converge.js +326 -0
  298. package/dist/cli-delegate/cmd_doctor.js +144 -0
  299. package/dist/cli-delegate/cmd_explain.js +2508 -0
  300. package/dist/cli-delegate/cmd_export.js +296 -0
  301. package/dist/cli-delegate/cmd_fleet.js +332 -0
  302. package/dist/cli-delegate/cmd_memory_get.js +3878 -0
  303. package/dist/cli-delegate/cmd_migrate.js +11 -0
  304. package/dist/cli-delegate/cmd_preflight.js +270 -0
  305. package/dist/cli-delegate/cmd_prune.js +444 -0
  306. package/dist/cli-delegate/cmd_refresh.js +28 -0
  307. package/dist/cli-delegate/cmd_settings_check.js +574 -0
  308. package/dist/cli-delegate/cmd_settings_migrate.js +223 -0
  309. package/dist/cli-delegate/cmd_sync.js +264 -0
  310. package/dist/cli-delegate/cmd_uninstall.js +656 -0
  311. package/dist/cli-delegate/cmd_update.js +425 -0
  312. package/dist/cli-delegate/cmd_upgrade.js +444 -0
  313. package/dist/cli-delegate/cmd_validate.js +305 -0
  314. package/dist/cli-delegate/cmd_versions.js +370 -0
  315. package/dist/discovery/deprecation-report.md +1 -1
  316. package/dist/discovery/discovery-manifest.json +100 -67
  317. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  318. package/dist/discovery/discovery-manifest.summary.md +4 -4
  319. package/dist/discovery/orphan-report.md +1 -1
  320. package/dist/discovery/packs.json +16 -10
  321. package/dist/discovery/trust-report.md +2 -2
  322. package/dist/discovery/workspaces.json +7 -5
  323. package/dist/hooks/dispatch.js +186 -12
  324. package/dist/install/emit_host_rules_cli.js +2 -1
  325. package/dist/install/emit_host_rules_cli.js.map +1 -1
  326. package/dist/install/install.mjs +418 -378
  327. package/dist/install/rule_scope.js +5 -1
  328. package/dist/install/rule_scope.js.map +1 -1
  329. package/dist/install/toolDetection.js +40 -12
  330. package/dist/install/toolDetection.js.map +1 -1
  331. package/dist/install/wizard-plan.js +2 -2
  332. package/dist/install/wizard-plan.js.map +1 -1
  333. package/dist/mcp/registry-manifest.json +3 -3
  334. package/dist/mcp/server.json +2 -2
  335. package/dist/mcp/server.mjs +2194 -1003
  336. package/dist/router.json +1 -1
  337. package/dist/scripts/_lib/compile_time_toggles.js +48 -0
  338. package/dist/scripts/_lib/compile_time_toggles.js.map +1 -0
  339. package/dist/scripts/condense.js +234 -217
  340. package/dist/scripts/condense.js.map +1 -1
  341. package/dist/server/schemas/settings.js +4 -0
  342. package/dist/server/schemas/settings.js.map +1 -1
  343. package/dist/shared/userMd/utils.js +30 -0
  344. package/dist/shared/userMd/utils.js.map +1 -1
  345. package/dist/ui/assets/index-BpSQt5vm.js.map +1 -1
  346. package/docs/guidelines/agent-infra/api-cost-levers.md +56 -5
  347. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +93 -33
  348. package/package.json +4 -2
  349. package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  350. package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
  351. package/src/agent-src/templates/scripts/tier_usage_report.ts +2 -2
  352. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
  353. package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
  354. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
  355. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
  356. package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
  357. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
  358. package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
  359. package/src/config/agent-settings.template.yml +32 -2
  360. package/src/config/ci-local-parity.yml +142 -0
  361. package/src/config/discovery/packs.yml +7 -0
  362. package/src/config/evaluator-budgets.json +1 -1
  363. package/src/config/gate-coverage.yml +127 -0
  364. package/src/config/pack-size-budget.json +27 -0
  365. package/src/config/preamble-payload-budget.json +44 -0
  366. package/src/install/emit_host_rules_cli.ts +2 -1
  367. package/src/install/rule_scope.ts +5 -1
  368. package/src/install/toolDetection.ts +39 -8
  369. package/src/install/wizard-plan.ts +2 -2
  370. package/src/scripts/_cli/cmd_conformance.ts +2 -1
  371. package/src/scripts/_cli/cmd_converge.ts +2 -1
  372. package/src/scripts/_cli/cmd_doctor.ts +292 -15
  373. package/src/scripts/_cli/cmd_export.ts +2 -1
  374. package/src/scripts/_cli/cmd_fleet.ts +2 -1
  375. package/src/scripts/_cli/cmd_migrate.ts +2 -1
  376. package/src/scripts/_cli/cmd_preflight.ts +2 -1
  377. package/src/scripts/_cli/cmd_refresh.ts +2 -1
  378. package/src/scripts/_cli/cmd_update.ts +2 -1
  379. package/src/scripts/_cli/cmd_upgrade.ts +2 -1
  380. package/src/scripts/_cli/cmd_versions.ts +2 -1
  381. package/src/scripts/_cli/detection_report.ts +480 -0
  382. package/src/scripts/_dispatch.bash +52 -14
  383. package/src/scripts/_lib/agent_user_profile.ts +381 -0
  384. package/src/scripts/_lib/agents_overlay.ts +9 -0
  385. package/src/scripts/_lib/anchor_eval.ts +311 -0
  386. package/src/scripts/_lib/cc_transcript.ts +316 -0
  387. package/src/scripts/_lib/changelog_eras.ts +103 -9
  388. package/src/scripts/_lib/compile_time_toggles.ts +79 -0
  389. package/src/scripts/_lib/confusables.ts +101 -0
  390. package/src/scripts/_lib/duplicate_scope_census.ts +77 -0
  391. package/src/scripts/_lib/environment_detector.ts +441 -0
  392. package/src/scripts/_lib/managed_agents_folder.ts +181 -0
  393. package/src/scripts/_lib/package_root.ts +72 -0
  394. package/src/scripts/_lib/payload_hash_drift.ts +126 -0
  395. package/src/scripts/_lib/preservation_migration.ts +291 -0
  396. package/src/scripts/_lib/retrieval_sanitize.ts +166 -2
  397. package/src/scripts/_lib/scan_scope.ts +115 -0
  398. package/src/scripts/_lib/user_global_memory_audit.ts +187 -0
  399. package/src/scripts/_lib/user_global_observations.ts +830 -0
  400. package/src/scripts/_lib/user_global_revocations.ts +110 -0
  401. package/src/scripts/_lib/user_memory_gate_counters.ts +291 -0
  402. package/src/scripts/ai_council/blind_review.ts +0 -0
  403. package/src/scripts/ai_council/budget_guard.ts +90 -11
  404. package/src/scripts/ai_council/bundler.ts +2 -2
  405. package/src/scripts/ai_council/clients.ts +59 -3
  406. package/src/scripts/ai_council/config.ts +53 -7
  407. package/src/scripts/ai_council/modes.ts +68 -2
  408. package/src/scripts/ai_council/orchestrator.ts +54 -9
  409. package/src/scripts/ai_council/transport_resolver.ts +331 -0
  410. package/src/scripts/ai_team/team_dispatch.ts +17 -6
  411. package/src/scripts/anchor_eval_falsify.ts +198 -0
  412. package/src/scripts/anchor_scoring_run.ts +239 -0
  413. package/src/scripts/annotate_discovery.ts +1 -65
  414. package/src/scripts/bench_quality_run.ts +168 -4
  415. package/src/scripts/cache_realization_report.ts +782 -0
  416. package/src/scripts/check_artefact_count_messaging.ts +5 -1
  417. package/src/scripts/check_augment_description_cap.ts +15 -4
  418. package/src/scripts/check_bundle_path_leakage.ts +10 -4
  419. package/src/scripts/check_ci_local_parity.ts +317 -0
  420. package/src/scripts/check_condensation.ts +96 -191
  421. package/src/scripts/check_context_paths.ts +38 -9
  422. package/src/scripts/check_dependency_floors.ts +153 -0
  423. package/src/scripts/check_gate_coverage.ts +299 -0
  424. package/src/scripts/check_iron_law_prominence.ts +22 -1
  425. package/src/scripts/check_kernel_prefix_stability.ts +0 -0
  426. package/src/scripts/check_no_new_legacy_path.ts +16 -6
  427. package/src/scripts/check_no_roadmap_refs.ts +22 -9
  428. package/src/scripts/check_originality_freshness.ts +167 -0
  429. package/src/scripts/check_pack_size.ts +188 -0
  430. package/src/scripts/check_preamble_payload_budget.ts +130 -0
  431. package/src/scripts/check_proposal.ts +0 -0
  432. package/src/scripts/check_references.ts +0 -1
  433. package/src/scripts/check_safety_floor_untouched.ts +171 -24
  434. package/src/scripts/check_site_links.ts +62 -3
  435. package/src/scripts/ci_status.ts +0 -0
  436. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  437. package/src/scripts/code_graph/build.ts +0 -0
  438. package/src/scripts/command_suggester/types.ts +0 -0
  439. package/src/scripts/compile_router.ts +10 -14
  440. package/src/scripts/condense.sh +3 -4
  441. package/src/scripts/condense.ts +247 -228
  442. package/src/scripts/cost/track.mjs +168 -33
  443. package/src/scripts/cost_summary.ts +33 -1
  444. package/src/scripts/council_cli.ts +51 -5
  445. package/src/scripts/discovery_graph.ts +0 -0
  446. package/src/scripts/encoding_corpus.ts +500 -0
  447. package/src/scripts/encoding_corpus_report.ts +216 -0
  448. package/src/scripts/evaluator_umbrella.sh +34 -1
  449. package/src/scripts/generate_index.ts +19 -2
  450. package/src/scripts/install-hooks.sh +2 -2
  451. package/src/scripts/learning_sidecar.ts +0 -0
  452. package/src/scripts/lint_confusables.ts +10 -72
  453. package/src/scripts/lint_eval_fixture_citations.ts +113 -0
  454. package/src/scripts/lint_featured_skills.ts +0 -0
  455. package/src/scripts/lint_hidden_unicode.ts +208 -0
  456. package/src/scripts/lint_load_context.ts +17 -5
  457. package/src/scripts/lint_new_skill_gate.ts +9 -3
  458. package/src/scripts/lint_no_python_twin_rationale.ts +17 -2
  459. package/src/scripts/lint_originality.ts +1 -1
  460. package/src/scripts/lint_skill_originality.ts +1 -1
  461. package/src/scripts/lint_ticket_buildable.ts +1 -1
  462. package/src/scripts/lint_ui_stack_bundles.ts +170 -0
  463. package/src/scripts/mcp_server/tools.ts +4 -4
  464. package/src/scripts/measure_scope_dedup.ts +224 -0
  465. package/src/scripts/memory_lookup.ts +0 -0
  466. package/src/scripts/mine_session.ts +98 -0
  467. package/src/scripts/orchestration_payload_hash_drift.ts +145 -0
  468. package/src/scripts/preamble_byte_census.ts +574 -0
  469. package/src/scripts/probe_skill_registration.ts +2 -2
  470. package/src/scripts/redact_hook_capture.ts +13 -0
  471. package/src/scripts/release.ts +65 -10
  472. package/src/scripts/router_telemetry.ts +1 -1
  473. package/src/scripts/second_brain_retrieval.ts +14 -4
  474. package/src/scripts/skill_linter.ts +5 -0
  475. package/src/scripts/surface-tiers.yml +2 -0
  476. package/src/scripts/validate_pack_yaml.ts +0 -0
  477. package/src/server/schemas/settings.ts +8 -0
  478. package/src/shared/userMd/utils.ts +31 -0
  479. package/dist/agent-src/rules/telegraph-speak.md +0 -87
@@ -17,14 +17,25 @@ import {
17
17
  StepResult,
18
18
  agent_directive,
19
19
  } from '../../delivery_state.js';
20
- import { PLACEHOLDER_PATTERNS } from './design.js';
20
+ import { placeholder_paths } from './design.js';
21
+ import {
22
+ UNSUPPORTED_LANE,
23
+ bundle_line,
24
+ unsupported_stack_questions,
25
+ } from './stack_bundles.js';
21
26
 
22
27
  /** Map `state.stack.frontend` → agent-directive skill name. */
23
28
  export const STACK_DIRECTIVES: Record<string, string> = {
24
29
  'blade-livewire-flux': 'ui-apply-blade-livewire-flux',
30
+ 'blade-livewire': 'ui-apply-blade-livewire',
31
+ filament: 'ui-apply-filament',
25
32
  'react-shadcn': 'ui-apply-react-shadcn',
33
+ react: 'ui-apply-react',
26
34
  vue: 'ui-apply-vue',
27
35
  plain: 'ui-apply-plain',
36
+ // Present so the `keys == KNOWN_STACKS` invariant holds. Never emitted —
37
+ // the step intercepts this lane and refuses instead of dispatching.
38
+ unknown: 'ui-apply-unsupported',
28
39
  };
29
40
 
30
41
  /** Fallback directive when `state.stack` is missing or malformed. */
@@ -104,47 +115,36 @@ function _resolve_directive(state: DeliveryState): string {
104
115
  return DEFAULT_DIRECTIVE;
105
116
  }
106
117
 
107
- /** Return paths into `envelope['rendered']` whose text matches a pattern. */
118
+ /**
119
+ * Return paths into `envelope['rendered']` whose text matches a pattern.
120
+ *
121
+ * Delegates to the walker shared with `design`, so the producer-side and
122
+ * consumer-side gates cannot drift apart. They previously held
123
+ * byte-identical copies of the same array-blind recursion, which meant the
124
+ * contract's "defense-in-depth" framing described two layers that failed on
125
+ * exactly the same inputs.
126
+ */
108
127
  function _placeholder_violations_in_output(envelope: Record<string, Any>): string[] {
109
- const rendered = envelope['rendered'];
110
- if (!_isDict(rendered)) {
111
- return [];
112
- }
113
- const violations: string[] = [];
114
- _walk_rendered(rendered, '', violations);
115
- return violations;
116
- }
117
-
118
- function _walk_rendered(node: Record<string, Any>, prefix: string, violations: string[]): void {
119
- for (const key of Object.keys(node)) {
120
- const value = node[key];
121
- const path = prefix ? `${prefix}.${key}` : String(key);
122
- if (_isDict(value)) {
123
- _walk_rendered(value, path, violations);
124
- continue;
125
- }
126
- if (typeof value !== 'string') {
127
- continue;
128
- }
129
- const lowered = value.toLowerCase();
130
- for (const pattern of PLACEHOLDER_PATTERNS) {
131
- if (lowered.includes(pattern)) {
132
- violations.push(path);
133
- break;
134
- }
135
- }
136
- }
128
+ return placeholder_paths(envelope['rendered']);
137
129
  }
138
130
 
139
131
  /** First-pass halt — emit the stack-specific apply directive. */
140
132
  function _delegate_to_stack_skill(state: DeliveryState): StepResult {
141
133
  const directive = _resolve_directive(state);
142
134
  const stack_label = _stack_label(state);
135
+ if (stack_label === UNSUPPORTED_LANE) {
136
+ return new StepResult({
137
+ outcome: Outcome.BLOCKED,
138
+ questions: unsupported_stack_questions('apply'),
139
+ message: 'UI apply refused: frontend framework not modelled by any lane.',
140
+ });
141
+ }
143
142
  return new StepResult({
144
143
  outcome: Outcome.BLOCKED,
145
144
  questions: [
146
145
  agent_directive(directive),
147
146
  `> Stack: \`${stack_label}\`. Implementing the locked design brief.`,
147
+ bundle_line(stack_label, 'build'),
148
148
  '> Microcopy is locked — every button label, empty-state ' +
149
149
  'message, and validation message must come verbatim from ' +
150
150
  '`state.ui_design.microcopy`.',
@@ -146,7 +146,17 @@ function _missing_required_keys(design: Record<string, Any>): string[] {
146
146
  missing.push(key);
147
147
  continue;
148
148
  }
149
- if (key === 'states' && _isDict(value)) {
149
+ if (key === 'states') {
150
+ // A non-object `states` (a string, a list) used to skip the
151
+ // per-state loop entirely, so `states: "n/a"` satisfied the gate
152
+ // without covering a single state. Report every required key
153
+ // instead — the author gets the same actionable list either way.
154
+ if (!_isDict(value)) {
155
+ for (const state_key of REQUIRED_STATE_KEYS) {
156
+ missing.push(`states.${state_key}`);
157
+ }
158
+ continue;
159
+ }
150
160
  for (const state_key of REQUIRED_STATE_KEYS) {
151
161
  if (!_pyTruthy(value[state_key])) {
152
162
  missing.push(`states.${state_key}`);
@@ -157,37 +167,74 @@ function _missing_required_keys(design: Record<string, Any>): string[] {
157
167
  return missing;
158
168
  }
159
169
 
160
- /** Return microcopy paths whose values match a placeholder pattern. */
170
+ /**
171
+ * Return brief paths whose values match a placeholder pattern.
172
+ *
173
+ * Covers `microcopy` **and** `states`. The five required states were checked
174
+ * for truthiness only, so `states.error: "TBD"` satisfied the gate — the brief
175
+ * looked complete while covering nothing. Both slots carry strings the user
176
+ * signs off on, so both are held to the same bar.
177
+ *
178
+ * An explicit `"n/a"` stays legitimate: a static landing page genuinely has no
179
+ * error or disabled state, and *declaring* that is the opposite of inventing
180
+ * filler. That is why the gate demands all five keys rather than branching on
181
+ * page type — the author states the answer instead of the engine guessing which
182
+ * states a surface ought to have.
183
+ */
161
184
  function _placeholder_violations(design: Record<string, Any>): string[] {
162
- const microcopy = design['microcopy'];
163
- if (!_isDict(microcopy)) return [];
185
+ return [
186
+ ...placeholder_paths(design['microcopy'], 'microcopy'),
187
+ ...placeholder_paths(design['states'], 'states'),
188
+ ];
189
+ }
190
+
191
+ /**
192
+ * Return every path under `node` whose leaf string carries a placeholder.
193
+ *
194
+ * Traverses objects **and arrays**. The array arm is load-bearing, not
195
+ * defensive: a list is the natural shape for the most common microcopy
196
+ * (`nav_items`, `menu`, `steps`) and for a rendered file split into lines,
197
+ * and a walker that recursed into objects only let
198
+ * `{ nav_items: ["Home", "TODO: Link"] }` through both the brief lock and
199
+ * the rendered-output gate.
200
+ *
201
+ * Array elements are addressed `key[i]` so the halt names the exact element
202
+ * the author has to fix, not just the list.
203
+ *
204
+ * Shared by `design` (producer side, on `microcopy`) and `apply` (consumer
205
+ * side, on the rendered envelope). One implementation on purpose: the two
206
+ * call sites previously carried byte-identical copies of the same bug, so
207
+ * duplicating them bought no independence — see
208
+ * `docs/contracts/ui-track-flow.md` § implement → apply.
209
+ */
210
+ export function placeholder_paths(node: Any, prefix = ''): string[] {
164
211
  const violations: string[] = [];
165
- _walk_microcopy(microcopy, '', violations);
212
+ _walk_placeholders(node, prefix, violations);
166
213
  return violations;
167
214
  }
168
215
 
169
- function _walk_microcopy(
170
- node: Record<string, Any>,
171
- prefix: string,
172
- violations: string[],
173
- ): void {
174
- for (const key of Object.keys(node)) {
175
- const value = node[key];
176
- const path = prefix ? `${prefix}.${key}` : String(key);
177
- if (_isDict(value)) {
178
- _walk_microcopy(value, path, violations);
179
- continue;
180
- }
181
- if (typeof value !== 'string') {
182
- continue;
183
- }
184
- const lowered = value.toLowerCase();
216
+ function _walk_placeholders(node: Any, prefix: string, violations: string[]): void {
217
+ if (typeof node === 'string') {
218
+ const lowered = node.toLowerCase();
185
219
  for (const pattern of PLACEHOLDER_PATTERNS) {
186
220
  if (lowered.includes(pattern)) {
187
- violations.push(path);
188
- break;
221
+ violations.push(prefix);
222
+ return;
189
223
  }
190
224
  }
225
+ return;
226
+ }
227
+ if (Array.isArray(node)) {
228
+ node.forEach((value, index) => {
229
+ _walk_placeholders(value, `${prefix}[${index}]`, violations);
230
+ });
231
+ return;
232
+ }
233
+ if (_isDict(node)) {
234
+ for (const key of Object.keys(node)) {
235
+ const path = prefix ? `${prefix}.${key}` : String(key);
236
+ _walk_placeholders(node[key], path, violations);
237
+ }
191
238
  }
192
239
  }
193
240
 
@@ -311,15 +358,23 @@ function _halt_unconfirmed(state: DeliveryState, design: Record<string, Any>): S
311
358
  });
312
359
  }
313
360
 
314
- /** Count leaf string entries in `microcopy` (recursive). */
315
- function _count_microcopy(microcopy: Record<string, Any>): number {
316
- let total = 0;
317
- for (const value of Object.values(microcopy)) {
318
- if (_isDict(value)) {
319
- total += _count_microcopy(value);
320
- } else if (typeof value === 'string') {
321
- total += 1;
322
- }
361
+ /**
362
+ * Count leaf string entries in `microcopy` (recursive, arrays included).
363
+ *
364
+ * The count is shown in the sign-off the user confirms, so it has to agree
365
+ * with what the placeholder walker inspects — an object-only count reported
366
+ * fewer locked strings than were actually locked.
367
+ */
368
+ function _count_microcopy(microcopy: Any): number {
369
+ if (typeof microcopy === 'string') return 1;
370
+ if (Array.isArray(microcopy)) {
371
+ return microcopy.reduce((total: number, value) => total + _count_microcopy(value), 0);
372
+ }
373
+ if (_isDict(microcopy)) {
374
+ return Object.values(microcopy).reduce(
375
+ (total: number, value) => total + _count_microcopy(value),
376
+ 0,
377
+ );
323
378
  }
324
- return total;
379
+ return 0;
325
380
  }
@@ -15,6 +15,11 @@ import {
15
15
  StepResult,
16
16
  agent_directive,
17
17
  } from '../../delivery_state.js';
18
+ import {
19
+ UNSUPPORTED_LANE,
20
+ bundle_line,
21
+ unsupported_stack_questions,
22
+ } from './stack_bundles.js';
18
23
 
19
24
  /** Maximum number of polish rounds per `/work` run. */
20
25
  export const POLISH_CEILING = 2;
@@ -31,9 +36,15 @@ export const TOKEN_REPEAT_THRESHOLD = 2;
31
36
  /** Map `state.stack.frontend` → agent-directive skill name. */
32
37
  export const STACK_DIRECTIVES: Record<string, string> = {
33
38
  'blade-livewire-flux': 'ui-polish-blade-livewire-flux',
39
+ 'blade-livewire': 'ui-polish-blade-livewire',
40
+ filament: 'ui-polish-filament',
34
41
  'react-shadcn': 'ui-polish-react-shadcn',
42
+ react: 'ui-polish-react',
35
43
  vue: 'ui-polish-vue',
36
44
  plain: 'ui-polish-plain',
45
+ // Present so the `keys == KNOWN_STACKS` invariant holds. Never emitted —
46
+ // the step intercepts this lane and refuses instead of dispatching.
47
+ unknown: 'ui-polish-unsupported',
37
48
  };
38
49
 
39
50
  /** Fallback directive when `state.stack` is missing or malformed. */
@@ -184,6 +195,14 @@ function _delegate_to_polish_skill(
184
195
  ceiling: number,
185
196
  ): StepResult {
186
197
  const directive = _resolve_directive(state);
198
+ const unsupported_label = _stack_label(state);
199
+ if (unsupported_label === UNSUPPORTED_LANE) {
200
+ return new StepResult({
201
+ outcome: Outcome.BLOCKED,
202
+ questions: unsupported_stack_questions('polish'),
203
+ message: 'UI polish refused: frontend framework not modelled by any lane.',
204
+ });
205
+ }
187
206
  const stack_label = _stack_label(state);
188
207
  const next_round = rounds + 1;
189
208
  let findings_line =
@@ -203,6 +222,7 @@ function _delegate_to_polish_skill(
203
222
  questions: [
204
223
  agent_directive(directive),
205
224
  `> Stack: \`${stack_label}\`. Polish round ${next_round} of ${ceiling}.`,
225
+ bundle_line(stack_label, 'build'),
206
226
  findings_line,
207
227
  '> Fix chart-type / contrast findings against the adopted ' +
208
228
  "corpus rows (design-intelligence § 'Grounding the " +
@@ -336,7 +356,7 @@ function _classify_token_violations(
336
356
  tokens: Record<string, Any>,
337
357
  ): [Record<string, Any>[], Record<string, Any>[]] {
338
358
  const matched: Record<string, Any>[] = [];
339
- // Insertion-ordered map keyed by `${category}${value}` to mirror the
359
+ // Insertion-ordered map keyed by `${category}\0${value}` to mirror the
340
360
  // Python `dict[tuple[str, str], int]` insertion order.
341
361
  const unmatched_counts = new Map<string, { category: string; value: string; count: number }>();
342
362
  for (const finding of findings) {
@@ -356,7 +376,7 @@ function _classify_token_violations(
356
376
  matched.push(finding);
357
377
  continue;
358
378
  }
359
- const key = `${category}${value}`;
379
+ const key = `${category}\0${value}`;
360
380
  const existing = unmatched_counts.get(key);
361
381
  if (existing) {
362
382
  existing.count += 1;
@@ -16,13 +16,24 @@ import {
16
16
  StepResult,
17
17
  agent_directive,
18
18
  } from '../../delivery_state.js';
19
+ import {
20
+ UNSUPPORTED_LANE,
21
+ bundle_line,
22
+ unsupported_stack_questions,
23
+ } from './stack_bundles.js';
19
24
 
20
- /** Map `state.stack.frontend` → agent-directive skill name. */
25
+ /** Map `state.stack.frontend` → agent-directive verb. */
21
26
  export const STACK_DIRECTIVES: Record<string, string> = {
22
27
  'blade-livewire-flux': 'ui-design-review-blade-livewire-flux',
28
+ 'blade-livewire': 'ui-design-review-blade-livewire',
29
+ filament: 'ui-design-review-filament',
23
30
  'react-shadcn': 'ui-design-review-react-shadcn',
31
+ react: 'ui-design-review-react',
24
32
  vue: 'ui-design-review-vue',
25
33
  plain: 'ui-design-review-plain',
34
+ // Present so the `keys == KNOWN_STACKS` invariant holds. Never emitted —
35
+ // the step intercepts this lane and refuses instead of dispatching.
36
+ unknown: 'ui-design-review-unsupported',
26
37
  };
27
38
 
28
39
  /** Fallback directive when `state.stack` is missing or malformed. */
@@ -181,12 +192,20 @@ function _stack_label(state: DeliveryState): string {
181
192
  function _delegate_to_review_skill(state: DeliveryState): StepResult {
182
193
  const directive = _resolve_directive(state);
183
194
  const stack_label = _stack_label(state);
195
+ if (stack_label === UNSUPPORTED_LANE) {
196
+ return new StepResult({
197
+ outcome: Outcome.BLOCKED,
198
+ questions: unsupported_stack_questions('review'),
199
+ message: 'UI review refused: frontend framework not modelled by any lane.',
200
+ });
201
+ }
184
202
  return new StepResult({
185
203
  outcome: Outcome.BLOCKED,
186
204
  questions: [
187
205
  agent_directive(directive),
188
206
  `> Stack: \`${stack_label}\`. Reviewing rendered components ` +
189
207
  'against the locked design brief.',
208
+ bundle_line(stack_label, 'review'),
190
209
  '> The review pass compares `state.ticket.ui_apply.rendered` ' +
191
210
  'against `state.ui_design` (microcopy, states, a11y, layout) ' +
192
211
  'and produces a structured `findings` list.',
@@ -294,7 +313,7 @@ function _filter_known(violations: Any[], known: Any[]): Any[] {
294
313
  * scalars, mirroring Python tuple-equality in a JS `Set`.
295
314
  */
296
315
  function _keyOf(rule: Any, selector: Any): string {
297
- return `${_tag(rule)}${_tag(selector)}`;
316
+ return `${_tag(rule)}\0${_tag(selector)}`;
298
317
  }
299
318
 
300
319
  function _tag(v: Any): string {
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Verb → skill-bundle map for the stack-dispatched UI steps.
3
+ *
4
+ * The UI steps halt with `@agent-directive: ui-apply-<stack>` (and the
5
+ * `ui-design-review-` / `ui-polish-` equivalents). Those names are **directive
6
+ * verbs, not skill paths** — the same shape as `run-tests`, `create-plan`, and
7
+ * `apply-plan`, which likewise resolve to no skill file. Only 2 of the engine's
8
+ * 11 literal verbs name a real skill, so a verb is something the agent
9
+ * interprets, and the mapping from verb to the skills that implement it is a
10
+ * separate fact that has to be written down somewhere.
11
+ *
12
+ * Before this module that mapping lived only in a prose table in
13
+ * `docs/contracts/ui-track-flow.md`. Nothing verified it, and two of its four
14
+ * rows were wrong: `vue` pointed at the directive verb itself (naming no skill
15
+ * at all) and `plain` — which is also the fallback for every unrecognised
16
+ * project — pointed at `blade-ui`, a skill whose frontmatter is
17
+ * `packs: [laravel]` and which a non-Laravel consumer therefore does not have
18
+ * installed.
19
+ *
20
+ * Keeping the map here makes it checkable: `lint_ui_stack_bundles` asserts every
21
+ * member resolves to a real skill, and that no lane reachable without the
22
+ * `laravel` pack names a `laravel`-only skill. A CI check in this repo cannot
23
+ * see a consumer's installed pack combination, so the second assertion is the
24
+ * part that actually prevents the `plain → blade-ui` class of defect.
25
+ */
26
+
27
+ /** Skills that implement a lane, in the order the agent should load them. */
28
+ export interface StackBundle {
29
+ /** Skills that build / fix UI for this lane (`apply`, `polish`). */
30
+ readonly build: ReadonlyArray<string>;
31
+ /** Skills that review UI for this lane (`review`). */
32
+ readonly review: ReadonlyArray<string>;
33
+ /**
34
+ * True when every skill above ships outside the framework packs, i.e. the
35
+ * lane is safe as a fallback for a consumer whose packs we cannot predict.
36
+ * Only lanes marked `pack_agnostic` may be used as `DEFAULT_*`.
37
+ */
38
+ readonly pack_agnostic: boolean;
39
+ }
40
+
41
+ /**
42
+ * The pack-agnostic pair. Both live in `engineering-base`, so they are present
43
+ * in every install; both self-describe as stack-neutral
44
+ * (`ui-component-architect`: "the same lens applies to Blade, Livewire, React,
45
+ * or Vue trees"; `tailwind-engineer`: "the **how** for any Tailwind-stack
46
+ * screen"). This is the honest floor for a lane with no framework-specific
47
+ * executor — not a claim that the lane is fully served.
48
+ */
49
+ const GENERIC_BUILD: ReadonlyArray<string> = ['ui-component-architect', 'tailwind-engineer'];
50
+
51
+ /** `design-review` is stack-neutral and ships in `engineering-base`. */
52
+ const GENERIC_REVIEW: ReadonlyArray<string> = ['design-review'];
53
+
54
+ /**
55
+ * Lane → bundle. Keys mirror `KNOWN_STACKS`; the dispatch tables in
56
+ * `apply` / `review` / `polish` keep their own verb strings (a tested public
57
+ * contract) and consume this map only to name the skills in the halt body.
58
+ */
59
+ export const STACK_BUNDLES: Readonly<Record<string, StackBundle>> = {
60
+ 'blade-livewire-flux': {
61
+ build: ['flux', 'livewire', 'blade-ui'],
62
+ review: GENERIC_REVIEW,
63
+ pack_agnostic: false,
64
+ },
65
+ // Livewire without Flux — the common Laravel frontend. Previously fell
66
+ // into `plain` because detection required Livewire AND Flux.
67
+ 'blade-livewire': {
68
+ build: ['livewire', 'blade-ui'],
69
+ review: GENERIC_REVIEW,
70
+ pack_agnostic: false,
71
+ },
72
+ // Filament is Livewire + Blade + Tailwind under the hood; the same
73
+ // executors apply. A Filament-specific skill is gated on evidence that
74
+ // these produce unusable output for it, not assumed.
75
+ filament: {
76
+ build: ['livewire', 'blade-ui'],
77
+ review: GENERIC_REVIEW,
78
+ pack_agnostic: false,
79
+ },
80
+ 'react-shadcn': {
81
+ build: ['react-shadcn-ui'],
82
+ review: GENERIC_REVIEW,
83
+ pack_agnostic: false,
84
+ },
85
+ // React without Radix/shadcn. `react-shadcn-ui` still carries the React
86
+ // component idiom; the shadcn-specific parts simply do not apply.
87
+ react: {
88
+ build: ['react-shadcn-ui'],
89
+ review: GENERIC_REVIEW,
90
+ pack_agnostic: false,
91
+ },
92
+ // No Vue executor exists. The previous prose row pointed at the directive
93
+ // verb itself, which named nothing; the generic pair is a smaller lie and a
94
+ // stated one — the halt body says the lane has no Vue-specific skill.
95
+ vue: {
96
+ build: GENERIC_BUILD,
97
+ review: GENERIC_REVIEW,
98
+ pack_agnostic: true,
99
+ },
100
+ plain: {
101
+ build: GENERIC_BUILD,
102
+ review: GENERIC_REVIEW,
103
+ pack_agnostic: true,
104
+ },
105
+ };
106
+
107
+ /**
108
+ * Lanes served by the stack-neutral pair rather than a framework executor.
109
+ *
110
+ * `plain` and `vue` share the bundle but not the meaning, and the halt body has
111
+ * to say which it is. For `plain` the pair IS the right answer — there is no
112
+ * framework to be idiomatic about. For `vue` it is a gap: a Vue project has a
113
+ * definite idiom and the package has no executor for it, so the result must not
114
+ * read as Vue support.
115
+ */
116
+ export const GENERIC_LANES: ReadonlySet<string> = new Set(['vue', 'plain']);
117
+
118
+ /** Lanes where the stack-neutral pair is the correct answer, not a shortfall. */
119
+ const NATIVELY_GENERIC_LANES: ReadonlySet<string> = new Set(['plain']);
120
+
121
+ /**
122
+ * The label detection returns for a framework it recognises but does not
123
+ * model. Mirrors `stack/detect.ts::UNSUPPORTED_STACK`; duplicated as a literal
124
+ * because this module is import-free by design (the detector is a leaf module
125
+ * the directives must not depend on).
126
+ */
127
+ export const UNSUPPORTED_LANE = 'unknown';
128
+
129
+ /** Return the bundle for `stack`, or the `plain` bundle when unmapped. */
130
+ export function bundle_for(stack: string): StackBundle {
131
+ return STACK_BUNDLES[stack] ?? (STACK_BUNDLES['plain'] as StackBundle);
132
+ }
133
+
134
+ /**
135
+ * Questions for the refusal halt on an unmodelled framework.
136
+ *
137
+ * Not a directive — there is nothing honest to dispatch to. The agent names
138
+ * the actual markers from the manifest (it has filesystem access; the engine
139
+ * deliberately does not carry them on `StackResult`), and the user chooses
140
+ * between the stack-neutral floor and stopping.
141
+ */
142
+ export function unsupported_stack_questions(step: string): string[] {
143
+ return [
144
+ '> Detection found a frontend framework this package does not model, ' +
145
+ `so there is no \`${step}\` lane for it.`,
146
+ '> Name the markers you see in `composer.json` / `package.json` so the ' +
147
+ 'choice below is made on the real stack, not on a guess.',
148
+ '> 1. Continue on the stack-neutral floor — `ui-component-architect` + ' +
149
+ '`tailwind-engineer`. Output will not be idiomatic for this ' +
150
+ 'framework; say so in the result.',
151
+ '> 2. Abort — drop this UI request and add a lane first ' +
152
+ '(`docs/contracts/ui-stack-extension.md`).',
153
+ ];
154
+ }
155
+
156
+ /**
157
+ * Render the "load these skills" line for a dispatch halt.
158
+ *
159
+ * The engine cannot load a skill itself; naming the bundle is what stops the
160
+ * agent from resolving an unresolvable verb by guessing. A lane with no
161
+ * framework-specific executor says that outright rather than presenting the
162
+ * generic pair as if it were stack support.
163
+ */
164
+ export function bundle_line(stack: string, role: 'build' | 'review'): string {
165
+ const bundle = bundle_for(stack);
166
+ const skills = role === 'review' ? bundle.review : bundle.build;
167
+ const rendered = skills.map((name) => `\`${name}\``).join(' + ');
168
+ if (NATIVELY_GENERIC_LANES.has(stack)) {
169
+ return `> Skills: ${rendered} — stack-neutral, which is what \`${stack}\` means.`;
170
+ }
171
+ if (GENERIC_LANES.has(stack)) {
172
+ return (
173
+ `> Skills: ${rendered} — there is no \`${stack}\`-specific executor, ` +
174
+ 'so this is the stack-neutral floor, not idiomatic ' +
175
+ `\`${stack}\`. Say so in the result.`
176
+ );
177
+ }
178
+ return `> Skills: ${rendered}.`;
179
+ }