Soroban is a coding-agent extension and skillset — installable into
Pi, Claude Code, Codex, or any Agent Skills-compatible
harness — that teaches the agent a disciplined Beads (br) + Jujutsu (jj)
workflow instead of leaving it to improvise one from scratch every session.
A soroban is also a Japanese abacus: beads on wires, slid one at a time, each
movement doing exactly one unit of work before the next is allowed. Coding
agents have no such discipline built in. Left to their own devices they either
try to hold an entire problem in their head at once and blur the details, or
plough through it fast and unreviewed. Soroban is the discipline imposed from
outside: work broken into single beads, each one moved deliberately, tracked
in Beads (br) and moved through
review with Jujutsu (jj).
The problem this solves is laid out at length in Taming Jagged Intelligence with Beads and jj: agents are strikingly good at some things and strikingly bad at neighboring things in the very same breath, and no amount of clever prompting evens that out. What does work is packaging effort into pieces small enough that an agent's rough edges stop mattering, and keeping a human genuinely in the loop of review rather than rubber-stamping whatever comes back. That post describes the shape of the workflow; Soroban is what makes the workflow actually repeatable, so that shape doesn't have to be re-explained to every fresh agent session from scratch. Install soroban in your preferred coding agent:
- Pi (recommended): install the repository root as a Pi package. Pi discovers the skills plus TypeScript hooks, slash commands, and prompt templates that enforce and automate the workflow — the only host with hook-based enforcement, not just the skills.
- Claude Code or Codex: install every directory under
skills/into the host's Agent Skills. The same planning, hack, slip, workspace, and per-bead procedures work there throughSKILL.mdinstructions, without loading any Pi-specific code.
The short, always-on machine rules live one level up, in
/etc/nixos/home-manager/server/llms/global-core.md. The longer procedures
live here, as skills loaded lazily on demand, so there is exactly one source
of truth for the workflow no matter which agent is reading it.
Soroban teaches a workflow built on two external tools. Both are required on the machine that runs the agent, no matter which coding agent you install soroban into:
- Install Beads (
br). Soroban tracks every unit of work as abrissue — nothing here works without thebrCLI onPATH. - Install Jujutsu (
jj). Soroban moves work through review withjj, not rawgit— thejjCLI must also be onPATH. - Install soroban in your preferred coding agent. Pi is recommended — it's the only host that also gains Pi's hook-based enforcement, on top of the same skills: Install in Pi. Claude Code and Codex get the same workflow through skills alone: Install in Claude Code or Codex.
- Install every skill directory together, not a subset. Each
first-level directory under
skills/is an independent Agent Skill, butsoroban-hackandsoroban-slipboth depend onsoroban-workflow,jj-workspaces,caveman, and the Beads planning/quality skills.
No package.json and no runtime npm install are required anywhere.
Add the absolute repository path to packages in ~/.pi/agent/settings.json:
"packages": ["/absolute/path/to/soroban"]Local package sources load in place, and pi update skips them, so edits to
this repository are not silently reset the way a git: package source would
be. Run pi list afterward and confirm Soroban's extensions, skills, and
prompts show up.
Link each skill directory separately. Do not link the skills/ parent as a
single skill, and do not point Claude Code or Codex at the repository root —
those hosts should see the portable skills only, never Pi's extensions/ or
prompts/.
Both discover user skills as symlinked directories — Claude Code under
~/.claude/skills/, Codex under ~/.agents/skills/. Point dest at whichever
your host uses and link every skill directory in one shot:
soroban_dir=/absolute/path/to/soroban
dest=~/.claude/skills # Codex: ~/.agents/skills
mkdir -p "$dest"
ln -s "$soroban_dir"/skills/*/ "$dest"/If a destination already exists, inspect it before overwriting it — someone may have put it there on purpose. After installing, restart the host if its skill picker hasn't refreshed. Verify the install with:
test -r ~/.claude/skills/soroban-workflow/SKILL.md # Claude Code
test -r ~/.agents/skills/soroban-workflow/SKILL.md # CodexThen open the host's skill picker (/skills where supported), explicitly
select soroban-workflow, and ask it to describe the claim → work → close →
squash sequence. Codex also accepts an explicit $soroban-workflow mention.
Either way, the host should load the skill and describe the workflow without
ever exposing extensions/ or prompts/ as skills of their own.
| Term | Meaning here |
|---|---|
| bead | One br issue — the smallest unit of trackable work |
| slip | Work exactly one bead, then stop and hand it back for review |
| hack | Work through the whole ready queue, bead after bead, without pausing |
hack and slip are both ordinary English words that show up constantly in
unrelated conversation, so Pi's trigger matching is deliberately stricter than
a plain substring search — it looks for the workflow intent, not just the
word.
These are load-bearing rules for extensions/; they do not imply equivalent
hooks exist in Claude Code or Codex.
- Never mutate
systemPrompt. Doing so invalidates prefix prompt caching on Anthropic, DeepSeek, and OpenAI alike. Context injection goes through Pi's dedicated context hook instead. - Keep
tool_callcheap. Handlers run sequentially before every single tool call, so use regex there and nothing heavier — no subprocesses, no file I/O. - Shell out only through
pi.exec. It is not a shell, and it does not reject on a non-zero exit, so always inspectresult.codeyourself. - Never install npm dependencies at runtime. No native addons, no ambient package-manager writes.
- Warn, don't block. Enforcement reports problems; it never silently rewrites a user's command out from under them.
- Use
br, notbd. This installation currently uses thebrCLI.
Soroban uses the Beads prefix sor. It does not maintain a tracked Beads
export: br owns everything under .beads/, that directory is gitignored,
and no br mutation ever produces a file worth committing. Pi serializes its
own br calls behind an advisory lock, so two Pi sessions working the same
repository can't erase each other's writes — but it never reads or writes
Beads data on its own behalf.
Note that the br CLI referenced throughout is the
beads_rust fork, not
gastownhall/beads. Though many of these
skills are probably compatible with the upstream, they haven't been tested.
Check beads_rust's own docs/help for anything not covered here.