Sandbox for the Finn loop — a spec/build/review AI software factory. Every feature here is built BY the loop (human-gated), never hand-coded. This repo is the testbed that graduates the loop into real repos later.
Stack: Next.js 16 App Router · TS · Tailwind · bun. Commands: bun run typecheck / bun run build / bun run dev.
Flow: idea → /finn-spec interviews you and files a GitHub issue → a HUMAN applies the
agent-ready label → /loop /finn-build claims it (self-assigns @me) and opens a PR →
/loop /finn-review posts a Finn-loop review of <SHA> verdict + labels → a HUMAN merges in
the GitHub UI (issue auto-closes via Closes #N).
Labels (the whole state machine):
| Scope | Label | Meaning |
|---|---|---|
| Issue | agent-ready |
human-approved, ready to build (humans-only apply) |
| Issue | blocked |
builder hit an open question; unassigned + comment |
| PR | loop-approved |
review passed |
| PR | loop-changes-requested |
review found fixable issues |
| PR | needs-human-review |
review needs a human call |
Hard rules:
- Humans merge, always. Skills never run
gh pr merge. - Only humans apply
agent-ready./finn-specfiles the issue unlabeled. - One pass = one unit of work. Don't batch issues or bundle scope.
- Specs carry AC-N (observable acceptance criteria) + NG-N (binding non-goals).
- Branch naming
issue-NNN-slug; PR bodies carry the scope ledger incl. the literal lineOther behavior changes: None. - Only ONE builder loop at a time — never run parallel
/finn-build.
Notify-only to #loop-lab (merge-ready PRs + blocked questions), best-effort. When the Slack MCP
is absent (headless), skills print [slack-degraded] and continue — merge-ready discovery falls
back to gh pr list --label loop-approved. Slack is a control surface, never state.
- Loop sessions run on Opus — Gian sets
/model opusbefore/loop; skills don't pin models. - No secret values in any file —
.env.local(gitignored) + the Keychain rail only. - Loop labels are factory state, not personal tasks — no ClickUp coupling.
- Acceptance test passed here (specced → built → reviewed → merged with zero manual edits).
- Target repo has the required CI check on its default branch; the 5 labels created there.
settings.jsonallowlist + Stop hook adapted to the target's script names.- Loop section APPENDED to the target's existing
AGENTS.md(never replace). - One watched build+review pass observed before any unattended
/loop.