feat(adw): the profile is the phase list, not a label on it - #3
Merged
Conversation
workflow-triage picked a profile and the scripts honoured it — review.sh scaled the fan-out, gate.sh scaled the required lenses — but adw-run did not. Its phases were written unconditionally, so a `light` run still paid for the scout agent, the full artifact set, the groom agent passes and a stop at G2. The two skills also disagreed in writing: triage said `light` → G7 only, adw-run said "stop for the operator" with no mention of the profile. The orchestrator won, so `light` bought a cheaper groom and a cheaper review and nothing else. adw-run now carries a phase × profile table and runs one column. Below `standard`: no scout agent (read the files — the agent protects a context this task will not fill), no groom agent (`light` runs the one lens inline), no test-author agent (write the failing test yourself and do not touch it afterwards), and no G2 — a twelve-line plan is one the operator approves without reading, and a gate that gets rubber-stamped devalues the one that must not. Adds `superlight` for work below `light`: no groom pass at all, one check, one reviewer. It needs no change to gate.sh, because the gates already accept that shape — `gate.sh plan` wants four headers and one numbered check, `gate.sh evidence` wants one evidence file, and on a task this size three of those headers are one word long. What never scales down, at any profile: the worktree, the draft PR, `gate.sh green`, `gate.sh evidence`, and one reviewer. The workspace is script-driven and takes seconds; it is what makes a run revertible and visible, and cutting it saves nothing measurable. One reviewer is the cheapest independent look at a diff there is — without it a small run is a solo run awarding itself a green tick. Adds the floor, which nothing documented before: a typo, a version bump, a comment fix should not enter the loop at all. Triage reasons about blast radius, so it will honestly answer `superlight` for a one-liner — that is not a licence to spend a worktree and a PR on it. Below the floor the cost is the operator's attention, not the tokens: a PR that says nothing teaches them to stop reading PRs. Operator override: `arguments: [profile, ref]` + `argument-hint`, so `/adw-run light SM-12` names the profile and triage is skipped. Claude Code's `:` is a plugin namespace (`/my-plugin:review`), not an option separator — `/adw-run:light` would parse as a skill `light` in a plugin `adw-run` — so arguments are the mechanism, and an unpassed named argument expands to an empty string, which makes "nobody chose" a normal branch. - scripts/gate.sh: 'superlight' added to the profile alternation. Without it "**Profile:** superlight" matches the `light` inside the word and the run is groomed as light. Order in the alternation is irrelevant — ERE is leftmost-longest, so both alternatives start at the same offset and the longer one wins either way; verified by swapping them and watching the tests stay green. superlight also skips the GROOM_LOG.md requirement, since no pass was meant to happen. The blocker check still runs: a blocker stops the run at every profile. - scripts/review.sh: `superlight` resolves to the light fan-out rather than dying as unknown. - groom-harden, slice-review, task-plan, the AGENTS.md block, the dev-prompt template and README updated to four profiles. Tests: 5 new assertions. superlight passes G1 with no ledger at all, still fails on an open blocker, and is recognised by review.sh instead of being rejected by name. Verified non-vacuous by mutation — dropping `superlight` from gate.sh's alternation fails 2, dropping it from review.sh fails 1. Suite: 116 passed, 0 failed, 1 known gap, under bash 5.2 and 3.2. VERSION 2.1.0 → 2.2.0. Refs RUS-190, RUS-191
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #2 (which is stacked on #1). Closes RUS-190 and RUS-191 — they were filed separately, but
the phase matrix and the new profile are one edit; splitting them would have meant writing the same
table twice.
The problem
workflow-triagepicked a profile and the scripts honoured it —review.sh:37scaled the fan-out,gate.sh:167scaled the required lenses — butadw-rundid not. Its phases were writtenunconditionally, so a
lightrun still paid for the scout agent, the full artifact set, the groom agentpasses and a stop at G2.
The two skills also disagreed in writing: triage said
light→ G7 only;adw-runphase 4 said"stop for the operator" with no mention of the profile. The orchestrator wins in practice, so
lightbought a cheaper groom, a cheaper review, and nothing else.
The change
adw-runcarries a phase × profile table and runs one column.superlightlightstandard/deepBelow
standardthe specialist agents go away, because their value goes away: the scout protects acontext this task will not fill, and the test-author guard exists so an implementer cannot bend a test —
when you are about to write both, the honest substitute is writing the test first and not touching it
after. G2 goes away because a twelve-line plan is one the operator approves without reading, and a gate
that gets rubber-stamped devalues the one that must not.
superlightis new: no groom pass at all, one check, one reviewer. It needed no change togate.sh's requirements —gate.sh planwants four headers and one numbered check,gate.sh evidencewants one evidence file, and on a task this size three of those headers are one word long.
What never scales down: the worktree, the draft PR,
gate.sh green,gate.sh evidence, onereviewer. The workspace takes seconds and is what makes a run revertible and visible; one reviewer is
the cheapest independent look at a diff there is.
The floor, which nothing documented before: a typo, a version bump, a comment fix should not enter
the loop at all. Triage reasons about blast radius, so it honestly answers
superlightfor a one-liner— that is not a licence to spend a worktree and a PR on it.
Operator override
/adw-run light SM-12. Claude Code's:is a plugin namespace (/my-plugin:review), not an optionseparator —
/adw-run:lightwould parse as a skilllightin a pluginadw-run. Arguments are themechanism, and an unpassed named argument expands to an empty string, so "nobody chose" stays a normal
branch.
Script changes
gate.sh:superlightadded to the profile alternation. Without it,**Profile:** superlightmatchesthe
lightinside the word and the run is groomed as light. superlight also skips theGROOM_LOG.mdrequirement — no pass was meant to happen — while the blocker check still runs, because a blocker stops
the run at every profile.
review.sh:superlightresolves to the light fan-out instead of dying as an unknown profile.How to verify
bash tests/run.sh # 116 passed, 0 failed, 1 known gap ADW_TEST_SHELL=/bin/bash bash tests/run.shNon-vacuous by mutation: dropping
superlightfromgate.sh's alternation fails 2 assertions, droppingit from
review.shfails 1.One thing worth knowing, because a comment in the first draft of this PR got it wrong: order in the
alternation is irrelevant. ERE is leftmost-longest, so
light|superlightandsuperlight|lightbothreturn
superlight— verified by swapping them and watching the suite stay green. What matters is thatthe longer word is in the list at all.
Not verified
superlightend to end. The profile is asserted at the two places ascript can see it (
gate.sh groom,review.sh); the rest is instructions to the orchestrator, andinstructions are advisory by construction.
should — the judgement is the operator's.
arguments:/argument-hint:frontmatter is documented Claude Code behaviour but has not beenexercised here;
/adw-run light SM-12has not been typed against the installed skill.