@event4u/agent-config 1.16.0 → 1.17.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 (203) hide show
  1. package/.agent-src/commands/{agents-audit.md → agents/audit.md} +4 -3
  2. package/.agent-src/commands/{agents-cleanup.md → agents/cleanup.md} +12 -6
  3. package/.agent-src/commands/{agents-prepare.md → agents/prepare.md} +4 -3
  4. package/.agent-src/commands/agents.md +46 -0
  5. package/.agent-src/commands/{chat-history-checkpoint.md → chat-history/checkpoint.md} +4 -4
  6. package/.agent-src/commands/{chat-history-clear.md → chat-history/clear.md} +4 -4
  7. package/.agent-src/commands/{chat-history-resume.md → chat-history/resume.md} +4 -4
  8. package/.agent-src/commands/chat-history/show.md +107 -0
  9. package/.agent-src/commands/chat-history.md +33 -89
  10. package/.agent-src/commands/{commit-in-chunks.md → commit/in-chunks.md} +15 -13
  11. package/.agent-src/commands/commit.md +22 -2
  12. package/.agent-src/commands/{context-create.md → context/create.md} +4 -3
  13. package/.agent-src/commands/{context-refactor.md → context/refactor.md} +4 -3
  14. package/.agent-src/commands/context.md +44 -0
  15. package/.agent-src/commands/{copilot-agents-init.md → copilot-agents/init.md} +4 -3
  16. package/.agent-src/commands/{copilot-agents-optimize.md → copilot-agents/optimize.md} +4 -3
  17. package/.agent-src/commands/copilot-agents.md +44 -0
  18. package/.agent-src/commands/council/default.md +221 -0
  19. package/.agent-src/commands/{council-design.md → council/design.md} +6 -5
  20. package/.agent-src/commands/{council-optimize.md → council/optimize.md} +7 -6
  21. package/.agent-src/commands/{council-pr.md → council/pr.md} +6 -5
  22. package/.agent-src/commands/council.md +47 -212
  23. package/.agent-src/commands/{create-pr-description.md → create-pr/description-only.md} +4 -2
  24. package/.agent-src/commands/create-pr.md +26 -5
  25. package/.agent-src/commands/{feature-dev.md → feature/dev.md} +5 -10
  26. package/.agent-src/commands/{feature-explore.md → feature/explore.md} +4 -8
  27. package/.agent-src/commands/{feature-plan.md → feature/plan.md} +4 -8
  28. package/.agent-src/commands/{feature-refactor.md → feature/refactor.md} +4 -8
  29. package/.agent-src/commands/{feature-roadmap.md → feature/roadmap.md} +6 -10
  30. package/.agent-src/commands/feature.md +6 -12
  31. package/.agent-src/commands/{fix-ci.md → fix/ci.md} +4 -8
  32. package/.agent-src/commands/{fix-portability.md → fix/portability.md} +4 -8
  33. package/.agent-src/commands/{fix-pr-bot-comments.md → fix/pr-bots.md} +4 -8
  34. package/.agent-src/commands/{fix-pr-developer-comments.md → fix/pr-developers.md} +4 -8
  35. package/.agent-src/commands/{fix-pr-comments.md → fix/pr.md} +7 -11
  36. package/.agent-src/commands/{fix-references.md → fix/refs.md} +4 -8
  37. package/.agent-src/commands/{fix-seeder.md → fix/seeder.md} +4 -8
  38. package/.agent-src/commands/fix.md +7 -13
  39. package/.agent-src/commands/{do-and-judge.md → judge/on-diff.md} +4 -3
  40. package/.agent-src/commands/judge/solo.md +90 -0
  41. package/.agent-src/commands/{do-in-steps.md → judge/steps.md} +4 -3
  42. package/.agent-src/commands/judge.md +35 -70
  43. package/.agent-src/commands/{memory-add.md → memory/add.md} +4 -3
  44. package/.agent-src/commands/{memory-full.md → memory/load.md} +4 -3
  45. package/.agent-src/commands/{memory-promote.md → memory/promote.md} +4 -3
  46. package/.agent-src/commands/{propose-memory.md → memory/propose.md} +4 -3
  47. package/.agent-src/commands/memory.md +48 -0
  48. package/.agent-src/commands/{module-create.md → module/create.md} +4 -3
  49. package/.agent-src/commands/{module-explore.md → module/explore.md} +4 -3
  50. package/.agent-src/commands/module.md +44 -0
  51. package/.agent-src/commands/{optimize-agents.md → optimize/agents.md} +4 -8
  52. package/.agent-src/commands/{optimize-augmentignore.md → optimize/augmentignore.md} +4 -9
  53. package/.agent-src/commands/{optimize-rtk-filters.md → optimize/rtk.md} +4 -8
  54. package/.agent-src/commands/{optimize-skills.md → optimize/skills.md} +4 -8
  55. package/.agent-src/commands/optimize.md +4 -10
  56. package/.agent-src/commands/{override-create.md → override/create.md} +4 -3
  57. package/.agent-src/commands/{override-manage.md → override/manage.md} +4 -3
  58. package/.agent-src/commands/override.md +44 -0
  59. package/.agent-src/commands/{roadmap-create.md → roadmap/create.md} +4 -3
  60. package/.agent-src/commands/{roadmap-execute.md → roadmap/execute.md} +4 -3
  61. package/.agent-src/commands/roadmap.md +44 -0
  62. package/.agent-src/commands/{tests-create.md → tests/create.md} +4 -3
  63. package/.agent-src/commands/{tests-execute.md → tests/execute.md} +4 -3
  64. package/.agent-src/commands/tests.md +44 -0
  65. package/.agent-src/contexts/communication/rules-auto/artifact-engagement-recording-mechanics.md +72 -0
  66. package/.agent-src/contexts/communication/rules-auto/augment-portability-mechanics.md +79 -0
  67. package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +98 -0
  68. package/.agent-src/contexts/communication/rules-auto/cli-output-handling-mechanics.md +87 -0
  69. package/.agent-src/contexts/communication/rules-auto/command-suggestion-policy-mechanics.md +62 -0
  70. package/.agent-src/contexts/communication/rules-auto/docs-sync-mechanics.md +78 -0
  71. package/.agent-src/contexts/communication/rules-auto/package-ci-checks-mechanics.md +85 -0
  72. package/.agent-src/contexts/communication/rules-auto/review-routing-awareness-mechanics.md +65 -0
  73. package/.agent-src/contexts/communication/rules-auto/roadmap-progress-sync-mechanics.md +78 -0
  74. package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +62 -0
  75. package/.agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +55 -0
  76. package/.agent-src/contexts/communication/rules-auto/ui-audit-gate-mechanics.md +53 -0
  77. package/.agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +77 -0
  78. package/.agent-src/contexts/judges/no-consolidate-rationale.md +102 -0
  79. package/.agent-src/contexts/judges/persona-voice-rubric.md +140 -0
  80. package/.agent-src/rules/artifact-engagement-recording.md +13 -69
  81. package/.agent-src/rules/ask-when-uncertain.md +27 -42
  82. package/.agent-src/rules/augment-portability.md +15 -61
  83. package/.agent-src/rules/augment-source-of-truth.md +27 -93
  84. package/.agent-src/rules/cli-output-handling.md +10 -76
  85. package/.agent-src/rules/command-suggestion-policy.md +18 -59
  86. package/.agent-src/rules/commit-conventions.md +17 -14
  87. package/.agent-src/rules/direct-answers.md +34 -49
  88. package/.agent-src/rules/docker-commands.md +5 -5
  89. package/.agent-src/rules/docs-sync.md +15 -69
  90. package/.agent-src/rules/language-and-tone.md +48 -72
  91. package/.agent-src/rules/missing-tool-handling.md +28 -22
  92. package/.agent-src/rules/no-cheap-questions.md +45 -52
  93. package/.agent-src/rules/no-roadmap-references.md +73 -0
  94. package/.agent-src/rules/package-ci-checks.md +21 -61
  95. package/.agent-src/rules/preservation-guard.md +64 -29
  96. package/.agent-src/rules/review-routing-awareness.md +24 -43
  97. package/.agent-src/rules/roadmap-progress-sync.md +10 -71
  98. package/.agent-src/rules/security-sensitive-stop.md +8 -8
  99. package/.agent-src/rules/skill-quality.md +16 -48
  100. package/.agent-src/rules/slash-command-routing-policy.md +7 -4
  101. package/.agent-src/rules/think-before-action.md +52 -42
  102. package/.agent-src/rules/tool-safety.md +19 -16
  103. package/.agent-src/rules/ui-audit-gate.md +24 -38
  104. package/.agent-src/rules/user-interaction.md +13 -68
  105. package/.agent-src/skills/ai-council/SKILL.md +2 -0
  106. package/.agent-src/skills/api-testing/SKILL.md +1 -1
  107. package/.agent-src/skills/check-refs/SKILL.md +59 -40
  108. package/.agent-src/skills/conventional-commits-writing/SKILL.md +86 -28
  109. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +5 -5
  110. package/.agent-src/skills/developer-like-execution/SKILL.md +4 -4
  111. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +101 -65
  112. package/.agent-src/skills/flux/SKILL.md +30 -10
  113. package/.agent-src/skills/github-ci/SKILL.md +2 -2
  114. package/.agent-src/skills/judge-code-quality/SKILL.md +7 -8
  115. package/.agent-src/skills/judge-security-auditor/SKILL.md +4 -5
  116. package/.agent-src/skills/judge-test-coverage/SKILL.md +3 -4
  117. package/.agent-src/skills/lint-skills/SKILL.md +57 -39
  118. package/.agent-src/skills/md-language-check/SKILL.md +61 -39
  119. package/.agent-src/skills/override-management/SKILL.md +5 -5
  120. package/.agent-src/skills/quality-tools/SKILL.md +2 -2
  121. package/.agent-src/skills/react-shadcn-ui/SKILL.md +116 -43
  122. package/.agent-src/skills/readme-reviewer/SKILL.md +30 -29
  123. package/.agent-src/skills/readme-writing/SKILL.md +78 -53
  124. package/.agent-src/skills/readme-writing-package/SKILL.md +50 -47
  125. package/.agent-src/skills/receiving-code-review/SKILL.md +52 -47
  126. package/.agent-src/skills/refine-prompt/SKILL.md +0 -1
  127. package/.agent-src/skills/requesting-code-review/SKILL.md +35 -30
  128. package/.agent-src/skills/security/SKILL.md +7 -2
  129. package/.agent-src/skills/security-audit/SKILL.md +7 -3
  130. package/.agent-src/skills/systematic-debugging/SKILL.md +68 -60
  131. package/.agent-src/skills/test-driven-development/SKILL.md +59 -57
  132. package/.agent-src/skills/test-performance/SKILL.md +0 -1
  133. package/.agent-src/skills/traefik/SKILL.md +4 -4
  134. package/.agent-src/skills/verify-completion-evidence/SKILL.md +28 -26
  135. package/.claude-plugin/marketplace.json +22 -11
  136. package/AGENTS.md +2 -2
  137. package/CHANGELOG.md +90 -1
  138. package/README.md +18 -17
  139. package/docs/architecture.md +4 -6
  140. package/docs/catalog.md +67 -39
  141. package/docs/contracts/STABILITY.md +13 -7
  142. package/docs/contracts/adr-chat-history-split.md +1 -3
  143. package/docs/contracts/adr-command-suggestion.md +0 -2
  144. package/docs/contracts/adr-implement-ticket-runtime.md +1 -2
  145. package/docs/contracts/adr-product-ui-track.md +3 -6
  146. package/docs/contracts/adr-prompt-driven-execution.md +3 -4
  147. package/docs/contracts/agent-memory-contract.md +6 -11
  148. package/docs/contracts/artifact-engagement-flow.md +6 -9
  149. package/docs/contracts/command-clusters.md +56 -46
  150. package/docs/contracts/command-suggestion-flow.md +1 -3
  151. package/docs/contracts/context-paths.md +99 -0
  152. package/docs/contracts/file-ownership-matrix.json +6722 -0
  153. package/docs/contracts/file-ownership-matrix.md +134 -0
  154. package/docs/contracts/implement-ticket-flow.md +6 -9
  155. package/docs/contracts/linear-ai-rules-inclusion.md +0 -1
  156. package/docs/contracts/linear-ai-three-layers.md +0 -2
  157. package/docs/contracts/load-context-budget-model.md +178 -0
  158. package/docs/contracts/load-context-schema.md +1 -3
  159. package/docs/contracts/rule-interactions.md +0 -1
  160. package/docs/contracts/rule-priority-hierarchy.md +1 -1
  161. package/docs/contracts/ui-track-flow.md +7 -17
  162. package/docs/customization.md +2 -0
  163. package/docs/getting-started.md +5 -4
  164. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +100 -0
  165. package/package.json +1 -1
  166. package/scripts/_one_off_phase4_dispatch_latency.py +108 -0
  167. package/scripts/_one_off_phase6_trigger_jaccard.py +92 -0
  168. package/scripts/_phase2_shim_helper.py +109 -0
  169. package/scripts/agent-config +10 -0
  170. package/scripts/ai_council/_one_off_2a4_acceptance.py +208 -0
  171. package/scripts/ai_council/_one_off_context_layer_v1_estimate.py +67 -0
  172. package/scripts/ai_council/_one_off_context_layer_v1_review.py +292 -0
  173. package/scripts/ai_council/_one_off_followups_review.py +259 -0
  174. package/scripts/ai_council/_one_off_nondestructive_inline_audit.py +209 -0
  175. package/scripts/ai_council/_one_off_phase_2a_budget_rebalance.py +257 -0
  176. package/scripts/ai_council/_one_off_phase_2a_post_revert.py +197 -0
  177. package/scripts/ai_council/_one_off_rule_hardening_v1.py +251 -0
  178. package/scripts/ai_council/_one_off_structural_open_questions.py +232 -0
  179. package/scripts/ai_council/_one_off_structural_optimization.py +144 -0
  180. package/scripts/ai_council/_one_off_structural_v3_gaps.py +252 -0
  181. package/scripts/ai_council/_one_off_structural_v3_review.py +240 -0
  182. package/scripts/check_always_budget.py +363 -45
  183. package/scripts/check_cluster_patterns.py +159 -0
  184. package/scripts/check_command_count_messaging.py +14 -7
  185. package/scripts/check_context_paths.py +201 -0
  186. package/scripts/check_no_roadmap_refs.py +155 -0
  187. package/scripts/check_phase_coupling.py +148 -0
  188. package/scripts/check_portability.py +2 -0
  189. package/scripts/check_references.py +29 -2
  190. package/scripts/check_safety_floor_untouched.py +125 -0
  191. package/scripts/command_suggester/loader.py +4 -1
  192. package/scripts/compress.py +59 -13
  193. package/scripts/generate_index.py +6 -2
  194. package/scripts/generate_ownership_matrix.py +323 -0
  195. package/scripts/hooks/augment-roadmap-progress.sh +57 -0
  196. package/scripts/install.py +49 -28
  197. package/scripts/lint_no_new_atomic_commands.py +12 -11
  198. package/scripts/requirements-evals.txt +1 -0
  199. package/scripts/roadmap_progress_hook.py +159 -0
  200. package/scripts/schemas/command.schema.json +4 -3
  201. package/scripts/skill_linter.py +1 -0
  202. package/scripts/sync_agent_settings.py +25 -2
  203. package/scripts/update_counts.py +7 -0
