Open-source · additive layer on GSD · MIT

Talk to the
Conductor.
It handles the rest.

One command, one session, always-on Kiwi. The Conductor auto-scales from a quick fix to a full parallel pipeline and runs immediately by default. Pass --plan-only to preview. Real merges and PRs are human-gated. Never a silent green.

v0–v3 built · all verified Conductor codename Kiwi No silent green, ever
02 · what bgsd does

The make-or-break guarantee.

Every path through the pipeline — a one-agent quick fix or a twelve-unit project — ends in a verified result. The console errors a screenshot misses are caught. Always.

The Conductor is always on

Kiwi is the only interface. You describe what you need; the Conductor detects scale, decides how many agents to run, and orchestrates the full pipeline. You never call verify, queue, or run directly — those are stages Kiwi manages.

Single entry: /bgsd-sesh
Console-first verification

The driver ladder checks console messages before it ever looks at the DOM or takes a screenshot. React's validateDOMNesting warnings, hydration mismatches, and missing-key errors all fire at console level — invisible to visual regression tools. bgsd surfaces them on every run, at every scale.

Rung 1 of 4
Same pipeline, scaled

Quick fix? One agent, direct execution, Loop 1 verify→fix. Full project? Decompose into a DAG, parallel worktrees, Loop 1 per worktree, merge, Loop 2 integration, review gate. The pipeline is the same — scale determines depth and width. --quick still verifies. Always.

Auto-scale · --quick · --feature · --project
Structured defect reports

Every verification run writes a schema-validated verification-report.json: per-criterion pass/fail, defect list with severity and source rung, screenshot index, and a driver-ladder audit. Machine-readable. Actionable. No ambiguity.

REPORT-01..03
No silent green, ever

If the Playwright MCP is absent, bgsd emits BLOCKED — not a fabricated PASS. If evidence is insufficient, verdict is INSUFFICIENT_EVIDENCE. Every non-clean stop produces a structured terminal state. Enforced in code, not just aspirationally documented.

NFR-06
Additive, never destructive

bgsd lives under bgsd/. It never edits vendored GSD directories (commands/, agents/, gsd-core/, etc.). It reaches GSD only through three stable seams: /gsd-* slash commands, the .planning/ file contract, and config.json.

NFR-01..04
A backlog that drains across sessions

Defer scope mid-session and Kiwi queues it instead of losing it. Start /bgsd-sesh with no prompt, or finish a session, and Kiwi proposes the next backlog item. Work carries over without you re-typing a thing.

defer → backlog → next
Every question is a selector

When Kiwi needs an answer, it asks with a GSD-style arrow-key selector: a few concrete options plus a type-your-own. A vague prompt, a gray-area call, the review gate, "which item next" all come as a pick, never a wall of prose.

AskUserQuestion
Code-only verification when you want it

The goal-backward code check always runs. The heavier Playwright UI testing is optional: pass --no-usage-verification, set it in BGSD.md, or just tell Kiwi. Quick fixes and non-UI changes skip the browser, never the check.

--no-usage-verification
Resume an interrupted session

Lost the Claude Code instance mid-run? Every unit's progress is on disk under .bgsd/runs/. /bgsd-resume finds the latest in-flight session and picks it back up from each unit's last phase. main stays protected.

/bgsd-resume
Watch it all live with --gui

Pass --gui and Kiwi opens a local dashboard: the parallel Loop 1 agents, verification, the Loop 2 integrator, and the review gate, each card showing its GSD substage, status, and progress. Ask Kiwi to open or close it any time.

/bgsd-gui
03 · how it works

The four-rung driver ladder.

Cheapest and most reliable first. Vision is a last resort, not a crutch.

rung 1 · console messages
Most bugs die here

browser_navigate then browser_console_messages. Timing is critical: navigate first so the MCP buffer captures React render-time warnings. This rung caught the validateDOMNesting defect in the canary proof.

rung 2 · network requests
Surface 4xx / 5xx silently swallowed

browser_network_requests. Flags any response where ok === false or status ≥ 400 for a required resource. Analytics beacons are noted but not automatically treated as failures.

rung 3 · dom snapshot
Semantic structure, not pixels

browser_snapshot after domcontentloaded. networkidle is explicitly prohibited (DRIVER-04) — apps with WebSockets or analytics beacons can hang indefinitely. Semantic selectors (roles, labels, headings) verify rendered content against criteria.

rung 4 · vision (fallback only)
Last resort for purely visual criteria

browser_take_screenshot. Fires only when rungs 1–3 cannot decide a criterion. Vision tokens are expensive and screenshots are blind to console and network defects. bgsd uses them last, not first.

Pre-flight MCP probe

