Three repositories, one workflow

Three projects, one workflow

You hand a ticket to one command. It reads the issue, explores the code, writes a plan for you to approve, implements it test-first, has two or three AI models review the result, commits, opens the pull request and reports back. Three repositories make that possible, and each does a completely different job. This page explains which does what, and how they fit together.

3
projects
8
phases
51
commands
252
stack skills
84
device tools
3
CLI hosts
3
platforms

01Three projects, three different jobs

Think about how a crew works. There is a process that knows what order the work happens in, there is the craft knowledge of how things are built in this particular shop, and there are the actual tools and eyes on the job. These three repositories are exactly those three things.

multi-agent-pipeline

The process

The part that knows the order and refuses to skip steps. It drives a ticket all the way to a merged pull request: analyse, plan, build, review, commit, report. It knows what needs your approval, what is a hard stop, and where to loop back and try again.

multi-agent-plugins

The craft knowledge

The answer to how we build things here, one answer per stack: iOS, Android, frontend, backend and shared. Folder shape, naming, which layer may know what, how tests are written. The pipeline consults this knowledge while it builds instead of carrying it inside itself.

multi-agent-toolkit-mcp

The hands and eyes

The server that lets the AI actually launch the app, tap a button, take a screenshot, run a build and audit a package. Without it the AI can only read code. With it, it can look at the result of its own work.

Why they are separate

They change at different rates, and each is useful on its own. The process can stay still for months. A stack's conventions change whenever that stack evolves. The toolkit grows when a new device capability appears. If they were one repository, every small convention change would force a release of the whole pipeline. The toolkit in particular stands alone: it gives any AI editor control of a simulator, whether or not the pipeline is involved.

02The big picture

The three repositories at the top. The three command-line tools that run them in the middle. At the bottom, the systems a run talks to and the durable trace it leaves behind.

AUTHOREDmulti-agent-pipelinethe process: 8 phases + 51 commandscommands/ · 51multi-agent-refs/ · 60agents/ · 8lib/ · schemas/ · scripts/skills/shared/external · 152multi-agent-pluginsthe craft knowledge: one per stackiOS · 145 Android · 29Backend · 32 Frontend · 24Common · 10each: index + reference +workflow + tools + knowledgemulti-agent-toolkit-mcpthe hands and eyes: 84 toolsiOS · 38 Android · 30Web · 8 Design · 6Agent DSL · 1published to npm, own versionv3.1.0generated from the left, version bumped only on changeinstall.js writes three host treesconsumed by all three hostsregistered once per hostRUNS ITClaude Code/multi-agent:<cmd>51 slash commands, lazy refsplugins load natively2 review modelsCopilot CLI/multi-agent-<cmd>51 skills, inlined orchestratorplugins copied in3 review modelsCodex CLI/multi-agent · $multi-agent1 skill, 51 specs as refspersonas generated as TOML3 review modelsone command runs the phasesA RUN0Init1Analysis2Planning3Dev4Review5Test6Commit7ReportWHAT IT TOUCHESpersistsreads and writesShared state rootall three hosts write here, none retargets the pathagent-state.jsontracker-state.jsonknowledge/ · memory/metrics.jsonla run started on one CLI resumes on anothera run is a file, not a sessionSystems you already useTrackers: Jira · GitHub · BitbucketDocs: Confluence · WikiDesign: FigmaDiagnostics: Graylog · Fortify · Crashlyticshosts come from preferences, tokens from the keychainno address or secret is ever hard-coded
The one-way arrow at the top is the only generated relationship: the marketplace is built from part of the pipeline, never edited by hand. The purple box at the bottom is the single place all three CLIs write to: delivery diverges, state converges. Review is purple because it is the only phase that can move a run backwards.

03What happens when you run one command

Eight phases in order. Two of the arrows go backwards and one is a shortcut the fast modes take. Those three arrows are the reason this is worth drawing rather than listing.

