Verified delegation for Claude Code. One agent hands briefed work to a roster of bots. A shell command, not a model, decides whether the work landed.
Every job carries an acceptance check that the runner executes. Jobs outlive the session that launched them. Every settled job leaves a receipt.
$ podium ledger --unverified
20260821-052315-157325573 researcher rate_limited unverified
20260821-052313-1565818314 implementer rejected failed_check exit 1
20260821-052311-155861591 reviewer done unverified
Look at the third row. That job ran to completion, exited cleanly, and reported success. No check ever ran, so nothing confirms it did anything at all. It stays on that list forever.
Four verdicts never collapse into each other:
| verdict | means |
|---|---|
verified |
a check ran and exited 0 |
failed_check |
a check ran and failed, so the job is rejected whatever the bot claimed |
check_timeout |
the check hung and was stopped, so it never passed |
unverified |
no check passed, so nothing confirms the work |
Only the first is a pass. unverified is never a soft one.
./demo.sh # run five jobs and print the receipts
./demo.sh --console # the same, then open the desktop console on itThe demo uses a stand-in executor and leaves ~/.podium untouched. It shows every verdict and proves that podium audit catches an edit.
The Claude Code plugin is the primary install path:
claude plugin marketplace add devYRPauli/podium
claude plugin install podium@podium
podium initThe plugin puts bin/podium on PATH. podium init proves the install with two canary jobs.
Use the Git clone path if you do not use Claude Code. Point your agent at this directory:
Set up Podium from this repo.
It follows docs/SETUP.md, asks once, runs podium init, and proves the install with two canary jobs.
$ podium bots
scout Fast codebase recon. Returns compressed, structured context for another bot to act on.
implementer Writes code against a brief. Makes the smallest change that satisfies the acceptance check.
reviewer Reviews a change for correctness and scope creep. Reports findings, never edits.
podium bots new <name> creates a bot in $PODIUM_HOME/bots. A plugin upgrade cannot wipe it.
$ podium run implementer "Add a null check to parse() in src/parser.ts" \
--check "npm test -- parser"
podium: implementer may write in /Users/you/project
20260821-052308-155126519
$ podium status 20260821-052308-155126519
id=... bot=implementer model=... status=done verdict=verified duration_secs=41 exit_code=0
podium ledger shows the receipts. podium ledger --unverified shows work that no check confirmed.
Write the check first, and make sure it fails. A check that already passes proves nothing. Red must come before green.
A job's cwd is where you invoked it. A writing bot can edit the repository where you were standing.
A detached bot cannot ask a question. The brief must explain what to do when something is ambiguous.
you --> Claude Code --> podium --> detached job --> executor --> bot
chief of staff runner | |
| `- prompt + memory
+-- acceptance check (run by the runner)
`-- log.jsonl (the receipts)
- A bot directory holds its prompt, durable memory, and workspace.
- The runner detaches jobs through
nohup, so they outlive the launching session. - The runner executes the check. A failed check rejects the job, whatever the bot reported.
- The executor enforces each bot's tool policy. The receipt records that policy.
See docs/architecture.md for the design and the full runner model.
Use Podium for two or more independent tasks that each take longer to run than to specify. Below that line, one delegated task costs more to brief and check than to do.
Four heavy jobs took 1248 seconds of work and 359 seconds of wall time, a 3.5x speedup. Eight concurrent jobs took 822 seconds of work and about 187 seconds of wall time, a 4.4x speedup. No job was throttled in either round.
The task also needs a checkable outcome. A check on code proves the function.
A check on prose proves the shape: the sections, the length, the paths it cites.
Nine research jobs on a foreign repository all reached verified, and the check
could not have told a correct report from a confident wrong one. Use Podium where
a check can fail for the right reason.
- Podium supports macOS and Linux only.
- Podium never handles secrets. You run the authentication command.
- A bot is confined only as well as its executor confines it.
- A writing bot can edit anything under its working directory. Use a container if you need more confinement.
- An acceptance check only proves that the check passed. It cannot prove that the check was worth running.
- Fan-out multiplies token spend. Expect throttling, and read
rate_limitedas exactly that.
OpenMausBot is a polished desktop Grok Bot with signed installers and app integrations. If you want that experience today, install it instead.
Three different things get called trust. Policy asks whether an agent may act. Signing asks whether someone edited the record. Podium asks whether the work landed. Use it when that distinction matters.
docs/architecture.mdexplains the design decisions and measurement history.docs/SETUP.mdguides the installer.docs/console.mdinstalls and runs the desktop console.docs/research.mdcompares the alternatives and their costs.CLAUDE.mdexplains the repository and development workflow.
./test/ascii.sh
./test/run.sh
cd desktop && npm test
cd desktop && npm run smokeNone of these suites calls a real model. The runner suite has 178 assertions, desktop has 31, and smoke has 13. The ASCII check has no file allowlist.
Licensed under the terms in LICENSE.
MIT.