Turns the existing scheduled backlog runner (the yj-backlog cron + next-issue.md, ~50 runs) into a designed autonomous loop that carries each issue from the open list to merged main — instead of stopping at "PR open, CI green" and handing every merge to a human.
The tracker is the loop's state machine: every transition writes something the collaborator can already read (claim, plan comment, branch, PR, merge, verification). Nothing lives in a conversation.
tick root + the standing two-reviewer critique fan-out
.gitignore (+.pi/loop/), CLAUDE.md
loop state stays local; the one doc that says why shapes exist now documents the loop's switch
No code, no schema, no bindings change.
Verification run
make skill-check — green over all 47 documented targets, including the new files (also the pre-commit hook's run)
critique chain parses as JSON
every rail proof-read against measured tracker mechanics: issue.sh claim refusal semantics, the protection contexts (CI / check, CI / e2e, 0 approvals), the measured partial-match of comma-joined Closes footers (hence one-per-line in both PR body and a commit body), unclaim.yml timing
tsc/make test/ui-test/e2e not run — no Go or frontend code touched; nothing they cover changed
Deliberately not done
The loop is not switched on (no job added, no loop session open) — that is the supervised pilot, phase P0.
Emulator mode is opt-in and user-operated; device-only issues remain out of reach by design.
Parallel worktrees: deferred until the e2e port situation changes (design doc, "Not now").
## What this is
Turns the existing scheduled backlog runner (the `yj-backlog` cron + `next-issue.md`, ~50 runs) into a designed autonomous loop that carries each issue from the open list to merged `main` — instead of stopping at "PR open, CI green" and handing every merge to a human.
The tracker is the loop's state machine: every transition writes something the collaborator can already read (claim, plan comment, branch, PR, merge, verification). Nothing lives in a conversation.
## What changed, and why
| Piece | Why it is where it is |
|---|---|
| `.planning/plans/active/020-autonomous-backlog-loop.md` | design doc: tick topology, leg/state table, model routing per the tiering card, scheduling windows, merge authority, rails, pilot phases |
| `.pi/skills/yj-loop/SKILL.md` | operating procedure — the tick reads it, so protocol changes don't rewrite prompts |
| `.pi/agents/yj-loop/*` (10 agents) | each leg's role + pinned tier: mimo (mechanical), qwen/deepseek-v4-pro-0813 (implement, understood-diff review), glm-5.3 (select/plan/validate/consequences review), glm-5.3-flash (pixels), kimi-k3 (once-a-day escalation) |
| `.pi/prompts/loop-tick.md`, `.pi/chains/loop-critique.chain.json` | tick root + the standing two-reviewer critique fan-out |
| `.gitignore` (+`.pi/loop/`), `CLAUDE.md` | loop state stays local; the one doc that says why shapes exist now documents the loop's switch |
No code, no schema, no bindings change.
## Verification run
- `make skill-check` — green over all 47 documented targets, including the new files (also the pre-commit hook's run)
- critique chain parses as JSON
- every rail proof-read against measured tracker mechanics: `issue.sh claim` refusal semantics, the protection contexts (`CI / check`, `CI / e2e`, 0 approvals), the measured partial-match of comma-joined `Closes` footers (hence one-per-line in both PR body and a commit body), `unclaim.yml` timing
- `tsc`/`make test`/`ui-test`/`e2e` not run — no Go or frontend code touched; nothing they cover changed
## Deliberately not done
- The loop is not switched on (no job added, no loop session open) — that is the supervised pilot, phase P0.
- Emulator mode is opt-in and user-operated; device-only issues remain out of reach by design.
- Parallel worktrees: deferred until the e2e port situation changes (design doc, "Not now").
Closes #236
The scheduled backlog runs already claimed, fixed, verified and opened
PRs one issue at a time (~50 runs), but stopped at "PR open, CI green" —
every merge and every stale branch was human work, and the pipeline
shape existed only as one prompt file. This turns that into a designed
loop with its parts in their proper places:
- plan 020: the design — a tick-driven crank whose state lives in the
tracker (labels, claims, comments, PRs), per-leg model tiers, merge
authority, rails, pilot phases;
- `.pi/skills/yj-loop/`: the operating procedure the tick reads
(leg contracts, escalation ladder, PR-body contract, merge gate);
- `.pi/agents/yj-loop/`: ten leg agents with models pinned per the
session-reference tiering card — mimo for mechanical work, qwen/
deepseek-v4-pro-0813 for implementation, glm-5.3 for selection,
planning and consequences review, glm-5.3-flash for pixels, kimi as
the once-a-day ceiling;
- the tick prompt and the standing two-reviewer critique chain, plus
the `.pi/loop/` gitignore entry and the CLAUDE.md pointer.
The switch stays where the v0's was — `.pi/schedule-prompts.json`,
gitignored, live only while the loop's pi session is open. No code
changes. Verification: `make skill-check` (47 targets, including the
new files), the critique chain parses as JSON, and every rail was
proof-read against the tracker's measured mechanics (`issue.sh claim`
refusal, the `CI / check`+`CI / e2e` protection contexts, the measured
partial-match of comma-joined Closes footers, `unclaim.yml`).
Closes#236
logan
merged commit 2453d717cf into main2026-09-03 03:54:15 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What this is
Turns the existing scheduled backlog runner (the
yj-backlogcron +next-issue.md, ~50 runs) into a designed autonomous loop that carries each issue from the open list to mergedmain— instead of stopping at "PR open, CI green" and handing every merge to a human.The tracker is the loop's state machine: every transition writes something the collaborator can already read (claim, plan comment, branch, PR, merge, verification). Nothing lives in a conversation.
What changed, and why
.planning/plans/active/020-autonomous-backlog-loop.md.pi/skills/yj-loop/SKILL.md.pi/agents/yj-loop/*(10 agents).pi/prompts/loop-tick.md,.pi/chains/loop-critique.chain.json.gitignore(+.pi/loop/),CLAUDE.mdNo code, no schema, no bindings change.
Verification run
make skill-check— green over all 47 documented targets, including the new files (also the pre-commit hook's run)issue.sh claimrefusal semantics, the protection contexts (CI / check,CI / e2e, 0 approvals), the measured partial-match of comma-joinedClosesfooters (hence one-per-line in both PR body and a commit body),unclaim.ymltimingtsc/make test/ui-test/e2enot run — no Go or frontend code touched; nothing they cover changedDeliberately not done
Closes #236