left margin: the two loops back, and the fast-mode shortcut0 · Initreads the ticket, branchesWhich repo, which branch, whose identity, what kind of task. All before any model call.Exit gate: stops unless the task type and design access are on record.1 · Analysisexplores the code in parallelFinds what is affected, which stack it is, and what already exists to reuse.Writing a second copy of an existing service is blocked here.2 · Planninga plan, file by fileA task graph that names the files each task touches.Approval gate: nothing is written until you approve. You can ask for edits.3 · Devtest first, then the codePer task: write a failing test, make it pass, simplify, build. At most three build retries.Rework from phase 4 and fix requests from phase 5 both come back here.4 · Reviewgates, then the modelsFirst the cheap certain checks: build, lint, tests, secret scan, security findings.Then two or three models review in parallel, and a triage step filters false positives.5 · Testoptional, by handChecks the branch out locally so you can open the app, and can run device audits.Runs only in the modes that are both interactive and worktree-backed.6 · Commitcommit, push, pull requestA conventional commit carrying the ticket id, then a PR that preserves existing reviewers.Refuses to commit while an accepted blocking finding is unresolved.7 · Reportwhere to tell peoplePR description, Jira comment, Confluence page, wiki. Whichever you pick.Records what it learned, and the next run reads it.skipreworkfixFast modes skip analysis and planning. No mode ever skips review.The rework loop stops after three rounds and hands the problem to you rather than looping forever.the analysis pipeline: the same phase numbers, but nothing is written to the repo0 · Initintake1 · Analysisevidence2 · Planningsynthesis4 · Reviewvalidator6 · Publishnot a commit7 · ReportsummaryNo Dev and no Test: phase 6 publishes the document to Local, Confluence or Jira instead of committing code.
The three lanes in the left margin are deliberately separated. The dashed ones are optional paths: the fast-mode shortcut and a fix request after manual testing. The purple one is the mandatory return from review.

04The pipeline: modes, gates, review

There are not nine unrelated modes to memorise. There are three independent switches, and the nine names are just the useful combinations of them.

depth

Fast, or thorough

Depth is a question, not a flag. Phase 0 asks Full or Short: Short drops analysis and planning and starts writing immediately, with a stronger model doing the writing. Pick it when you already know what changes.

local

Your checkout, or a separate one

By default the work happens in a separate checkout of the same repository, so your own working copy is never touched and two tasks can run side by side. A local mode works directly in the checkout you are sitting in, which is simpler when you want to watch it happen.

autopilot

Asks you, or decides itself

Interactively it stops for the plan, the commit and the pull request. On autopilot it resolves those to sensible defaults and writes down what it chose. It still stops for review findings, for a build that will not go green, and for the reporting step.

Two of those switches are commands; the third is not. Worktree and questions are chosen by which entry you type. Depth is asked once, at Phase 0 Step 7.5, and recommended from the task type - which is why there is no fast-and-unattended entry: autopilot may not ask, and an unwatched run is the worst place to drop analysis and planning. And ship is the odd one out: it skips the writing entirely and runs the tail of the pipeline over work you already did by hand.

Nine entry points over the same eight phases

You choose how much ceremony a task gets. The full pipeline asks about everything. Autopilot resolves the defaults itself. The fast modes skip analysis and planning, go straight to building, and use a stronger model while doing it.

ModePhasesWorktreeAsks youDev model
/multi-agent0 1 2 3 4 5 6 7yesat every stepSonnet
:autopilot0 1 2 3 4 6 7yesonly at reportingSonnet
:local0 1 2 3 4 6 7noat every stepSonnet
:local-autopilot0 1 2 3 4 6 7noonly at reportingSonnet
Step 7.5 → Short0 3 4 5 6 7yesat every stepOpus
:analysis0 1 2 4 6 7noat every stepFable
:resume-local0 4 5 6 7noat every stepnone, the branch diff is the input
What autopilot never skips. The review phase, the three-attempt build cap, the confirms in front of destructive commands, the circuit breaker, and the channel choice at reporting. Everything else it resolves to a default and logs. Unattended does not mean unchecked.

What stops a run, and what only warns

A check that cannot fail is worse than no check, because the green tick gets read as coverage. So every gate declares which side of the line it is on, and several deliberately stay closed when the evidence is missing.

