● A CLI any agent can run Model-agnostic Harness-agnostic v0.1.2 · 34 of 39 done · US-18 unsigned

Build & ship.
The keel holds!

KEEL is a super-thin method for human and AI-agent collaboration you drop into a git repository: signed stories, standing laws, a live snapshot, and a CLI any agent can run. Deterministic commands in bin/ — not prompts that drift. Any agent. Any harness. bin/claim then bin/review; the accept key stays human.

Any model. Any harness. The CLI does not improvise. What it is

The human surface

Even the overview is a command.

bin/render writes overview.html from the same files the agent reads. data/stories.json, data/epics/, decisions.md, laws/, and STATE.md — one canonical store. Checkboxes, quoted evidence, glanceable counts. No JavaScript framework. The operator judges here — not in the chat.

The operator page is a projection of data/stories.json, data/epics/, decisions.md, and laws/ — same truth the agent boots from.

Same repo. Two audiences.

One truth. A FAIL is a win.

A real Hermès session. BOOT, then evidence. AC-3 fails — and the agent stops. That halt is the product. KEEL outputting FAIL means the rules held. Source: screenshots/keel-proof-hermes.png · US-38 evidence bundle.

Hermès session under KEEL: BOOT ok, AC table with PASS and FAIL, agent refuses to piggyback, METHOD.md waiting on Review.
AC-3 fails; the agent will not touch bin/, will not take US-39, will not piggyback. FAIL is a win — every dev gets a gate that actually holds.

01 The problem

Chat is a terrible place to keep a project.

You brief an agent. It writes code. The thread dies, the model changes, the tool gets deprecated — and the context that made the work coherent is gone. Next session starts from zero, or from whatever that vendor still holds.

02 What KEEL is

A repo the agent can resume. A human who still decides.

KEEL is not another coding assistant. It is a thin method you drop into a git repository: standing laws, signed stories, a live snapshot, and a CLI any agent can run. Open a new chat in any harness. The agent boots from the files, does one piece of work, and stops for you to accept. Swap Claude for Grok, Codex for Open WebUI — the project does not move.

Two guides

You are the operator. The agent is in the repo.

03 Why teams use it

What you actually get.

Built for people already working with AI agents — founders, staff engineers, studios — who need the work to survive a model change, a new laptop, or a new hire.

01

Any agent, any model

KEEL does not care if you run Claude Code, Codex, Hermès, Open WebUI, Amp, Grok, or Factory Droid. The method lives in files those tools already know how to read.

02

The project is the memory

Status, decisions, and "where we left off" sit in the repo. A fresh chat with zero history can boot, report the state, and continue. No vendor lock-in for context.

03

Humans keep the accept key

Agents may draft and verify. They may not mark work done. Park, reassign, and epic-accept are operator-only. The agent does not run git worktree add. The gate held on every model we tested — including when nobody reminded the agent.

04

Work comes as signed stories

Intent becomes a contract with acceptance criteria before code moves. Unverifiable requests get parked. Optional scope.touch / scope.forbid and depends_on bind the pack to its ground.

05

Evidence, or it did not happen

A "done" claim without a commit hash or an artifact path is void. You review quoted evidence on a generated page, not a vibe from the chat.

06

No platform to adopt

Stdlib Python. No pip. No build. Git is the runtime. Clone, run bin/init, open the repo in the agent you already use. Local-only is first-class.

04 How a session runs

Five beats.
No invented work.

You open the repo in whatever agent you use today. The agent must prove it read the project before it may edit. Then: one signed task, evidence, your accept. Tomorrow a different model can pick up the same files.

P-BOOT

Session start

Open the repo in your agent. It reads the live snapshot and the law slices for the task, then must print a BOOT line before it may touch a file.

BOOT ok · keel v0.1.2 · …
P-STORY

Intent → contract

Turn a request into a signed story with acceptance criteria. If it cannot be verified, it is parked — not shipped.

bin/gate US-xx · sign US-xx
P-RUN

Execute

The agent gets one story, the project rules, and recent decisions. It works inside that scope, cites evidence per AC, then hands the story back through bin/review. Done is forbidden for the agent.

claim · pack · review
P-ACCEPT

Human judgment

You review the evidence on overview.html and say the literal word. The accept key never transfers by silence, enthusiasm, or elapsed time.

accept US-xx
P-END

Leave residue

Snapshot updates. Decisions are written down. Failures are logged as facts. bin/verify green, then commit and push — or it did not happen.

bin/state · bin/verify

04a For a slice larger than one story

Or, take an epic (E-n) — two extra beats.

An epic is a dispatch envelope: id E-n, goal, ordered stories, depends_on epics, scope.touch / scope.forbid. take E-n claims the whole slice. The agent chains unlocked stories, no human turn between them, presents the epic when the frontier stops, and waits. You judge once.

P-EPIC-RUN

Chain unlocked stories

Each story depends_on is done. One pack, evidence, bin/review. Next unlocked story, repeat — no new take.

bin/claim E-n · bin/pack · …
P-EPIC-ACCEPT

You judge once

