Skip to content

Repository files navigation

Podium

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.

The moment it exists for

$ 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.

See it work

./demo.sh              # run five jobs and print the receipts
./demo.sh --console    # the same, then open the desktop console on it

The demo uses a stand-in executor and leaves ~/.podium untouched. It shows every verdict and proves that podium audit catches an edit.

Install

The Claude Code plugin is the primary install path:

claude plugin marketplace add devYRPauli/podium
claude plugin install podium@podium
podium init

The 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.

Using it

$ 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.

How it works

  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.

When it pays

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.

Honest limits

  • 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_limited as exactly that.

Alternatives

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

Working on it

./test/ascii.sh
./test/run.sh
cd desktop && npm test
cd desktop && npm run smoke

None 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.

License

MIT.

About

Verified delegation for Claude Code. The runner executes acceptance checks and records a receipt for every job.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages