How we workDocuments · Agents · Skills
A snapshot of the operating model — the build loop that moves stories from idea to merged code, the source-of-truth documents that contain decisions, the agent roster that owns the writes, and the skills that codify recurring procedures. Reads top to bottom: how stories flow → what they edit → who edits → what's been codified.
The build loop
Every unit of work is a story — the thinnest change that runs end-to-end and answers one named question. A story moves through five lifecycle states and four build steps. There is exactly one human gate (Scoped → Next up) and one human checkpoint — acceptance verification of what Nate can see at merge time; a native device walk is deferred and tracked post-merge (S-A-41), never blocking the merge. Everything else flows.
[A]–[F].Lives in
BACKLOG.md.Inert.
Lives in
BACKLOG.md.Pool, not a queue.
Lives in
BACKLOG.md.Auto-promotes at step 1.
Lives in
Active_Story_<W>.md.Optional
<W>2 concurrent slot.Lives in
Completed_Stories.md.Most-recent first.
Next up — Workstream X; expand into Active_Story_<W>.md; commit to main; push.claude/<W>-NN-<slug>. Tests for testable logic are part of the build.Completed_Stories.md, queue-refill, push, open PR. The builder then invokes the Release Manager to merge — never runs gh pr merge itself. Merge gates on dev-green + whatever Nate can verify at merge time; a native device walk is deferred post-merge ("Device verified in build N").Next up — Workstream X halts that workstream.
Concurrency: steps 2–3 parallel within a workstream (P-22 disjoint); step 4 serializes.
Worktree per story: P-19.
Release gate (S-A-41): JS-only → over-the-air; native-trigger → device build. Walk tracked post-merge.
Six parallel workstreams
The lane dimension. Every story belongs to exactly one workstream; story IDs (S-A-NN … S-F-NN) are per-workstream and clash-free by construction. A is the multiplier — its output is more parallelism for the others.
& agents
CLAUDE.mdarchitecture
SPEC.md §3–5back-office
(deferred SOR)
surfaces
SPEC.md §6–7EXTRACTION.mdreadiness
(
BUSINESS_READINESS.md)Documents — by collision class
The five classes from CLAUDE.md's shared-doc collision model. Class assignment is how concurrent sessions can edit shared state without locks: each class has a known resolution rule, and the rule is what makes parallelism safe.
Class 1 — Append-only
PRINCIPLES.md
P-XX. Append-anywhere.GAPS.md
AUDIT.md
DEFECTS.md
2026-06-07.Reviews/
YYYY-Www.md). Append-by-file. Trend renders to docs/wbr.html.Completed_Stories.md
Decisions_Archive.md
D-XX entries.Class 2 — Per-section disjoint
## §N in the same SOR. Disjointness is checked at step 1; overlap blocks the proposal.SPEC.md
EXTRACTION.md
CLAUDE.md
Class 3 — Single-owner
.claude/agents/pm.md (S-A-42) and is the single writer for every class-3 doc below — invoke via the Agent tool or plain English in chat.BACKLOG.md
QUESTIONS.md
OPERATING_MODEL.md
PREREQUISITES.md
SHIPCHECKLIST.md
V2_STRATEGY.md
VISION.md
README.md
Class 4 — Story-scoped exclusive
main is the public claim — once pushed, parallel sessions see the slot is taken on next fetch.Active_Story_<W>.md
Active_Story_<W>2.md
Class 5 — Derived
V2_STRATEGY.html
V2_STRATEGY.md.docs/dashboard.html
tools/dashboard/generate.py; auto-commits to main.docs/wbr.html
Reviews/ ledger. Regenerated by tools/wbr/.docs/process-map.html
tools/process-map/generate.py from the live .claude/agents/* + .claude/skills/* + the process SORs; auto-commits on a process change (S-A-64).Also visible to sessions but outside the model: MEMORY.md (Nate's auto-memory index, outside the repo) — practically append-only for new index lines, single-owner (Nate) for reshuffles.
The agent roster
16 roles. 13 are live agents — each a .claude/agents/<name>.md file with name+description frontmatter — and Nate stands in for the rest. Each role's remit is bounded enough that the boundary holds without in-session supervision; that boundary is what each agent inherits. Live agents are shown first. This roster is generated from the live agent files — going live is writing the file.
PM
.claude/agents/pm.md. Invocable as subagent_type: "pm" or via plain English. Nate still judges product-scope calls.Ops
.claude/agents/ops.md. The canonical answer for "what's in flight" and "next free story number."Release Manager
scripts/pr-open-automerge.sh, which arms GitHub native auto-merge — gh pr merge --auto --squash — unconditionally at open time unless it carries ship:batch or the rare --defer-merge Nate-only-subjective-acceptance case, so a green PR merges itself with no session needing to be alive to ask). Runs gh pr merge directly on Mac, the GitHub MCP merge tool in a web/remote session where gh is absent, only in these narrower cases. Confirms the branch is canonical (Ops governs branch state); merges only once the required CI test check is green — refuses a red/pending check (DEF-012 guard), overridable only by Nate's explicit instruction; recovers a moved main by merging origin/main into the story branch (never force-push); returns a post-merge cleanup directive to Ops..claude/agents/release-manager.md. Never pushes to main; never removes worktrees (Ops does). Plain-English output only.Chief-of-Staff
Project Documentation/Reviews/, executes disposition (additive → PM now; scope → fork for Nate)..claude/agents/chief-of-staff.md. Invoke with "run the WBR."QA
.claude/agents/qa.md. Invoke for "which test tier does this need?", "audit our test health", or "run the e2e net." Class-3 edits (TESTING.md) route through PM.Design Intake
_inbox/ (no-ops when empty) or a manual 'intake the latest design handoff'. Boundary-owning serializer like PM/Ops/Release Manager — routes, doesn't decide scope, doesn't edit SPEC or build the screens itself..claude/agents/design-intake.md. Reconciles a Design/_inbox/ handoff bundle into the visual SOR + Scoped stories. Invoke with "intake the latest design handoff."Bug Intake
.claude/agents/bug-intake.md. Drains the Supabase bug_reports queue, transcribes each voice note, triages each. Invoke with "process the bug reports."Review
/code-review --fix applies), not a scope-decider..claude/agents/review.md. The per-story code-review reader of record at step-4 reconcile; runs the bisect-first protocol (P-05) on regressions. Advisory — reports, never blocks merge.audio-pipeline
auto-fixer
crm-inbox-drainer
npm run inbox-drain) and applies each the way a chat session would: Done → flips the acceptance/'Device verified in build N' field on Completed_Stories.md (class-1, direct); Answer → PM resolves the QUESTIONS.md entry + lands it in the SOR; Decide → PM (BACKLOG.md/DEFECTS.md). Marks each row processed so it's never re-applied.extraction-tuner
principal-engineer
Build-A
Build-B
SPEC.md §5; the "how" lives in EXTRACTION.md.Research
Research Material/ — standalone .mds cross-referenced with backlog entries. Does not decide — presents findings.deep-research skill). Stands up as a scheduled review agent — extraction-quality and audit-pass reviews.Handoffs — who hands what to whom
- PM→Builder publishes
Active_Story_<W>.mdat step-1 auto-promote (thestory-promoteskill). - Builder→Ops claims the branch + worktree (canonical name, next story number) before step-3 build or any doc-work session.
- Builder→QA at step-3 pre-handoff: QA reads whether the covering flow + tests are adequate; the automated net runs.
- Builder→Review at step-4 reconcile: independent diff-read for correctness + reuse/simplification; audit-grade findings land in
AUDIT.md. - Builder→Release Mgr at step-4: invokes it with the PR number + acceptance signal + branch/worktree. The builder never runs
gh pr merge. - Builder→PM at step-4 reconcile: new
PRINCIPLES.md/GAPS.md/AUDIT.md/DEFECTS.mdentries + queue refill. - Release Mgr→Ops post-merge cleanup directive — the branch + worktree to remove.
- Any role→PM single-owner-doc edits: propose and stop. PM applies + commits.
- Design Intake→PM a consumed
Design/_inbox/bundle's net-new screens → fully-shaped Scoped entries. - Bug Intake→DEFECTS a drained, transcribed, triaged bug-report queue → a
DEFECTS.mdappend (auto-fixable) or a fork list (needs-Nate). - QA→Nate findings that need human verification (suspect device behavior, off extraction output).
- Chief-of-Staff→Nate scope decisions surfaced by the WBR, presented as a named fork list for the gate.
Skills — codified procedures
A procedure becomes a skill when it's multi-step with non-trivial sequencing and has real failure cost if re-derived from prose. One of these without the other stays inline in CLAUDE.md. The bar is deliberately tight; most procedures stay inline. Skills live in .claude/skills/<name>/SKILL.md and run cold without reading the operating contract first. Written = a .claude/skills/<name>/ directory exists; pending = named in OPERATING_MODEL.md §3 with no directory yet.
Written ✓
capture-triage
debug-discipline
extraction-rule
fix-defects
process-prune
prompt-diet
readiness-gate
sprint-plan
story-build
Active_Story names. Carries tests-as-definition-of-done, P-16 native-verify, and the pre-handoff Claude-verifies pass (incl. P-14 canonical-design diff).story-promote
Next up, expands to full Active_Story shape, removes from backlog, commits to main, pushes. Covers preflight (in-flight branch check, story numbering, P-22 disjointness) and the step-1 claim sequence.story-reconcile
Completed_Stories entry, queue-refill, tsc, push, open PR, then invoke the Release Manager to merge. Carries the two-path release gate (native-trigger vs JS-only/OTA) and the reconcile-the-process pass.wbr-docs
tools/wbr/doc_checks.py) as the scripted floor, then the five cluster auditors as the judgment layer. Proposes the doc-health metric fills.wbr-process
wbr-product
Pending
canonical-design-comparison
bisect-first-on-regression
worktree-sim-walk
Two procedures graduated into agents rather than skills: the main-moved merge-recovery and post-merge worktree cleanup now live in the Release Manager + Ops remits, not a .md skill. Most other procedures stay inline in CLAUDE.md — single-step, single-judgment, or already-named-once rules (iOS build via npm scripts, EAS env-var key delivery, doc-class assignment, P-22 disjointness as a story-promote preflight, and so on).
How this hangs together
Story flows down the build loop. Each step is owned by an agent role; the only human gate is Scoped → Next up, the only human checkpoint is step-4 acceptance.
The story edits documents — and the document's collision class decides how a parallel session can safely edit the same file at the same time.
The role that owns the document applies the edit (or, for class 3, applies edits proposed by other sessions).
The skills are what make this runnable cold: a PM agent invoking story-promote does the right thing without re-reading CLAUDE.md.
Today vs. tomorrow. Today, 16 roles and 13 live agents, with Nate standing in for the rest. Each filled seat turns a tab-switch in Nate's head into an explicit protocol call: a Scoped entry, a QUESTIONS.md Q, a branch claim through Ops, a merge invocation to the Release Manager, a chat message routed through PM. PM was the first seat — the highest-leverage one, because the single-owner write-lock changes everyone else's proposal pattern; Ops, Release Manager, Chief-of-Staff, QA, Design Intake, Bug Intake, and Review followed by carving the git-state, merge, review-rollup, test-net, design-intake, bug-intake, and diff-review surfaces out of Nate's hands. Tomorrow, every role an agent, and Nate's job is judging the boundaries instead of performing all the work.