When every listed story is review or done, say the word. bin/epic-accept batch-closes the slice. Park and reassign are operator-only.

accept E-n

05 Inside the repo

Where the project actually lives.

Not a database. Not a cloud workspace. Ordinary files your editor, git, and any agent can read. The method sits beside your code in src/.

METHOD.md

Operating manual

The only hand-written instruction source. Adapters are compiled from it.

Source of truth
laws/*.md

Standing world-model

Stack, design, and domain constraints. Versioned. New versions append.

Versioned
data/stories.json

Signed intents

Narrative, AC[], DoD[], status, optional scope and depends_on. Editable until ready. Locked at launch.

Locked at sign
data/epics/E-n.json

Epic envelopes

Goal, ordered stories, depends_on epics, scope. One file per epic. The dispatch unit larger than one story.

Per epic
decisions.md

Append-only residue

Rationale and consequences, newest first. Corrections supersede; they do not rewrite.

Append-only
STATE.md

Bounded snapshot

Phase, open intents, active epics, resume cue. O(current), never O(history). Regenerated freely by bin/state.

Regenerated
overview.html

Human decision surface

Checkboxes, quoted evidence, glanceable first. Generated by bin/render. Groups stories by epic. Works from file://.

Projection
archive/

Packs & evidence

Context packs, evidence bundles, raw logs. Write-once. Distill later into decisions.md.

Write-once
src/

Your project's code

Everything outside src/ is method. bin/init creates the blank for a new ship.

Project
bin/

CLI · 18 wrappers

init · boot · gate · claim · pack · review · state · render · adapt · verify · distill · epic-gate · epic-claim · epic-pack · epic-present · epic-accept · park · reassign. Dispatcher: bin/keel. No pip. No build. Stdlib Python.

Stdlib Python

06 Rules that do not move

Eight invariants. Complexity must pay rent.

These are the load-bearing laws of a KEEL repo. They change rarely, and only with written rationale. Everything else in the method can be simplified.

  1. 01Everything that matters lives in this repo, never only in a harness.
  2. 02STATE.md stays bounded: O(current), never O(history).
  3. 03No done without evidence mapped to AC / DoD.
  4. 04One canonical store (data/, laws/, decisions.md). Pages and views are projections.
  5. 05Raw history to archive/. Durable lessons distilled into decisions.md.
  6. 06IDs — story ids, law keys — are immutable once referenced.
  7. 07Adapters are build artifacts. METHOD.md is their only source.
  8. 08Complexity must pay rent.
The model is interchangeable. The brain is not.

Claude today, Grok tomorrow, a local model on a flight. KEEL does not bind you to a vendor. Local-only is first-class. When you need sync, git push and pull is enough.

07 Provenance

Not a theory. A matrix.

Same test, many tools: cold start, remote repo, full loop. Fresh chat, zero history. The agent states project status, continues from the resume cue, and stops for a human accept. Verified — not assumed. Sole in-repo source for harness and model pass claims: docs/testing-matrix.md.

Harnesses that passed

Cold start · with remote · full loop

Open WebUI + Open Terminal Hermès OpenCode Codex Claude Code Amp Code Grok Build Factory Droid

Models that passed

Same gates, every family

Grok 4.6 Claude Opus Claude Fable GPT-5.5 GPT-5.6 Qwen3.8-27B Kimi 3 Ox Alpha / GLM 5.3 Flash Qwen 3.8

BOOT line

The agent proves it read the repo before it edits anything. Matches bin/boot output verbatim.

No invented work

If nothing is ready, it reports and waits. It does not improvise a backlog. Held 3/3 in the matrix.

Evidence citation

Every "done" names a commit hash or an artifact path. No citation, no done. The reporting law.

Acceptance authority

The agent stops at PENDING and waits for a human word. It never accepts itself. Park, reassign, epic-accept: operator-only.

Read next

Docs the page sits on.

These live in the upstream repo. The site links out; nothing is fork‑left to drift.

08 Start

Drop it on a project.

Clone, run bin/init. That empties the method's contracts and creates src/ for your code. Open the folder in the agent you already use. Prefer a click? Use this template on GitHub — or unzip and init.

shell · blank workspace
# blank workspace
git clone https://github.com/monnkeebrain/keel.git my-project
cd my-project
bin/init
git add -A && git commit -m "init workspace"
shell · one session, one story
# canonical `take US-xx` (or `take E-n` for an epic slice)
python3 bin/claim US-xx
python3 bin/pack  US-xx --save
# … execute inside the write-set, evidence per AC …
python3 bin/review US-xx
python3 bin/state && python3 bin/render && python3 bin/verify
  • No pip. Stdlib Python only. Identical in slim containers, VPS, laptop.
  • Git is the runtime. Push/pull only — GitHub or GitLab, private, whatever you have.
  • ZIP is first-class. Unzipped folder, no .git? bin/init creates the local repo.
  • Agent shells have no TTY. git inspection runs with --no-pager. Stack law, not choice.
  • The accept key stays human. Park, reassign, epic-accept, and git worktree add: not yours to run.