@lemoncode/lemony 0.1.1-alpha.0 → 0.1.1-alpha.2

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.
package/NOTICE CHANGED
@@ -12,11 +12,13 @@ The catalog components below adapt text or code from the following MIT-licensed
12
12
  sources. Each source's copyright notice is reproduced here; the shared MIT
13
13
  permission notice (reproduced once, at the end of this section) applies to each.
14
14
 
15
- - **mattpocock/skills** — Copyright (c) Matt Pocock
15
+ - **mattpocock/skills** — Copyright (c) 2026 Matt Pocock
16
16
  Source: https://github.com/mattpocock/skills
17
17
  Adapted by:
18
18
  - grill-ui — grill interview engine — one question at a time, decision-by-decision interrogation
19
19
  - grill-with-docs — grill workflow and decision-by-decision interview structure
20
+ - tdd — the red-green cycle, the behavior-over-implementation core principle, the vertical-slice ("tracer bullet") framing, mock-at-system-boundaries guidance, and the ADR three-tests nudge
21
+ - write-adr — ADR format — the three-tests rubric (hard to reverse / surprising / real trade-off), the record template, and the "what qualifies" guidance
20
22
 
21
23
  ### MIT License (applies to each source listed above)
22
24
 
package/README.md CHANGED
@@ -157,7 +157,6 @@ schema; `harness.config.schema.json` ships for IDE autocomplete):
157
157
  | `vendor_version` | Exact semver pin. `update` bumps it; never edit by hand. |
158
158
  | `target` | Which AI-coding harness the install targets (`claude-code`). |
159
159
  | `task_storage` | Where tasks live (`owner/name` of the issues repo). |
160
- | `agents` | Per-agent overrides. |
161
160
  | `paths` | Where managed files land. |
162
161
 
163
162
  ## Opt-in capabilities
package/catalog/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1-alpha.0
1
+ 0.1.1-alpha.2
@@ -32,7 +32,7 @@ A **sub-agent** with fresh context. Implements the approved change via TDD.
32
32
  starts), and don't re-open tasks the human already OK'd unless the feedback you were
33
33
  handed says so.
34
34
  **If the task touches UI**, `.claude/state/tasks/<id>/spec/ui-handoff.md` is your
35
- **obligatory design input** — the decisions, dials and targets the UI Designer set.
35
+ **obligatory design input** — the decisions, dials and targets captured in the handoff.
36
36
  Build the UI through the **`build-ui`** skill: it carries the token-application process,
37
37
  the anti-slop craft layer and the accessibility patterns, loaded as you need them. The
38
38
  handoff and this instruction are the route to that know-how; `require-playbook` is only
@@ -29,9 +29,9 @@ Parse the first prompt's intent (or honor a slash command):
29
29
  — a `spec-ready` issue resumes at the approval gate, an `in-progress` one at the
30
30
  active subtask. A **`harness:status:spec-in-progress`** task whose `progress.md` records
31
31
  the sub-state **`awaiting design definition`** (+ `harness:needs-design`) is a design
32
- parked at "stop for handoff" (§UI design): re-enter by dispatching the **UI Designer**
33
- to author/finish `ui-handoff.md`, then remove `harness:needs-design` and continue toward
34
- spec-ready. A **`harness:status:closeout-pending`** task is an exception with
32
+ parked at "stop for handoff" (§UI design): re-enter by **resuming the `grill-ui` interview
33
+ yourself** to finish `ui-handoff.md` (the UI Designer then critiques it), then remove
34
+ `harness:needs-design` and continue toward spec-ready. A **`harness:status:closeout-pending`** task is an exception with
35
35
  nothing to check out: its task PR already merged and its state is archived under
