Standing Architect

Launches a standing design authority in the current session. The architect loads a design document once, announces itself on the campfire, and blocks waiting for escalation questions from workers. It consumes zero tokens when idle.

What it does

  1. Finds or creates a swarm campfire (reads .campfire/root if present).
  2. Loads design context — from a file path, an inline description, or a design campfire ID.
  3. Announces: Architect online. Monitoring for escalations.
  4. Blocks on cf read --follow --tag escalation — dormant until a question arrives.
  5. When an escalation comes in: checks prior rulings, reads any referenced source, makes a ruling, posts --fulfills.
  6. Returns to blocking. Repeat.

When to use

  • Multi-session work — any time two or more agent sessions are running on the same repo.
  • Parallel agents — when worker agents should not each load the full design context.
  • Shared design authority — when you want rulings to be consistent across all workers in a session.

Configuration

Pass arguments to the skill when invoking it:

Argument Effect
"path/to/design.md" Read the file as the design document. Architect loads it fully before monitoring.
"Design campfire: <id>" Read deliberation history from a design campfire: cf read <id> --all.
"<inline description>" Use the description itself as design context. Useful for quick sessions without a doc.
(both path and campfire) Combine both sources. File provides structure; campfire provides recent decisions.

Ruling standards

  • Decide, don't defer. Workers are blocked. A fast good-enough ruling beats a slow perfect one.
  • Cite the design. Every ruling references the relevant section or prior decision.
  • Be consistent. Before ruling, check prior decisions: cf read "$campfire" --tag decision --all.
  • Escalate to human when needed. Novel trade-offs or major consequences get tagged gate-human.

Example session

Session 1 — invoke the skill in Claude Code
/cf-architect "docs/design/auth-system.md" # Claude Code: Found swarm campfire from .campfire/root Reading docs/design/auth-system.md... Design context loaded (JWT 15m expiry, httpOnly cookies, no localStorage) Announced: "Architect online. Monitoring for escalations." [blocking on cf read --follow --tag escalation] # Escalation arrives from a worker: escalation: "Should token refresh require old expired token?" Checking prior rulings... none on refresh strategy Ruling: "Use refresh tokens. httpOnly cookie stores both. Expired JWT does not prove identity — require refresh token instead." Posted --fulfills msg-abc --tag decision [back to monitoring]

The architect is read-only on code. It reads source to inform rulings. It does not edit files or pick up work items.

Escalation

Posts a design question to the campfire and blocks until the architect (or a human) answers. The worker's context is fully preserved while waiting — no polling, no tab switching, no context loss when the answer arrives.

What it does

  1. Finds the swarm campfire (reads .campfire/root, or discovers via cf ls).
  2. Posts the question with --tag escalation --future — marking it as a promise awaiting fulfillment.
  3. Blocks on cf await <campfire> <msg-id> --timeout 15m.
  4. When fulfilled: parses the decision, reports it, continues work using the ruling.
  5. On timeout: posts a --tag blocker message and reports that no ruling was received.

When to use

  • Design decisions — locking strategy, API shape, error handling approach.
  • Scope ambiguity — unclear whether something is in or out of scope for the current task.
  • Interface changes — before changing a shared interface that other sessions depend on.
  • Novel trade-offs — anything the implementer shouldn't decide unilaterally.

Category tags

The skill applies --tag escalation automatically. You can signal the category in your question text — the architect reads the full message regardless of tags. Common categories:

Category Use for
architecture System structure, component boundaries, tech choices
scope What is and isn't in the current work item
interface Public APIs, shared structs, protocol contracts
dependency External libraries, service dependencies, version pins

Writing good escalations

Include: the specific question, relevant file paths and line numbers, the trade-offs you see, and any constraints you're already working within. The more context in the escalation, the faster and better the ruling.

Example: worker asks about locking strategy

Session 2 — Worker
/cf-escalate "Locking strategy for auth tokens in pkg/auth/token.go. High read volume, rare concurrent writes. Optimistic or pessimistic? Trade-off: optimistic = retry on conflict, pessimistic = serializes all writes." → Posted escalation: msg-xyz → Waiting for ruling... [blocking...] → Ruling received: "Use optimistic locking. Read volume dominates. Retry on write conflict is acceptable. Ref: design §4.1 — prefer reads." → Continuing with ruling...
Session 1 — Architect
[blocking on --follow...] escalation from worker: "Locking strategy for auth tokens... optimistic or pessimistic?" Checking prior rulings... none on locking strategy Reading pkg/auth/token.go... → Ruling posted: "Use optimistic locking..." --fulfills msg-xyz --tag decision [back to monitoring]

No architect running? A human can fulfill any escalation from any terminal: cf send <campfire> --fulfills <msg-id> --tag decision "Use optimistic locking."

