A Claude Code scaffold system β shape Β· build Β· validate
codeViber drives software delivery end-to-end β from a raw requirement to validated, production-shaped code β by orchestrating a roster of specialist subagents through a fixed delivery state machine. The root conversation stays lean and acts as a controller; the work happens in bounded subagent dispatches, and progress persists across sessions in .claude/state/.
- Explore β What it is Β· Quick start Β· How it works Β· Architecture Β· Specialist subagents Β· State machine Β· Lifecycle hooks Β· Configuration Β· Docs
codeViber is a drop-in .claude/ configuration that turns a single Claude Code session into a disciplined delivery pipeline. Instead of one model improvising a whole build, codeViber breaks delivery into sequential stages, hands each stage to a purpose-built specialist subagent, and gates every advance behind a read-only validator.
Two ideas hold it together:
- A persistent state machine. Mode, current stage, decisions, the artifact index, the gap queue, and the latest validator result all live as files in
.claude/state/β so a run survives compaction and can be resumed in a fresh session rather than restarted. - A lean controller thread. An operating policy (
CLAUDE.md) keeps the root conversation under a context budget, holding only control state and delegating detailed implementation to subagents.
It is a scaffold/orchestration layer, not an application β there is nothing to deploy. You install it into a project and drive it with slash commands.
codeViber is configuration, not a package β there's no install step beyond placing the .claude/ directory in your project. Requirements: Claude Code and python3 on PATH (the lifecycle hooks are stdlib-only Python 3).
Start a run from a requirement:
/scaffold build a task management API with auth and PostgreSQL
codeViber detects the execution mode from context:
| Mode | When used |
|---|---|
greenfield |
No existing codebase β building from scratch |
brownfield |
Existing codebase β adding or modifying features |
repair |
Existing codebase β fixing broken behavior |
Then steer the run with the commands below.
| Command | Purpose |
|---|---|
/scaffold <requirement> |
Start a new orchestration run |
/resume-scaffold |
Resume from saved state at the active stage |
/continue-stage |
Continue the active stage from its checkpoint |
/validate |
Run the delivery validator (the gate between stages) |
/fix-gap <id | all-blockers> |
Route a gap to its owner and re-validate |
/plan-product <requirement> |
Shape requirements with product-designer |
/decide-stack <constraints> |
Choose a stack with tech-strategist |
/plan-seo <context> |
Run seo-expert for public-facing web products |
A full walkthrough of each command and the stage flow lives in the scaffold user guide.
Delivery is broken into sequential stages, each owned by a specialist subagent:
product β [seo] β stack β architecture β implementation β validation
The SEO stage is optional β codeViber skips it for internal tools and APIs, and runs it (between product and stack) only for public-facing web products. Validation runs automatically after each stage; when it finds problems it writes them to a gap queue, assigns each gap a primary owner, dispatches remediation, and re-validates. The root thread tracks stage, decisions, and open gaps β never raw code or logs.
The root conversation is a controller. It reads control state, dispatches one specialist subagent at a time for a bounded task, records the returned artifact, and advances only after the validator passes. State persists to disk so the controller can be rebuilt after compaction or in a new session.
flowchart LR
Op["You Β· slash commands"]
Root["Root controller<br/>(lean thread)"]
State[("`.claude/state/`<br/>state machine")]
Sub["Specialist<br/>subagents"]
Val["delivery-validator<br/>(read-only gate)"]
Op -- "/scaffold, /validate, /fix-gap" --> Root
Root -- "dispatch bounded task" --> Sub
Sub -- "decisions Β· artifact Β· risks Β· handoff" --> Root
Root -- "persist stage / gaps / artifacts" --> State
State -- "re-entry summary (hooks)" --> Root
Root -- "run gate after each stage" --> Val
Val -- "blocking / conditional gaps" --> State
Repository layout:
.
βββ .claude/
β βββ agents/ # 13 specialist subagent definitions
β βββ commands/ # 8 slash commands (the operator surface)
β βββ scripts/ # Python 3 lifecycle hooks
β βββ state/ # the persistent state machine (JSON + markdown)
β βββ settings.json # wires the hooks into Claude Code
βββ docs/adr/ # architecture decision records (written at runtime)
βββ CLAUDE.md # scaffold-first operating policy for the root thread
βββ scaffold_readme.md # the scaffold user guide
βββ LICENSE
Each stage and each gap is routed to the agent built for it. Every subagent returns the same structured contract β decisions, artifact, risks, next_steps, handoff, done_criteria β so the controller can record outcomes without absorbing the reasoning.
| Agent | Handles |
|---|---|
product-designer |
Requirements shaping, actors, flows, acceptance criteria |
tech-strategist |
Stack selection with rationale, recorded as ADRs |
solution-architect |
System shape, contracts, module boundaries |
frontend-engineer |
UI, components, state, routing |
backend-engineer |
APIs, schema, jobs, auth |
platform-engineer |
CI/CD, Docker, deployment, secrets |
test-architect |
Test strategy, coverage, test scaffolding |
security-reviewer |
Auth, authz, secrets, data exposure |
ux-optimizer |
Flow friction, error states, task efficiency |
design-system |
Tokens, typography, component consistency |
seo-expert |
Search intent, technical SEO audit, action plan |
delivery-validator |
Read-only β validates readiness, never patches |
bug-fixer |
Root-cause diagnosis and targeted fixes |
All durable state lives in .claude/state/ so a run can be resumed rather than restarted:
| File | Contents |
|---|---|
scaffold-state.json |
Current mode, stage, active plan, open gap IDs, next action |
project-summary.md |
Compact, human-readable summary of the run |
artifact-index.json |
Pointers to all produced artifacts (specs, ADRs, schemasβ¦) |
gap-queue.json |
Open gaps with severity and owner assignments |
validator-status.json |
Latest validation result and timestamp |
stage-checkpoints/ |
Per-stage snapshots for resume / continue |
Four stdlib-only Python 3 scripts in .claude/scripts/, wired through .claude/settings.json, keep the controller and the state machine in sync:
| Hook | Script | Role |
|---|---|---|
SessionStart |
session_start.py |
On startup / resume / compact, emits a concise re-entry summary (mode, stage, validator status, open gaps, next action) into the session |
PreCompact |
pre_compact.py |
Preserves control state before context compaction |
SubagentStop |
subagent_stop.py |
Captures a subagent's outcome as it finishes |
Stop |
stop_guard.py |
Fails closed β warns if blocking validator gaps are still unresolved, otherwise refreshes the summary |
The system ships ready to run; there is no .env. Behavior is defined declaratively in the repo:
.claude/settings.jsonβ registers the four lifecycle hooks..claude/agents/*.mdβ each subagent'sname, dispatchdescription, and allowedtools..claude/commands/*.mdβ the slash-command surface.CLAUDE.mdβ the operating policy (context budget, delegation, validation, resume rules).
- User guide:
scaffold_readme.mdβ commands, stages, resuming, fixing gaps. - Operating policy:
CLAUDE.mdβ the scaffold-first rules the root thread follows. - Architecture decisions:
docs/adr/β populated at runtime bytech-strategist/solution-architect; the committed tree currently holds none. - License: MIT.