Before any acceptance criterion is touched, bgsd calls browser_snapshot as a no-op reachability check. If the MCP is absent, the run halts immediately:

{
  "verdict": "BLOCKED",
  "reason": "mcp_unavailable",
  "install_guidance":
    "claude mcp add playwright ..."
}

No result is fabricated. This is the "no silent green" invariant.

Verdict stdout contract

The only thing that reaches stdout is a single verdict line. The full JSON report lands on disk, never in the terminal.

PASS  .bgsd/runs/<run-id>/verification-report.json
FAIL  .bgsd/runs/<run-id>/verification-report.json
ERROR  .bgsd/runs/<run-id>/verification-report.json
04 · stages the conductor runs

You talk. Kiwi orchestrates.

These are the internal stages the Conductor runs on your behalf inside a /bgsd-sesh session. You never call them directly.

verify stage v0 proven

Boots or attaches to a running app and verifies it against acceptance criteria. Returns a single verdict line plus a structured verification-report.json. Runs inside every Loop 1 and Loop 2 cycle. If the driver ladder can't drive a real browser, it emits BLOCKED — never a fabricated pass.

classify + fix-stream v1 built

Items move through classify → route → execute → verify → Loop 1 until a terminal state. The Conductor feeds items in from your prompt; each item's history is recorded in a durable, append-only store with content-key dedup.

orchestration engine v2 built

For project-scale prompts: decompose into a verified DAG, fan units across parallel git worktrees, run Loop 1 per worktree, conflict-check and merge verified branches into the standing next integration branch, and checkpoint at every wave boundary. The live path requires explicit --live.

live status view v2 built

Kiwi's always-on dashboard. Color-coded per-worktree badges, Loop 1 iteration counts, merge history, budget and context telemetry, and a main-protected indicator (marking that main is never written by an agent). Zero model calls. The Conductor displays this automatically; you can also run it standalone with --watch.

Loop 2 + review gate v3 built

Integration verify→fix on the standing next branch: boot the integrated app, dispatch parallel fix agents on defects, re-merge, re-verify. Followed by the User Review Gate: per-criterion checklist, your explicit sign-off. Never auto-passes.

feedback + CHANGELOG v3 built

Turns your review findings into a new fix pass. Aggregates per-agent CHANGELOGs across Loop 1, Loop 2, and feedback rounds into a PR body. Opens an atomic PR into next behind the --live guard; nextmain stays human-only.

04b · scale comparison

One flag. One guarantee. Three scales.

A session runs by default. Pass --plan-only (or --dry-run) to preview without executing. A manual scale flag always wins, unconditionally. The pipeline integrates everything on the standing next branch; agents never write to main, and the nextmain merge is human-only.

--quick --feature --project
Example "change this button to blue" "add a dark-mode toggle" "build auth + billing + a dashboard"
Auto-scale trigger ≤2 units, 1 surface a few units, mid-size ≥4 units or ≥3 surfaces
Upfront discussion no no yes (intake/brainstorm)
Decompose + parallel worktrees no — single some, low concurrency full fan-out
Integration loop (Loop 2) no yes if >1 unit yes
Formal review gate no (Loop 1 PASS + 1-line confirm) yes yes
Verification (Loop 1) always always always

No silent green at any scale. Every path through the pipeline — quick, feature, or project — exits through Loop 1 with a real browser check. A structured verification-report.json is produced on every run. BLOCKED if the MCP is absent. INSUFFICIENT_EVIDENCE if evidence is thin. Never a fabricated PASS.

05 · milestones

Proven in order. Built to deepen.

Each version de-risks the next. The core value was validated at v0, before any orchestration was built on top of it. v0 through v3 are all built.

v0 proven
Verify engine — the make-or-break test

Proven in isolation before any orchestration was built on top. The verify stage returned FAIL on a <div>-in-<p> defect (a real React console error invisible to a screenshot) and PASS on the clean route, reproducibly across reruns. Tester, runtime-isolate, criteria parser, report assembler, and schema all live.

v1 built
Fix-stream + Loop 1

Persistent fix-stream with classify → route → execute → verify → loop. Queue, classify-item, route-item, and loop1 scripts with 85 unit tests across all four layers. Live runs (Loop 1 autonomous spawn, Hyperpolymath cron) are guarded behind --live and remain human-gated.

v2 built
Conductor (Kiwi) + parallel orchestration + live status

Full Conductor pipeline: decomposition, dependency graph, worktree fan-out, wave scheduler, conflict pre-check + merge-resolver, integration onto the standing next branch, doc aggregation, reversible cleanup, context management, and the live status view. 14 test suites green across v0+v1+v2. Live multi-process run is human-gated behind --live.