Multi-Session Coordination

Announces work, reads other sessions' status and schema changes, and routes human-needed decisions to a single monitoring point. Use this when two or more Claude Code sessions are running concurrently on the same repo.

What it does

The skill has four subcommands, each a targeted campfire operation:

start — join or create the project campfire

Reads .campfire/root. Creates a swarm campfire if none exists. Announces this session. Reads what other sessions have posted (status, schema changes). Reports active sessions and recent changes.

/cf-coordinate start Project campfire: abc123... Announcing: "Session started. Working on: auth middleware refactor." Active sessions: Session B (working on billing endpoint) Schema changes: none since last read

status — see what's happening

Reads all status messages, schema changes, and pending human decisions from the project campfire. Run this before starting a new file or touching a shared interface.

/cf-coordinate status === Active sessions === Session A: auth middleware refactor (pkg/auth/, pkg/middleware/) Session B: billing endpoint (pkg/billing/) === Schema changes === AuthToken struct: added RefreshToken field. Affects: pkg/billing/client.go === Needs human === (none)

schema-change — notify others of interface changes

Posts a --tag schema-change message visible to all sessions. Other sessions should check this before continuing work that touches the same interface, and pull before proceeding.

/cf-coordinate schema-change "Changed AuthToken struct: added RefreshToken field. Affects: pkg/billing/client.go, pkg/middleware/auth.go"

needs-human — route a decision to the human

Posts a --tag gate-human message to the project campfire. The human monitors one command to see all decisions that need them, across all sessions.

/cf-coordinate needs-human "Billing endpoint returns 200 on failed charge. Spec says 402. Change will break mobile app v2.1. Proceed?" # Human monitoring from any terminal: cf read "$(cat .campfire/root)" --follow --tag gate-human

Root campfire setup

Run once per project to set up named views for the human monitoring experience:

cf swarm start --description "project-name coordination" root_cf=$(cat .campfire/root) # Create named views (run once per project) cf view create "$root_cf" "needs-me" --predicate '(tag "gate-human")' cf view create "$root_cf" "changes" --predicate '(tag "schema-change")' cf view create "$root_cf" "sessions" --predicate '(tag "status")' # Monitor human-needed decisions in real time: cf read "$root_cf" --follow --tag gate-human # Or use the named view: cf view read "$root_cf" "needs-me"

Example: two sessions coordinating

Session A — auth work
/cf-coordinate start Announcing: "Working on auth middleware refactor. Touching: pkg/auth/" No other sessions active. # Later, after changing a shared interface: /cf-coordinate schema-change "Changed AuthToken struct: added RefreshToken field"
Session B — billing work
/cf-coordinate start Announcing: "Working on billing endpoint. Touching: pkg/billing/" Session A: working on auth middleware refactor (pkg/auth/) # Before touching a file that uses AuthToken: /cf-coordinate status Schema change: AuthToken struct changed. Affects: pkg/billing/client.go Pulling latest before continuing...

Architect and Implementer Specs

Two agent specs ship with the recipes: architect.md and implementer.md. Drop them into your project's .claude/agents/ directory. Claude Code reads them automatically when spawning subagents.

How to install

# Copy to your project cp campfire-recipes/.claude/agents/architect.md your-project/.claude/agents/ cp campfire-recipes/.claude/agents/implementer.md your-project/.claude/agents/ # Customize for your project (see below)

architect.md

Defines the standing architect role. The spec covers:

  • Loading design context once at start (file or design campfire)
  • Blocking on cf read --follow --tag escalation
  • Checking prior rulings before making new ones
  • Escalating novel trade-offs to the human via gate-human
  • Constraints: read-only on code, no implementation work

The architect uses Sonnet tier by default (set in the frontmatter: model: sonnet). Upgrade to Opus for novel architectural decisions or complex multi-factor trade-offs.

implementer.md

Defines the implementer/worker role. The spec covers:

  • Campfire integration — when and how to escalate, signal completion, and announce schema changes
  • Process: baseline tests → feature branch → implement → verify → PR
  • Flaky test handling — never retry and move on; diagnose the root cause
  • Merge protocol — push a branch, create a PR, signal readiness on campfire; do not merge to main

The implementer also uses Sonnet tier. For purely mechanical tasks (template updates, config files, copy-paste refactors), you can dispatch on Haiku.

Customizing for your project

Both specs are starting points. Edit them to add:

  • Project-specific conventions (language, framework, test runner)
  • Repo layout and where shared interfaces live
  • Escalation thresholds (what decisions require the architect vs. worker autonomy)
  • PR review requirements and merge criteria

Keep the campfire integration section intact — that's the coordination contract between architect and implementer. Customize the rest freely.

