Go to bed. Wake up to reviewed PRs and a short list of questions.
stu turns your Claude Code session into a blind supervisor. It hands out the work, checks every return mechanically, and stops rather than guess.
/stu:init
Answer a few questions about your repo.
/stu:run "<objective>"
Name the work. Walk away.
/stu:settle
Answer what it parked, one at a time.
/plugin install stu --marketplace keavi-app/stu-claude
Why long runs go wrong
- Runs drift.Three hours in, the session is busy with work nobody asked for.
- Agents self-certify."Done" is a word the agent typed.
- Checks lie.A check that never ran looks the same as one that passed.
- Questions get guessed.Calls you would have made differently, made at 3 a.m.
- Pushes go unseen.The agent that wrote the change also ships it.
What a run looks like
> /stu:run parleq 0.45.1 bug fixesobjective written · 3 units · cycle cap 4cycle 1 orchestrator (opus)1reviewer finished. Relayed; result not read.checked engine:c0 on main tag 0.6.2cycle 2 orchestrator (sonnet)2interim "c1 has landed and been tagged." Not counted until the cycle's result passes the checks.checked engine:c1 on main tag 0.6.3checked parleq-speech:p1 reviewed · gated · pin 0.6.3DONE 3 of 3 units closed · 2 of 4 cycles3awaiting your approval to push:parleq-speech:p1 fix/0.45.1-bug-fixes 2754016! stu-approve parleq-speech:p1 2754016f99342736010fd6dc46adf8ec0672fd3b
- 1Blind supervisorIt passes on that a reviewer finished. It never reads what the reviewer said.
- 2Fail closedA claim in prose counts for nothing until the cycle's result passes all five checks.
- 3Your checkpointThis repo is marked, so the push waits for you to approve that exact commit.
Condensed from the supervisor's own messages during the Parleq trial, with the private engine repo shown as engine.
How stu works
A supervisor that stays small
Your session holds only unit IDs and a scoreboard, and never reads the work. Its context is designed to stay flat; if it grows anyway, the run ends at the next cycle.
- you
- supervisorholds: unit IDs, scoreboardreads: nothing
- orchestratorfresh each cyclewrites no code
- implementerwritesreviewerat one SHAmerge gateown evidencescout, verifierread-only
Checks that stop the run instead of trusting it
Every return is checked against the scoreboard with set operations. A failure gets one repair at most, then the run stops.
- returnID sets
- five checks, every return
- 1every ID was issuedno invented work
- 2no silent new unitsno scope creep
- 3DONE means none leftno "done" with work open
- 4a premise to verifyno self-certified claims
- 5progress, not spinningno burned night
- all passscoreboard updated; next cycle, or DONEa failone repair, at mostfails again: STOPfail closed, nothing guessed
Questions wait for you; the run keeps going
A question only you can answer parks one unit, with a recommendation. Settle it later in a fresh session.
- unit 3 needs youyour call
- parkedwith a recommendation
- others continueunits 1 and 2
- /stu:settleone at a time
- resumeanswers go back in
Repos you mark wait for your approval
On a marked repo, an agent's push stops at a git hook until you approve that exact commit. Elsewhere, the merge gate merges only the SHA that was reviewed.
- git pushfrom the agent
- before-pushrefused: not approved
- stu-approve <unit> <sha>you run it, not the agent
- pushthat SHA only
- git pushyour terminal
- pushstraight through; public repos still get the leak scan
- reviewedby an agent that did not write it
- merge gatecollects its own evidence
- merged at the reviewed SHAor reported for you to merge
A budget on every agent
Turn and context budgets, enforced live by a hook, with a native maxTurns backstop. Each role gets the cheapest model that does the job.
| Role | Model | Turn budget |
|---|---|---|
| supervisor | your session | 4 cycles (8 overnight) |
| orchestrator | opus on cycle 1, then sonnet | 120 · backstop 190 |
| implementer | sonnet | 140 · backstop 220 |
| reviewer, merge gate, verifier | sonnet | |
| scout | haiku |
Proof: the Parleq trial
- c0
- tag 0.6.2
- c1
- tag 0.6.3
- waits for 0.6.3
- p1 · pin 0.6.3
- approved
- v0.45.1
Check it: the v0.45.1 release and PR #131. Every rule in stu is backed by a measured failure, written up in the design rationale, and its known limits are listed too.
Prefer the shell?
claude plugin marketplace add keavi-app/stu-claude
claude plugin install stu@keavi --scope user
Needs Claude Code 2.1.310 or later, an authenticated gh, git 2.31+ and Python 3.9+. macOS, Linux or WSL.