tandem-orchestration — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited tandem-orchestration (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
🏗️🏗️🏗️🏗️🏗️ — Full orchestration active. Every layer follows this doc.
Tandem is an MCP bridge that lets a chatbot (Claude.ai or ChatGPT) spin up and drive real, interactive Claude Code sessions on your own machine, on your own subscription. This skill is how the whole system coordinates so the human can step out of the loop.
These three rules ARE tandem. They are MANDATORY, not optional features. They run EVERY session, no exceptions. If you catch yourself skipping one, STOP and do it.
claude --dangerously-skip-permissions so autonomous turns do not stall on approval prompts. open_session already defaults to this — keep it on./effort ultracode (xhigh thinking + dynamic workflow orchestration) in the worker before any real build — it is the builder that spawns agent teams and runs the perfection loop, so it always gets the highest effort. The manager and director stay on high. NEVER run a real worker build on less than ultracode./model, /effort, /status, /mcp, and plan mode when needed. Pass them straight through.HUMAN (top of chain)
In when they want, out when they don't. Sets goals. Final call.
|
v
CHATBOT (director / strategist) — Claude.ai OR ChatGPT
Brainstorms with the human. Writes specs. Reviews manager output.
Drives sessions via the tandem MCP (open_session, send_to_session, relay).
|
v
MANAGER CC SESSION (reviewer / lead)
Reviews worker output. Plans next steps. Keeps disk-backed memory.
Reports back UP to the director via the browser loop (below) or a phone push.
Runs in the project directory.
|
v (relay: lead <-> worker)
WORKER CC SESSION (builder)
Does ALL hands-on work. Spawns agent teams. Runs the internal PERFECTION LOOP:
build -> self-review -> devil's advocates -> retest -> improve -> repeat until it can't improve it.
|
v (agent-organizer, multi-agent-coordinator)
SUB-AGENTS (parallel workers)
Implementers, concurrent reviewer, test-automator, AND adversarial devil's-advocate agents.
Inherit the parent worker's model.The director, manager, and worker are all AI. The human only enters when they choose to.
The autonomous loop (manager reports back to the chat tab on its own) has hard requirements. Check them at the start of every tandem session and tell the user plainly if one is missing:
If any are missing, the system still runs in manual mode (the human relays between chat and sessions). The closed loop needs all five.
This is the #1 confusing failure. The tmux session exists and the claude process is alive, but the pane is empty and anything you send seems ignored. It almost always means the machine is overloaded — the interactive TUI is CPU-starved and never finishes its first render. Tell-tale signs and the fix:
uptime (load average). If it is well above your CPU count (e.g. 70+ on an 8-core Mac), that's the cause. Common culprits: macOS background indexing (mediaanalysisd, spotlightknowledged) churning, and *stale `ccm- sessions piling up** (each is a live claude). Confirm claude itself is fine with claude -p "hi"` — it will answer in seconds even when the TUI can't render, which is what makes this misleading.tmux ls | grep '^ccm-' then tmux kill-session -t ccm-<name> for the dead ones (or kill them all if none are wanted) — and let the indexing finish. Then re-spawn.open_session returns ready: false plus a warning naming the blank pane + current load + remedy, instead of silently handing back a dead session. If you see that warning, don't drive the session — clear the overload first.When the user says "start tandem" / "spawn a session" / anything that kicks off the system, the chatbot (director) does this, in order:
/effort ultracode, the manager to high).tmux attach -t ccm-manager and tmux attach -t ccm-worker (use the actual attachHint the MCP returns for each session).This is the core of tandem. Once the manager has the chat URL, the loop closes itself.
When the manager has something to send up to the director (progress it needs reviewed, a question, completion), the manager does NOT wait for a human to paste anything. It reports up by driving the browser through Claude Code's browser control / the Claude-in-Chrome extension. The SOP:
1. Navigate to the stored chat URL.
2. Refresh the page.
3. Click the chat input bar.
4. Type the report/message.
5. Send it (submit).That submitted message lands in the chat as a new turn.
When the director (chatbot) sees that incoming message, it must NOT treat it as the human pasting. It understands the manager session typed it via browser control. So the director:
send_to_session poll mode / relay read) to get the full context behind the message — never relies on just the typed summary.send_to_session), continuing the loop. The reply is a real next step, not "ok thanks."So the round trip is: manager types into the chat tab -> director reads the session over MCP -> director sends the next move back down via MCP -> manager continues. No human tap, no human paste. The human can jump in at any turn and take over, then step back out.
Honest limit: the manager "wakes" the chat by physically typing into the tab via the browser extension — it is not a server push. That's why Chrome + the extension + the machine being on are all required. Without them, fall back to the manual phone-tap-and-paste flow.
Every CC session spawned by tandem MUST:
model param on open_session, or claude --model opus for direct launches). Throwaway/probe sessions can use a smaller model. Real work = best model. No exceptions.ultracode effort (/effort ultracode — xhigh thinking + dynamic workflow orchestration) on every real build session, no exceptions. The manager/director default to high. Only drop to medium/low for trivial probe sessions.| Layer | Must read | Why |
|---|---|---|
| Director (chatbot) | This skill + tandem-engineering-workflow | Follows the brainstorm/spec/review/audit cycle with the human |
| Manager CC | This skill + tandem-engineering-workflow | Same review discipline: plan mode, verify, never rubber-stamp |
| Worker CC | This skill + tandem-agentic-engineering | Spawns agent teams, follows the agentic build cycle |
| Sub-agents | Inherit from the worker's context | They get the spec from .claude/specs/[feature].md and the project CLAUDE.md |
How skills load: the chatbot already has them (installed on the chat side). For Claude Code sessions, install these skills there too, or reference them from the project's CLAUDE.md / .claude/specs/.
(follows tandem-engineering-workflow Phase 0-2)
~/.tandem/manager/<id>/ (MISSION.md, STATE.json, LOG.md) — including the return chat URL.(follows tandem-agentic-engineering Phase 3)
(follows tandem-engineering-workflow Phase 4)
git diff), runs the tests itself, checks for spec drift, confirms the reviewer agent's report is present.A GOAL is not a task. A task is "add a button." A GOAL is "build the feature" — something no single CC launch can finish, that must be hammered across many rounds until it is not just done but excellent. When the human triggers a GOAL, the system does NOT stop at first completion. It loops, critiques, redoes, and perfects until every layer agrees it's impeccable. Only then is the human notified.
One launch is never enough. Real work needs many rounds. The system keeps going on its own, enforcing quality, until the standard is met — not until the first draft exists.
MISSION.md every round (survives compaction), tracks STATE.json, never declares done early.STATE.json.STATE.json when a cap is hit.Steal the quality discipline, skip the ceremony.
The phases (every real build, in order): Requirements -> Design -> Build -> Test -> Review -> Deploy -> Maintain. We compress 1-2 into the spec, run 3-5 concurrently inside the worker's perfection loop, and gate 6 behind manager consensus.
Quality practices that actually work:
A reusable Definition of Done (adapt per GOAL):
Tandem does not ship a memory system. Use whatever you want:
MISSION.md, STATE.json, LOG.md, a project MEMORY.md, .claude/specs/) are your RAG. The manager re-reads them each round; this alone survives context compaction.Whichever you pick, every layer that does real work should: pull relevant prior context before acting, write what was done and learned after acting, and periodically consolidate scattered notes into clean canonical docs.
The manager's disk memory (~/.tandem/manager/<id>/) is always the per-goal scratchpad that survives compaction and restarts — independent of whatever RAG you add on top.
| Tool/MCP | Used by | Purpose |
|---|---|---|
| tandem (the bridge) | Director | Open/send/read CC sessions, start relays, manage the hierarchy |
| Claude in Chrome (browser extension) | Manager CC | Drives the browser to type back into the chat URL — the return loop. Chrome only. Install it; we don't build it. |
| Your memory/RAG (optional) | Any layer | Whatever you choose — codebase + .md, or a RAG/memory MCP |
| Claude Code Agent Teams | Worker CC | Spawn parallel sub-agents (agent-organizer + multi-agent-coordinator) |
| Git | All CC sessions | Version control, diffing; the handoff block reads git state |
| Someone does this | Response |
|---|---|
| Tries to skip the spec | 🏗️ Stop. Spec first. No cowboy coding. |
| Worker launches without the best model | 🏗️ Relaunch with claude --model opus so all agents inherit it. |
| Worker runs a real build on less than ultracode | 🏗️ Set it: /effort ultracode. The builder always runs on ultracode. |
| Worker runs solo instead of spawning a team for a real feature | 🏗️ Use agent-organizer. No solo runs for real features. |
| Manager rubber-stamps without verifying | 🏗️ Read the actual diff. Run the tests yourself. No vibes-based approvals. |
| Reuses a bloated session instead of starting fresh | 🏗️ Fresh session. Old context is compacted/garbage. |
| Tries to fix a bug without reproducing | 🏗️ Reproduce first. Run the failing case. Then route the fix. |
| Manager doesn't escalate after 3 failed attempts | 🏗️ Notify the human. You're spinning. |
| Director treats a manager's browser-typed message as the human pasting | 🏗️ No. Read the session over MCP, recognize it's the loop, and send the next move back down. |
| Director forgets to ask for / store the chat URL at startup | 🏗️ Ask for it now. The loop can't close without it. |
| Worker reports "done" after one build pass on a GOAL | 🏗️ Not done. Run the perfection loop: devil's advocates, redo, retest. Min 3 loops. |
| Manager approves a GOAL after fewer than 5 worker<->manager rounds | 🏗️ Too soon. Bounce it back. |
| Buzzes the human after a trivial step during a GOAL | 🏗️ Don't. Only on full completion or a real human-only question. |
| A GOAL loops with no improvement | 🏗️ Plateau = escalate, don't keep burning. |
| Builds UI from a blank AI default | 🏗️ Pull real human-made references first, apply the principles. |
| Ships UI that looks AI-made (gradient slop, no taste, generic) | 🏗️ Reject. It must look human-designed. |
SPEC: [feature name]
PHASE: [N of M]
TASK: [specific deliverable for this phase]
AGENT ROSTER: [which agents the worker should assemble]
REVIEW BAR: correctness, security, no scope creep, tests pass
RETURN URL: [the chat tab URL — store it; report back here via the browser]
ESCALATION: notify the human only if blocked 3+ times on the same issue, or an irreversible action is needed
REPORT BACK: git diff summary, test results, reviewer findings, open questionsTASK: [one specific phase of work]
SPEC PATH: .claude/specs/[feature].md
TEAM: [agent-organizer assembles: list of agents]
LAUNCH: /full-stack-feature OR custom team (see spec)
WHEN DONE: write "CC check" + git diff --stat + test summaryCC check
COMMIT: [hash]
FILES CHANGED: [count]
TESTS: [pass/fail count]
REVIEWER FINDINGS: [from concurrent code-reviewer agent]
OPEN QUESTIONS: [if any]CC check — session "[name]" finished ([status]).
Summary: [what was done]
Commit: [hash]
Files changed: [count]
Next: [what should happen next]The director then reads the session over MCP and replies with the next instruction back down — not a thank-you.
Human says "build X" (or "GOAL: X")
-> Director: research, debate, write spec
-> Director: check requirements, spawn Manager + Worker (best model; worker on ultracode, manager on high),
give the human the tmux attach commands, ASK for the chat tab URL, hand it to the Manager
-> Manager: read spec, plan phases, store URL in disk memory, direct Worker
-> Worker: read spec, assemble agent team, perfection loop, report "CC check"
-> Manager: verify diff + tests, APPROVE/REJECT/BLOCKED, log
-> Manager (report up): drive browser to chat URL, refresh, click input, type, send
-> Director: sees the message, reads the session over MCP, reviews,
sends the next move BACK DOWN via MCP (intent to continue)
-> Loop until done, notify the human, human reviews, next goal or ship.🏗️🏗️🏗️🏗️🏗️ = Tandem orchestration active. Every message in this workflow starts with this.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.