@lemoncode/lemony 0.1.0 → 0.1.1-alpha.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 (48) hide show
  1. package/NOTICE +39 -0
  2. package/catalog/VERSION +1 -1
  3. package/catalog/agents/architect.md +4 -4
  4. package/catalog/agents/fit-assessment.md +1 -1
  5. package/catalog/agents/implementer.md +15 -8
  6. package/catalog/agents/orchestrator.md +165 -24
  7. package/catalog/agents/reviewer.md +7 -7
  8. package/catalog/agents/spec-author.md +4 -4
  9. package/catalog/agents/ui-designer.md +115 -15
  10. package/catalog/commands/add-capability.md +3 -3
  11. package/catalog/commands/resume.md +10 -4
  12. package/catalog/commands/spinoff.md +2 -2
  13. package/catalog/commands/sync-design-tokens.md +29 -0
  14. package/catalog/harness.config.schema.json +14 -0
  15. package/catalog/hooks/init.sh +11 -11
  16. package/catalog/hooks/lib/lemony.sh +3 -3
  17. package/catalog/hooks/lib/playbook-scan.sh +10 -11
  18. package/catalog/hooks/session-close.sh +7 -7
  19. package/catalog/schemas/tier2-events-history.md +11 -11
  20. package/catalog/schemas/tier2-events.md +46 -47
  21. package/catalog/skills/a11y-audit/SKILL.md +121 -0
  22. package/catalog/skills/bootstrap-architecture/SKILL.md +3 -3
  23. package/catalog/skills/build-ui/SKILL.md +147 -0
  24. package/catalog/skills/build-ui/accessibility.md +101 -0
  25. package/catalog/skills/build-ui/anti-slop.md +107 -0
  26. package/catalog/skills/code-explorer/SKILL.md +1 -1
  27. package/catalog/skills/design-critique/SKILL.md +110 -0
  28. package/catalog/skills/design-tool-sync/SKILL.md +120 -0
  29. package/catalog/skills/grill-ui/SKILL.md +187 -0
  30. package/catalog/skills/grill-ui/ui-handoff-format.md +148 -0
  31. package/catalog/skills/grill-with-docs/SKILL.md +9 -2
  32. package/catalog/skills/mutation-testing/SKILL.md +1 -1
  33. package/catalog/skills/note-side-finding/SKILL.md +1 -1
  34. package/catalog/skills/playbook-iterate/SKILL.md +2 -2
  35. package/catalog/skills/review-pr/SKILL.md +3 -3
  36. package/catalog/skills/task-closeout/SKILL.md +9 -8
  37. package/catalog/skills/update-architecture/SKILL.md +3 -3
  38. package/catalog/templates/claude-code/agents.md.tpl +16 -10
  39. package/catalog/templates/claude-code/docs/playbooks/README.md.tpl +1 -3
  40. package/catalog/templates/claude-code/harness.config.yml.tpl +9 -1
  41. package/dist/cli.mjs +1286 -1665
  42. package/package.json +13 -4
  43. package/catalog/agents/README.md +0 -29
  44. package/catalog/hooks/README.md +0 -56
  45. package/catalog/playbook-format.md +0 -198
  46. package/catalog/schemas/README.md +0 -13
  47. package/catalog/skills/README.md +0 -62
  48. package/catalog/templates/README.md +0 -32