v3 built
Loop 2 + User Review Gate + feedback mode

Integration verify→fix (Loop 2) on the standing next branch, per-criterion User Review Gate (never auto-passes), feedback mode for rapid iteration, per-agent CHANGELOG aggregation, and guarded gh pr create into next. 19 test suites green across v0+v1+v2+v3.

v2-intake + v4 Remote planned
Conductor intake extension + remote orchestration

Intake/proxy extension (E1–E6) for Conductor brainstorm and decision-oracle, drafted in .planning/v2-intake/. Remote orchestration (off-machine worktrees, distributed execution) planned for v4.

06 · installation

Two commands to install. One command to run everything.

Install bgsd

bgsd is an installable, standalone Claude Code plugin. Add the marketplace, install the plugin, and reload. It is gsd-agnostic: it does not vendor GSD. It uses the user-installed gsd-core plugin, and the Conductor (Kiwi) sets up what it needs (gsd-core, Playwright) at the start of every sesh. You just talk to it.

Step 1 — Add the marketplace and install the plugin
# Add the bgsd marketplace, then install the plugin
claude plugin marketplace add filippo-fonseca/better-gsd
claude plugin install bgsd@better-gsd

# Then reload so the /bgsd-* commands bind
/reload-plugins # or restart Claude Code
Step 2 — Talk to the Conductor; it provisions the rest
# Kiwi ensures gsd-core is installed and up to date at sesh start
# (claude plugin install gsd-core --scope user; claude plugin update gsd-core)
# and ensures the Playwright browser tooling is available.
# You do not run these by hand.

# Optional, to add Playwright yourself for the canary proof below:
claude mcp add playwright -- npx @playwright/mcp@0.0.76
Step 3 — Optionally run the canary proof, then start a session
# Canary proof: clean route (expect PASS)
/bgsd-verify --boot bgsd/fixtures/canary-next \
             --criteria bgsd/fixtures/canary-next/acceptance.md

# Canary proof: buggy route (expect FAIL on validateDOMNesting)
/bgsd-verify http://localhost:<port>/buggy \
             --criteria bgsd/fixtures/canary-next/acceptance.md

# One-time, idempotent repo setup (also runs as a /bgsd-sesh preflight)
/bgsd-init # create next, scaffold .bgsd/, write BGSD.md

# Then start talking to the Conductor
/bgsd-sesh "your task here" # executes (default)
/bgsd-sesh "quick fix" --quick # force quick, still verified
/bgsd-sesh "add dark-mode toggle" --feature # feature depth
/bgsd-sesh "big feature" --project # discuss first, then execute
/bgsd-sesh "..." --plan-only # preview (--dry-run alias)

The /buggy route looks identical to a working page in a screenshot. The defect only exists in the browser console: exactly what bgsd catches. Run the fixture in development mode: React's validateDOMNesting warning is stripped from production builds. /bgsd-init creates the standing next integration branch off your base branch, scaffolds the persistent .bgsd/ master folder, and writes a user-editable BGSD.md settings file. The Conductor ensures gsd-core is installed and kept up to date for you (and runs claude plugin update gsd-core to refresh it); after any plugin update, Claude Code needs /reload-plugins or a restart to apply, and Kiwi flags it. Once installed, /bgsd-sesh is all you need.

07 · hard rules

Enforced, not aspirational.

These invariants are checked in code. bgsd tells you clearly when one is about to be violated.

InvariantEnforcement
Agents never write to main main (production) is never written, committed, or PR'd by an agent. Integration lands on the standing next branch; the nextmain merge is a manual, human-only step.
Additive only bgsd lives under bgsd/ (plus runtime .bgsd*/ dirs). It never edits GSD's directories.
Never edit vendored GSD The forked GSD source (commands/, agents/, gsd-core/, skills/, hooks/) is read-only to bgsd.
Seams only bgsd reaches GSD only through (1) /gsd-* slash commands, (2) the .planning/ file contract, and (3) config.json. No reaching into GSD internals.
No silent green (NFR-06) If evidence is insufficient: INSUFFICIENT_EVIDENCE, not PASS. If MCP is absent: BLOCKED. Every non-clean stop produces a structured terminal state.
Bounded, reversible autonomy (NFR-08) Every loop is bounded by max_iterations; every Conductor run by --budget-cap; every wave requires your go/no-go. Cleanup writes a recovery file before deleting anything.
Live runs are human-gated Sessions execute by default; --plan-only / --dry-run previews. Real irreversible actions (git merge, gh pr create) are still gated at merge-boundary checkpoints behind --live. The guard checks process.argv — not environment variables — and throws a detailed refusal if absent.