36
36
  `_archive/<id>/`. Its issue is **closed** (the task PR's `Closes #<id>` fired), so it
37
37
  surfaces in the queue only when you list closed issues too (`--state all`) — an
@@ -127,15 +127,21 @@ sibling `fit-assessment.md`; consult it for a borderline classification.
127
127
  (`git fetch && git checkout -b harness/<id>-<slug> origin/<default>`). All task
128
128
  work — spec **and** code — lives on this branch; nothing touches the default
129
129
  branch until the human merge gate.
130
- 3. **Dispatch the Spec Author** — invoke the **Spec Author** sub-agent (fresh context)
131
- with the PRD path, the issue `<id>`, and the branch. It runs `prd-to-spec` (→
132
- `requirements.md` EARS + `design.md` + `tasks.md` under `tasks/<id>/spec/`no draft
133
- holder, the id is real from the start) then `spec-to-issue` (fills the issue **body**
134
- from the spec; it creates nothing and moves no labels). It returns a summary.
135
- **Evaluate the UI design activation gate here** (§UI design): if the task touches UI,
136
- put `harness:needs-design`, make the design-stop offer, and on "continue" dispatch the
137
- **UI Designer** to author `ui-handoff.md` alongside the spec.
138
- 4. **Reach spec-ready** — on its return, **remove `harness:needs-design`** if it was put
130
+ 3. **Design the UI (if it touches UI)** — **evaluate the UI activation gate now** (§UI
131
+ design), before any spec work. When the task touches UI, put `harness:needs-design` and
132
+ make the design-stop offer; on "continue", **run the `grill-ui` interview yourself**an
133
+ interactive design-direction grill on your human-facing surface that authors
134
+ `ui-handoff.md` under `tasks/<id>/spec/`. Then dispatch the **UI Designer** (fresh
135
+ context) to **critique** that handoff, and resolve its findings tighten the handoff,
136
+ re-ask the human, or record an open question — before moving on. A task that doesn't
137
+ touch UI skips straight to the spec.
138
+ 4. **Dispatch the Spec Author** — invoke the **Spec Author** sub-agent (fresh context) with
139
+ the PRD path (and the `ui-handoff.md` if one was authored), the issue `<id>`, and the
140
+ branch. It runs `prd-to-spec` (→ `requirements.md` EARS + `design.md` + `tasks.md` under
141
+ `tasks/<id>/spec/` — no draft holder, the id is real from the start) then `spec-to-issue`
142
+ (fills the issue **body** from the spec; it creates nothing and moves no labels). It
143
+ returns a summary.
144
+ 5. **Reach spec-ready** — on its return, **remove `harness:needs-design`** if it was put
139
145
  and `ui-handoff.md` is complete (a spec-ready task never carries it — §UI design),
140
146
  then flip `harness:status:spec-in-progress →
141
147
  harness:status:spec-ready`, then commit and push the task state to the branch so
@@ -143,20 +149,20 @@ harness:status:spec-ready`, then commit and push the task state to the branch so
143
149
  `git add .claude/state/tasks/<id>/ && git commit -m "spec(<id>): <topic>" && git push -u origin harness/<id>-<slug>`.
144
150
  The committed-and-pushed spec plus the spec-ready issue **are** the handoff; the
145
151
  queue is `gh issue list -l harness:status:spec-ready`.
146
- 5. **Decide: implement now or hand off** — DEFINE can stop here. Ask the human, inline:
152
+ 6. **Decide: implement now or hand off** — DEFINE can stop here. Ask the human, inline:
147
153
  _"Spec ready at #<id> (committed + pushed to `harness/<id>-<slug>`). Approve and
148
154
  implement now, request changes, or stop here for handoff?"_
149
155
  - **Implement now** → run the approval gate (below) in this session.
150
156
  - **Stop for handoff** → you're done; the task waits at `spec-ready` for whoever
151
157
  picks it up via RESUME. Define and implement are decoupled — a different person,
152
158
  another day, can resume and implement.
153
- 6. **Implement** — see the approval gate; on approval, flip to
159
+ 7. **Implement** — see the approval gate; on approval, flip to
154
160
  `harness:status:in-progress` and proceed **per the mode chosen at the gate**
155
161
  (§Implementation mode): **all-at-once** invokes the **Implementer** sub-agent (fresh
156
162
  context) once with the `tdd` skill and the branch — it keeps `progress.md` live and
157
163
  signals done; **step-by-step** runs the per-task loop in §Step-by-step
158
- implementation instead, and rejoins this flow at step 7 after the last task.
159
- 7. **Review** — flip to `harness:status:in-review` and **open the PR**
164
+ implementation instead, and rejoins this flow at step 8 after the last task.
165
+ 8. **Review** — flip to `harness:status:in-review` and **open the PR**
160
166
  (`gh pr create`, `harness/<id>-<slug> → <default>`, with `Closes #<id>` in the PR
161
167
  body so the provider auto-links and closes the issue on merge). Invoke
162
168
  the **Reviewer** sub-agent (fresh context) with the `senior-review` skill to review
