The operating model
Every piece of work is a change.
/sulis:change is the one command for the whole life of a piece of work — start, focus, ship, rebase, discard. Everything else in Sulis happens inside a change. If you're going to learn one Sulis command, learn this one.
The lifecycle
A piece of work moves through six stages, all bounded by a single change:
Every change gets a six-character handle (CH-01HQ8X), its own Git branch (change/fix-login-bug), and its own isolated worktree directory. The handle is what you'll use to reference the change in conversation; the branch and worktree are where the work actually lives.
Two things to know about how Sulis runs
When you start a change, Sulis does two things that are worth knowing about up front. Both are deliberate; both are shaped by the realities of autonomous engineering.
Each piece of work gets its own terminal, its own working directory (a Git worktree), and its own focused Sulis session. The reason: context isolation. If you're working on auth in one change and storage in another, the two sessions don't bleed into each other — each Sulis knows about its own change and nothing else.
You can have three or four changes in flight without any of them getting confused about
what they're building. /sulis:change focus CH-xxxx jumps you back to the
terminal for a specific change.
--dangerously-skip-permissions.
Claude Code asks for permission before every shell command, file edit, and network call by default. That's the right safe default for casual use — but it makes autonomous engineering impractical (a full change might need 200+ permission prompts before it ships).
The spawned terminal opts out of those prompts so Sulis can run the full lifecycle — spec, design, build, review, secure — without you sitting on the prompt button. The trade-off is explicit: Sulis runs more autonomously inside the isolated worktree.
The six subcommands
Each subcommand maps to one decision the founder makes about a piece of work. Three are safe (no destructive side effects); two prompt before acting; one is destructive and explicit.
Opens a new focused workspace for a piece of work. The most common entry point.
fix) from the
22-primitive vocabulary, creates a branch (change/fix-login-bug) and a
worktree, writes a reconnaissance note about the existing repo, then spawns a new
terminal already focused on the change. The handle (CH-01HQ8X) is what
you'll use to reference the change later.
If your system can't spawn a terminal automatically (some platforms or terminal apps don't support it), Sulis tells you the path to cd into and the command to run yourself. No silent fail.
Shows every change in flight, in one scannable list.
The list is file-based — Sulis reads change manifests on disk, your local session state, and the Git branches that exist. There's no database, no service to be down.
Reattaches to a change you started earlier.
Lands a finished change into the shared dev branch. This is the only subcommand that changes shared state — so Sulis runs through a four-step gate before the merge happens.
1. Confirm. Sulis echoes the exact branch + the irreversible step and asks for an explicit yes/no.
2. Push + open PR to
dev. Never to main;
promotion to main is a separate, deliberate founder act.3. Wait for automated checks. The PR's
branch-ci must go
green before the merge proceeds. If it fails, Sulis stops and surfaces what broke.4. Run the review gate.
/sulis:review composes code-health
+ security and returns PASS (proceed),
CONCERN (ask the founder), or CRITICAL (stop, do not
merge).
The trivial-change carve-out (CW-05): if the change is ≤30 lines, 1 file, and no new files were added, Sulis skips the full review automatically — and tells you it skipped, with the reason. Otherwise the review runs.
The audit trail. After the squash-merge, the remote branch is deleted
(it's just the merge artefact). The local branch and worktree stay intact, marked
stage='shipped'. The cockpit's "Shipped" section reads from this; you can
always retrace what shipped and why.
Pulls the latest dev work into the change branch so your work stays current with the team.
If the merge clean: Sulis reports the commit count and you keep going. If there are conflicts (the team touched the same lines as your change), Sulis tells you which files clash and lets you decide whether to resolve now or carry on with the current work and handle conflicts later. Sulis won't auto-resolve.
Throws a change away. Deletes its branch, its worktree, its local state, and its manifest. Use for abandoned experiments, dead-ends, and orphaned changes you don't want taking up cognitive space.
Shipped changes are protected by default. nuke won't
destroy the audit trail of a shipped change unless you pass an explicit
--include-shipped flag.
The 22 primitives
Every change carries a primitive — the kind of architectural move it
represents. Sulis picks one from your intent ("fix the login bug" → fix; "split
the god-class" → decompose) and falls back to feat when nothing
clearly fits. The primitive shapes the branch name, the conventional commit prefix, and the
kind of review the change goes through.
The 22 primitives sit inside 5 mutually-exclusive groups, ordered by the dominant relationship the change has to existing code:
Introduce new code, or new usage of existing code. Adds behaviour.
Change the structure of existing code without changing behaviour.
Change the implementation behind a preserved surface.
Remove existing code or behaviour.
Add cross-cutting concerns over existing behaviour. Non-functional changes.
fix,
feat, chore, and other Conventional Commit prefixes as
friendlier shorthands — they map to the appropriate primitive internally. So
--primitive fix works as well as --primitive secure; pick
whichever you're more comfortable with.
What lives inside a change
Once a change is started, the six stages — Recon, Specify, Design, Implement, Review, Ship — all happen inside it. Each stage has its own entry-point skill that Sulis runs when it arrives there. The Plugin reference page lays out every skill under its parent stage; the change is the container around all of them.
Working with multiple changes
Because each change has its own terminal, its own worktree, and its own focused Sulis session, you can have several pieces of work in flight without context-switching cost. Typical pattern:
/sulis:change start "fix login"— terminal A opens, focused on the bug./sulis:change start "add analytics"— terminal B opens, focused on the feature.- From any other terminal,
/sulis:change listshows both in flight. /sulis:change focus CH-01HQ8Xreattaches to terminal A if you closed it./sulis:dashboardshows the same set in a richer view, with progress per change.