GatePhaseKindWhat it prevents
Init exit gate0stopsA run entering analysis with no task type or design access on record
Design access0stopsUI derived from a text description instead of the design
Analysis validator1stopsA malformed analysis reaching the planner
Reuse discovery1stopsA second copy of something that already exists
Plan validator and approval2stopsAn unexecutable or unapproved plan reaching the build
Autopilot safety classifier2pausesUnattended execution of a plan that deletes or migrates data
Build queue lock3serializesTwo builds racing on the same output
Build, lint, tests, secrets4stopsSpending review budget on a change that does not compile
Evidence gate4, 6stopsA claim that the build passed with no log that shows it
Test integrity4raises blockersTests weakened or deleted until the suite turns green
Visual conformance4stopsA component drifting away from its design
Diff risk score4advisoryNothing. It routes attention, it is not a gate.
Secret and attribution hooks6stopsCommitting a token, crediting a bot, force-pushing a protected branch

Review: three stages, and one honest asymmetry

1 · Certain checks2 · Parallel review3 · TriageOutcomebuildlinttestssecret scansecurity findingsno model runs until all of these passcheap checks reject before costly onesReviewer 1 · security and architecturefable · opus · gpt-5.6 xhighReviewer 2 · edge casesgpt-5.4 · absent on Claude CodeReviewer 3 · correctness and namingsonnet · sonnet · gpt-5.6 medium180 second limit; if none return it retries once, then stopson very small changes it may drop to a single reviewermerge and de-duplicatefilter false positivesconfirm with a failing testpauses if it rejects over 80%fixback to phase 3accepton to phase 6escalateafter three roundsClaude Code reviews with 2 models, Copilot and Codex with 3. The difference is capability, not preference.On Codex all three are from one vendor, so agreement counts as weaker evidence, and the triage note says so.
Reviewer 2 is dashed because it is the only intentional difference between the hosts: GPT-5.4 is not directly reachable from Claude Code, so that host reviews with two models rather than three.

Eight specialists, three model vocabularies

Each specialist is defined once and states a tier, not a model name. Every CLI maps that tier onto a model it can actually reach, so one definition works in three places.

SpecialistPhaseTierWhat it does
code-reviewer4fableMember of the review panel
ios-architect2, 4fableiOS structural judgement
android-architect4fableAndroid structural judgement
backend-architect4fableAPI and service judgement
security-auditor4, 5opusSecurity and store compliance
dev-critic3.5sonnetCritiques the code before review sees it
explorer1sonnetScans the codebase in parallel
task-clarifier0haikuScores how ambiguous the request is

05The plugins: craft knowledge per stack

How you build a screen in an iOS project has nothing to do with how you add an endpoint in a backend. The pipeline does not carry those answers inside itself. It asks that stack's plugin.

PluginVersionSkillsCovers
ai-ios-toolkit0.7.3147iOS and SwiftUI: architecture, code style, file placement, navigation, forms, previews, Figma to component, Code Connect, build and test
ai-backend-toolkit0.1.533Service side: creating and evolving endpoints, auth, data, validation, security, the OpenAPI spec
ai-android-toolkit0.1.430Android and Compose: architecture, state, navigation, testing, Gradle
ai-frontend-toolkit0.1.425React and Next.js: components, state, routing, styling, accessibility
ai-common-toolkit0.2.611Stack-agnostic: accessibility audit, plain-language editing, backlog, decision council

Every plugin has the same skeleton

index

The router

One entry point that decides which skill should answer a given request.

reference

How this stack is built

Knowledge to read, not steps to run: layers, naming, file placement, which unit may know what.

workflow

What to do, step by step

Create a screen, evolve a component, fix a bug, branch and open a PR. Imperative and ordered.

tools

Outside sources

Figma data, Code Connect mappings, component documentation, resource registries.

knowledge

Generated depth

Framework and API depth. Never hand-written here: it is generated from the pipeline, and the next build overwrites it.