@@ -0,0 +1,148 @@
1
+ # `ui-handoff.md` — the design contract
2
+
3
+ The artifact the UI Designer produces in DEFINE and the implementer builds from when implementing. It lives at
4
+ `.claude/state/tasks/<id>/spec/ui-handoff.md`, a sibling of the spec, owned by the UI Designer.
5
+
6
+ **It captures DECISIONS and targets, not know-how.** How to apply tokens to a stack, avoid generic
7
+ "AI slop", or meet WCAG lives in the implementer's and reviewer's skills. This file says _what to
8
+ build_ and _how it should look and feel_, at a level the implementer can execute and the review can
9
+ check.
10
+
11
+ ## Two principles that shape every section
12
+
13
+ - **Graduated altitude.** Default to **decisions-altitude**: reference the design system, name the
14
+ variant, state the few things that matter. Drop to the full **component anatomy** (below) ONLY for
15
+ a genuinely novel or critical component. Don't freeze what the implementer's model already knows.
16
+ - **Text-first.** Screens travel as a text inventory + a nav/flow map + per-screen structural intent.
17
+ The implementer generates the pixels from that + the tokens + the anti-slop know-how. A visual
18
+ tool, if the designer used one, is a private DEFINE aid — not a consumed contract.
19
+
20
+ Every section is **N/A-able** per task: mark a section N/A rather than padding it.
21
+
22
+ ---
23
+
24
+ ## Template
25
+
26
+ ```markdown
27
+ # UI handoff — #<id> <topic>
28
+
29
+ **Status**: in_progress | completed
30
+
31
+ > Owned by the UI Designer. Sibling of the spec. The implementer builds from this via the `build-ui`
32
+ > skill; the design QA lens checks the built UI against it at REVIEW. Decisions-altitude; text-first;
33
+ > tokens by reference.
34
+
35
+ ## 1. Personas / users served
36
+
37
+ <!-- Who this serves and the context that shapes design. Consume docs/personas.md if present;
38
+ never restate it wholesale — capture only what drives a design decision here. -->
39
+
40
+ ## 2. Aesthetic direction
41
+
42
+ **Tone preset**: controlled | impact | innovative | (none)
43
+ **Dials**: variance = low|medium|high · motion = low|medium|high · density = low|medium|high
44
+ **Brand references**: <sites/products admired, and what to take from each>
45
+ **Voice / feel**: <a few words — e.g. "calm, precise, trustworthy">
46
+
47
+ <!-- See "Direction language" below for what the presets and dials mean. The dials are the
48
+ verifiable contract; the review checks the built UI against them. -->
49
+
50
+ ## 3. Screen inventory + nav / flow
51
+
52
+ <!-- The screens/surfaces this task adds or changes, and how the user moves between them.
53
+ Text or a mermaid flow diagram. No pixels. -->
54
+
55
+ ## 4. Per-screen layout
56
+
57
+ <!-- For each screen: regions, hierarchy, what draws the eye first. Words, not mockups. -->
58
+
59
+ ## 5. Components
60
+
61
+ <!-- Decisions-altitude by default: name the component, the variant, and the states that matter.
62
+ Use the full anatomy (below) ONLY for a novel or critical component. -->
63
+
64
+ ## 6. States
65
+
66
+ <!-- Empty / loading / error / success / edge content for the task's surfaces. -->
67
+
68
+ ## 7. Responsive / breakpoints
69
+
70
+ <!-- The behavior that actually changes across breakpoints for this task. -->
71
+
72
+ ## 8. Motion / interaction
73
+
74
+ <!-- Motion appetite (from the dial) + the few interactions that carry meaning. -->
75
+
76
+ ## 9. Accessibility
77
+
78
+ <!-- Target level (default WCAG 2.1 AA) + task-specific a11y decisions. The audit and the
79
+ how-to are skills; capture only decisions here. -->
80
+
81
+ ## 10. Microcopy
82
+
83
+ <!-- The actual words for the task's key labels and messages, inline. Voice follows §2. -->
84
+
85
+ ## 11. Token reference
86
+
87
+ Reference `docs/design-tokens.json` — the single, client-owned source of truth, a 3-tier
88
+ W3C-DTCG model (`primitive` → `semantic` → `component`). **Never inline token values here; point at
89
+ the file.** If the project has no token file yet, say so and capture it as an open question — never
90
+ invent a token set. `lemony design-tokens validate` flags raw colours/dimensions in source that
91
+ should reference a token.
92
+
93
+ ## Open questions
94
+
95
+ <!-- Anything the interview left unresolved. If a fork has more than one valid answer and the user
96
+ can't resolve it, raise a discovery rather than guess. -->
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Direction language (for §2)
102
+
103
+ The aesthetic direction is expressed as three explicit **dials**, optionally seeded by a **tone
104
+ preset**. Dials are reproducible and review-verifiable; they exist to fight the generic defaults a
105
+ model reaches for unprompted.
106
+
107
+ ### Dials
108
+
109
+ - **Variance** — _conventional ↔ expressive._ How far the design departs from safe, system-default
110
+ patterns.
111
+ - **low** — predictable, system-like, fast to build; risks looking generic.
112
+ - **medium** — distinctive but restrained; a clear point of view without flamboyance.
113
+ - **high** — bold, characterful, memorable; more build cost and more ways to get it wrong.
114
+ - **Motion** — _still ↔ animated._ Appetite for transition and animation.
115
+ - **low** — minimal, functional transitions only.
116
+ - **medium** — purposeful motion on key interactions.
117
+ - **high** — rich, choreographed motion as part of the identity.
118
+ - **Density** — _airy ↔ compact._ Information density and use of whitespace.
119
+ - **low** — spacious, generous whitespace, few elements per view.
120
+ - **medium** — balanced.
121
+ - **high** — dense, data-rich, efficient for expert/repeat use.
122
+
123
+ ### Tone presets (optional shorthand)
124
+
125
+ A preset seeds default dial values as a starting point; the user can override any dial after.
126
+
127
+ | Preset | variance | motion | density | Feel |
128
+ | -------------- | -------- | ------ | ------- | -------------------------------------------------- |
129
+ | **controlled** | low | low | medium | Calm, trustworthy, enterprise; clarity over flair. |
130
+ | **impact** | high | medium | low | Bold, memorable, marketing-forward; few big moves. |
131
+ | **innovative** | high | high | medium | Novel, dynamic, cutting-edge; motion as identity. |
132
+
133
+ ---
134
+
135
+ ## Component anatomy (for §5, novel/critical components only)
136
+
137
+ Drop to this fuller shape ONLY when a component is genuinely new to the project or critical enough
138
+ that the review needs a fixed reference. For everything else, decisions-altitude (name + variant +
139
+ states-that-matter) is enough.
140
+
141
+ 1. **Description / when to use** — what it is and when to reach for it.
142
+ 2. **Variants** — the variants and when each applies.
143
+ 3. **Props / properties** — the inputs that change its appearance or behavior.
144
+ 4. **States** — default / hover / active / focus / disabled / loading / error, as applicable.
145
+ 5. **Anatomy / layout** — the internal regions and their arrangement (text).
146
+ 6. **Behavior / interaction** — what it does on interaction, including motion.
147
+ 7. **Accessibility** — role, keyboard interaction, focus handling, screen-reader announcement.
148
+ 8. **Do's and Don'ts** — the traps specific to this component.
@@ -4,6 +4,13 @@ description: Relentlessly interview the user about a plan or design until shared
4
4
  origin: vendor
5
5
  vendor_version: '{{vendor_version}}'
6
6
  invoked-by: [orchestrator, architect]
7
+ attribution:
8
+ - source: mattpocock/skills
9
+ author: Matt Pocock
10
+ url: https://github.com/mattpocock/skills
11
+ license: MIT
12
+ relationship: derived-from
13
+ note: grill workflow and decision-by-decision interview structure
7
14
  ---
8
15
 
9
16
  # Grill With Docs
@@ -41,7 +48,7 @@ If ambiguous, ask whether the user wants the plan challenged or built together.
41
48
  the grill against it so proposals don't contradict existing boundaries/seams. Trust it
42
49
  for the big picture; verify against code where a decision actually turns on it. It is
43
50
  **absent by default and that is fine** — grill as today, and never push the user to
44
- create it (decision #8; it is **not** one of the files this skill creates lazily below).
51
+ create it (it is **not** one of the files this skill creates lazily below).
45
52
  - `docs/adr/` if present
46
53
  - The project's playbooks — `docs/playbooks/<topic>.md` (then the global layer),
47
54
  discovered by topic filename
@@ -117,7 +124,7 @@ If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The ma
117
124
  │ └── docs/adr/
118
125
  ```
