KEEL · YARD v0.10.0

The writing workflow

Keel's thesis is that prose is written against a contract. The daily loop below is the whole method: structure first, words second, and when the words outgrow the structure — and they will — the structure is amended explicitly, with the damage computed, instead of letting the manuscript drift away from its outline.

SPECIFY the beat WRITE the leaves PROOFREAD ✂ RENDER F5 AMEND the beat blast radius ⛔ ⚠ · RECONCILE & LAND atomic · ⛔ resolved or waived the write gate per-revision marks render warnings the prose fights the beat back to writing
The loop. Black is the daily path; red is what happens when the words disagree with the plan — which is a feature, not a failure.

1 · Specify the beat

A beat is born a stub — a titled slot. Give it a premise (sketched), then the full contract: POV, story time, what the scene enters with, what it must exit with, tension, word budget (specified). Only now will Keel accept prose. This is the write gate, and it is enforced, not advised:

$ keel new s-0002 --beat b-v1.2.1.1 keel: the write gate refuses this: beat b-v1.2.1.1 is Stub, and leaves require a specified-or-better beat. Specify the beat first (co/ci its card, fill the contract, set status: specified)
You do not specify everything up front. The spine is deep near the pen and shallow far away. When you write into the last specified movement, Keel warns — in the foot, in the map, on the rail border — and never blocks. The frontier is a dashboard light, not a wall.

2 · Write the leaves

Open the beat's leaf (Enter from the Map, or view 2) and write against the contract that stays on screen in the head. The leaf is checked out to you — an exclusive lock, so conflicts cannot exist. ^s saves the working file; checking in makes a revision:

$ keel ci s-0002 -m "the river crossing" checked in s-0002 r2

Everything is a revision. Nothing is ever overwritten; keel log shows the full trail, keel diff shows word-level changes between any two.

3 · Proofread

Proofreading is part of the status chain. Every leaf revision either carries a proofread mark or visibly lacks one — and because the mark is per revision, any later edit clears it automatically. The pass is a diff you accept, never a silent rewrite:

$ keel proofread s-0001 s-0001 r4 — corrections ([-…-] {+…+}): He [-walkked-]{+walked+} to the gate. The toll [-was was-]{+was+} memory. apply with `keel proofread s-0001 --accept` — nothing was written $ keel proofread s-0001 --accept s-0001 r5 — corrections applied and marked proofread

--mark-only records a human pass with no AI. Unproofread leaves surface with ✂ in keel status and as warnings on every render and export — visible debt, never a block.

4 · Render — see the book

F5 (or keel render) typesets the volume through Typst into a real B-format PDF — running heads, generated contents, justified EB Garamond on the exact line grid. Your PDF viewer reloads on each re-render, so the loop is live:

$ keel render rendered .keel\render\book.pdf ✂ unproofread in the render: s-0002 r2 — `keel proofread s-0002` $ keel render --publish published — view it at http://localhost:8000/preview/the-salt-ledger.pdf

5 · When the prose fights the beat — amend

Mid-scene you discover the exit condition is wrong. Do not quietly rewrite the card: check the beat out, edit it, and run keel amend. Keel diffs the contract and computes the blast radius — every leaf and beat your change touches, graded by severity:

$ keel amend b-v1.1.1.1 -m "the toll is memory" amendment a-1 opened — b-v1.1.1.1 (exits_with) blast radius (2 impacts): ⛔ b-v1.1.1.2 b-v1.1.1.1 changed exits_with — b-v1.1.1.2's enters_with must be re-satisfied ⚠ s-0001 realizes b-v1.1.1.1 — contract fields changed: exits_with reconcile: `keel co <object>` · edit · `keel ci <object> -m "…" --changeset a-1` — then `keel land a-1`

6 · Reconcile and land

Each fix is an ordinary checkout/check-in tagged to the changeset, held pending. Landing flips everything canon in one transaction — and refuses while any ⛔ is unresolved, unless you waive it with the reason on record:

$ keel land a-1 keel: a-1 has unresolved blocking impacts — reconcile them into the changeset or land with --waive "reason" (recorded): ⛔ b-v1.1.1.2 — enters_with must be re-satisfied $ keel ci b-v1.1.1.2 -m "re-satisfy entry" --changeset a-1 checked in b-v1.1.1.2 r3 — pending in a-1 $ keel land a-1 a-1 landed — 2 revisions canon tracked debt — these show ⚠ stale until reconciled: ⚠ s-0001 — realizes b-v1.1.1.1 …

Warnings you chose not to fix become tracked debt — the leaf shows ⚠ stale in keel status until someone reconciles it. Changed your mind entirely? keel abandon a-1 walks every head back; the revisions are retained, history stays honest.

Then it repeats

Specify the next beat before you need it (the frontier warning tells you when), write, proofread, render, amend when reality demands it. The book accretes as canon revisions with a complete audit trail — and the synopsis (keel synopsis) always reads as the current truth of the spine.