@lemoncode/lemony 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -14
- package/catalog/VERSION +1 -1
- package/catalog/agents/architect.md +13 -4
- package/catalog/agents/implementer.md +87 -8
- package/catalog/agents/orchestrator.md +643 -386
- package/catalog/agents/partition.md +316 -0
- package/catalog/agents/reviewer.md +356 -21
- package/catalog/agents/spec-author.md +16 -4
- package/catalog/agents/spinoff.md +100 -0
- package/catalog/agents/triage.md +41 -0
- package/catalog/agents/ui-design.md +147 -0
- package/catalog/agents/ui-designer.md +3 -2
- package/catalog/commands/add-capability.md +4 -4
- package/catalog/commands/define.md +7 -0
- package/catalog/commands/hotfix.md +15 -1
- package/catalog/commands/pause.md +5 -0
- package/catalog/commands/resume.md +38 -10
- package/catalog/commands/triage.md +4 -3
- package/catalog/harness.config.schema.json +40 -0
- package/catalog/hooks/lib/merge-pr.sh +699 -0
- package/catalog/schemas/tier2-events-history.md +17 -0
- package/catalog/schemas/tier2-events.md +10 -10
- package/catalog/skills/mutation-testing/SKILL.md +80 -19
- package/catalog/skills/prd-to-spec/SKILL.md +74 -2
- package/catalog/skills/raise-discovery/SKILL.md +6 -0
- package/catalog/skills/resolve-discovery/SKILL.md +12 -7
- package/catalog/skills/security-review/SKILL.md +119 -6
- package/catalog/skills/spec-compliance-check/SKILL.md +8 -4
- package/catalog/skills/spec-to-issue/SKILL.md +7 -1
- package/catalog/skills/task-closeout/SKILL.md +85 -20
- package/catalog/skills/test-gap-report/SKILL.md +4 -0
- package/catalog/skills/triage-issue/SKILL.md +65 -4
- package/catalog/skills/verify/SKILL.md +3 -0
- package/catalog/templates/claude-code/agents.md.tpl +50 -16
- package/catalog/templates/claude-code/harness.config.yml.tpl +33 -0
- package/dist/cli.mjs +744 -37
- package/package.json +10 -6
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# UI design (DEFINE + REVIEW) — Orchestrator companion
|
|
2
|
+
|
|
3
|
+
> Vendor companion to `.claude/agents/orchestrator.md` (the hat). **Read on
|
|
4
|
+
> demand, never at boot** — and never just to evaluate the activation gate: the
|
|
5
|
+
> gate's canonical two-part statement lives in the orchestrator's L1 step 3 and
|
|
6
|
+
> is evaluated there, core-only. Read this file when that gate has FIRED, when an
|
|
7
|
+
> implemented UI change reaches review (`tasks/<id>/spec/ui-handoff.md` exists),
|
|
8
|
+
> when resuming a task parked `awaiting design definition`, or on
|
|
9
|
+
> `/sync-design-tokens`.
|
|
10
|
+
|
|
11
|
+
UI design threads into an L1 task that touches UI — never a linear step. **The interactive
|
|
12
|
+
design interview is yours**: a sub-agent can't talk to the human, so at DEFINE **you** run
|
|
13
|
+
the `grill-ui` skill on your human-facing surface and author the `ui-handoff.md` contract.
|
|
14
|
+
The **UI Designer** sub-agent — always installed, invoked **on-demand**, your only invoker —
|
|
15
|
+
is your design **critic and QA**: at DEFINE it reviews the handoff you just authored (before
|
|
16
|
+
the Spec Author runs); at REVIEW it runs a mechanical pre-pass (the deterministic
|
|
17
|
+
`design-tokens` gates + the project's a11y tooling) then the `design-critique` and
|
|
18
|
+
`a11y-audit` judgment lenses, and returns one design verdict. You own the human dialogue, the
|
|
19
|
+
`ui-handoff.md` artifact, and the labels; it critiques and reports.
|
|
20
|
+
|
|
21
|
+
A third, on-demand affordance sits outside those two moments: **design-tool token sync**.
|
|
22
|
+
When the human runs `/sync-design-tokens` (or accepts the DEFINE offer when a drift check
|
|
23
|
+
shows an export is pending), dispatch the UI Designer to run its `design-tool-sync` skill.
|
|
24
|
+
It is human-reviewed both ways and tokens-only; the design tool is a projection of
|
|
25
|
+
`docs/design-tokens.json`, never a peer source of truth.
|
|
26
|
+
|
|
27
|
+
## Activation gate
|
|
28
|
+
|
|
29
|
+
Canonical statement: the orchestrator's **L1 step 3** — evaluated there, core-only,
|
|
30
|
+
before this file is ever read. Rationale worth keeping in mind when it fired on a
|
|
31
|
+
borderline call: a wasted handoff stub is cheaper than UI shipped with no design
|
|
32
|
+
pass.
|
|
33
|
+
|
|
34
|
+
## Design-stop offer
|
|
35
|
+
|
|
36
|
+
When the gate fires, **put `harness:needs-design`** on the issue and offer the human,
|
|
37
|
+
inline, in one line — three choices:
|
|
38
|
+
|
|
39
|
+
> This task touches UI. (1) **Continue** — define the design now, as part of the spec;
|
|
40
|
+
> (2) **Stop for handoff** — park here so a designer picks it up later; (3) **No UI after
|
|
41
|
+
> all** — skip design.
|
|
42
|
+
|
|
43
|
+
- **Continue** → **run `grill-ui` yourself** — the interactive design interview on your
|
|
44
|
+
human-facing surface — authoring `ui-handoff.md` under `tasks/<id>/spec/`. Then dispatch
|
|
45
|
+
the **UI Designer** (fresh context, Task tool) with the `<id>` and branch to **critique**
|
|
46
|
+
the handoff, and resolve its findings — tighten the handoff, re-ask the human, or
|
|
47
|
+
record an open question — before the Spec Author runs. The issue stays at
|
|
48
|
+
`harness:status:spec-in-progress` — design is part of completing the spec, not a new
|
|
49
|
+
lifecycle state.
|
|
50
|
+
- **Stop for handoff** → record the sub-state `awaiting design definition` in
|
|
51
|
+
`progress.md`, commit and push the task state to the branch, and stop. The task waits
|
|
52
|
+
at `spec-in-progress` (+ `harness:needs-design`) for a `/resume` (below).
|
|
53
|
+
- **No UI after all** → **remove `harness:needs-design`** and proceed with the ordinary
|
|
54
|
+
spec flow — the gate was a false positive, which bias-to-include accepts.
|
|
55
|
+
|
|
56
|
+
## Persisting personas (offer)
|
|
57
|
+
|
|
58
|
+
`docs/personas.md` is **client-owned** — the harness consumes it, never imposes it. When your
|
|
59
|
+
`grill-ui` interview captured personas **inline** because `docs/personas.md` was **absent** (§1
|
|
60
|
+
of the handoff), make the offer — a human-facing choice, so it is yours:
|
|
61
|
+
|
|
62
|
+
> The design defined these personas inline. Persist them to `docs/personas.md` so future UI
|
|
63
|
+
> tasks reuse them? (yes / no)
|
|
64
|
+
|
|
65
|
+
- **Yes** → write a minimal `docs/personas.md` from the personas already in the handoff's §1
|
|
66
|
+
— the client's own words, not an invented cast. Then continue toward spec-ready.
|
|
67
|
+
- **No** → write nothing; the inline personas live on in the handoff for this task. The next
|
|
68
|
+
UI task simply asks again.
|
|
69
|
+
|
|
70
|
+
Only offer when the file was **absent and personas were captured inline** — never when
|
|
71
|
+
`docs/personas.md` already exists (it was consumed, nothing to persist) and never unasked.
|
|
72
|
+
This is opt-in surfacing of the client's own answers, not the harness authoring a persona set.
|
|
73
|
+
|
|
74
|
+
## Design-tokens & design-tool on-ramp (offer)
|
|
75
|
+
|
|
76
|
+
`docs/design-tokens.json` and a design-tool connection are **client-owned inputs** — consumed if
|
|
77
|
+
present, never imposed. A repo adopting the harness fresh has neither, and silence there is a dead
|
|
78
|
+
end. So when your `grill-ui` interview finds **either absent**, surface it as an opt-in offer (a
|
|
79
|
+
human-facing choice, so it is yours) rather than only an open question:
|
|
80
|
+
|
|
81
|
+
- **No `docs/design-tokens.json`** → offer to **scaffold** a starter token set derived from the
|
|
82
|
+
direction the interview just settled (the client's own colours/type/spacing, not a vendor
|
|
83
|
+
template), plus an opt-in follow-up to generate a sensible starter set for the aspects the
|
|
84
|
+
interview didn't cover. On **yes**, write the file and run `lemony design-tokens validate` before
|
|
85
|
+
closing; on **no**, capture it as an open question.
|
|
86
|
+
- **No `com.lemony.design-tool` binding** → offer to **connect a design tool** (write the binding +
|
|
87
|
+
first import via the UI Designer's `design-tool-sync` skill / `/sync-design-tokens`), or **stay
|
|
88
|
+
pure-code**. Skip gracefully if the tool's MCP bridge is unavailable; never connect unasked.
|
|
89
|
+
|
|
90
|
+
The mechanics live in the `grill-ui` skill; you run the offers on your human-facing surface. Only
|
|
91
|
+
offer when the input is **absent** — never re-offer a token file or binding that already exists.
|
|
92
|
+
|
|
93
|
+
## Label put/remove
|
|
94
|
+
|
|
95
|
+
`harness:needs-design` is an **orthogonal presence flag** (same family as
|
|
96
|
+
`harness:architecture-drift`), never a status:
|
|
97
|
+
|
|
98
|
+
- **Put** it as soon as the gate classifies the task as touching UI and design is not
|
|
99
|
+
yet complete.
|
|
100
|
+
- **Remove** it the moment `ui-handoff.md` is **complete** — at or before the flip to
|
|
101
|
+
`harness:status:spec-ready`. **Complete** = the handoff carries **this task's** design
|
|
102
|
+
decisions (its sections hold real content, not the verbatim placeholder template), the UI
|
|
103
|
+
Designer's critique **passed** (or you resolved its findings), and **no** open design fork
|
|
104
|
+
remains (an open fork means design is still open — keep the label and resolve it first).
|
|
105
|
+
Ensure the label is gone **before** flipping to `spec-ready`: a spec-ready task never
|
|
106
|
+
carries `harness:needs-design`.
|
|
107
|
+
|
|
108
|
+
## `awaiting design definition` sub-state + /resume re-entry
|
|
109
|
+
|
|
110
|
+
A task parked at "stop for handoff" sits at `harness:status:spec-in-progress` with
|
|
111
|
+
`progress.md` recording the sub-state `awaiting design definition`. It is the design
|
|
112
|
+
analogue of the step-by-step `awaiting human checkpoint` line — execution state, not a
|
|
113
|
+
label. `/resume <id>` re-enters there: check out the branch, read the captured context,
|
|
114
|
+
resume the `grill-ui` interview yourself to finish `ui-handoff.md`, dispatch the UI Designer
|
|
115
|
+
to critique it, then remove `harness:needs-design` and continue toward spec-ready. The resume
|
|
116
|
+
queue surfaces the parked design (`resume.md` lists `spec-in-progress` too).
|
|
117
|
+
|
|
118
|
+
## REVIEW — the design lens
|
|
119
|
+
|
|
120
|
+
When an implemented UI change reaches review (L1 step 8), invoke the **UI Designer** as
|
|
121
|
+
a **distinct lens** alongside the Reviewer (code). The **durable "this task touched UI"
|
|
122
|
+
signal is the existence of `tasks/<id>/spec/ui-handoff.md`** — `harness:needs-design` is
|
|
123
|
+
already gone by spec-ready, so it can't be the cue; the handoff artifact persists and
|
|
124
|
+
survives a cold `/resume`, so it is what to check. Either lens rejecting routes back to
|
|
125
|
+
the Implementer (rejection is transient — no dedicated label); both passing reaches the
|
|
126
|
+
single human merge gate (two inputs, one gate).
|
|
127
|
+
|
|
128
|
+
The UI Designer's lens mirrors the Reviewer's own shape — a **mechanical pre-pass** (the
|
|
129
|
+
deterministic `lemony design-tokens validate` + `lemony design-tokens contrast` gates, plus the
|
|
130
|
+
project's a11y tooling), then **judgment** (`design-critique` + `a11y-audit`), returning
|
|
131
|
+
**one design verdict** with findings grouped by source (tokens / accessibility / craft).
|
|
132
|
+
The Reviewer's code lens stays design-unaware; you still see exactly two review inputs.
|
|
133
|
+
|
|
134
|
+
**Deterministic vs judgment, by level.** The two deterministic gates are cheap, agent-free
|
|
135
|
+
facts, so they run **per-step** on UI-touching steps in step-by-step mode (a bad contrast
|
|
136
|
+
in step 2 must not ride to step 6 — see the orchestrator's §Step-by-step implementation);
|
|
137
|
+
the project's a11y lint rides the per-step lint the same way. The **judgment lenses run
|
|
138
|
+
full-pass only** — design is holistic, and a mid-component critique is noise. There is no
|
|
139
|
+
per-step design agent and no new cap: a full-pass design rejection routes back like any
|
|
140
|
+
other rejection. (`lemony design-tokens validate` / `contrast` also run in CI independently of
|
|
141
|
+
review.)
|
|
142
|
+
|
|
143
|
+
## Closeout
|
|
144
|
+
|
|
145
|
+
`ui-handoff.md` lives in `tasks/<id>/spec/`, so closeout archives it with the rest of
|
|
146
|
+
the spec (`task-closeout` `git mv`s the whole `spec/` into `_archive/<id>/`) — no
|
|
147
|
+
special handling.
|
|
@@ -42,8 +42,9 @@ wishes they had on call. Hold a high bar and bring conviction:
|
|
|
42
42
|
You do **not** author the design — a sub-agent can't interview the human, so at DEFINE the
|
|
43
43
|
Orchestrator runs the `grill-ui` interview on its own surface and authors `ui-handoff.md`.
|
|
44
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
|
|
46
|
-
|
|
45
|
+
off-cycle affordance, design-tool token sync (authority for the label lifecycle is
|
|
46
|
+
`.claude/agents/ui-design.md`, the Orchestrator's UI-design companion; the activation
|
|
47
|
+
gate itself lives in the Orchestrator's L1 step 3, core-only).
|
|
47
48
|
|
|
48
49
|
**DEFINE — critique the handoff.** After the Orchestrator authors `ui-handoff.md` and
|
|
49
50
|
**before** it dispatches the Spec Author, it dispatches you (fresh context) to review that
|
|
@@ -43,10 +43,10 @@ latent ones.
|
|
|
43
43
|
reports the project has no meaningful architecture to map, it writes nothing: relay
|
|
44
44
|
that to the user and **end the command** — skip step 4, force nothing.
|
|
45
45
|
|
|
46
|
-
- **Any other latent capability
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
- **Any other latent capability**: it has no guided activation. Say so plainly and
|
|
47
|
+
**end the command** — do **not** fabricate the artifact. (Guided activation beyond
|
|
48
|
+
the architecture map is a deliberate non-feature, not a pending seam; wiring one up
|
|
49
|
+
for a future capability is its own decision.)
|
|
50
50
|
|
|
51
51
|
4. **Re-sync so the gated skill installs** — only when step 3 actually wrote the artifact.
|
|
52
52
|
Run:
|
|
@@ -22,3 +22,10 @@ self-approve, and move the `harness:status:*` labels per the lifecycle.
|
|
|
22
22
|
If the task turns out to be too small for the full ceremony — nothing to specify,
|
|
23
23
|
verify, or review — nudge toward `/triage` (L2) or `/bypass` (L3) per the task-fit
|
|
24
24
|
dial (`.claude/agents/fit-assessment.md`). When in doubt, keep it in the harness.
|
|
25
|
+
|
|
26
|
+
The dial's ceiling is the **partition question**: if the closed PRD bundles separable,
|
|
27
|
+
independently mergeable wants, the orchestrator asks — at the define's close, before
|
|
28
|
+
opening the task — whether to cut the feature into several issues, each its own
|
|
29
|
+
branch, PR and merge gate (authority: `.claude/agents/partition.md`, read on trigger).
|
|
30
|
+
An approved cut opens a parent partition-plan issue (`harness:partition-plan`, never a
|
|
31
|
+
task) and Part 1 as a normal task; later parts open at their turn.
|
|
@@ -23,7 +23,21 @@ question to capture it, then proceed.
|
|
|
23
23
|
issue, so it auto-closes on merge).
|
|
24
24
|
3. **Skip the human-wait gates.** Do **not** pause for an approval gate, and do
|
|
25
25
|
**not** wait on the merge gate — merge/ship as soon as the test is green and CI
|
|
26
|
-
passes.
|
|
26
|
+
passes. "As soon as CI passes" is mechanical, not a vibe: execute the merge
|
|
27
|
+
through the checks-precondition executor
|
|
28
|
+
(`.claude/hooks/lib/merge-pr.sh <pr> --squash` — no `--approve-issue` here:
|
|
29
|
+
the hotfix review runs async, so there is no APPROVE to bind at merge time;
|
|
30
|
+
the stale-approve guard belongs to the reviewed task path), which waits for green and
|
|
31
|
+
refuses red or absent checks — urgency skips the _human_ wait, never the
|
|
32
|
+
verification. This is the one path where you don't wait for a human to sign
|
|
33
|
+
off first. On any non-zero exit (red / no checks / timeout / no verdict),
|
|
34
|
+
act on the exit code exactly as the Orchestrator's "Executing an authorized
|
|
35
|
+
merge — the checks precondition" section prescribes: surface the real state
|
|
36
|
+
and ask. Urgency never authorizes `--force` on your own initiative — a fire
|
|
37
|
+
does not lower the bar for merging on red or unverified checks. One
|
|
38
|
+
adaptation: a standing no-checks answer has no closeout PR to ride on this
|
|
39
|
+
path — commit the `merge.allow_no_checks: true` line onto the **hotfix
|
|
40
|
+
branch** before merging, so it lands with the hotfix PR.
|
|
27
41
|
4. **Run the Reviewer asynchronously.** After shipping, dispatch the **Reviewer**
|
|
28
42
|
sub-agent (fresh context, `senior-review`) on the merged change. The review is not
|
|
29
43
|
skipped — it's deferred. If it surfaces problems, file a follow-up fix (a normal
|
|
@@ -50,3 +50,8 @@ A two-step pause:
|
|
|
50
50
|
|
|
51
51
|
The hook prints `git status --porcelain` after emitting — it never
|
|
52
52
|
auto-commits. Decide what (if anything) to stage and commit before leaving.
|
|
53
|
+
Exception — a task running **pre-commit review ON** (orchestrator §Pre-commit
|
|
54
|
+
review ON): do **not** commit; the zero-commit deferral binds `/pause` too.
|
|
55
|
+
Leave the staged save-point untouched (it survives the session; staging
|
|
56
|
+
anything now is the mid-experiment `add` the protocol forbids), note the pause
|
|
57
|
+
in `progress.md` — disk-only, per the mode's contract.
|
|
@@ -16,8 +16,11 @@ is the single source for the procedure.
|
|
|
16
16
|
parked at `awaiting design definition` (+ `harness:needs-design`), and
|
|
17
17
|
`-l harness:status:pending` for stubs captured by `/spinoff`), plus parked closeouts
|
|
18
18
|
(`-l harness:status:closeout-pending --state all` — their issue is already **closed** by
|
|
19
|
-
the task PR's `Closes #<id>`, so an open-only listing would miss them), and
|
|
20
|
-
|
|
19
|
+
the task PR's `Closes #<id>`, so an open-only listing would miss them), and **partition
|
|
20
|
+
parents** (`-l harness:partition-plan` — not tasks; one with unticked parts surfaces as
|
|
21
|
+
"partition in progress: next part per the plan" — or "waiting on #<id> (Part <j>)" when
|
|
22
|
+
the next row is blocked by an in-flight child — and resuming it starts the next eligible
|
|
23
|
+
part, or names the blocker, per `.claude/agents/partition.md`), and ask which to pick up.
|
|
21
24
|
|
|
22
25
|
In brief (authority is the orchestrator): for an SDD task the state and spec live
|
|
23
26
|
**only on the branch** until merge — `git fetch` and check out `harness/<id>-<slug>`
|
|
@@ -27,21 +30,41 @@ In brief (authority is the orchestrator): for an SDD task the state and spec liv
|
|
|
27
30
|
resumes at the **approval gate** (run it — read the spec cold, never self-approve);
|
|
28
31
|
an `in-progress` one resumes at the active subtask. A `spec-in-progress` task whose
|
|
29
32
|
`progress.md` records `awaiting design definition` is a **UI design parked at "stop for
|
|
30
|
-
handoff"** (authority:
|
|
33
|
+
handoff"** (authority: `.claude/agents/ui-design.md`): re-enter by **resuming the `grill-ui`
|
|
31
34
|
interview yourself** to finish `ui-handoff.md` (the UI Designer then critiques it), then
|
|
32
35
|
drop `harness:needs-design` and continue toward spec-ready. When `progress.md` records
|
|
33
36
|
`Mode: step-by-step`, the `## Step log` carries the step sub-state — resume
|
|
34
37
|
exactly there: `awaiting human checkpoint (step N/M)` re-presents that pending
|
|
35
|
-
checkpoint (inspect / run / OK / changes / OK+downgrade
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
checkpoint (inspect / run / OK / changes / OK+downgrade; in all-at-once under
|
|
39
|
+
pre-commit review ON the line carries no `(step N/M)` counter — same
|
|
40
|
+
re-entry); a `fix-loop iteration K`
|
|
41
|
+
line re-enters the per-step implement→review loop at that iteration; an
|
|
42
|
+
`awaiting ledger retry (step N/M, retry 1/1)` line — or its full-pass twin
|
|
43
|
+
`awaiting ledger retry (full pass, retry 1/1)` — re-runs
|
|
44
|
+
`lemony review-ledger validate` on the sidecar on disk (`--anchor` per the
|
|
45
|
+
orchestrator: per-step, the `(anchor <oid>)` on the step-log line; full pass, the
|
|
46
|
+
fingerprint merge-base — except pre-commit review ON's pre-gate twin, which anchors
|
|
47
|
+
at the recorded single-group anchor, = the branch head: ON defers every commit) —
|
|
48
|
+
green re-presents the gate
|
|
49
|
+
the pass feeds, red goes to that gate with the verb's lines, the single retry being spent
|
|
50
|
+
(authority: the orchestrator §Step-by-step implementation). If the Mode line carries a
|
|
38
51
|
`(downgraded to all-at-once at step N)` suffix, the remaining tasks run all-at-once —
|
|
39
52
|
resume at the active subtask as usual, not via the step loop (the Step log is then
|
|
40
53
|
history, not sub-state).
|
|
41
54
|
|
|
42
55
|
**Cross-machine pickup of an `in-progress` task**: the branch on origin
|
|
43
56
|
carries the last **successful** best-effort WIP push — the Implementer pushes on
|
|
44
|
-
signaling done, and step-by-step pushes at each checkpoint-wait.
|
|
57
|
+
signaling done, and step-by-step pushes at each checkpoint-wait. Exception: a task
|
|
58
|
+
running **pre-commit review ON** defers every commit and push until a checkpoint OK
|
|
59
|
+
— in-flight work and its `progress.md` updates exist only in the implementing
|
|
60
|
+
machine's worktree, so from another machine the branch reads as of the last OK'd
|
|
61
|
+
group; before the first OK it is **indistinguishable from idle** (the knob record
|
|
62
|
+
itself is deferred — the documented price of the mode, orchestrator §Pre-commit
|
|
63
|
+
review ON). When config pins `implementation.pre_commit_review: on`, or the
|
|
64
|
+
branch's `progress.md` already carries the `Pre-commit review: on` line (some OK
|
|
65
|
+
landed), surface the mode instead of concluding the task is idle. A discovery
|
|
66
|
+
pause still surfaces cross-machine via its labels and issue comment, though the
|
|
67
|
+
full `discoveries.md` entry stays machine-local. If a **local** copy
|
|
45
68
|
of the branch is ahead of origin, prefer it (it is the newer state — this is what
|
|
46
69
|
makes same-machine resume lossless). From a **different** machine, anything committed
|
|
47
70
|
after the last successful push is unreachable and undetectable (origin is
|
|
@@ -51,9 +74,14 @@ checkpoint is a conscious replay, not a silent assumption. An `in-review` one re
|
|
|
51
74
|
**merge gate**: surface the open PR's review comments and run the merge-gate procedure
|
|
52
75
|
(route change-requests back to the Implementer, then offer to post threaded replies —
|
|
53
76
|
authority is the orchestrator). A `closeout-pending` task has **nothing to check out** —
|
|
54
|
-
its task PR already merged and its state is archived under `_archive/<id>/`:
|
|
55
|
-
`
|
|
56
|
-
|
|
77
|
+
its task PR already merged and its state is archived under `_archive/<id>/`: if the open
|
|
78
|
+
`harness/closeout-<id>` record PR is still unmerged, **re-run the self-merge executor on
|
|
79
|
+
it** (`.claude/hooks/lib/merge-pr.sh harness/closeout-<id> --squash --delete-branch` —
|
|
80
|
+
the skill's step-5 line verbatim, flags included: a bare invocation is rejected by
|
|
81
|
+
`gh pr merge` non-interactively and would re-park forever. The park may have been a
|
|
82
|
+
transient pending/red that has since settled; a repeat not-green re-parks), then re-enter the
|
|
83
|
+
`task-closeout` skill at its **finalize** step (step 6) once that PR is merged — the
|
|
84
|
+
skill owns the finalize operations
|
|
57
85
|
(delete the task branch, flip to `done`, emit `task_done`, close the issue). A
|
|
58
86
|
`pending` stub has **no branch
|
|
59
87
|
yet** — nothing to check out: read the captured context (the title is the symptom; the
|
|
@@ -6,14 +6,15 @@ allowed-tools: Read, Write, Edit, Bash, Task, Skill
|
|
|
6
6
|
# /triage
|
|
7
7
|
|
|
8
8
|
Enter **TRIAGE** mode and run the **L2 lightweight round-trip** exactly as specified
|
|
9
|
-
in `.claude/agents/
|
|
10
|
-
**forces the mode** —
|
|
9
|
+
in `.claude/agents/triage.md` (the orchestrator's lazy companion). This command only
|
|
10
|
+
**forces the mode** — that file is the single source for the steps.
|
|
11
11
|
|
|
12
12
|
`$ARGUMENTS` is the bug report (the symptom, repro, or error). If empty, ask one
|
|
13
13
|
question to capture it, then proceed.
|
|
14
14
|
|
|
15
15
|
In brief (authority is the orchestrator): triage the codebase to find the root cause
|
|
16
|
-
|
|
16
|
+
draft a TDD-based fix plan and declare the risk surfaces (`triage-issue`), creating
|
|
17
|
+
the issue with
|
|
17
18
|
`harness:managed` (no `harness:sdd` — its absence marks the lightweight path), then
|
|
18
19
|
branch and scaffold `progress.md`, implement (`tdd`), review (`senior-review`), and
|
|
19
20
|
run the human merge gate before closeout. L2 skips the spec and its approval gate, but
|
|
@@ -92,6 +92,46 @@
|
|
|
92
92
|
}
|
|
93
93
|
},
|
|
94
94
|
"additionalProperties": false
|
|
95
|
+
},
|
|
96
|
+
"merge": {
|
|
97
|
+
"default": {},
|
|
98
|
+
"type": "object",
|
|
99
|
+
"properties": {
|
|
100
|
+
"checks_timeout_secs": {
|
|
101
|
+
"default": 600,
|
|
102
|
+
"type": "integer",
|
|
103
|
+
"exclusiveMinimum": 0,
|
|
104
|
+
"maximum": 9007199254740991
|
|
105
|
+
},
|
|
106
|
+
"allow_no_checks": {
|
|
107
|
+
"default": false,
|
|
108
|
+
"type": "boolean"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"additionalProperties": false
|
|
112
|
+
},
|
|
113
|
+
"implementation": {
|
|
114
|
+
"default": {},
|
|
115
|
+
"type": "object",
|
|
116
|
+
"properties": {
|
|
117
|
+
"pre_commit_review": {
|
|
118
|
+
"default": "human",
|
|
119
|
+
"type": "string",
|
|
120
|
+
"enum": [
|
|
121
|
+
"human",
|
|
122
|
+
"on",
|
|
123
|
+
"off"
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"additionalProperties": false
|
|
128
|
+
},
|
|
129
|
+
"gates": {
|
|
130
|
+
"type": "array",
|
|
131
|
+
"items": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"minLength": 1
|
|
134
|
+
}
|
|
95
135
|
}
|
|
96
136
|
},
|
|
97
137
|
"required": [
|