119
126
 
120
- Create files and directories lazily — only when there's something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed. Same for `docs/prds/` when the first PRD lands. **`docs/architecture.md` is the exception — never create it here.** It is client-owned (decision #8); only the Architect's `update-architecture` skill ever edits it (and only when the file already exists).
127
+ Create files and directories lazily — only when there's something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed. Same for `docs/prds/` when the first PRD lands. **`docs/architecture.md` is the exception — never create it here.** It is client-owned; only the Architect's `update-architecture` skill ever edits it (and only when the file already exists).
121
128
 
122
129
  #### Challenge against the glossary
123
130
 
@@ -26,7 +26,7 @@ slow.
26
26
  ## Precondition (capability-gated)
27
27
 
28
28
  This skill is only installed when the project declares a **`test:mutation`** script in
29
- `package.json` (the `has-mutation-testing` capability, #155). If you are reading it, the
29
+ `package.json` (the `has-mutation-testing` capability). If you are reading it, the
30
30
  script exists — run it. The harness stays tool-agnostic: the script may drive Stryker or
31
31
  any mutation tool. Delegate to it exactly as `verify` delegates to the project's
32
32
  declared scripts; never assume a specific tool's CLI.
@@ -39,7 +39,7 @@ discovery (pause and stop). When genuinely unsure whether it blocks you, prefer
39
39
  `raise-discovery` — a wrong pause is cheaper than coding past a real contradiction.
40
40
 
41
41
  The same channel covers **architecturally-significant drift in `docs/architecture.md`**
42
- (ADR 0011) — when you read the map to orient and find it states a boundary/seam the code no
42
+ — when you read the map to orient and find it states a boundary/seam the code no
43
43
  longer matches, in an area your task doesn't touch. That is a defect of the _map_, not the
44
44
  code: non-blocking and out of your scope, so it rides here. Tag such a bullet `kind: drift`
45
45
  (see the contract below) so the Orchestrator routes it to the Architect's
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: playbook-iterate
3
- description: Propose changes to a client playbook — or extract a new one from the codebase — when the spec collides with a documented pattern (a T6 PLAYBOOK_CONFLICT) or the client asks. Playbooks are client-owned (decision #8); the Architect proposes and the human decides. Use when the Orchestrator routes a T6 discovery resolution to the Architect, or on an explicit "capture how we do X" request.
3
+ description: Propose changes to a client playbook — or extract a new one from the codebase — when the spec collides with a documented pattern (a T6 PLAYBOOK_CONFLICT) or the client asks. Playbooks are client-owned; the Architect proposes and the human decides. Use when the Orchestrator routes a T6 discovery resolution to the Architect, or on an explicit "capture how we do X" request.
4
4
  origin: vendor
5
5
  vendor_version: '{{vendor_version}}'
6
6
  invoked-by: [architect]
@@ -13,7 +13,7 @@ trigger-condition: a T6 PLAYBOOK_CONFLICT needs the playbook changed, or the cli
13
13
 
14
14
  A **playbook** describes _how to build_ a category of software (a backend service, an
15
15
  SPA, a testing strategy) in **project-agnostic** terms — placeholder names, never a real
16
- codebase's symbols. Playbooks are **client-owned** (decision #8): the vendor ships the
16
+ codebase's symbols. Playbooks are **client-owned**: the vendor ships the
17
17
  _format_ and the _lookup convention_, never the content. So this skill **proposes**; the
18
18
  human **decides**. The Architect never rewrites a client playbook unilaterally.
19
19
 
@@ -20,8 +20,8 @@ heavier tool, deliberately not this one.
20
20
 
21
21
  ### 0. Resolve the PR
22
22
 
23
- - **URL** (`https://github.com/<org>/<repo>/pull/123`): extract `<org>/<repo>` + number.
24
- - **Number** (`#834`, `834`): resolve the repo with `gh repo view --json nameWithOwner`.
23
+ - **URL** (`https://github.com/<org>/<repo>/pull/<n>`): extract `<org>/<repo>` + number.
24
+ - **Number** (`#<n>`, `<n>`): resolve the repo with `gh repo view --json nameWithOwner`.
25
25
  - **No argument**: detect the open PR on the current branch with `gh pr view`.
26
26
 
27
27
  Run in parallel:
@@ -37,7 +37,7 @@ Read the repo's `CLAUDE.md` (and `CONTEXT.md` if present). Summarize in ≤ 50 l
37
37
  code-style rules, comment conventions, naming, architecture constraints. This is what
38
38
  the analysis judges "against project convention" by.
39
39
 
40
- ### 2. Analyze (single sub-agent, the #43 lenses as a checklist)
40
+ ### 2. Analyze (single sub-agent, the review lenses as a checklist)
41
41
 
42
42
  Spawn **one** `Explore` sub-agent with the full diff, the changed-files list, and the
43
43
  project context. Its prompt walks the five review lenses as a checklist — **not** five
@@ -10,7 +10,7 @@ invoked-by: [orchestrator]
10
10
 
11
11
  ## Core Principle
12
12
 
13
- Closeout is **archive-on-done through a dedicated PR** (ADR 0009). The durable memory of
13
+ Closeout is **archive-on-done through a dedicated PR**. The durable memory of
14
14
  a finished task — its spec and its resolved discoveries — is **archived live**, not
15
15
  deleted, so a future agent reads the decisions instead of doing git archaeology. The
16
16
  genuinely architectural decisions rise further, to ADRs. And the closeout record reaches
@@ -19,7 +19,7 @@ every other change obeys.
19
19
 
20
20
  Three moves, in this order:
21
21
 
22
- 1. **Activate the Architect** — closeout is its reliable end-of-task checkpoint (#138).
22
+ 1. **Activate the Architect** — closeout is its reliable end-of-task checkpoint.
23
23
  In cold blood, no resume pressure, it drives durable capture: `write-adr` (HITL offer
24
24
  per resolved discovery), `update-architecture` (automatic, when the map exists), and
25
25
  `playbook-iterate` (HITL offer, once per task). The canon outlives any task folder.
@@ -56,7 +56,7 @@ merge, then records it.
56
56
 
57
57
  Archival is **destructive** and must wait until the task PR is merged. Until that merge,
58
58
  the task can re-enter iteration — a Reviewer rejection, or human review comments at the
59
- gate (#111) — and that re-work needs the spec **live** in `tasks/<id>/spec/`. Archiving
59
+ gate — and that re-work needs the spec **live** in `tasks/<id>/spec/`. Archiving
60
60
  pre-merge would pull the spec out from under an in-flight fix. So every step below runs
61
61
  **after** the merge is confirmed.
62
62
 
@@ -68,12 +68,12 @@ merged base: `git checkout <default> && git pull`.
68
68
 
69
69
  ### 1. Activate the Architect for durable capture
70
70
 
71
- Closeout is the Architect's **reliable activation point** (#138): in cold blood, after
71
+ Closeout is the Architect's **reliable activation point**: in cold blood, after
72
72
  the merge, with no paused sub-agent pulling toward "just unblock me", it drives the three
73
73
  durable-capture skills the on-demand triggers otherwise lose. Each one **no-ops cleanly
74
74
  when its skill isn't installed**, so this step is safe everywhere.
75
75
 
76
- The three differ in **who decides** — and the asymmetry is deliberate (ADR 0010):
76
+ The three differ in **who decides** — and the asymmetry is deliberate:
77
77
 
78
78
  - **`write-adr` — HITL offer, per resolved discovery.** Walk the **resolved** entries in
79
79
  `discoveries.md` and **offer** the ones that settled a real decision (not a trivial
@@ -153,7 +153,9 @@ git rm -r .claude/state/tasks/<id>/
153
153
 
154
154
  `spec/` and `discoveries.md` survive **live** under `_archive/<id>/` (grep-able), plus in
155
155
  git history and the GitHub issue. `progress.md` (the pause-point bitácora) and any other
156
- working scratch are gone.
156
+ working scratch are gone. A UI task's **`ui-handoff.md`** is a sibling **inside**
157
+ `spec/`, so the single `git mv` of `spec/` archives it with the rest — no special
158
+ handling.
157
159
 
158
160
  ### 5. Open the closeout PR and auto-merge
159
161
 
@@ -204,8 +206,7 @@ Then flip the issue to `harness:status:done` and **emit `task_done`** — both h
204
206
  in finalize, exactly once (the parked → `/resume` path also lands here, so it is the
205
207
  single emit point for either path). You compute the envelope (cycle time, review
206
208
  rejections, level) as the Orchestrator running this skill; the fields and the `emit`
207
- command line are in `orchestrator.md` §Closeout. `events.jsonl` is local-only/gitignored
208
- (ADR 0008), so the emit never dirties the base.
209
+ command line are in `orchestrator.md` §Closeout. `events.jsonl` is local-only/gitignored, so the emit never dirties the base.
209
210
 
210
211
  ### 7. Report
211
212
 
@@ -18,13 +18,13 @@ updated. This skill keeps it true to reality after an architecturally significan
18
18
 
19
19
  The trigger is usually a change in hand, but the job is the same when **drift is surfaced
20
20
  without a change** — an orientation or review finds the map already diverged from the code
21
- (a `code-explorer` Notes flag, a Reviewer side-finding; ADR 0011). Reconcile it the same
21
+ (a `code-explorer` Notes flag, a Reviewer side-finding). Reconcile it the same
22
22
  way, applying the same significance bar below: only shape-level divergence is worth an edit.
23
23
 
24
24
  It is gated on `applies-when: has-architecture-doc`: it only installs when the project
25
25
  already keeps `docs/architecture.md`. The harness **never creates** an architecture doc
26
- where the client chose not to have one (decision #8 — the vendor gives the framework,
27
- not the architecture). If a project has no such doc and one is wanted, that's a client
26
+ where the client chose not to have one — the vendor gives the framework,
27
+ not the architecture. If a project has no such doc and one is wanted, that's a client
28
28
  decision, not an automatic harness action.
29
29
 
30
30
  ## What counts as architecturally significant
@@ -5,9 +5,9 @@
5
5
 
6
6
  This file is the **dispatcher** the Orchestrator follows on every session. The
7
7
  Orchestrator is the single human-facing hat; it invokes sub-agents (Spec Author,
8
- Implementer, Reviewer) with fresh context via the Task tool. Full role rules live
9
- in `.claude/agents/<role>.md`; skills in `.claude/skills/`; task state in
10
- `.claude/state/`.
8
+ Implementer, Reviewer, and the on-demand Architect / UI Designer) with fresh context
9
+ via the Task tool. Full role rules live in `.claude/agents/<role>.md`; skills in
10
+ `.claude/skills/`; task state in `.claude/state/`.
11
11
 
12
12
  ## Mode dispatcher
13
13
 
@@ -40,7 +40,7 @@ surface the menu.
40
40
 
41
41
  ## Task-fit dial
42
42
 
43
- The harness is a dial, not on/off (decisions #57–#61):
43
+ The harness is a dial, not on/off:
44
44
 
45
45
  - **L1 — full SDD**: real features. Grill → spec → human gate → implement → review.
46
46
  - **L2 — lightweight**: small bugs. Issue + state + implement (TDD) + light review.
@@ -60,10 +60,14 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
60
60
  3. **Spec** — Spec Author sub-agent (given the `<id>` + branch): `prd-to-spec` (→
61
61
  `requirements.md` EARS + `design.md` + `tasks.md` under `tasks/<id>/spec/`) then
62
62
  `spec-to-issue` (fills the issue body — it creates nothing and moves no labels).
63
- 4. **Spec-ready + handoff** flip to `harness:status:spec-ready`, commit and push the
64
- task state to the branch. DEFINE can stop here: the spec-ready queue
65
- (`gh issue list -l harness:status:spec-ready`) is the handoff. Ask: implement now or
66
- hand off?
63
+ **UI design gate** (§UI design in `orchestrator.md`): if the repo has a frontend AND
64
+ the task touches UI, put `harness:needs-design`, offer the design-stop, and on
65
+ "continue" dispatch the **UI Designer** to author `ui-handoff.md` alongside the spec.
66
+ 4. **Spec-ready + handoff** — remove `harness:needs-design` once `ui-handoff.md` is
67
+ complete (a spec-ready task never carries it), flip to `harness:status:spec-ready`,
68
+ commit and push the task state to the branch. DEFINE can stop here: the spec-ready
69
+ queue (`gh issue list -l harness:status:spec-ready`) is the handoff. Ask: implement
70
+ now or hand off?
67
71
  5. **Approval gate** — run by whoever implements (a RESUME of a spec-ready issue runs
68
72
  it). Present the spec; the human approves (or asks for changes → Spec Author
69
73
  revises). On approval, flip to `harness:status:in-progress`. The spec, not the code,
@@ -71,7 +75,9 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
71
75
  6. **Implement** — Implementer sub-agent, `tdd` skill, on the branch, keeping
72
76
  `.claude/state/tasks/<id>/progress.md` live.
73
77
  7. **Review** — flip to `harness:status:in-review`, open the PR (`gh pr create`,
74
- branch → default), Reviewer sub-agent reviews it (`senior-review`, fresh context).
78
+ branch → default), Reviewer sub-agent reviews it (`senior-review`, fresh context). If
79
+ the task touched UI, the **UI Designer** reviews as a distinct design + a11y lens too
80
+ — either lens rejecting routes back to the Implementer.
75
81
  8. **Merge gate** — never auto-merge. Surface the approved PR; the human merges (or
76
82
  authorizes you to). The task stays at `in-review` until merged.
77
83
  9. **Closeout** — `task-closeout`: confirm the merge via `gh`, offer durable discoveries
@@ -97,7 +103,7 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
97
103
  `harness/closeout-<id>` PR (`gh pr merge --auto`); park at `closeout-pending` if it
98
104
  needs approval. Then close the issue and delete the branch. Same as L1.
99
105
 
100
- ## Discovery interrupts (decision #30)
106
+ ## Discovery interrupts
101
107
 
102
108
  At any step, a sub-agent that hits a T1–T6 case (contradiction, unspecified decision,
103
109
  scope drift, existing solution, infeasibility, playbook conflict) **pauses instead of
@@ -75,9 +75,7 @@ status: active
75
75
  - `keywords` (optional) — case-insensitive regexes (Oniguruma). **Prompts matching any regex suggest this playbook.**
76
76
 
77
77
  `applies_to` and `keywords` are independently optional: a playbook can be require-only,
78
- suggest-only, both, or neither. The full spec lives in
79
- [`catalog/playbook-format.md`](https://github.com/{{task_storage_repo}}/blob/main/catalog/playbook-format.md)
80
- (packaged with the vendor — referenced here for convenience).
78
+ suggest-only, both, or neither.
81
79
 
82
80
  ## What belongs here (and what doesn't)
83
81
 
@@ -24,7 +24,7 @@ agents:
24
24
  - implementer
25
25
  - reviewer
26
26
  - architect # always installed; invoked on-demand, outside the linear flow
27
- # - ui-designer # catalog slot, inactive by default (decision #11)
27
+ # - ui-designer # catalog slot, inactive by default
28
28
 
29
29
  # Paths (relative; defaults shown — declare only overrides).
30
30
  paths:
@@ -57,3 +57,11 @@ rollback:
57
57
  # Uncomment to opt the team out:
58
58
  # telemetry:
59
59
  # enabled: false
60
+
61
+ # Design tokens (`design-tokens validate`). The anti-hardcode scan inspects a built-in
62
+ # set of UI/style extensions (.css/.scss/.ts/.tsx/.vue/.svelte/.astro/.js/.mdx/.html/…).
63
+ # Add extra suffixes here for a stack the built-ins don't cover — additive, never a
64
+ # replacement. Default none.
65
+ # design_tokens:
66
+ # scan_extensions:
67
+ # - .foo