@@ -112,8 +112,8 @@ Required fields (ordered):
112
112
  a codebase convention; omit only when verdict is `apply`
113
113
 
114
114
  If a finding needs runtime confirmation (running a formatter, linter,
115
- or static analyzer), note it as a follow-up for the implementer — the
116
- judge does not execute tools.
115
+ or static analyzer to see the actual report), note it as a follow-up
116
+ for the implementer — the judge does not execute tools.
117
117
 
118
118
  ## Gotcha
119
119
 
@@ -140,16 +140,15 @@ judge does not execute tools.
140
140
  ## References
141
141
 
142
142
  - **LLM-as-a-Judge foundations** — Zheng et al., "Judging LLM-as-a-Judge
143
- with MT-Bench and Chatbot Arena" (2023),
144
- [arxiv.org/abs/2306.05685](https://arxiv.org/abs/2306.05685).
145
- Establishes the specialized-judge pattern and failure modes (position
146
- bias, self-consistency) this skill defends against.
143
+ with MT-Bench and Chatbot Arena" (2023), [arxiv.org/abs/2306.05685](https://arxiv.org/abs/2306.05685).
144
+ Establishes the specialized-judge pattern and its known failure modes
145
+ (position bias, self-consistency) this skill must defend against.
147
146
  - **Code-review rubric** — Google Engineering Practices, "The Standard
148
147
  of Code Review" and "What to look for in a code review",
149
148
  [google.github.io/eng-practices/review/reviewer](https://google.github.io/eng-practices/review/reviewer/).
150
149
  The lenses (design, functionality, complexity, tests, naming, comments,
151
- style, consistency) the judge applies — codebase conventions over
152
- external style preferences.
150
+ style, consistency) the judge applies — prioritizing codebase conventions
151
+ over external style preferences.
153
152
  - [`subagent-orchestration`](../subagent-orchestration/SKILL.md) —
154
153
  model-pairing rules (`subagents.judge_model` one tier above implementer).
155
154
  - Sibling judges: [`judge-bug-hunter`](../judge-bug-hunter/SKILL.md),
@@ -150,13 +150,12 @@ Runtime boundary: the judge does not execute tools.
150
150
  ## References
151
151
 
152
152
  - **LLM-as-a-Judge foundations** — Zheng et al., "Judging LLM-as-a-Judge
153
- with MT-Bench and Chatbot Arena" (2023),
154
- [arxiv.org/abs/2306.05685](https://arxiv.org/abs/2306.05685).
155
- Establishes the specialized-judge pattern and failure modes (position
156
- bias, self-consistency) this skill defends against.
153
+ with MT-Bench and Chatbot Arena" (2023), [arxiv.org/abs/2306.05685](https://arxiv.org/abs/2306.05685).
154
+ Establishes the specialized-judge pattern and its known failure modes
155
+ (position bias, self-consistency) this skill must defend against.
157
156
  - **Security rubric** — OWASP Application Security Verification Standard
158
157
  (ASVS), [owasp.org/www-project-application-security-verification-standard](https://owasp.org/www-project-application-security-verification-standard/).
159
- Finding categories (authentication, access control, validation,
158
+ The finding categories (authentication, access control, validation,
160
159
  cryptography, error handling) the judge walks on every diff.
161
160
  - [`subagent-orchestration`](../subagent-orchestration/SKILL.md) —
162
161
  model-pairing rules (`subagents.judge_model` one tier above implementer).
@@ -134,10 +134,9 @@ as a follow-up for the implementer — the judge does not execute tools.
134
134
  ## References
135
135
 
136
136
  - **LLM-as-a-Judge foundations** — Zheng et al., "Judging LLM-as-a-Judge
137
- with MT-Bench and Chatbot Arena" (2023),
138
- [arxiv.org/abs/2306.05685](https://arxiv.org/abs/2306.05685).
139
- Establishes the specialized-judge pattern and failure modes (position
140
- bias, self-consistency) this skill defends against.
137
+ with MT-Bench and Chatbot Arena" (2023), [arxiv.org/abs/2306.05685](https://arxiv.org/abs/2306.05685).
138
+ Establishes the specialized-judge pattern and its known failure modes
139
+ (position bias, self-consistency) this skill must defend against.
141
140
  - **Test-value rubric** — Martin Fowler, "Test Pyramid",
142
141
  [martinfowler.com/bliki/TestPyramid.html](https://martinfowler.com/bliki/TestPyramid.html),
143
142
  and Kent Beck, "Test Desiderata",
@@ -17,56 +17,74 @@ execution:
17
17
 
18
18
  ## When to use
19
19
 
20
- - Validate shape of every skill/rule in `.agent-src.uncompressed/`
21
- - Verify `execution:` metadata is well-formed
22
- - Pre-PR local check before CI skill-lint job
23
- - Investigate reported linter failure
20
+ Use this skill when:
24
21
 
25
- NOT: single file (call `skill_linter.py <path>`), cross-refs (use `check-refs`),
26
- compression freshness (use `bash scripts/compress.sh --check`).
22
+ - Validating the shape of every skill and rule in `.agent-src.uncompressed/`
23
+ - Verifying execution metadata (`execution.type`, `handler`, `command`) is well-formed
24
+ - Checking locally before opening a PR that CI's skill-lint job will pass
25
+ - Investigating a reported linter failure on a specific skill or rule
26
+
27
+ Do NOT use when:
28
+
29
+ - Linting only one file — call `python3 scripts/skill_linter.py <path>` directly
30
+ - Checking cross-references between files — use `check-refs` instead
31
+ - Checking compression freshness — use `bash scripts/compress.sh --check` instead
27
32
 
28
33
  ## Procedure
29
34
 
30
- 1. **Inspect env** — `python3` on PATH, cwd = agent-config repo root (linter
31
- resolves `.agent-src.uncompressed/skills/` relative to cwd).
32
- 2. **Dispatch via runtime** —
35
+ ### 1. Inspect the environment
33
36
 
34
- ```bash
35
- python3 scripts/runtime_dispatcher.py run --skill lint-skills
36
- ```
37
+ Confirm `python3` is available and the working directory is the agent-config
38
+ repository root the linter expects to find `.agent-src.uncompressed/skills/`
39
+ and related directories relative to `cwd`.
37
40
 
38
- Handler runs `python3 scripts/skill_linter.py --all`, captures stdout/stderr,
39
- returns typed `ExecutionResult`.
40
- 3. **Verify result** —
41
- - `status: success` + `exit_code: 0` → all clean
42
- - `exit_code: 1` → warnings only — review stdout
43
- - `exit_code: 2` → errors — fix flagged files
44
- - `status: timeout` → investigate slowdown, do not just raise timeout
45
- - `status: error` → interpreter missing or wrong cwd
41
+ ### 2. Dispatch via the runtime layer
46
42
 
47
- ## Output
43
+ Invoke the skill through the runtime dispatcher so the `execution:` block in
44
+ this skill's frontmatter governs the call:
48
45
 
49
- 1. One-line summary: status, exit code, duration (ms)
50
- 2. Count of skills/rules inspected if known
51
- 3. First 10 errored files: code + message
52
- 4. Next action: fix, re-run, or surface raw stdout
46
+ ```bash
47
+ python3 scripts/runtime_dispatcher.py run --skill lint-skills
48
+ ```
53
49
 
54
- ## Gotcha
50
+ The dispatcher resolves the request, the shell handler runs
51
+ `python3 scripts/skill_linter.py --all`, captures stdout/stderr, and returns
52
+ a typed `ExecutionResult`.
55
53
 
56
- - `--all` walks full tree — several seconds; bump `timeout_seconds` if repo grew
57
- - Running outside repo root → zero skills inspected, looks green but is a no-op
58
- - `exit_code: 1` (warnings) does not fail CI — not the same as "clean"
54
+ ### 3. Verify the result
59
55
 
60
- ## Do NOT
56
+ Check the returned `ExecutionResult`:
57
+
58
+ - `status: success` and `exit_code: 0` → all skills and rules are clean
59
+ - `exit_code: 1` → warnings only — review `stdout` for the listed warnings
60
+ - `exit_code: 2` → errors present — fix the flagged files before continuing
61
+ - `status: timeout` → the linter exceeded `timeout_seconds` — investigate
62
+ - `status: error` → the interpreter could not launch — check that `python3`
63
+ is on `PATH` and the repository root is the current working directory
61
64
 
62
- - Do NOT call `skill_linter.py` directly when the intent is to exercise the
63
- runtime path — go through the dispatcher
64
- - Do NOT raise `timeout_seconds` to mask slowdowns
65
- - Do NOT add pipes/redirection — handler uses `shell=False`, argv form only
65
+ ## Output format
66
66
 
67
- ## References
67
+ 1. One-line summary: `success | failure | timeout | error`, exit code,
68
+ duration in milliseconds
69
+ 2. Count of skills and rules the linter inspected, if known
70
+ 3. List of files with errors (first 10), each with code and message
71
+ 4. Next action: fix errors, re-run, or surface the raw `stdout` for review
72
+
73
+ ## Gotchas
74
+
75
+ - The command uses `--all`, which walks the full tree — expect several seconds
76
+ of runtime on a warm repo; bump `timeout_seconds` if the repo has grown
77
+ - Running outside the agent-config repo root will make the linter report zero
78
+ skills, which looks like a pass but is actually a no-op
79
+ - Warnings (`exit_code: 1`) do not fail CI by default; do not dismiss them as
80
+ "green" when the task is to get to zero warnings
81
+
82
+ ## Do NOT
68
83
 
69
- - Skill: `check-refs` sibling pilot that runs the cross-ref checker
70
- - Rule: `runtime-safety`execution metadata constraints
71
- - Script: `scripts/skill_linter.py`, `scripts/runtime_dispatcher.py`,
72
- `scripts/runtime_handler.py`
84
+ - Do NOT invoke `scripts/skill_linter.py` directly when the intent is to test
85
+ the runtime path use the dispatcher so the handler and result object are
86
+ exercised
87
+ - Do NOT raise `timeout_seconds` to hide a genuinely slow linter pass —
88
+ investigate the slowdown first
89
+ - Do NOT add shell redirection or pipes to `command` — the handler runs
90
+ `subprocess.run` with `shell=False`; only argv form is supported
@@ -16,29 +16,32 @@ execution:
16
16
 
17
17
  ## When to use
18
18
 
19
- Fire **before** saving any `.md` file under:
19
+ Fire this skill **before** writing or saving any `.md` file under:
20
20
 
21
- - `.agent-src.uncompressed/` (source of truth)
21
+ - `.agent-src.uncompressed/` (source of truth — skills, rules, commands, guidelines, templates, contexts)
22
22
  - `.agent-src/` (compressed projection)
23
23
  - `.augment/` (local agent projection)
24
- - `agents/` (project roadmaps, contexts, sessions)
24
+ - `agents/` (project-specific roadmaps, contexts, sessions)
25
25
 
26
- Per [`language-and-tone`](../../rules/language-and-tone.md) § "`.md`
27
- files are ALWAYS English" + § Detection heuristic, every `.md` in
28
- those trees must be English. Bilingual content lives only in labeled
26
+ Per [`language-and-tone`](../../rules/language-and-tone.md) § "`.md` files
27
+ are ALWAYS English" and § Detection heuristic, every `.md` file in those
28
+ trees must be English. Bilingual content lives only in labeled
29
29
  `DE: … · EN: …` anchor blocks.
30
30
 
31
31
  Do NOT use when:
32
32
 
33
- - Editing project content outside the trees above
34
- - Reviewing non-`.md` files (checker rejects them)
33
+ - Editing project content outside the trees listed above (READMEs of
34
+ consumer projects, application docs that follow a different policy)
35
+ - Reviewing chat history files (`.agent-chat-history` is JSONL, not `.md`)
36
+ - Inspecting non-`.md` files — the checker rejects them with a warning
35
37
 
36
38
  ## Procedure
37
39
 
38
40
  ### 1. Identify the file(s) about to be saved
39
41
 
40
- Collect every `.md` path the agent is about to create or modify this
41
- turn. Multiple files → one invocation.
42
+ Collect the absolute or repo-relative path of every `.md` file the
43
+ agent is about to create or modify in this turn. Multiple files in
44
+ one turn → pass them all to a single invocation.
42
45
 
43
46
  ### 2. Run the checker
44
47
 
@@ -46,58 +49,77 @@ turn. Multiple files → one invocation.
46
49
  python3 scripts/check_md_language.py <path> [<path> …] [--format json]
47
50
  ```
48
51
 
49
- Exit codes: `0` clean, `1` violations (save **blocked** until fixed
50
- or suppressed), `3` internal error.
52
+ Exit codes:
53
+
54
+ - `0` → no German content detected, save proceeds
55
+ - `1` → violations found, save is **blocked** until they are resolved
56
+ or explicitly suppressed
57
+ - `3` → internal error (unreadable file, decode failure)
51
58
 
52
59
  ### 3. Resolve findings
53
60
 
54
- | Kind | Cause | Fix |
61
+ For every violation:
62
+
63
+ | Kind | Likely cause | Fix |
55
64
  |---|---|---|
56
- | `umlaut` | German prose in body | Translate to English |
57
- | `de_word` | German function word in unquoted prose | Translate; or move into `DE: … · EN: …` block |
65
+ | `umlaut` | German prose leaked into body text | Translate the sentence to English |
66
+ | `de_word` | German function word in unquoted prose | Translate; or move into a `DE: … · EN: …` block if intentional bilingual anchor |
58
67
 
59
- Meta-doc that **must** quote German tokens (e.g. the heuristic in
60
- `language-and-tone.md` itself) → append
61
- `<!-- md-language-check: ignore -->` to that single line. Never as a
62
- wholesale silencer.
68
+ If the line is meta-documentation that **must** quote German tokens
69
+ (e.g. the detection heuristic in `language-and-tone.md` itself),
70
+ append `<!-- md-language-check: ignore -->` at the end of that single
71
+ line — never as a wholesale silencer.
63
72
 
64
73
  ### 4. Re-run and confirm
65
74
 
66
- After every fix re-run on the same paths. Save proceeds only on `0`.
75
+ After every fix, re-run the checker on the same paths. Save only
76
+ proceeds on exit `0`.
67
77
 
68
78
  ## Allowed escape hatches
69
79
 
70
- - **Labeled anchor** — lines starting with `DE:` / `- DE:` / `* DE:`
71
- (and the same for `EN:`) auto-skipped.
72
- - **Fenced code blocks** — exempt; shell snippets, JSON fixtures,
73
- quoted user input pass through.
74
- - **Inline code** backtick spans stripped before scanning.
75
- - **Per-line marker** — `<!-- md-language-check: ignore -->` on lines
76
- that genuinely quote German tokens (rare).
80
+ - **Labeled anchor block** — lines starting with `DE:` / `- DE:` /
81
+ `* DE:` (and the same for `EN:`) are skipped automatically. Use this
82
+ for intent-based opt-in / opt-out anchors.
83
+ - **Fenced code blocks** — `\`\`\` … \`\`\`` content is exempt, so
84
+ shell snippets, JSON fixtures, and quoted user input in code
85
+ blocks pass through untouched.
86
+ - **Inline code** backtick spans are stripped before scanning;
87
+ identifiers like `für_test` inside backticks do not flag.
88
+ - **Per-line marker** — append `<!-- md-language-check: ignore -->`
89
+ to a line that genuinely needs to quote a German token in body
90
+ prose (rare; reserved for the rules that document the heuristic).
77
91
 
78
92
  ## Output format
79
93
 
80
94
  1. One-line summary: `clean` or `N violation(s) found`
81
95
  2. Per violation: `file:line — kind \`match\`` plus the offending line
82
96
  3. Next action: translate, move into a `DE:`/`EN:` block, add the
83
- per-line ignore marker, or revert
97
+ per-line ignore marker, or revert the change
84
98
 
85
99
  ## Gotchas
86
100
 
87
- - `.md` files only; non-`.md` paths emit a warning and skip
88
- - Word list is short and conservative — clean run is **necessary
89
- but not sufficient**; agent owns the final language judgement
90
- - Frontmatter (`--- ---`) is exempt
101
+ - The checker scans `.md` files only; passing a non-`.md` path emits a
102
+ warning and skips it
103
+ - The detection word list is intentionally short and conservative —
104
+ a clean run is **necessary but not sufficient**; the agent still
105
+ owns the final language judgement
106
+ - Frontmatter (`--- … ---` at file head) is exempt; descriptions and
107
+ YAML keys can use international characters where the schema allows
91
108
 
92
109
  ## Do NOT
93
110
 
94
- - Do NOT silence by deleting trigger words from
95
- `scripts/check_md_language.py`; extend the allow-list instead
96
- - Do NOT use the ignore marker as a generic mute
97
- - Do NOT skip the gate "because the file is small"
111
+ - Do NOT silence the checker by deleting trigger words from
112
+ `scripts/check_md_language.py`; extend the allow-list (anchor
113
+ blocks, ignore marker) instead
114
+ - Do NOT add the ignore marker to body prose just to push a save
115
+ through; the marker is for meta-documentation that quotes tokens,
116
+ not a generic mute
117
+ - Do NOT skip the gate "because the file is small" — `language-and-tone`
118
+ § Detection heuristic applies to every save under the four trees
98
119
 
99
120
  ## Cloud Behavior
100
121
 
101
- Cloud surfaces (Claude.ai Web, Skills API) ship without the script,
102
- so this skill is **inert** there apply the heuristic from
103
- [`language-and-tone`](../../rules/language-and-tone.md) manually.
122
+ On cloud surfaces (Claude.ai Web, Skills API) the checker script is
123
+ not shipped, so this skill is **inert** — the agent applies the
124
+ heuristic from [`language-and-tone`](../../rules/language-and-tone.md)
125
+ manually before emitting the file.
@@ -31,11 +31,11 @@ Changes to `.augment/` affect ALL projects. Use overrides instead.
31
31
 
32
32
  ## Procedure: Create an override
33
33
 
34
- Before creating, understand the original:
34
+ Before creating an override, understand the original:
35
35
 
36
- 1. **Read the original** from `.augment/{type}/{name}` — understand purpose and behavior
37
- 2. **Check existing overrides** in `agents/overrides/{type}/` — avoid duplicates
38
- 3. **Identify what needs changing** — only override specific behavior that differs
36
+ 1. **Read the original** from `.augment/{type}/{name}` — understand its purpose, structure, and behavior.
37
+ 2. **Check for existing overrides** in `agents/overrides/{type}/` — avoid duplicates.
38
+ 3. **Identify what needs changing** — only override the specific behavior that differs for this project.
39
39
 
40
40
  When loading any skill, rule, or command:
41
41
 
@@ -69,7 +69,7 @@ Override files **must match the original filename** exactly:
69
69
  |---|---|
70
70
  | `.augment/rules/php-coding.md` | `agents/overrides/rules/php-coding.md` |
71
71
  | `.augment/skills/eloquent/SKILL.md` | `agents/overrides/skills/eloquent.md` |
72
- | `.augment/commands/feature-plan.md` | `agents/overrides/commands/feature-plan.md` |
72
+ | `.augment/commands/feature/plan.md` | `agents/overrides/commands/feature/plan.md` |
73
73
  | `../../../docs/guidelines/php/controllers.md` | `agents/overrides/guidelines/php-controllers.md` |
74
74
  | `.augment/templates/roadmaps.md` | `agents/overrides/templates/roadmaps.md` |
75
75
 
@@ -52,8 +52,8 @@ Use the **first matching** command style:
52
52
  | `symplify/easy-coding-standard` | `vendor/bin/ecs` | `vendor/bin/ecs check --fix` |
53
53
 
54
54
  **Priority:** If a project ships a `quality:*` wrapper (Artisan or Composer script), always prefer it —
55
- wrappers typically add
56
- git-aware execution, caching, automatic baseline regeneration, and memory management.
55
+ wrappers typically add git-aware execution, caching, automatic baseline regeneration, and memory
56
+ management on top of the native tools.
57
57
 
58
58
  If none of the above is installed → skip quality checks, inform the user.
59
59
 
@@ -9,35 +9,59 @@ source: package
9
9
  ## Compatibility
10
10
 
11
11
  - **Tested against:** `shadcn@2.1`, Tailwind CSS `3.x`, React `18+`.
12
- - Audit step (`directives/ui/audit.py`) reads the line above and compares it with `state.ui_audit.shadcn_inventory.version`; major mismatch triggers a soft halt before this skill runs.
12
+ - The audit step (`directives/ui/audit.py`) reads the line above and
13
+ compares it with `state.ui_audit.shadcn_inventory.version`; a major
14
+ mismatch triggers a soft halt before this skill runs.
13
15
 
14
16
  ## When to use
15
17
 
16
- Use when `state.stack.frontend == "react-shadcn"` and `directives/ui/apply.py`, `review.py`, or `polish.py` dispatches to this skill, or when a React project clearly uses shadcn/ui (presence of `components.json`, `@radix-ui/*` dependencies, a `components/ui/` folder of generated primitives).
18
+ Use when `state.stack.frontend == "react-shadcn"` and `directives/ui/apply.py`,
19
+ `review.py`, or `polish.py` dispatches to this skill, or when a React project
20
+ clearly uses shadcn/ui (presence of `components.json`, `@radix-ui/*`
21
+ dependencies, a `components/ui/` folder of generated primitives).
17
22
 
18
23
  Do NOT use when:
19
-
20
24
  - Project is Blade + Livewire + Flux (use `flux` / `livewire` / `blade-ui`).
21
25
  - Project is Vue (use the Vue stack skills).
22
- - Plain React without shadcn/ui — fall back to manual composition; this skill assumes the primitive set exists.
26
+ - Plain React without shadcn/ui — fall back to manual composition; this skill
27
+ assumes the primitive set exists.
23
28
 
24
29
  ## Gotcha
25
30
 
26
- - shadcn/ui is **not** an npm package. Primitives are copied into `components/ui/` and edited in-place. Do not `npm install shadcn-ui`. Run `npx shadcn@latest add <primitive>` to scaffold; then edit.
27
- - Major-version drift between this skill's `## Compatibility` line and the project's installed primitives is a real risk. Audit step writes `state.ui_audit.shadcn_inventory` with the detected version — when it diverges by a major, audit emits a soft halt before this skill runs.
28
- - shadcn/ui composes Radix primitives. Accessibility built in via Radix but only when wrapper components used correctly (`asChild`, `<DialogTrigger>` instead of bare `<button>`).
29
- - Tailwind tokens come from `tailwind.config.{js,ts}` (`theme.extend.colors`) and CSS custom properties on `:root` and `.dark` (`--background`, `--foreground`, `--primary`, `--ring`, …). Audit writes them into `state.ui_audit.design_tokens`. Use those tokens; do not hardcode values.
30
- - Dark mode is class-based (`<html class="dark">`). Every color must come from `bg-background`, `text-foreground`, etc. — never raw `bg-white`.
31
- - Every interactive primitive must declare a focus-visible state via `focus-visible:ring-2 focus-visible:ring-ring`; comes free with generated primitives but easy to remove during a refactor.
31
+ - shadcn/ui is **not** an npm package. Primitives are copied into
32
+ `components/ui/` and edited in-place. Do not `npm install shadcn-ui`.
33
+ Run `npx shadcn@latest add <primitive>` to scaffold; then edit.
34
+ - Major-version drift between this skill's `## Compatibility` line and
35
+ the project's installed primitives is a real risk. The audit step
36
+ writes `state.ui_audit.shadcn_inventory` with the detected version
37
+ when it diverges by a major, audit emits a soft halt before this
38
+ skill runs.
39
+ - shadcn/ui composes Radix primitives. Accessibility is built in via Radix
40
+ but only when you use the wrapper components correctly (`asChild`,
41
+ `<DialogTrigger>` instead of a bare `<button>`).
42
+ - Tailwind tokens come from `tailwind.config.{js,ts}` (`theme.extend.colors`)
43
+ and CSS custom properties on `:root` and `.dark` (`--background`,
44
+ `--foreground`, `--primary`, `--ring`, …). Audit writes them into
45
+ `state.ui_audit.design_tokens`. Use those tokens; do not hardcode values.
46
+ - Dark mode is class-based (`<html class="dark">`). Every color must come
47
+ from `bg-background`, `text-foreground`, etc. — never raw `bg-white`.
48
+ - Every interactive primitive must declare a focus-visible state via
49
+ `focus-visible:ring-2 focus-visible:ring-ring`; that comes for free with
50
+ the generated primitives but is easy to remove during a refactor.
32
51
 
33
52
  ## Covered primitives
34
53
 
35
- Validated against the following shadcn primitives at the declared version:
54
+ This skill is validated against the following shadcn primitives at the
55
+ declared version:
36
56
 
37
- - **Form / inputs:** `Button`, `Input`, `Textarea`, `Checkbox`, `RadioGroup`, `Select`, `Switch`, `Label`, `Form` (react-hook-form wrapper + `zodResolver`).
38
- - **Overlay:** `Dialog`, `Sheet`, `Popover`, `Tooltip`, `DropdownMenu`, `AlertDialog`.
57
+ - **Form / inputs:** `Button`, `Input`, `Textarea`, `Checkbox`,
58
+ `RadioGroup`, `Select`, `Switch`, `Label`, `Form` (react-hook-form
59
+ wrapper + `zodResolver`).
60
+ - **Overlay:** `Dialog`, `Sheet`, `Popover`, `Tooltip`, `DropdownMenu`,
61
+ `AlertDialog`.
39
62
  - **Layout:** `Card`, `Separator`, `Tabs`, `Accordion`, `ScrollArea`.
40
- - **Data display:** `Table` (with `@tanstack/react-table`), `Badge`, `Avatar`, `Skeleton`, `Progress`.
63
+ - **Data display:** `Table` (with `@tanstack/react-table`), `Badge`,
64
+ `Avatar`, `Skeleton`, `Progress`.
41
65
  - **Feedback:** `Toast` (sonner), `Alert`.
42
66
 
43
67
  ## Not covered — fall back to manual composition
@@ -45,63 +69,110 @@ Validated against the following shadcn primitives at the declared version:
45
69
  - Marketing-only components (Hero, Pricing, Features) — outside shadcn/ui.
46
70
  - `Calendar` / `DatePicker` — composition skill required, not generated.
47
71
  - `Combobox` — built from `Command` + `Popover`; case-by-case.
48
- - Streaming / partial-prerender boundaries — use the project's framework patterns (Next.js / Remix), not shadcn/ui.
72
+ - Streaming / partial-prerender boundaries — use the project's framework
73
+ patterns (Next.js / Remix), not shadcn/ui.
49
74
 
50
75
  ## Procedure: render a shadcn/ui component for the design brief
51
76
 
52
77
  ### Step 0: Inspect
53
78
 
54
- 1. Read `state.ui_audit.shadcn_inventory.version` and confirm it matches the version in `## Compatibility` within the same major. If audit flagged a mismatch, user already chose to proceed — note that in `state.changes`.
55
- 2. Read `state.ui_audit.design_tokens` — every color, spacing, and radius in rendered output must reference a token from this map.
79
+ 1. Read `state.ui_audit.shadcn_inventory.version` and confirm it matches
80
+ the version in `## Compatibility` within the same major. If audit
81
+ flagged a mismatch, the user already chose to proceed — note that
82
+ in `state.changes`.
83
+ 2. Read `state.ui_audit.design_tokens` — every color, spacing, and radius
84
+ in the rendered output must reference a token from this map.
56
85
  3. Read `state.ui_design`:
57
86
  - `components` → the primitive list to compose.
58
- - `microcopy` → button labels, empty-state text, validation messages. **Lock — render verbatim.**
87
+ - `microcopy` → button labels, empty-state text, validation messages.
88
+ **Lock — render verbatim.**
59
89
  - `states` → empty / loading / error / success / disabled coverage.
60
90
  - `a11y` → ARIA labels, keyboard nav, focus order.
61
91
 
62
92
  ### Step 1: Compose primitives
63
93
 
64
- 1. Import primitives from project's `components/ui/` path (`@/components/ui/button`, …) — never from `shadcn` or `radix-ui`.
65
- 2. Compose Radix-style: `<Dialog>` `<DialogTrigger asChild>` → `<DialogContent>` → `<DialogHeader>` → `<DialogTitle>`. Never wrap `DialogTrigger` around a pre-styled `<button>`; pass `asChild`.
66
- 3. Use variant API of `Button` (`variant="default" | "destructive" | "outline" | "secondary" | "ghost" | "link"`); do not override with raw Tailwind for the variant set.
67
- 4. Forms: `useForm` (react-hook-form) + `zodResolver(schema)` → `<Form>` → `<FormField>` → `<FormItem>` → `<FormLabel>` → `<FormControl>` → `<FormMessage>`. Validation messages come from the zod schema, mirrored to design-brief microcopy.
94
+ 1. Import primitives from the project's `components/ui/` path
95
+ (`@/components/ui/button`, …) never from `shadcn` or `radix-ui`.
96
+ 2. Compose Radix-style: `<Dialog>` `<DialogTrigger asChild>`
97
+ `<DialogContent>` → `<DialogHeader>` → `<DialogTitle>`. Never wrap
98
+ `DialogTrigger` around a pre-styled `<button>`; pass `asChild`.
99
+ 3. Use the variant API of `Button` (`variant="default" | "destructive" |
100
+ "outline" | "secondary" | "ghost" | "link"`); do not override with
101
+ raw Tailwind for the variant set.
102
+ 4. Forms: `useForm` (react-hook-form) + `zodResolver(schema)` →
103
+ `<Form>` → `<FormField>` → `<FormItem>` → `<FormLabel>` →
104
+ `<FormControl>` → `<FormMessage>`. Validation messages come from
105
+ the zod schema, mirrored to the design-brief microcopy.
68
106
 
69
107
  ### Step 2: Apply tokens, dark mode, a11y
70
108
 
71
- 1. Colors via semantic classes: `bg-background`, `text-foreground`, `bg-primary text-primary-foreground`, `text-muted-foreground`. No `bg-white` / `text-black` / hardcoded `#fff`.
72
- 2. Spacing / radius from theme tokens (`rounded-lg` mapped to `--radius` in `tailwind.config.{js,ts}`). Polish refactors hardcoded values when a token equivalent exists.
73
- 3. Dark mode: never branch on a `dark` prop; rely on `.dark` class on root and semantic tokens.
74
- 4. Every interactive primitive: keyboard trigger present (Enter/Space on buttons, Esc on dialogs — Radix free), visible focus ring, `aria-label` from `state.ui_design.a11y` when icon-only.
109
+ 1. Colors via semantic classes: `bg-background`, `text-foreground`,
110
+ `bg-primary text-primary-foreground`, `text-muted-foreground`. No
111
+ `bg-white` / `text-black` / hardcoded `#fff`.
112
+ 2. Spacing / radius from theme tokens (`rounded-lg` mapped to `--radius`
113
+ in `tailwind.config.{js,ts}`). Polish refactors hardcoded values
114
+ when a token equivalent exists.
115
+ 3. Dark mode: never branch on a `dark` prop; rely on the `.dark` class
116
+ on the root and semantic tokens.
117
+ 4. Every interactive primitive: keyboard trigger present (Enter/Space
118
+ on buttons, Esc on dialogs — Radix free), visible focus ring,
119
+ `aria-label` from `state.ui_design.a11y` when icon-only.
75
120
 
76
121
  ### Step 3: State coverage
77
122
 
78
- 1. Empty: render design-brief empty-state copy in a `Card` or inline placeholder; never `null`.
79
- 2. Loading: `Skeleton` rows for tables; `Button` `disabled` + `Loader2` icon for submit-in-flight.
80
- 3. Error: `Alert variant="destructive"` with design-brief message; `FormMessage` for field-level errors.
81
- 4. Success: `toast.success(...)` from `sonner` with design-brief confirmation copy.
82
- 5. Disabled: `disabled` prop on trigger plus design-brief reason as `aria-describedby` text.
123
+ 1. Empty: render the design-brief empty-state copy in a `Card` or
124
+ inline placeholder; never `null`.
125
+ 2. Loading: `Skeleton` rows for tables; `Button` `disabled` +
126
+ `Loader2` icon for submit-in-flight.
127
+ 3. Error: `Alert variant="destructive"` with the design-brief message;
128
+ `FormMessage` for field-level errors.
129
+ 4. Success: `toast.success(...)` from `sonner` with the design-brief
130
+ confirmation copy.
131
+ 5. Disabled: `disabled` prop on the trigger plus the design-brief
132
+ reason as `aria-describedby` text.
83
133
 
84
134
  ### Step 4: Validate
85
135
 
86
136
  1. No raw `<input>` / `<button>` / `<select>` outside the primitive set.
87
137
  2. No hardcoded colors / spacing — every value is a token.
88
138
  3. Microcopy matches `state.ui_design.microcopy` byte-for-byte.
89
- 4. Dark mode: toggle `.dark` on `<html>`, render the component, every surface still legible (no `text-white on bg-white`).
139
+ 4. Dark mode: toggle `.dark` on `<html>`, render the component, every
140
+ surface still legible (no `text-white on bg-white`).
90
141
  5. Keyboard: Tab through every focusable element; focus ring visible.
91
142
 
92
143
  ## Output format
93
144
 
94
- 1. React component file(s) under project's `components/` (or `app/`) tree, importing primitives from `@/components/ui/*`.
95
- 2. Per file, one entry recorded in `state.changes` with `kind="ui"`, `stack="react-shadcn"`, and the design-brief summary.
145
+ 1. React component file(s) under the project's `components/` (or `app/`)
146
+ tree, importing primitives from `@/components/ui/*`.
147
+ 2. Per file, one entry recorded in `state.changes` with `kind="ui"`,
148
+ `stack="react-shadcn"`, and the design-brief summary.
96
149
 
97
150
  ### Review pass — a11y findings + preview envelope
98
151
 
99
- When dispatched by `directives/ui/review.py` (test slot) or `directives/ui/polish.py` (verify slot) — review/polish run, not initial apply — also emits:
100
-
101
- - `state.ui_review.a11y` `{violations: [{rule, selector, severity}, ...], severity_floor?, accepted_violations?}`. Run a11y tool against rendered output (e.g. `axe-core` via Playwright, `@axe-core/react`, `jest-axe`) and translate hits into this shape. Use same `(rule, selector)` shape as `state.ui_audit.a11y_baseline` so engine's de-dup matches pre-existing entries on replay. Omit envelope on apply passes; engine's `_apply_a11y_gate` only fires when baseline present.
102
- - `state.ui_review.preview` — `{render_ok: bool, screenshot_path?, dom_dump_path?, error?, skipped?}`. `render_ok: false` with `error` populated triggers `preview_render_failed` halt; `render_ok: true` with `screenshot_path` threads screenshot into delivery report's `artifacts` list. Browser tooling (Playwright/Cypress/…) is consumer-project dependency — package does not ship one.
103
-
104
- Polish dispatch: when dispatcher skips `review` because previous review pass returned `SUCCESS`, this skill MUST itself synthesise updated `state.ui_review.findings` (including remaining `a11y_violation` entries) so engine's gate sees current state on next polish round.
152
+ When this skill is dispatched by `directives/ui/review.py` (test slot)
153
+ or `directives/ui/polish.py` (verify slot) — i.e. a review/polish run,
154
+ not the initial apply it also emits:
155
+
156
+ - `state.ui_review.a11y` — `{violations: [{rule, selector, severity}, ...],
157
+ severity_floor?, accepted_violations?}`. Run an a11y tool against the
158
+ rendered output (e.g. `axe-core` via Playwright, `@axe-core/react`,
159
+ `jest-axe`) and translate hits into this shape. Use the same
160
+ `(rule, selector)` shape as `state.ui_audit.a11y_baseline` so the
161
+ engine's de-dup matches pre-existing entries on replay. Omit the
162
+ envelope on apply passes; the engine's `_apply_a11y_gate` only fires
163
+ when a baseline is present.
164
+ - `state.ui_review.preview` — `{render_ok: bool, screenshot_path?,
165
+ dom_dump_path?, error?, skipped?}`. `render_ok: false` with `error`
166
+ populated triggers the `preview_render_failed` halt; `render_ok: true`
167
+ with `screenshot_path` threads the screenshot into the delivery
168
+ report's `artifacts` list. Browser tooling (Playwright/Cypress/…) is
169
+ a consumer-project dependency — this package does not ship one.
170
+
171
+ Polish dispatch: when the dispatcher skips `review` because a previous
172
+ review pass already returned `SUCCESS`, this skill MUST itself
173
+ synthesise the updated `state.ui_review.findings` (including any
174
+ remaining `a11y_violation` entries) so the engine's gate sees the
175
+ current state on the next polish round.
105
176
 
106
177
  ## Do NOT
107
178
 
@@ -109,13 +180,15 @@ Polish dispatch: when dispatcher skips `review` because previous review pass ret
109
180
  - Do NOT hardcode colors / spacing / radii — use the token map.
110
181
  - Do NOT branch on a `dark` prop — use semantic tokens + the `.dark` class.
111
182
  - Do NOT rewrite microcopy — it is locked by `state.ui_design`.
112
- - Do NOT skip `asChild` on `DialogTrigger` / `SheetTrigger` / similar Radix wrappers — breaks the accessibility contract.
113
- - Do NOT introduce a non-shadcn UI library (MUI, Chakra) into the same surface — pick one system per surface.
183
+ - Do NOT skip `asChild` on `DialogTrigger` / `SheetTrigger` / similar
184
+ Radix wrappers it breaks the accessibility contract.
185
+ - Do NOT introduce a non-shadcn UI library (MUI, Chakra) into the same
186
+ surface — pick one system per surface.
114
187
 
115
188
  ## Auto-trigger keywords
116
189
 
117
190
  - shadcn / shadcn ui / shadcn/ui
118
- - React component (when project uses shadcn)
191
+ - React component (when the project uses shadcn)
119
192
  - Radix primitive
120
193
  - Tailwind dark mode
121
194
  - React Hook Form + zod