feat(loop): autonomous backlog loop — tracker to merged main, scheduled #237

Merged
logan merged 1 commits from feat/236-autonomous-backlog-loop into main 2026-09-03 03:54:15 +00:00
Collaborator

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

## 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
logan added 1 commit 2026-09-03 03:32:37 +00:00
feat(loop): add the autonomous backlog loop configuration
CI / check (push) Skipped
CI / e2e (push) Skipped
CI / check (pull_request) Successful in 3m23s
CI / e2e (pull_request) Successful in 10m53s
e772f51982
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 main 2026-09-03 03:54:15 +00:00
Sign in to join this conversation.