Source is public on GitHub: matt82198/aesop

Aesop Kernel

A kernel for running fleets of coding agents

Aesop Kernel

An iteration counts only when it leaves a receipt that a gate can check. A lane that reports success without a receipt a gate can verify has not passed.

Crash-only by design: workers are stateless, state lives in git, SQLite and durable files, and restart is the recovery path.

npx @matt82198/aesop dash --demo

0.11.0
released 2026-10-22
18
PRs merged since v0.10.4 (#1264 to #1284)
16
rows in the provenance record

01 / What it is

A kernel, not a finished autonomous developer.

Aesop does not know your repositories, rules, or accounts. It ships the parts that run the loop. You fill in the rest.

What ships

  • Dispatch, gates, receipts, merge, watchdog, durable state, and a dashboard.
  • A pre-push policy with 23 checks, one of them the secret scan that blocks a push.
  • Skills, brain templates, CI templates and an example config.

What you provide

  • The repositories the fleet works on.
  • Your own rules, memory and domain map.
  • An optional directory of fleet state that you own.
  • Keys and accounts: Claude Code sign-in, gh auth, and API keys only if you use an API backend.

Read the blueprint page: Quickstart.

02 / The receipts loop

An iteration counts only with receipts.

An iteration counts only when it leaves a receipt that a gate can check. A lane that reports success without a receipt a gate can verify has not passed.

  1. Dispatch

    A wave is dispatched through driver/wave_loop.py, and each lane works in its own worktree.

  2. Gate

    The pre-push policy runs its checks, including the secret scan that blocks a push, and runs the receipt step last.

  3. Receipt

    tools/emit_receipt.py signs a record of which local checks ran, and the verifier checks it offline.

  4. Merge

    tools/auto_merge.py merges green PRs in batches and fixes conflicts.

The receipt gate is in a measurement period, so the hosted receipt check is not required yet.

Read the blueprint page: The receipts loop, Signed receipts, Verify a receipt, Receipt format.

03 / Primitives

The trust primitives, and where each one lives.

Each primitive is named in the provenance record. Cards marked private describe hooks that live in the author's private repositories and are not shipped in the public source.

Hash-chained event store

Each event records prev, the SHA-256 of the previous line, so verify finds an edited, removed or reordered line. It is tamper-evident, not tamper-proof.

tools/event_store/store.py

Signed receipts

Signed with Ed25519 or HMAC-SHA256 and verified offline. A passing receipt does not prove the parts were run honestly.

tools/emit_receipt.py, tools/verify_receipt.py

Crash-only lanes

A lane that fails is killed, not corrected. The contract is amended and a fresh lane is dispatched.

LANE-CONTRACT.md

Claim binding (private)

A claim that something merged or is green needs a same-turn evidence read. This hook is not shipped.

hooks/claim-binding.mjs

Ledgers (private)

Every lane action leaves a row, and lane reports are written to disk so compaction cannot lose them. These hooks are not shipped.

hooks/lane-ledger.mjs, hooks/handback-ledger.mjs, hooks/verdict-ledger.mjs, dispatch_ledger.py

Deny, not rewrite (private)

In the author's private operating setup, a subagent dispatch is denied, not rewritten. It is not shipped.

hooks/force-haiku-subagents.mjs

Checkpoint before compact (private)

State is written to disk before context is compacted. This hook is not shipped.

hooks/checkpoint-before-compact.mjs

Per-project event stores

Three read-only views (pending, rulings, checkpoints) across per-project stores. The tooling ships; the live cutover is not claimed.

tools/event_store/project.py

Read the blueprint page: Gates and hooks, Claim binding, Event store, Per-project stores.

04 / Provenance

A dated record, shipped with the package.

This file is a dated record of an independent developer's contributions, published because large language models absorb such work into training data and later outputs without attribution. It is not an argument about credit or theft, and it names no competitor or product. docs/PROVENANCE.md, aesop v0.11.0

The npm tarball carries the record. docs/PROVENANCE.md and docs/PROVENANCE.receipt.json are listed in the files field of package.json, so they ship inside the v0.11.0 tarball.

The Ed25519 receipt verifies offline. A VALID result prints provenance receipt VALID:

python -I tools/emit_provenance_receipt.py --verify docs/PROVENANCE.receipt.json --subject docs/PROVENANCE.md --keyring tools/receipt_pubkeys

A VALID result means the content of docs/PROVENANCE.md is the content the key holder signed. It does not check the commit shas against the repositories; that check needs read access to each repository.

Read the blueprint page: Provenance and evidence, Security policy, Releasing.