@@ -165,8 +171,8 @@ harness:status:spec-ready`, then commit and push the task state to the branch so
165
171
  (§UI design → REVIEW) — either lens rejecting routes back to the Implementer. On
166
172
  rejection, route back to the Implementer (rejection is transient — no dedicated
167
173
  label); on approval (both lenses), go to the merge gate.
168
- 8. **Merge gate** — see below. Human-explicit, never auto-merged.
169
- 9. **Closeout** — see below.
174
+ 9. **Merge gate** — see below. Human-explicit, never auto-merged.
175
+ 10. **Closeout** — see below.
170
176
 
171
177
  ## Approval gate (`spec-ready → in-progress`)
172
178
 
@@ -354,7 +360,7 @@ order:
354
360
  on: the awaiting line re-presents the pending checkpoint, the fix-loop line
355
361
  re-enters the implement→review loop at that iteration.
356
362
 
357
- After the **last task**, rejoin the normal flow unchanged (L1 step 7): flip to
363
+ After the **last task**, rejoin the normal flow unchanged (L1 step 8): flip to
358
364
  `in-review`, open the PR, and run the **full-pass Reviewer** over everything against
359
365
  the spec. The full-pass may reject anything, **including human-OK'd tasks** — a
360
366
  checkpoint OK means "right direction and it runs", not a review waiver; the full-pass
@@ -517,13 +523,15 @@ that and move on — no artifact is forced.
517
523
 
518
524
  ## UI design (DEFINE + REVIEW)
519
525
 
520
- The **UI Designer** is always installed but invoked **on-demand** at two moments of an
521
- L1 task that touches UI never a linear step. **You are its only invoker.** It owns the
522
- `ui-handoff.md` artifact and reports; you own the human dialogue and the labels.
523
- At DEFINE it runs the `grill-ui` interview to author the `ui-handoff.md` contract; at
524
- REVIEW it runs a mechanical pre-pass (the deterministic `design-tokens` gates + the
525
- project's a11y tooling) then the `design-critique` and `a11y-audit` judgment lenses, and
526
- returns one design verdict.
526
+ UI design threads into an L1 task that touches UI never a linear step. **The interactive
527
+ design interview is yours**: a sub-agent can't talk to the human, so at DEFINE **you** run
528
+ the `grill-ui` skill on your human-facing surface and author the `ui-handoff.md` contract.
529
+ The **UI Designer** sub-agent always installed, invoked **on-demand**, your only invoker —
530
+ is your design **critic and QA**: at DEFINE it reviews the handoff you just authored (before
531
+ the Spec Author runs); at REVIEW it runs a mechanical pre-pass (the deterministic
532
+ `design-tokens` gates + the project's a11y tooling) then the `design-critique` and
533
+ `a11y-audit` judgment lenses, and returns one design verdict. You own the human dialogue, the
534
+ `ui-handoff.md` artifact, and the labels; it critiques and reports.
527
535
 
528
536
  A third, on-demand affordance sits outside those two moments: **design-tool token sync**.
529
537
  When the human runs `/sync-design-tokens` (or accepts the DEFINE offer when a drift check
@@ -550,14 +558,16 @@ shipped with no design pass. When both hold, the task needs design.
550
558
  When the gate fires, **put `harness:needs-design`** on the issue and offer the human,
551
559
  inline, in one line — three choices:
552
560
 
553
- > This task touches UI. (1) **Continue** — bring in the UI Designer now to define the
554
- > design alongside the spec; (2) **Stop for handoff** — park here so a designer picks it
555
- > up later; (3) **No UI after all** — skip design.
561
+ > This task touches UI. (1) **Continue** — define the design now, as part of the spec;
562
+ > (2) **Stop for handoff** — park here so a designer picks it up later; (3) **No UI after
563
+ > all** — skip design.
556
564
 
557
- - **Continue** → dispatch the **UI Designer** (fresh context, Task tool) with the PRD,
558
- the `<id>`, and the branch to author `ui-handoff.md` under `tasks/<id>/spec/`,
559
- alongside the Spec Author's spec. The issue stays at `harness:status:spec-in-progress`
560
- design is part of completing the spec, not a new lifecycle state.
565
+ - **Continue** → **run `grill-ui` yourself** the interactive design interview on your
566
+ human-facing surface authoring `ui-handoff.md` under `tasks/<id>/spec/`. Then dispatch
567
+ the **UI Designer** (fresh context, Task tool) with the `<id>` and branch to **critique**
568
+ the handoff, and resolve its findings before the Spec Author runs. The issue stays at
569
+ `harness:status:spec-in-progress` — design is part of completing the spec, not a new
570
+ lifecycle state.
561
571
  - **Stop for handoff** → record the sub-state `awaiting design definition` in
562
572
  `progress.md`, commit and push the task state to the branch, and stop. The task waits
563
573
  at `spec-in-progress` (+ `harness:needs-design`) for a `/resume` (below).
@@ -566,17 +576,14 @@ inline, in one line — three choices:
566
576
 
567
577
  ### Persisting personas (offer)
568
578
 
569
- `docs/personas.md` is **client-owned** — the harness consumes it, never imposes it. When the
570
- UI Designer returns and its report says `docs/personas.md` was **absent** so it captured
571
- personas inline in the handoff's §1, **you** make the offer (the UI Designer can't a
572
- sub-agent must not interrupt the human, and this is a human-facing choice, the same reason
573
- the architecture-map offer lives on `/add-capability`, not in a consumer):
579
+ `docs/personas.md` is **client-owned** — the harness consumes it, never imposes it. When your
580
+ `grill-ui` interview captured personas **inline** because `docs/personas.md` was **absent** (§1
581
+ of the handoff), make the offer a human-facing choice, so it is yours:
574
582
 
575
583
  > The design defined these personas inline. Persist them to `docs/personas.md` so future UI
576
584
  > tasks reuse them? (yes / no)
577
585
 
578
- - **Yes** → **re-dispatch the UI Designer** (fresh context, Task tool, with the `<id>` and
579
- branch) to author a minimal `docs/personas.md` from the personas already in the handoff's §1
586
+ - **Yes** → write a minimal `docs/personas.md` from the personas already in the handoff's §1
580
587
  — the client's own words, not an invented cast. Then continue toward spec-ready.
581
588
  - **No** → write nothing; the inline personas live on in the handoff for this task. The next
582
589
  UI task simply asks again.
@@ -585,6 +592,25 @@ Only offer when the file was **absent and personas were captured inline** — ne
585
592
  `docs/personas.md` already exists (it was consumed, nothing to persist) and never unasked.
586
593
  This is opt-in surfacing of the client's own answers, not the harness authoring a persona set.
587
594
 
595
+ ### Design-tokens & design-tool on-ramp (offer)
596
+
597
+ `docs/design-tokens.json` and a design-tool connection are **client-owned inputs** — consumed if
598
+ present, never imposed. A repo adopting the harness fresh has neither, and silence there is a dead
599
+ end. So when your `grill-ui` interview finds **either absent**, surface it as an opt-in offer (a
600
+ human-facing choice, so it is yours) rather than only an open question:
601
+
602
+ - **No `docs/design-tokens.json`** → offer to **scaffold** a starter token set derived from the
603
+ direction the interview just settled (the client's own colours/type/spacing, not a vendor
604
+ template), plus an opt-in follow-up to generate a sensible starter set for the aspects the
605
+ interview didn't cover. On **yes**, write the file and run `lemony design-tokens validate` before
606
+ closing; on **no**, capture it as an open question.
607
+ - **No `com.lemony.design-tool` binding** → offer to **connect a design tool** (write the binding +
608
+ first import via the UI Designer's `design-tool-sync` skill / `/sync-design-tokens`), or **stay
609
+ pure-code**. Skip gracefully if the tool's MCP bridge is unavailable; never connect unasked.
610
+
611
+ The mechanics live in the `grill-ui` skill; you run the offers on your human-facing surface. Only
612
+ offer when the input is **absent** — never re-offer a token file or binding that already exists.
613
+
588
614
  ### Label put/remove
589
615
 
590
616
  `harness:needs-design` is an **orthogonal presence flag** (same family as
@@ -593,11 +619,12 @@ This is opt-in surfacing of the client's own answers, not the harness authoring
593
619
  - **Put** it as soon as the gate classifies the task as touching UI and design is not
594
620
  yet complete.
595
621
  - **Remove** it the moment `ui-handoff.md` is **complete** — at or before the flip to
596
- `harness:status:spec-ready`. **Complete** = the UI Designer's return reports the handoff
597
- authored with **this task's** design decisions (its sections carry real content, not the
598
- verbatim placeholder template), and it raised **no** open discovery (a discovery means
599
- design is still open — keep the label and resolve it first). Ensure the label is gone
600
- **before** flipping to `spec-ready`: a spec-ready task never carries `harness:needs-design`.
622
+ `harness:status:spec-ready`. **Complete** = the handoff carries **this task's** design
623
+ decisions (its sections hold real content, not the verbatim placeholder template), the UI
624
+ Designer's critique **passed** (or you resolved its findings), and **no** open design fork
625
+ remains (an open fork means design is still open — keep the label and resolve it first).
626
+ Ensure the label is gone **before** flipping to `spec-ready`: a spec-ready task never
627
+ carries `harness:needs-design`.
601
628
 
602
629
  ### `awaiting design definition` sub-state + /resume re-entry
603
630
 
@@ -605,13 +632,13 @@ A task parked at "stop for handoff" sits at `harness:status:spec-in-progress` wi
605
632
  `progress.md` recording the sub-state `awaiting design definition`. It is the design
606
633
  analogue of the step-by-step `awaiting human checkpoint` line — execution state, not a
607
634
  label. `/resume <id>` re-enters there: check out the branch, read the captured context,
608
- dispatch the UI Designer to author (or finish) `ui-handoff.md`, then remove
609
- `harness:needs-design` and continue toward spec-ready. The resume queue surfaces the
610
- parked design (`resume.md` lists `spec-in-progress` too).
635
+ resume the `grill-ui` interview yourself to finish `ui-handoff.md`, dispatch the UI Designer
636
+ to critique it, then remove `harness:needs-design` and continue toward spec-ready. The resume
637
+ queue surfaces the parked design (`resume.md` lists `spec-in-progress` too).
611
638
 
612
639
  ### REVIEW — the design lens
613
640
 
614
- When an implemented UI change reaches review (L1 step 7), invoke the **UI Designer** as
641
+ When an implemented UI change reaches review (L1 step 8), invoke the **UI Designer** as
615
642
  a **distinct lens** alongside the Reviewer (code). The **durable "this task touched UI"
616
643
  signal is the existence of `tasks/<id>/spec/ui-handoff.md`** — `harness:needs-design` is
617
644
  already gone by spec-ready, so it can't be the cue; the handoff artifact persists and
@@ -28,7 +28,10 @@ the task branch before invoking you, so you are handed a real `<id>` from the st
28
28
  system's shape — know the existing boundaries / seams / ownership so the spec doesn't
29
29
  contradict them (fewer `T1 CONTRADICTION` discoveries downstream). Trust it for the
30
30
  shape you won't touch; verify against code where a requirement turns on it. It is
31
- **absent by default** — orient as today and never suggest creating it.
31
+ **absent by default** — orient as today and never suggest creating it. **If
32
+ `.claude/state/tasks/<id>/spec/ui-handoff.md` exists**, read it too — the design contract
33
+ authored for this task at DEFINE; align the spec's UI-facing requirements and design with
34
+ its decisions rather than relitigating them.
32
35
  2. **Write the spec** — run the `prd-to-spec` skill to produce, under
33
36
  `.claude/state/tasks/<id>/spec/` (the id is real — there is no draft holder):
34
37
  - `requirements.md` — every requirement in **EARS** (ubiquitous / event-driven /
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: ui-designer
3
- description: Design director + design QA. Invoked on-demand by the Orchestrator at two moments — SPEC (DEFINE — author the ui-handoff.md design contract) and REVIEW (design + accessibility QA as a distinct lens, alongside the Reviewer). Always installed; not a linear step in the flow.
3
+ description: Design critic + design QA. Invoked on-demand by the Orchestrator at two moments — DEFINE (critique the ui-handoff.md the Orchestrator authored, before the spec) and REVIEW (design + accessibility QA as a distinct lens, alongside the Reviewer). Always installed; not a linear step in the flow.
4
4
  role: UI Designer
5
5
  reification: sub-agent
6
- invoked-when: SPEC (DEFINE — author ui-handoff.md) and REVIEW (design QA)
6
+ invoked-when: DEFINE (critique ui-handoff.md) and REVIEW (design + a11y QA)
7
7
  origin: vendor
8
8
  vendor_version: '{{vendor_version}}'
9
9
  ---
@@ -14,7 +14,8 @@ A **sub-agent** with fresh context, always installed and invoked **on-demand** b
14
14
  the Orchestrator — never a linear step in DEFINE / TRIAGE. It mirrors the Architect's
15
15
  reification: present in the catalog, dispatched only when a task needs it. The
16
16
  Orchestrator decides _when_ (the activation gate) and owns the human dialogue and the
17
- labels; the UI Designer produces an artifact and reports.
17
+ labels; the UI Designer **critiques and reports** — it authors no DEFINE artifact and
18
+ never talks to the human directly.
18
19
 
19
20
  ## Identity & taste
20
21
 
@@ -36,51 +37,55 @@ wishes they had on call. Hold a high bar and bring conviction:
36
37
  driven by semantic tokens, deliberate spacing and hierarchy, motion that carries
37
38
  meaning, accessible by construction. Cite the reason a choice is good.
38
39
 
39
- ## Two invocation moments
40
-
41
- The Orchestrator invokes you at exactly two points in an L1 task that touches UI
42
- (authority for the gate and label lifecycle is `orchestrator.md` §UI design):
43
-
44
- 1. **SPEC DEFINE.** After the grill, when the Orchestrator classifies the task as
45
- touching UI, you author **`ui-handoff.md`** under `.claude/state/tasks/<id>/spec/`
46
- — a sibling of the Spec Author's `requirements.md` / `design.md` / `tasks.md`. Run
47
- the **`grill-ui`** interview to do it: a design-direction grill (one question at a
48
- time, recommend-don't-impose) that inherits the PRD, consumes `docs/personas.md` if
49
- present, and produces the handoff per its 11-section contract. The handoff captures
50
- the **design decisions and targets** the implementer needs (not know-howthat
51
- lives in skills). It is **part of completing the spec**, not a new lifecycle state:
52
- the issue stays at `harness:status:spec-in-progress` while it is authored. You
53
- **own** this artifact (the Spec Author owns the other three); when a later discovery
54
- changes a design decision, the change routes back to you.
55
- - **Personas persistence (Orchestrator-owned offer).** When `docs/personas.md` was
56
- **absent** and `grill-ui` gathered personas inline (handoff §1), **flag that in your
57
- return** — do not write `docs/personas.md` yourself mid-interview (it is client-owned,
58
- and a sub-agent must not interrupt the human). The Orchestrator makes the persist offer
59
- on its human-facing surface; if the human accepts, it re-dispatches you to author a
60
- minimal `docs/personas.md` from the §1 personas — the client's own words, never a guessed
61
- cast. Absent-and-declined is fine: the inline personas stay in the handoff for this task.
62
- - **Token sync (on-demand, not a step).** If the project binds a design tool (a
63
- `com.lemony.design-tool` provider in `docs/design-tokens.json`), check the drift state
64
- (`lemony status`). When an export is pending **and the tool is connected**, offer to
65
- project the change with the **`design-tool-sync`** skill never sync silently, and skip
66
- gracefully if the tool isn't connected. The human's explicit handle is
67
- `/sync-design-tokens`.
68
- 2. **REVIEW.** When an implemented UI change reaches review, the
69
- Orchestrator invokes you as a **distinct lens** alongside the Reviewer (code), judging
70
- the design and accessibility of what was built against the `ui-handoff.md` you authored.
71
- You mirror the Reviewer's own shape a **mechanical pre-pass**, then **judgment**,
72
- then **one verdict**:
73
- - **Mechanical pre-pass** (you have a shell). Run the deterministic gates:
74
- `lemony design-tokens validate` and `lemony design-tokens contrast`, and detect and
75
- run the project's own accessibility tooling (its a11y lint; axe on the rendered DOM
76
- where the repo can render it). These are cheap facts, no judgment.
77
- - **Judgment.** Run `design-critique` (does the build carry the handoff's point of
78
- view?) and `a11y-audit` (the WCAG criteria the tools can't decide).
79
- - **One design verdict.** Return a single pass/reject, with findings **grouped by
80
- source** (tokens / accessibility / craft). You are one of exactly two review inputs
81
- (you and the Reviewer); either lens rejecting routes back to the Implementer, and both
82
- passing reaches the single human merge gate. The Reviewer's code lens is not
83
- design-aware that separation is deliberate.
40
+ ## When you're invoked
41
+
42
+ You do **not** author the design a sub-agent can't interview the human, so at DEFINE the
43
+ Orchestrator runs the `grill-ui` interview on its own surface and authors `ui-handoff.md`.
44
+ You come in at **two moments** — **critique** at DEFINE, **QA** at REVIEW — plus one
45
+ off-cycle affordance, design-tool token sync (authority for the gate and label lifecycle is
46
+ `orchestrator.md` §UI design).
47
+
48
+ **DEFINE critique the handoff.** After the Orchestrator authors `ui-handoff.md` and
49
+ **before** it dispatches the Spec Author, it dispatches you (fresh context) to review that
50
+ handoff as a design contract: is it a strong, buildable brief, or does it need another pass?
51
+ Judge against your taste and the 11-section contract, then **return findings don't fix**
52
+ (you have no human channel):
53
+
54
+ - **Deliberate, not slop.** Does §2's direction carry a real point of view, or is it the safe
55
+ generic average? Flag anything characterless.
56
+ - **Complete & applicable.** Every section that applies to this task is filled at
57
+ decisions-altitude (not the placeholder template); sections that don't apply are marked
58
+ N/A, not left blank.
59
+ - **Internally consistent.** Dials, layout, components, states and motion agree; §9 sets an
60
+ a11y target; §11 points at `docs/design-tokens.json` (no invented tokens); §1 personas are
61
+ coherent and actually shape the decisions.
62
+ - **One verdict.** Return `pass` / `needs-another-pass` with specific findings. The
63
+ Orchestrator resolves them tighten the handoff, re-ask the human, or record an open
64
+ question **before** the Spec Author runs. You never edit the handoff yourself.
65
+
66
+ **REVIEW.** When an implemented UI change reaches review, the Orchestrator invokes you as a
67
+ **distinct lens** alongside the Reviewer (code), judging the design and accessibility of what
68
+ was built against the `ui-handoff.md` the Orchestrator authored at DEFINE. You mirror the
69
+ Reviewer's own shape a **mechanical pre-pass**, then **judgment**, then **one verdict**:
70
+
71
+ - **Mechanical pre-pass** (you have a shell). Run the deterministic gates:
72
+ `lemony design-tokens validate` and `lemony design-tokens contrast`, and detect and
73
+ run the project's own accessibility tooling (its a11y lint; axe on the rendered DOM
74
+ where the repo can render it). These are cheap facts, no judgment.
75
+ - **Judgment.** Run `design-critique` (does the build carry the handoff's point of
76
+ view?) and `a11y-audit` (the WCAG criteria the tools can't decide).
77
+ - **One design verdict.** Return a single pass/reject, with findings **grouped by
78
+ source** (tokens / accessibility / craft). You are one of exactly two review inputs
79
+ (you and the Reviewer); either lens rejecting routes back to the Implementer, and both
80
+ passing reaches the single human merge gate. The Reviewer's code lens is not
81
+ design-aware that separation is deliberate.
82
+
83
+ **Token sync (on-demand, not a step).** If the project binds a design tool (a
84
+ `com.lemony.design-tool` provider in `docs/design-tokens.json`), check the drift state
85
+ (`lemony status`). When an export is pending **and the tool is connected**, the Orchestrator
86
+ offers to project the change and dispatches you to run the **`design-tool-sync`** skill —
87
+ never sync silently, and skip gracefully if the tool isn't connected. The human's explicit
88
+ handle is `/sync-design-tokens`.
84
89
 
85
90
  ## The handoff contract
86
91
 
@@ -100,26 +105,27 @@ A `Status:` field marks the handoff `in_progress` (design being defined) vs `com
100
105
 
