Your process, across pull requests.

Let the work run.

You shouldn’t have to coordinate every step of every change. Put your working instructions, review criteria, and checks in the repository. Pelaggio runs that process with your coding agents, from charter to pull request.

An open-source CLI. Bring the agents you already use.
Read the current limits before your first run.

How it works

Write down how you work.

Put the project’s conventions in its agent instructions, what you look for in its review rubric, and how to verify a change in its check commands. Those shared files guide the next work item too.

For each item, define the outcome and boundaries. Pelaggio runs implementation and review in a git worktree, with planning when the item calls for it. Shipping opens a pull request by default; your configuration controls delivery.

Start with a change you can judge yourself. Tests cover what they exercise. Review can miss things.

Read the operating limits ↗
Each step includes a shakedown.
  1. Plan
    Shakedown
  2. Implement
    Shakedown
  3. Ship
    Shakedown

Findings send the work back.

Examples

Two work items.

Choose a work item

CSV export

01 / Request

“Let me export the filtered work list as CSV.”

02 / Decisions
  • Exact-match, as the list. Unknown → header-only 200.
  • Quote every data field; leave the header unquoted.
03 / Checks
  • all 23 filtered rows across pages; source unchangedpass
  • exact Unicode, comma, quote and newline round-trip; CSV download headerspass
  • empty store produces header-only exportpass
  • browser download uses changed filter after paginationpass
  • original status filtering and pagination remain functionalpass
  • Baseline tests and syntax checkspass
04 / Handoff
JoeThe list’s filter, not the page you’re on. Unknown status keeps the header and writes nothing — they didn’t 400 it. Every field quoted, header left bare.
Joe, back from offshore with the catch
Receipts
Request
“Let me export the filtered work list as CSV.”
Accept
  • All matching rows, any page
  • CSV round-trip, including punctuation
  • Browser uses the current filter
  • Store unchanged
Bounds
No auth · UTF-8 CSV, not spreadsheet apps
  • Status-query semantics

    TakenExact-match, as the list. Unknown → header-only 200.

    NotReject unknown status with 400.

  • Field quoting

    TakenQuote every data field; leave the header unquoted.

    NotQuote only when a field contains comma, quote, or a break.

Illustrative run meter. Illustrative meter: model names, wall clock, attempt count, tokens, turns, and costs below are authored examples, not measurements from this capture. The saved attempts record unpinned models and no token, turn, or cost measurements.

Captured attempts · Capture manifest and digests

Wall clock
37 min
Cost
~$0.92estimated
Tokens
277k in · 15k out
Turns
32
Illustrative completed path · 4 example attempts
StepProviderModelCostTurnsTokens
shakedown-plangrokgrok-code-fast-1~$0.18648k / 2.1k
implementcodexgpt-5-codex~$0.4214126k / 8.4k
shakedown-codegrokgrok-code-fast-1~$0.24872k / 3.2k
shipgrokgrok-code-fast-1~$0.08431k / 1.1k
  • Shakedown used a different provider than implement.
  • Shipped to a local git remote, not a GitHub pull request.
  • Grok ran with unsandboxed fallback — no Landlock on the host.

Interrupted import

01 / Request

“Let me resume an interrupted import without starting over or duplicating the work.”

02 / Decisions
  • Persisted records, indexed by stable id.
  • Preflight all conflicts before writing.
  • Fail visibly; leave the store for repair.
03 / Checks
  • SIGKILL after durable progress, restart without duplicates or lost existing rowspass
  • repeating a completed import is idempotentpass
  • conflicting identity fails visibly and preserves existing contentpass
  • malformed JSON fails before writespass
  • a later invalid record is detected before writing earlier valid rowspass
  • Baseline tests and syntax checkspass
04 / Handoff
JoeSame command after a kill, keyed off the records already there — not a journal. Conflicts named before any write. If the ids were already dirty, it stops and leaves the store.
Joe, back from offshore with the catch
Receipts
Request
“Let me resume an interrupted import without starting over or duplicating the work.”
Accept
  • Same command after a kill, no duplicates
  • Completed import is idempotent
  • Conflicts named before any write
  • Malformed input fails before writes
Bounds
One writer · Process interrupt, not power loss or two processes
  • Restart identity

    TakenPersisted records, indexed by stable id.

    NotSource hash and a separate checkpoint journal.

  • Conflict timing

    TakenPreflight all conflicts before writing.

    NotStop at the first conflict during incremental commits.

  • Pre-existing duplicate ids

    TakenFail visibly; leave the store for repair.

    NotCollapse equals, or migrate existing data.

Illustrative run meter. Illustrative meter: model names, wall clock, attempt count, tokens, turns, and costs below are authored examples, not measurements from this capture. The saved attempts record unpinned models and no token, turn, or cost measurements.

Captured attempts · Capture manifest and digests

Wall clock
38 min
Cost
~$1.07estimated
Tokens
305k in · 17k out
Turns
36
Illustrative completed path · 4 example attempts
StepProviderModelCostTurnsTokens
shakedown-plangrokgrok-code-fast-1~$0.21754k / 2.7k
implementcodexgpt-5-codex~$0.5116141k / 9.8k
shakedown-codegrokgrok-code-fast-1~$0.28981k / 3.6k
shipgrokgrok-code-fast-1~$0.07429k / 940
  • Shakedown used a different provider than implement.
  • Shipped to a local git remote, not a GitHub pull request.
  • Grok ran with unsandboxed fallback — no Landlock on the host.

Try it locally

Set up your repository.

You’ll need Node 20.6+, git, an authenticated agent CLI, and gh for GitHub pull requests. Provider setup varies; check the setup guide first.

Before you run it ↗

  1. Generate the configuration

    Generate the skills, quality rubric, sample roadmap, and configuration.

  2. Adapt it to your project

    Give this prompt to your agent. Read the resulting diff before continuing.

  3. Run one work item

    Stay nearby for the first cycle. Follow the work and inspect what comes back.