Model tier recommendations

Role Default tier Upgrade when
architect Sonnet Novel architecture, multi-factor trade-offs, strategic decisions
implementer Sonnet Complex integration, unfamiliar codebase, security-critical changes
implementer Haiku Mechanical edits, template work, config updates with no design decisions

Campfire Topology

Campfires nest. Tags propagate up through the hierarchy based on each campfire's --require configuration. This lets humans monitor one campfire and see everything that needs them from any depth below.

Root → swarm → engagement hierarchy

Project Root Campfire ← .campfire/root | Human monitors here │ ├── Swarm Campfire ← cf swarm start │ --require gate-human # human decisions propagate up │ --require schema-change # interface changes propagate up │ │ ├── Session A ← /cf-coordinate start │ │ posts: status, schema-change, gate-human │ │ │ └── Session B ← /cf-coordinate start │ posts: status, escalation, merge-ready │ └── Sub-campfire ← cf create (for focused channels) --require gate-human └── Targeted work

Tag propagation

When a campfire is created with --require <tag>, any message posted with that tag on a child campfire propagates to the parent automatically. The human never has to join the child campfire.

Tag Meaning Propagates to root
gate-human Decision requires human input before work continues Yes — require on swarm
schema-change A shared interface changed; other sessions should pull Yes — require on swarm
escalation Worker needs architect ruling (blocks on cf await) No — stays on swarm campfire
decision Architect ruling (fulfills an escalation) No — stays on swarm campfire
status Session announcement or progress update No — stays on swarm campfire
merge-ready Worker has a PR ready for review Optional — add to --require if needed

When to create sub-campfires

Use cf create for a sub-campfire when:

  • A focused channel is needed for a specific area of work (e.g., a security audit, a sweep pass)
  • Three or more findings cluster around one topic
  • Two sessions need back-and-forth that would clutter the swarm campfire

Disband sub-campfires when done. The swarm campfire is permanent for the duration of the session; the root campfire persists across sessions.

Escalation cascade example

A worker's question reaches the human without manual forwarding:

# Create the hierarchy ROOT=$(cf create --description "project-root" --json | jq -r .id) TEAM=$(cf create --description "team-alpha" \ --require gate-human --require schema-change --json | jq -r .id) # Human monitors the root only cf read "$ROOT" --follow --tag gate-human # Worker posts to the team campfire cf send "$TEAM" --instance worker --tag gate-human \ "Need approval: migration will drop legacy_users table. 3 integrations still reference it." # Message appears at the root. Human never joined the team campfire. [gate-human] Need approval: migration will drop legacy_users table...

Troubleshooting

cf not found on PATH

The Campfire CLI must be installed and on your PATH before any skill will work.

# Verify installation cf version # Should print a version number. If command not found: Install from https://getcampfire.dev Ensure the install directory is on PATH (e.g., ~/.local/bin)

Skills not discovered by Claude Code

Skills must be in the correct directory with the correct filename.

# Expected locations after install: ~/.claude/skills/cf-architect/SKILL.md ~/.claude/skills/cf-escalate/SKILL.md ~/.claude/skills/cf-coordinate/SKILL.md # Verify: ls ~/.claude/skills/ # If missing, re-run the install: cp -r campfire-recipes/.claude/skills/* ~/.claude/skills/

New Claude Code sessions pick up skills automatically. Existing sessions pick them up on next invocation — no restart needed.

No campfire found — "Start one with cf swarm start"

The skills look for .campfire/root in the working directory. If it doesn't exist, they fall back to cf ls to discover campfires. If neither works:

# Create the project campfire from your project root: cf swarm start --description "your-project coordination" # Verify it was created: cat .campfire/root cf swarm status

Identity collision — two agents with the same identity

If two sessions share the same cf identity, messages from one look like they came from the other. This is a tool configuration issue, not a protocol issue.

# Check the active identity: cf id # Each agent session should have a distinct identity. # If they collide, run cf init in a separate home directory # or use --identity flag to specify a keyfile path.

Escalation timed out — no architect responded

The cf await timeout is 15 minutes by default. If no architect is running, escalations time out.

# Check if an architect is online: cf read "$(cat .campfire/root)" --tag status --all # Look for: "Architect online. Monitoring for escalations." # If no architect is running, start one in another session: /cf-architect "your design doc or description" # Or fulfill the timed-out escalation manually: cf send <campfire> --fulfills <msg-id> --tag decision "Your ruling here."

Debug commands

# List all local campfires cf ls # Read all messages on a campfire (including compacted) cf read <campfire-id> --all # Check swarm status cf swarm status # Read a specific tag cf read <campfire-id> --tag escalation --all cf read <campfire-id> --tag decision --all cf read <campfire-id> --tag gate-human --peek