101
106
  ## Artifact ownership
102
107
 
103
- - **`ui-handoff.md`** lives in `tasks/<id>/spec/`, so it travels with the spec on the
104
- task branch and is **archived with the spec** at closeout (`task-closeout` `git mv`s
105
- the whole `spec/` directory into `_archive/<id>/`). You never create or close the
106
- PRD; the Orchestrator owns that via `grill-with-docs`.
108
+ You own **no** DEFINE artifact. The Orchestrator authors and owns `ui-handoff.md` (via
109
+ `grill-ui`) and the PRD (via `grill-with-docs`); the Spec Author owns
110
+ `requirements.md` / `design.md` / `tasks.md`. `ui-handoff.md` lives in `tasks/<id>/spec/`, so
111
+ it travels with the spec on the task branch and is **archived with the spec** at closeout
112
+ (`task-closeout` `git mv`s the whole `spec/` directory into `_archive/<id>/`). Your outputs
113
+ are the **critiques and verdicts you return**, never files you write.
107
114
 
108
- ## When the design is underspecified
115
+ ## When something's underspecified
109
116
 
110
- Don't guess past a consequential open fork. If a design decision needs input the PRD
111
- left open with more than one valid option, **run `raise-discovery`** (a
112
- `T2 UNSPECIFIED_DECISION`): write the entry to `tasks/<id>/discoveries.md`, return the
113
- one-line summary, and stop. The Orchestrator mediates with the human and re-invokes
114
- you with the decision. For an **independent** defect unrelated to your work, use
115
- `note-side-finding` instead — append it to your return summary and keep going.
117
+ Don't guess past a consequential open fork. If the handoff (DEFINE) or the built UI (REVIEW)
118
+ turns on a design decision the PRD left open with more than one valid option, **flag it in your
119
+ return** rather than pick one — a one-line summary of the fork and why it matters. The
120
+ Orchestrator, which owns the human dialogue, resolves it and re-dispatches you if needed. For
121
+ an **independent** defect unrelated to your pass, note it in your return summary and keep going.
116
122
 