The marketplace is an output, not a source. Vendor knowledge is authored once in the pipeline repository. A build script rebuilds each plugin's knowledge tree, regenerates its skill list, and bumps the patch version only when that plugin's skill set actually changed. An unchanged run bumps nothing. Writing directly into a plugin's knowledge folder is a mistake by construction: the next build overwrites it.

06The toolkit: hands and eyes for the AI

A model being able to read code does not mean it knows whether what it wrote works. This server closes that gap: it can launch the app, tap it, take a screenshot, run a build, and audit the package before submission. All 84 tools over a standard MCP connection.

FamilyCountWhat it doesWho uses it
ios_*38Drives the simulator: screenshots, taps, typing, permissions, locale, location, push, appearance; plus a build wrapper and result drill-downPhase 5 device checks, design check, store readiness
android_*30The same surface for the emulator: install, navigate, permissions, dark mode, font scale, logcat, APK auditThe same consumers, Android side
web_*8Headless browser: go, click, type, evaluate, wait, read text, screenshotFrontend work and verification
design_*6Opens the app in mock mode, enumerates every state, compares it to the Figma variant pixel by pixelThe design check command
agent_run_steps1Runs an array of steps in a single round trip, for login and form flowsMulti-step manual test paths
Why the build wrapper matters. Raw build output is thousands of lines and all of it lands in the model's context. The wrapper returns one line instead: pass or fail, how many errors, how many warnings, and an id. The model drills into that id only when it needs to. That is thousands of tokens saved per build cycle, and the context stays available for real work.

The server runs independently of the pipeline. It connects to any MCP client, because it is a plain stdio MCP server. Some pipeline skills declare a minimum version, so when the server moves it has to ship: the sync step has its own gates, from a syntax check to package completeness to the advertised tool count matching the real one.

07Three CLIs, one pipeline

The same tree installs into three places, in three different shapes, because the three hosts disagree about how skills are discovered and how much of a prompt survives.

