This page takes a stranger from install to one landed change. The target is about 20 minutes. It uses a throwaway repository and a throwaway bare remote, so nothing reaches a repository you care about. The commands are the ones scripts/outsider_smoke.py runs in CI, and CI runs that smoke in python:3.12-slim. Every shell command below is a command the smoke executes. The smoke cannot start T3 threads, so the four steps that need T3 each carry a T3 action line.
Create a directory ~/my-repo holding two files. README.md holds any text. a.txt holds the single line first line. The work later adds a second line to a.txt. Then create the throwaway remote and push the first commit.
git init -b main ~/my-repo
git init --bare ~/my-remote.git
git -C ~/my-repo remote add origin ~/my-remote.git
git -C ~/my-repo add README.md a.txt
git -C ~/my-repo commit --message "outsider smoke"
git -C ~/my-repo push origin main~/my-remote.git is the remote. The landing queue pushes trunk to it, so this walkthrough needs no hosted repository. The smoke creates its own remote the same way.
Run the install from your pstack-t3 checkout.
python3 scripts/install.pyT3 action: Run
$setup-pstackin a new T3 thread. It reads the live catalog and writes your roles.
The smoke runs the roles command below against a fixture catalog it writes. On your machine, a user-level $setup-pstack run writes the snapshot to ~/.config/pstack-t3/catalog.json, or under $XDG_CONFIG_HOME when you set it to an absolute path. Use the path where your snapshot landed in the command below. Replace grok/grok-4.7 with a provider and model you run.
python3 scripts/install.py doctorpython3 skills/pstack-runtime/scripts/roles.py show --catalog ~/.config/pstack-t3/catalog.json --parent grok/grok-4.7 --role "feature, refactoring"T3 action: Open the coordinator thread. In that thread,
$brigadeopens the restaurant. Pin the thread;brigade opendoes not pin it.
The smoke runs the same open command. It prints the restaurant path. Use that path as $RESTAURANT in the commands below.
python3 skills/brigade/scripts/brigade.py open --project-root ~/my-repo --name smokeBind the restaurant to the coordinator thread. $THREAD is the coordinator thread id. Later brigade writes except close --dry-run carry --owner $THREAD@1. The smoke binds with smoke-thread.
python3 skills/brigade/scripts/brigade.py --at $RESTAURANT set --thread $THREADThe queue needs a contract before any work can be fired. The local and push modes are frozen, per the guide. Push mode is supported and frozen. This walkthrough uses push mode.
python3 skills/landing/scripts/land.py --repo ~/my-repo init --trunk main --mode push --remote originThe command prints the landing store path. That store holds the contract, the queue, and the lease table.
File the request on the restaurant's rail.
python3 skills/brigade/scripts/brigade.py --at $RESTAURANT --owner $THREAD@1 ticket add --summary "Add a second work line" --kind feature --paths a.txtThe command prints T1. --paths names the file the work will change, so fire can lease it.
Fire the ticket into one unit of work for the feature playbook.
python3 skills/brigade/scripts/brigade.py --at $RESTAURANT --owner $THREAD@1 fire --tickets T1 --station feature --summary "Add a second work line" --paths a.txtThe command prints the unit and its lease. Fire claims the landing lease on a.txt.
T3 action: Render the worker brief with
brigade briefand launch the worker thread with that brief. The worker runs the feature playbook in its own worktree.
The smoke cannot start a thread. It stands in for the worker with these commands on branch smoke/d1. The two lines show the change, and the commit records it.
git -C ~/my-repo worktree add ~/work -b smoke/d1 origin/main
printf 'first line\nsecond line\n' > ~/work/a.txt
git -C ~/work add a.txt
git -C ~/work commit -m "Add a second work line"
SHA=$(git -C ~/work rev-parse HEAD)SHA is the commit the review checks and the queue lands.
T3 action: Ask another model family to review that commit. Recording a pass refuses a verifier from the author's model family unless you pass
--same-family.
Record the branch and the commit on the unit, then record the pass. --author and --verifier take provider and model names. The values below are the smoke's examples, so use the models you run.
python3 skills/brigade/scripts/brigade.py --at $RESTAURANT --owner $THREAD@1 dish D1 --branch smoke/d1 --sha $SHA --state in-reviewpython3 skills/brigade/scripts/brigade.py --at $RESTAURANT --owner $THREAD@1 pass record D1 --sha $SHA --verdict pass --author grok/grok-4.7 --verifier claude/claude-opus-5-5The unit cannot move to merged until it has a pass at this commit.
Submit the reviewed commit to the queue, then drain the queue. The queue runs the contract's checks and pushes trunk to origin. This walkthrough sets no check, so the contract's check list is empty.
python3 skills/landing/scripts/land.py --repo ~/my-repo submit --holder smoke/D1 --branch smoke/d1 --sha $SHA --lease L1 --reviewer claude/claude-opus-5-5 --owner smoke/@1python3 skills/landing/scripts/land.py --repo ~/my-repo landThe queue replays the reviewed commit onto trunk.
$REMOTE is the remote's path, ~/my-remote.git. Read the landed file from the remote's trunk.
git --git-dir $REMOTE show main:a.txtThe output shows the landed file. It holds both lines.
Record that the unit merged. Then print the report. close --dry-run writes nothing.
python3 skills/brigade/scripts/brigade.py --at $RESTAURANT --owner $THREAD@1 dish D1 --state mergedpython3 skills/brigade/scripts/brigade.py --at $RESTAURANT close --dry-runThe report counts one merged item. The store keeps the merged unit.
The smoke runs every command above against a home it mints and a throwaway remote it creates. It checks each command's exit status and, where a step has one, its expected output. It then checks three results. The file on the remote's trunk holds both lines. The unit is merged. The report counts one merged item. CI runs the smoke on every pull request. The four T3 action steps are the only parts it cannot run.