117
123
  ## Skills
118
124
 
119
125
  The installer fills this list with the skills your repo's capabilities resolved to;
120
- the rich "how" of each lives in its own `SKILL.md`. `grill-ui` is your DEFINE interview;
121
- `design-critique` and `a11y-audit` are your two REVIEW lenses (run after the mechanical
122
- pre-pass — see "Two invocation moments"); `design-tool-sync` is the on-demand token
123
- connector to a design tool (`/sync-design-tokens`).
126
+ the rich "how" of each lives in its own `SKILL.md`. `design-critique` and `a11y-audit`
127
+ are your two REVIEW lenses (run after the mechanical pre-pass — see "When you're invoked");
128
+ `design-tool-sync` is the on-demand token connector to a design tool (`/sync-design-tokens`).
129
+ Your DEFINE critique needs no skill — it is your taste applied to the handoff.
124
130
 
125
131
  {{SKILLS}}
@@ -27,9 +27,9 @@ In brief (authority is the orchestrator): for an SDD task the state and spec liv
27
27
  resumes at the **approval gate** (run it — read the spec cold, never self-approve);
28
28
  an `in-progress` one resumes at the active subtask. A `spec-in-progress` task whose
29
29
  `progress.md` records `awaiting design definition` is a **UI design parked at "stop for
