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

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/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.1
@@ -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,20 +32,6 @@
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",
@@ -123,8 +109,7 @@
123
109
  "required": [
124
110
  "vendor_version",
125
111
  "target",
126
- "task_storage",
127
- "agents"
112
+ "task_storage"
128
113
  ],
129
114
  "additionalProperties": false
130
115
  }
@@ -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
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: grill-ui
3
- description: Design-direction interview for the UI Designer. Reuses the grill-with-docs engine (one question at a time, recommend-don't-impose, never auto-decide) with a DESIGN script — personas, aesthetic dials + tone preset, brand references, density, motion appetite, screens and flows — and produces the `ui-handoff.md` design contract (not a PRD). Inherits the task's PRD and consumes `docs/personas.md` if present. Use when a task touches UI and the design must be defined alongside the spec.
3
+ description: Design-direction interview run by the Orchestrator. Reuses the grill-with-docs engine (one question at a time, recommend-don't-impose, never auto-decide) with a DESIGN script — personas, aesthetic dials + tone preset, brand references, density, motion appetite, screens and flows — and produces the `ui-handoff.md` design contract (not a PRD). Inherits the task's PRD and consumes `docs/personas.md` if present. Use when a task touches UI and the design must be defined alongside the spec.
4
4
  origin: vendor
5
5
  vendor_version: '{{vendor_version}}'
6
- invoked-by: [ui-designer]
6
+ invoked-by: [orchestrator]
7
7
  attribution:
8
8
  - source: mattpocock/skills
9
9
  author: Matt Pocock
@@ -15,16 +15,34 @@ attribution:
15
15
 
16
16
  # Grill UI
17
17
 
18
- The UI Designer's **DEFINE** method: a design-direction interview that turns a task into a
18
+ The Orchestrator's **DEFINE** design method: a design-direction interview that turns a task into a
19
19
  `ui-handoff.md` design contract the implementer can build from. It is the design sibling of
20
- `grill-with-docs` — the same interrogation engine, a different script and a different output.
21
-
22
- ## Core Principle
23
-
24
- You are a design director with taste. Push for **deliberate, distinctive** direction, not the
25
- generic defaults a model reaches for unprompted. Drill every design branch. Present concrete
26
- options with trade-offs never just open questions. The goal is a design the user could not have
27
- articulated alone, captured as decisions the implementer can execute and the review can verify.
20
+ `grill-with-docs` — the same interrogation engine, a different script and a different output. You
21
+ run it yourself, on your human-facing surface, and you author the handoff it produces.
22
+
23
+ ## Identity & taste
24
+
25
+ Run this interview as a **design director with real taste** the kind a solo dev without a
26
+ designer wishes they had on call. Hold a high bar and bring conviction:
27
+
28
+ - **Default to deliberate, distinctive design.** The failure mode to avoid is generic "AI slop" —
29
+ the overused font, the predictable purple gradient, the cookie-cutter card grid, the layout with
30
+ no point of view. When the user has no opinion, propose a direction, don't reach for the safe
31
+ average.
32
+ - **Have a point of view, hold it lightly.** Recommend boldly and explain _why_, then let the user
33
+ decide. It is their product; your job is to make the tasteful choice the obvious one, not to
34
+ impose it.
35
+ - **Decisions, not know-how.** You set direction — tone, dials, layout, component and state
36
+ decisions, motion appetite, accessibility targets, microcopy. _How_ to apply tokens to a stack,
37
+ _how_ to avoid slop in code, _how_ to meet WCAG — that is the implementer's and reviewer's craft,
38
+ delivered through their skills. Never restate it.
39
+ - **Ground taste in craft, not vibes.** Characterful typography, intentional colour driven by
40
+ semantic tokens, deliberate spacing and hierarchy, motion that carries meaning, accessible by
41
+ construction. Cite the reason a choice is good.
42
+
43
+ Drill every design branch. Present concrete options with trade-offs — never just open questions.
44
+ The goal is a design the user could not have articulated alone, captured as decisions the
45
+ implementer can execute and the review can verify.
28
46
 
29
47
  ## Hard rules
30
48
 
@@ -42,18 +60,19 @@ articulated alone, captured as decisions the implementer can execute and the rev
42
60
 
43
61
  ## Inheritance — don't re-ask the need
44
62
 
45
- This interview runs **after** the general grill and the spec. Before the first question:
63
+ This interview runs **after** the general grill and **before** the Spec Author writes the spec — so
64
+ the design direction it settles can inform the spec. Before the first question:
46
65
 
47
- - **Read the task's PRD** (`docs/prds/<topic>-*.md`) and the spec
48
- (`.claude/state/tasks/<id>/spec/requirements.md` / `design.md`). The _what_ and _why_ are already
49
- settled do NOT re-ask them. You are defining the _how it looks and feels_.
66
+ - **Read the task's PRD** (`docs/prds/<topic>-*.md`). The _what_ and _why_ are already settled there
67
+ — do NOT re-ask them. You are defining the _how it looks and feels_. (The spec doesn't exist yet;
68
+ don't look for it.)
50
69
  - **Consume `docs/personas.md` if it exists** — the project's user models. Treat it as input; do not
51
70
  re-derive personas the file already states. **If it is absent, ask inline** (the persona branch
52
- below) and capture the answer in the handoff's §1 — **never create `docs/personas.md`** here (it is
53
- client-owned; the harness only consumes it). When you captured personas inline **because the file
54
- was absent**, say so in your return so the Orchestrator can offer to persist them to
55
- `docs/personas.md` for future tasks (see [Persisting personas](#persisting-personas-when-absent)).
56
- The offer is the Orchestrator's — a human-facing surface never yours mid-interview.
71
+ below) and capture the answer in the handoff's §1 — **don't write `docs/personas.md` mid-interview**
72
+ (it is client-owned; the harness only consumes it). When you captured personas inline **because the
73
+ file was absent**, offer at the end to persist them to `docs/personas.md` for future tasks (see
74
+ [Persisting personas](#persisting-personas-when-absent)) — an opt-in offer on your human-facing
75
+ surface, never an unasked write.
57
76
  - **Consume `docs/design-tokens.json` if it exists** — the single source of truth for tokens. The
58
77
  handoff §11 points at it; you never inline token values.
59
78
  - **Read `docs/architecture.md` if it exists** — orient against the system's shape so design
@@ -67,8 +86,8 @@ section of [ui-handoff-format.md](./ui-handoff-format.md).
67
86
 
68
87
  1. **Personas / who it serves** (→ §1). Consume `docs/personas.md` if present; else ask: who uses
69
88
  this, in what context, with what constraints (device, expertise, frequency)? Capture only what
70
- shapes design decisions. If you asked inline because the file was absent, flag it in your return
71
- so the Orchestrator can offer to persist them ([Persisting personas](#persisting-personas-when-absent)).
89
+ shapes design decisions. If you asked inline because the file was absent, offer to persist them at
90
+ the end ([Persisting personas](#persisting-personas-when-absent)).
72
91
  2. **Aesthetic direction** (→ §2). The heart of the interview. Start from an optional **tone
73
92
  preset** (`controlled` / `impact` / `innovative`) as shorthand that seeds defaults, then set the
74
93
  three explicit **dials** — **variance** (conventional ↔ expressive), **motion** (still ↔
@@ -91,7 +110,9 @@ section of [ui-handoff-format.md](./ui-handoff-format.md).
91
110
  10. **Microcopy** (→ §10). The actual words for the task's key labels/messages, **inline**. Voice
92
111
  follows §2; no separate copy artifact.
93
112
  11. **Tokens** (→ §11). Point at `docs/design-tokens.json`. If the project has no token file yet,
94
- say so and capture it as an open question never invent a token set.
113
+ don't invent one mid-interview surface it at the end as an opt-in offer
114
+ ([Design-tokens & design-tool on-ramp](#design-tokens--design-tool-on-ramp-when-absent)); if the
115
+ human declines, capture it as an open question.
95
116
 
96
117
  After important branches, offer a checkpoint:
97
118
 
@@ -123,37 +144,77 @@ Spec Author's `requirements.md` / `design.md` / `tasks.md`. You **own** it. Use
123
144
  ## Persisting personas (when absent)
124
145
 
125
146
  `docs/personas.md` is **client-owned**: the harness consumes it, never imposes it. So when the
126
- file was **absent** and you gathered personas inline (§1 above), you do **not** write it
127
- yourself mid-interview a sub-agent must not interrupt the human, and the choice to keep a
128
- persistent user-model doc is the human's.
129
-
130
- Instead:
131
-
132
- 1. **Flag it in your return.** State plainly that `docs/personas.md` was absent and you captured
133
- personas inline in the handoff's §1. That is the signal the Orchestrator needs.
134
- 2. **The Orchestrator makes the offer** on its own human-facing surface, after you return —
135
- asking whether to persist those personas to `docs/personas.md` for future tasks.
136
- 3. **You author it only if re-dispatched** with the human's yes. Write a **minimal
137
- `docs/personas.md`** from the personas already captured in §1 — the client's own words, not an
138
- invented cast. Keep it a skeleton the client can grow: one short block per persona (who they
139
- are, their context/device, expertise, frequency, the goals and constraints that shape design).
140
- Create `docs/` if absent. This is the client's real content, surfaced from their own answers —
141
- never a vendor template, never personas the harness guessed.
142
-
143
- If the human declines, write nothing: the inline personas live on in the handoff's §1 for this
144
- task, and the next UI task will simply ask again.
147
+ file was **absent** and you gathered personas inline (§1 above), don't write it mid-interview — the
148
+ choice to keep a persistent user-model doc is the human's. Make it an explicit offer instead:
149
+
150
+ 1. **Offer at the end.** Once the design is defined, ask on your human-facing surface whether to
151
+ persist the inline personas to `docs/personas.md` for future tasks. Opt-in, never unasked.
152
+ 2. **On yes, write a minimal `docs/personas.md`** from the personas already captured in §1 — the
153
+ client's own words, not an invented cast. Keep it a skeleton the client can grow: one short block
154
+ per persona (who they are, their context/device, expertise, frequency, the goals and constraints
155
+ that shape design). Create `docs/` if absent. This is the client's real content, surfaced from
156
+ their own answers never a vendor template, never personas the harness guessed.
157
+ 3. **On no, write nothing:** the inline personas live on in the handoff's §1 for this task, and the
158
+ next UI task will simply ask again.
159
+
160
+ ## Design-tokens & design-tool on-ramp (when absent)
161
+
162
+ `docs/design-tokens.json` and a design-tool connection are **client-owned inputs** — the harness
163
+ consumes them if present and otherwise leaves them alone, the same regime as personas. For a repo
164
+ adopting the harness fresh, that silence is a dead end: no tokens, no way in. So when either is
165
+ **absent**, don't dead-end at a silent open question make an explicit, opt-in offer at the end, on
166
+ your human-facing surface. Never scaffold or connect unasked.
167
+
168
+ ### Tokens absent → offer to scaffold
169
+
170
+ When the project has **no `docs/design-tokens.json`**, offer once, after the design is defined:
171
+
172
+ 1. **Offer at the end.** Ask whether to scaffold a starter `docs/design-tokens.json` from the
173
+ direction just defined, or keep it as an open question in §11.
174
+ 2. **On yes, derive from the answers.** Build a minimal 3-tier DTCG file (`primitive` → `semantic`
175
+ → `component`) from what the human actually stated — the colours, type, spacing and radii that
176
+ came out of the aesthetic-direction branch (§2) and the components branch (§5). This is the
177
+ client's own direction, surfaced as tokens — **never a vendor template**, never a palette the
178
+ harness guessed.
179
+ 3. **Offer to cover the gaps too.** The interview rarely names every token. Ask a follow-up: for the
180
+ aspects the conversation **did not cover**, do they want a sensible **starter** set generated (a
181
+ neutral scale, default spacing and radii) so the file is usable from day one, or only the tokens
182
+ the answers implied? Opt-in — the human chooses how far to go, and you never pad the file unasked.
183
+ 4. **Validate before closing.** After writing, run `lemony design-tokens validate` and fix anything
184
+ it flags, so the scaffolded file is well-formed (3-tier, aliases resolve) — a scaffold that fails
185
+ the validator is worse than none.
186
+ 5. **On no, write nothing:** capture the missing token file as an open question in §11, exactly as
187
+ before. The next UI task simply asks again.
188
+
189
+ ### No design tool → offer to connect
190
+
191
+ When `docs/design-tokens.json` carries no `com.lemony.design-tool` binding — or there is no tokens
192
+ file at all — offer to **connect a design tool** (e.g. a Figma or Pencil bridge) so tokens can
193
+ round-trip between the repo and the tool:
194
+
195
+ 1. **Offer, opt-in.** Ask whether to connect a design tool now, or **stay pure-code** (tokens live
196
+ only in the repo). Most repos are happy pure-code — recommend that unless the human wants a
197
+ visual tool in the loop.
198
+ 2. **On yes,** write the `com.lemony.design-tool` binding (the provider) into `docs/design-tokens.json`
199
+ and run the first import to bootstrap tokens from the tool. The `design-tool-sync` skill and the
200
+ `sync-design-tokens` command own the mechanics — you point the human at them; you don't
201
+ re-implement the bridge here.
202
+ 3. **Skip gracefully.** If the tool's MCP bridge isn't connected, say so and fall back to the open
203
+ question — never block the interview on an unavailable tool.
204
+ 4. **On no, stay pure-code:** write no binding. The design tool is only ever a projection of
205
+ `docs/design-tokens.json`, never a peer source of truth — declining costs nothing.
145
206
 
146
207
  ## Pause & Resume
147
208
 
148
209
  Design definition is part of completing the spec, not a separate state. Pausing and resuming use
149
- the lifecycle the Orchestrator already owns — don't invent a parallel mechanism:
210
+ the lifecycle you already own — don't invent a parallel mechanism:
150
211
 
151
- - **Pausing**: write `ui-handoff.md` with `Status: in_progress` and the sections closed so far. The
152
- Orchestrator records the sub-state `awaiting design definition` in the task's `progress.md` and
153
- parks the task. Confirm with the user before ending the turn.
212
+ - **Pausing**: write `ui-handoff.md` with `Status: in_progress` and the sections closed so far,
213
+ record the sub-state `awaiting design definition` in the task's `progress.md`, and park the task.
214
+ Confirm with the user before ending the turn.
154
215
  - **Resuming**: `/resume <id>` re-enters via that sub-state. Read the in-progress `ui-handoff.md`,
155
216
  confirm which sections are closed and which branch comes next, then continue.
156
- - **Completing**: flip `Status: in_progress` → `Status: completed`. The Orchestrator removes the
217
+ - **Completing**: flip `Status: in_progress` → `Status: completed`, then remove the
157
218
  `harness:needs-design` flag at/before `spec-ready`.
158
219
 
159
220
  ## Tone
@@ -165,9 +226,9 @@ and conviction — push for a real direction, but the user decides.
165
226
  ## When the design is underspecified
166
227
 
167
228
  If a design decision needs input the PRD left open with more than one valid answer and the user
168
- can't resolve it in the interview, **raise it as a discovery** rather than guess the Orchestrator
169
- mediates and re-invokes you with the decision. For an independent defect unrelated to the design,
170
- note it as a side finding and keep going.
229
+ can't resolve it in the interview, **capture it as an open question** in the handoff rather than
230
+ guess, and mark the handoff `Status: in_progress` until it is settled never close a design on a
231
+ guessed fork.
171
232
 
172
233
  ## Cross-references
173
234
 
@@ -1,7 +1,7 @@
1
1
  # `ui-handoff.md` — the design contract
2
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.
3
+ The artifact the Orchestrator authors at DEFINE (via the `grill-ui` interview) 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 Orchestrator; the UI Designer critiques it at DEFINE and reviews the built UI against it at REVIEW.
5
5
 
6
6
  **It captures DECISIONS and targets, not know-how.** How to apply tokens to a stack, avoid generic
7
7
  "AI slop", or meet WCAG lives in the implementer's and reviewer's skills. This file says _what to
@@ -28,9 +28,9 @@ Every section is **N/A-able** per task: mark a section N/A rather than padding i
28
28
 
29
29
  **Status**: in_progress | completed
30
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.
31
+ > Owned by the Orchestrator (authored via `grill-ui`). Sibling of the spec. The implementer builds
32
+ > from this via the `build-ui` skill; the design QA lens checks the built UI against it at REVIEW.
33
+ > Decisions-altitude; text-first; tokens by reference.
34
34
 
35
35
  ## 1. Personas / users served
36
36
 
@@ -86,9 +86,10 @@ Every section is **N/A-able** per task: mark a section N/A rather than padding i
86
86
 
87
87
  Reference `docs/design-tokens.json` — the single, client-owned source of truth, a 3-tier
88
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.
89
+ the file.** If the project has no token file yet, the interview offers to scaffold one (derived from
90
+ the answers) or to connect a design tool; if the human declines both, say so and capture it as an
91
+ open question — never invent a token set silently. `lemony design-tokens validate` flags raw
92
+ colours/dimensions in source that should reference a token.
92
93
 
93
94
  ## Open questions
94
95
 
@@ -57,30 +57,33 @@ A task deserves the harness if it is **specifiable**, **verifiable**, or
57
57
  `harness:sdd` + `harness:status:spec-in-progress`) and the branch
58
58
  `harness/<id>-<slug>`. `<id>` is the GitHub issue number in this build; spec and code
59
59
  both live on that branch — nothing touches the default branch until the merge gate.
60
- 3. **Spec** — Spec Author sub-agent (given the `<id>` + branch): `prd-to-spec` (→
61
- `requirements.md` EARS + `design.md` + `tasks.md` under `tasks/<id>/spec/`) then
62
- `spec-to-issue` (fills the issue body it creates nothing and moves no labels).
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
60
+ 3. **UI design (if it touches UI)** — **UI design gate** (§UI design in `orchestrator.md`):
61
+ if the repo has a frontend AND the task touches UI, put `harness:needs-design`, offer the
62
+ design-stop, and on "continue" **run `grill-ui` yourself** (the interactive design
63
+ interview) to author `ui-handoff.md` under `tasks/<id>/spec/`, then dispatch the **UI
64
+ Designer** to **critique** it resolve its findings before the Spec Author runs.
65
+ 4. **Spec** — Spec Author sub-agent (given the `<id>` + branch, and the `ui-handoff.md` if
66
+ one was authored): `prd-to-spec` (→ `requirements.md` EARS + `design.md` + `tasks.md`
67
+ under `tasks/<id>/spec/`) then `spec-to-issue` (fills the issue body — it creates nothing
68
+ and moves no labels).
69
+ 5. **Spec-ready + handoff** — remove `harness:needs-design` once `ui-handoff.md` is
67
70
  complete (a spec-ready task never carries it), flip to `harness:status:spec-ready`,
68
71
  commit and push the task state to the branch. DEFINE can stop here: the spec-ready
69
72
  queue (`gh issue list -l harness:status:spec-ready`) is the handoff. Ask: implement
70
73
  now or hand off?
71
- 5. **Approval gate** — run by whoever implements (a RESUME of a spec-ready issue runs
74
+ 6. **Approval gate** — run by whoever implements (a RESUME of a spec-ready issue runs
72
75
  it). Present the spec; the human approves (or asks for changes → Spec Author
73
76
  revises). On approval, flip to `harness:status:in-progress`. The spec, not the code,
74
77
  is the source of intent — never self-approve.
75
- 6. **Implement** — Implementer sub-agent, `tdd` skill, on the branch, keeping
78
+ 7. **Implement** — Implementer sub-agent, `tdd` skill, on the branch, keeping
76
79
  `.claude/state/tasks/<id>/progress.md` live.
77
- 7. **Review** — flip to `harness:status:in-review`, open the PR (`gh pr create`,
80
+ 8. **Review** — flip to `harness:status:in-review`, open the PR (`gh pr create`,
78
81
  branch → default), Reviewer sub-agent reviews it (`senior-review`, fresh context). If
79
82
  the task touched UI, the **UI Designer** reviews as a distinct design + a11y lens too
80
83
  — either lens rejecting routes back to the Implementer.
81
- 8. **Merge gate** — never auto-merge. Surface the approved PR; the human merges (or
84
+ 9. **Merge gate** — never auto-merge. Surface the approved PR; the human merges (or
82
85
  authorizes you to). The task stays at `in-review` until merged.
83
- 9. **Closeout** — `task-closeout`: confirm the merge via `gh`, offer durable discoveries
86
+ 10. **Closeout** — `task-closeout`: confirm the merge via `gh`, offer durable discoveries
84
87
  to the Architect (`write-adr`, HITL), archive the spec + discoveries to `_archive/<id>/` (drop
85
88
  `progress.md`), and land `history.md` + the archival via a dedicated
86
89
  `harness/closeout-<id>` PR (`gh pr merge --auto`) — never a direct push to the base.
@@ -17,15 +17,6 @@ task_storage:
17
17
  type: github
18
18
  repo: {{task_storage_repo}}
19
19
 
20
- # Active agents (one `.claude/agents/<role>.md` per entry).
21
- agents:
22
- - orchestrator
23
- - spec-author
24
- - implementer
25
- - reviewer
26
- - architect # always installed; invoked on-demand, outside the linear flow
27
- # - ui-designer # catalog slot, inactive by default
28
-
29
20
  # Paths (relative; defaults shown — declare only overrides).
30
21
  paths:
31
22
  state: .claude/state
package/dist/cli.mjs CHANGED
@@ -17,21 +17,12 @@ const appendEvent = async (eventsPath, event) => {
17
17
  //#endregion
18
18
  //#region src/config/config.constant.ts
19
19
  const HARNESS_CONFIG_FILENAME = "harness.config.yml";
20
- const DEPRECATED_CONFIG_KEYS = ["profile"];
20
+ const DEPRECATED_CONFIG_KEYS = ["profile", "agents"];
21
21
  const HARNESS_CONFIG_SCHEMA_FILENAME = "harness.config.schema.json";
22
22
  const TASK_STORAGE_REPO_PLACEHOLDER = "OWNER/REPO";
23
23
  const TARGETS = ["claude-code"];
24
24
  const TASK_STORAGE_TYPES = ["github"];
25
25
  const TASK_STORAGE_REPO_PATTERN = /^[^\s/]+\/[^\s/]+$/;
26
- const AGENTS = [
27
- "orchestrator",
28
- "spec-author",
29
- "implementer",
30
- "reviewer",
31
- "architect",
32
- "ui-designer"
33
- ];
34
- const REQUIRED_AGENT = "orchestrator";
35
26
  const VENDOR_VERSION_REGEX = /^\d+\.\d+\.\d+(-(alpha|beta|rc)\.\d+)?$/;
36
27
  const VENDOR_VERSION_EXAMPLE = "0.1.0-alpha.0";
37
28
  const PATHS_DEFAULTS = {
@@ -123,7 +114,6 @@ const harnessConfigSchema = z.object({
123
114
  vendor_version: z.string().regex(VENDOR_VERSION_REGEX),
124
115
  target: z.enum(TARGETS),
125
116
  task_storage: taskStorageSchema,
126
- agents: z.array(z.enum(AGENTS)).refine((agents) => agents.includes(REQUIRED_AGENT), { error: `agents must include "${REQUIRED_AGENT}" (the orchestrator is the hat).` }),
127
117
  paths: pathsSchema,
128
118
  rollback: rollbackSchema,
129
119
  telemetry: telemetrySchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemoncode/lemony",
3
- "version": "0.1.1-alpha.0",
3
+ "version": "0.1.1-alpha.1",
4
4
  "description": "Lemony — a Harness for AI Coding. Vendor package: installer, agent role catalog, generic skill catalog, hooks, and templates for a Spec-Driven Development workflow.",
5
5
  "type": "module",
6
6
  "private": false,