one authored treecommands/multi-agent/ · 51skills/shared/{core,external} · 204agents/ · 8 multi-agent-refs/ · 60lib/ · 30 schemas/ · 20install.js --claude --copilot --codexClaude Code/multi-agent:<cmd>copied, only its own namespace wipedcommands/multi-agent/ · 51multi-agent-refs/ · 60skills/ · 152 agents/*.md · 8a thin router loads one phase at a timethe rules folder is never overwrittenplugins load natively from the marketplaceno path rewriting neededCopilot CLI/multi-agent-<cmd>copied with 12 path rules appliedskills/multi-agent-<cmd> · 51skills/ · 252 agents/*.md · 8no commands tree, no refs treethe orchestrator is one file with all 8 phasesbecause there is no lazy loading hereplugins are copied, prefixed on a name clashrefs resolve from GitHubCodex CLI/multi-agent · $multi-agenttransformed with 22 ordered rulesskills/multi-agent · exactly 1refs/commands/<cmd> · 51refs/skills/ · 199specialists are generated as TOML, not copiedplus a router prompt for a real slash commandsub-commands are reference files, not skillsthe reason is in the next sectionOne state root for all threelog, preference and knowledge paths are deliberately left aloneagent-state.json · tracker-state.jsonresume: validate, then re-enter at the next phasework started on one CLI can finish on another
The transform detail sits inside each host box rather than on the arrows, so the arrows only have to carry direction. The three dashed purple arrows converge on one point, because that convergence is the whole idea.

Why Codex gets exactly one skill

Codex collects the name and description of every skill it finds into one block, and silently drops the overflow. It does not warn. This was measured, not assumed.

if each command were its own skillthe skills blockpast the line, entries dropno log, no warningcapacitymeasured on Codex 0.145:142 skills declared75 of them surfacedplus one unrelated skill evictedand plugin skills render with no descriptionso an entry buys nothing even when it fitswhat ships: 1 skill and 51 referencesthe skills blocka single entryread on demandmulti-agent-refs/commands/<cmd>/SKILL.md · 51phases/phase-N-*.md · 8skills/<name>/ · 199located by the recipe carried in AGENTS.mda gate fails if a second pipeline skill ever appearsso the constraint cannot regress unnoticed
Two more silent failures live in the same family: forking with full history while overriding the model discards the override, and there are four concurrency slots, so at most three sub-agents can run. That ceiling is why the Codex review panel is exactly three.

08Three operating systems

The same scripts have to run on macOS, Linux and Windows. That is a contract, not an aspiration: at the end of every sync each shell script is syntax-checked and scanned for patterns that are not portable.

PlatformHow it is detectedWhat changes
macOS$OSTYPE is darwin*BSD file timestamps; secrets in the Keychain
Linux$OSTYPE is linux*GNU file timestamps; secrets in libsecret
Windows (Git Bash)$OSTYPE is msys or cygwinThe home directory resolves under /c/Users/; secrets in Credential Manager
Windows (WSL)/proc/version mentions MicrosoftThe Linux toolchain, inside WSL

Six rules that keep it portable

  • Paths are always quoted and always go through the home variable. No absolute user path anywhere.
  • Timestamps try the BSD form first and fall back to the GNU form.
  • Tree walks prune node_modules, Pods and build output identically everywhere.
  • Text tools are invoked in POSIX form. No GNU-only flags.
  • Secrets only ever go through one layer. Nothing calls the platform tool directly.
  • Verification parses every shell script after a sync. Any output at all means a portability regression.

09Talking to the outside

A task rarely arrives self-contained. Six typed fetchers pull in the surrounding evidence, and six channels write the result where people are already looking. Neither has an address or a secret hard-coded: addresses come from preferences and secrets from a keychain mapping.

SourceWhat it brings inIf it fails
ConfluenceFeature specification pagesThe run continues
Swagger / OpenAPIEndpoint contractsThe run continues
CrashlyticsThe stack trace behind a reported crashThe run continues
GraylogService logs for a transaction idThe run continues, but not silently
FortifySecurity scan findingsA critical finding stops review
FigmaDesign truth: screenshots, tokens, component mappingIf all three tiers fail, the run stops
An unreachable source is announced, not absorbed. Exiting with success is not permission to stay quiet. A network failure has to offer a real choice: refresh the credential, connect the VPN and retry, continue without this source, or abort. Which branch was taken gets recorded. Because I searched the logs and found nothing, and I never reached the log server, are different statements, and only one of them is true.
ChannelWhat it writesThe rule it respects
Pull requestA description with fixed sections: summary, changes, architecture, verification, dependencies, relatedA Bitbucket update must not clear the existing reviewers
JiraOne comment: summary, test scenarios, source referencesIt writes once, no matter how many PRs opened
ConfluenceA page under a parent you chooseDesign frames upload as attachments, never hotlinked
WikiA component page, per-platform sub-pages, screenshots, a status boardIt only opens for component work
GitHub issueA comment plus a progress-flag update in the issue bodyThe issue is never closed, and comment and flags are both or neither
PR reviewOne inline comment per finding, anchored to a line, plus a review stateOne big lumped comment is forbidden

10How it keeps itself honest

Most of what follows exists because the opposite behaviour shipped once and cost something.

No commit without a passing build

And passing means a log that shows it. A self-assertion does not count as a build.

An issue is never closed

Auto-close keywords are forbidden in commits, PR titles and bodies. Closing is a human decision.

Uncommitted work is never removed

The cleanup step has a safe skip path and never force-removes.

A design is never guessed

If a variant, spacing or string is missing, the run stops and asks for the analysis to be regenerated. Substituting something close has cost rebuild rounds.

No AI credit anywhere

Not in commits, not in PR bodies, not in code comments. The author is always the user's identity.

An empty answer is not consent

If a question is submitted blank it is asked again, never resolved to a default.

Counts are derived, not asserted

Every number describing how many commands exist is computed from the tree, and a gate requires the prose to agree.

A test that asserts nothing is rejected

The runner fails a suite that exits successfully having checked nothing. Three suites were doing exactly that.

On top of those sit 137 smoke suites, a separate parity gate per host, an install fingerprint that catches structural drift, and a registry where a command name may only disappear through a recorded rename.