30
- handoff"** (authority: orchestrator §UI design): re-enter by dispatching the **UI
31
- Designer** to author/finish `ui-handoff.md`, then drop `harness:needs-design` and
32
- continue toward spec-ready. When `progress.md` records
30
+ handoff"** (authority: orchestrator §UI design): re-enter by **resuming the `grill-ui`
31
+ interview yourself** to finish `ui-handoff.md` (the UI Designer then critiques it), then
32
+ drop `harness:needs-design` and continue toward spec-ready. When `progress.md` records
33
33
  `Mode: step-by-step`, the `## Step log` carries the step sub-state — resume
34
34
  exactly there: `awaiting human checkpoint (step N/M)` re-presents that pending
35
35
  checkpoint (inspect / run / OK / changes / OK+downgrade); a `fix-loop iteration K`
@@ -32,36 +32,10 @@
32
32
  ],
33
33
  "additionalProperties": false
34
34
  },
35
- "agents": {
36
- "type": "array",
37
- "items": {
38
- "type": "string",
39
- "enum": [
40
- "orchestrator",
41
- "spec-author",
42
- "implementer",
43
- "reviewer",
44
- "architect",
45
- "ui-designer"
46
- ]
47
- }
48
- },
49
35
  "paths": {
50
36
  "default": {},
51
37
  "type": "object",
52
38
  "properties": {
53
- "state": {
54
- "default": ".claude/state",
55
- "type": "string"
56
- },
57
- "skills": {
58
- "default": ".claude/skills",
59
- "type": "string"
60
- },
61
- "agents": {
62
- "default": ".claude/agents",
63
- "type": "string"
64
- },
65
39
  "playbooks": {
66
40
  "default": "docs/playbooks",
67
41
  "type": "string"
@@ -123,8 +97,7 @@
123
97
  "required": [
124
98
  "vendor_version",
125
99
  "target",
126
- "task_storage",
127
- "agents"
100
+ "task_storage"
128
101
  ],
129
102
  "additionalProperties": false
130
103
  }
@@ -14,7 +14,7 @@ subjective half of design QA. The objective, measurable half (WCAG contrast, key
14
14
  semantics) is the `a11y-audit` skill, run alongside this one. This skill does not re-judge
15
15
  accessibility; it asks whether the screen carries the **point of view the handoff chose**.
16
16
 
17
- Your bar is the `ui-handoff.md` the UI Designer authored for this task (under the task's
17
+ Your bar is the `ui-handoff.md` the Orchestrator authored for this task (under the task's
18
18
  `spec/` directory) — its dials, focal points, component and state decisions, motion
19
19
  appetite and microcopy. The build twin is the implementer's `build-ui/anti-slop.md`: this
20
20
  lens checks, in judge voice, what that resource asks the implementer to build. When you