Agents, a dispatch command and skills for running development as a factory of specialised roles inside Claude Code, in parallel waves.
Eleven roles. factory-chief orchestrates. factory-analyst gathers
requirements, factory-po slices them into stories, factory-techlead decides
structure and writes ADRs. factory-frontend, factory-backend, factory-dba
and factory-devops implement. factory-cyber, factory-qa and
factory-tester verify.
Fifteen stack specialists. stack-cobol, stack-typescript, stack-react,
stack-vue, stack-astro, stack-capacitor, stack-firebase, stack-node,
stack-php, stack-dotnet, stack-oracle, stack-sql, stack-mongodb,
stack-python, stack-docker.
Each specialist's body does not restate generic good practice. It lists the traps
specific to that technology, the kind a generic agent misses: that COMP-3 keeps
its sign in the last nibble, that Firestore security rules are not query filters,
that a composite index on (a,b) does not help a query filtering only on b.
One command, /factory, which dispatches in waves via the Workflow tool.
One skill, cobol-copybook, holding the copybook, COMP-3 and EBCDIC
reference.
make install # into ~/.claude
make install CLAUDE_DIR=~/.claude-alt # into another configuration directory
make status # shows what is linked
These are symlinks, not copies: editing here takes effect immediately. Restart your Claude Code session after installing so the agent registry reloads.
/factory plan add magic-link authentication
/factory add magic-link authentication
/factory review
plan runs reconnaissance and design only, so you can approve before spending
the implementation waves. review runs the verification wave alone over the
current diff.
A wave is not a conceptual stage, it is a data dependency. Two tasks belong in the same wave when neither reads the other's output. Grouping by stage ("now all the developers") creates a barrier where none was needed, and a barrier makes the fast task wait on the slow one for no reason.
The command uses pipeline() by default, which has no barrier between stages: one
story can be in verification while another is still being implemented.
parallel() only appears where the next stage genuinely needs the whole set, for
example factory-chief consolidating, or the design stage which needs all of the
reconnaissance.
An earlier squads/dispatch exists, with around forty Python scripts doing wave
decomposition, routing, model selection and cost tracking. It was written when
there was no native wave engine.
Today the Workflow tool does that: phases, parallel fan-out, barrier-free
pipelines, schema-validated output, worktree isolation and token limits.
Reimplementing it in Python would mean trading one call for forty files to
maintain.
The 26 files in agents/ are generated. Edit the table in gen-agents.py, not
the markdown.
make agents # regenerate
make check # validate the frontmatter of all 26, exits 1 on failure
check-agents.py exists for a concrete reason: the first version of the
generator used textwrap.dedent on an f-string containing an embedded list and
produced YAML with invalid indentation. Claude Code drops an agent with broken
frontmatter silently, with no error. The check catches that.
The same applies to
skills/cobol-copybook/references/generate-references.py: the byte tables are
generated from Python's codecs, with a self-check, because the first version
swallowed a LookupError from a missing codec and produced an invented table.
This repository and the projects generated from it are public. Commit with:
export TZ=UTC
Without it, the commit carries the author's timezone offset, which is location metadata readable through GitHub's public API.