Changelog
Versioning is x.y.z — major.minor.bugfix (owner rule 2026-08-28): a bug
fix bumps the patch, a minor feature round bumps the minor, and any
component reaching 20 flips over to the next (x.y.20 → x.(y+1).0). A major
bump marks a massive dev sprint — rare, owner permission only. The
workspace Cargo.toml is the single source of the number; the TUI head
and the Yard display it. Every bump cuts its section out of [Unreleased].
[Unreleased]
[2.2.0] — 2026-08-31
The publishing round (backlog #41): the pipeline anchors to what can
physically be printed, and the whole road from finished book to print
job is built — dark until go-live.
- Lulu Print API is provider #1 (owner research + vendor review;
Bookvault and Cloudprinter recorded as later candidates behind the
provider abstraction). The yard's new client speaks OAuth2 to the
SANDBOX by default; production demands the explicit PRINT_LIVE=1
secret and every provider action is disabled until LULU_CLIENT_KEY/
SECRET exist. Nothing prints until the owner flips the switch.
- The pinned catalogue: Lulu's spec sheet parsed into
tools/lulu/pod-packages.json — 3,277 real pod_package_ids with page
ranges, paper bulk, and list-price estimates. Both sides validate
against it; a SKU keel would compose that Lulu cannot manufacture is
refused at check-in and at submission.
- Printable trims: pocket · novella (5×8″) · digest · a5 · us-trade ·
royal join the trim table on both sides, each proven by `keel geometry
--check`. The UK trade trims stay renderable but are flagged
screen-only everywhere (Lulu prints none of them). New series seed at
novella — the closest printable trim to b-format; the sample follows
(parity hashes re-pinned from the release binary).
- The m-print card: the full product matrix — binding (perfect ·
coil · saddle · casewrap · linen · wire-o), five papers, B&W/color,
standard/premium, finish, linen/foil colors, quantity, shipping level
— a frozen card seeded at init, edited in the yard, validated against
the catalogue on both sides.
- The wrap:
tools/typst/wrap.typrenders the one-piece back +
spine + front cover, spine sized from the measured page count × the
paper's bulk, 0.125in bleed, spine text auto-omitted under 6mm, back
cover carrying the design card's new back_cover_text + imprint with
a clear barcode zone. The yard re-verifies every wrap against Lulu's
cover-dimensions endpoint before submission — a mismatched spine
refuses loudly.
keel print-package: renders the exact-trim interior, measures
the true page count via typst, renders the wrap, and pushes both to
the yard (--local renders without pushing). The TUI gains no other
surface — the standing rule lands in SPEC: the TUI is for writing;
user management, publishing, billing, and approvals live in the yard.
- The publishing page (
/yard/<slug>/publish/, book-admin only):
the m-print editor with live SKU echo and list-price estimate, the
ship-to address (carriers demand a phone number), Lulu validation /
five-level quotes / submission / cancel / status timeline with
tracking, an HMAC-verified status webhook with lazy refresh as the
auto-stop fallback — and RFQ lines for tier-2 bulk runs (Markono,
PrintNinja, QinPrinting researched: ~1,000-copy offset on bulky cream
stock is the realistic mass-market-style run; Lulu's acid-free stock
can't be that product), advanced by hand through their own statuses.
Print packages are VERSIONED and served to Lulu through revocable
unguessable tokens.
- The font menu (owner picks — all eight): Crimson Pro, Literata,
Alegreya, Vollkorn, Libre Baskerville, Source Serif 4, Spectral, and
Cormorant Garamond (display-grade) join EB Garamond — vendored (OFL),
calibrated per face against typst renders, embedded in the EPUB, and
chosen on the design page with a rendered one-page specimen per face.
Lulu prints any embedded face; the menu is keel's own constraint.
[2.1.4] — 2026-08-30
The lowercase convention reaches everywhere: every Rust string literal
and comment (help overlay, verb output, doc comments — 55 files) and
SPEC.md itself now write the yard, the helm, davy, the ledger, the
loft, plank, planking, the worldline. The sweep masked strings and
comments so code identifiers (View::Yard, DavyPanel, Store::Yard) were
never touched; book titles and all-caps treatments keep their case.
BACKLOG and CHANGELOG history stays as written.
[2.1.3] — 2026-08-30
The tension sunset, preview's own key, and the floating footer.
- Tension is removed (owner: "the tension function doesn't really
work"). The map view's sparkline, the rail's tension chip, the yard
scene form's field, the tree rollup, and the amend-diff entry are all
gone; the docs and mock illustrations no longer show it. The scene
contract SUNSETS the field gracefully: tension: still PARSES so
every pre-2.1.3 scene opens, but it is never emitted — the next
check-in scrubs it (Rust skip_serializing, yard codec drop; both
sides tested). The showcase sample no longer writes it.
penters preview (owner pick): the third mode gets a letter key
symmetric with i — p in from interactive mode, Esc out. F5 stays a
synonym everywhere, and the only entry while editing (plain p is
prose there). Help overlay and manual updated.
- The footer floats like the header — both sticky, site-wide.
[2.1.2] — 2026-08-30
The live-review continues: the invisible-diagram bug, the lowercase
convention, and three site behaviors.
- The one-page manual's diagrams render again. One chapter's SVG
carried an unscoped <style>text{fill:ink}</style> — document-scoped
in HTML, it repainted every text in all sixteen chapters' figures
ink-on-ink (the "so many pieces missing" TUI tour). Scoped by class;
gotcha recorded in SPEC. Stale version strings inside illustrations
(v1.3.0, v0.11.0) dropped.
- Lowercase module names everywhere (owner convention, recorded in
SPEC): the yard, the helm, davy, the ledger, the loft, plank,
planking, the worldline — mid-sentence, at sentence start, and in
titles, matching the keel.x wordmark style. Swept across the site and
docs; caps survive only as typographic treatments and in book titles.
- The top nav floats: the site header is sticky on every page; the
docs scrollspy nav and anchors offset beneath it.
- The home rolodex auto-advances every 10 seconds; picking a module
holds it for 60 seconds, then the rotation resumes.
[2.1.1] — 2026-08-30
The keel.pub polish round, live with the owner — and the login incident,
found and hardened the same night.
- The reference manual is ONE page. /docs/ serves every reference
chapter on a single scrollable page; the LHS nav is a scrollspy that
tracks the section under the reading line and jumps on click. The
sixteen per-chapter templates merged into docs/all.html; old chapter
URLs 301 to their anchors. /how-to-use/ (the Begin group) keeps its
own pages.
- Home page: the selected rolodex card highlights again — whether
the click lands on the card or its dot (the highlight selectors had
silently broken when the strip moved inside the carousel wrapper) —
and the page reads ~30% wider (62rem → 80rem).
- Changelog page: spans the browser width, the text in a cream
hairline card.
- seed_admin fails loudly when production is missing the
ADMIN_PASSWORD secret — a machine without it had silently reset the
prod admin password to the test default. The seed now refuses outside
DEBUG, failing the deploy's release_command instead. Production login
is admin/mvp by explicit owner decision (2026-08-30, not
mission-critical yet), set via the secret so the guard stays armed.
[2.1.0] — 2026-08-30
The feedback round: five backlog features land in one session — the
worldline learns to fork, unknown names capture themselves, and three
new verdicts (contract, first-read, print-readiness) arrive.
- The worldline branch (#16). The ONE permitted story-timeline
branch: keel new m-worldline --name <branch> creates the card (the
card IS the branch — a duplicate create refuses), co/ci edits its
fork and optional rejoin points, and scenes opt on via
story_time.strand. Temporal mode draws the fork (┬), the branch
strand below with its scenes, and the rejoin curving home — a drawing
rule, not a merge; open-ended branches trail ⋯. Chronological mode
keeps one line with ◆ branch marks; an unmatched strand tag renders ?
— visible, never silently mainlined. Story-time branching only:
version control stays dead.
- Entity quick-capture (#15). ^s save scans the prose for @ref
markers naming entities that don't exist (@ref{Hollow Gate} →
e-hollow-gate); the quick-capture overlay lists them — j/k select,
h/l pick the kind (character · location · faction · lore), Enter
creates the stub via the sibling CLI without leaving the scene.
Check-in warns about unknown refs (never blocks), and the Codex sees
new entities immediately.
- The contract verifier (#7).
keel verify <s-id>: does the prose
deliver the contract's input → output? A verdict (delivered · partial
· missed) with quoted evidence and up to three gaps. Ephemeral by
owner decision — nothing stored, nothing gated. Rides sonnet
(verify.contract).
- The Reader (#8).
keel reader <chapter>: a simulated FIRST read —
confused / guessed it / landed. The reader sees only the stripped
prose of the chapters up to and including the target, never the
contracts, ledger, or spine — the one agent that catches
author-knowledge leakage. Opus (reader.react), on demand, ephemeral.
- Styled exports (#17).
keel export --epubnow ships a designed
book: CSS derived from the page config and m-design (face, size,
leading, justification, opener treatment), EB Garamond roman + italic
embedded, and the Yard's cover as the EPUB cover. `keel export
--print` emits the print-on-demand interior PDF — the exact-trim book
block built coverless (print-identical by the Round 2 cover decision),
no bleed, no crop marks: the KDP/IngramSpark "interior" file.
- Docs: worldline, exports, Davy (verifier + Reader), TUI, and CLI
manual chapters updated; the in-app help too. Backlog: #41 publishing
workflow engine and #42 roles redesign (Super Admin / Story Master /
Writer / Reader) recorded for later rounds.
[2.0.0] — 2026-08-29
The simplification — the owner's redesign of the core model, a clean
break (no migration; prod and the sample reseed). The six-level spine
collapses to the near-universal writer's shape, and the collaboration
loop (comments + a pull-request queue) arrives.
- Series › Volume › Arc › Scene. Movement and Beat are gone. The arc
card carries the ordered scenes: list — the list IS the spine;
scenes keep flat s-#### ids so reordering is one card edit. Unlisted
scenes surface visibly as orphans, everywhere.
- The scene is ONE document: a rough YAML contract in frontmatter
(input / output / overview, optional pov / story_time /
tension / word_budget) over the Plank prose body. @page markers
subdivide the body into drafting pages (render as nothing); the foot
shows page 2/5 and ^PgUp/^PgDn jump the seams. The Helm edits the
body only — the contract is held aside and re-attached on save.
- No write gate. Once the genesis elements are in, any editor
writes. Review statuses per scene: ○ draft · ◐ in-review · ● canon.
- The pull request:
keel review <s-id>(verb + palette) sets
in-review; the Yard's approval queue lists it; the book admin lands
canon with an honest checkout/checkin.
- Scene comments (Yard): a thread is one root + at most three flat
replies, taggable to an editor, either side marks it done. The web
authors them; the Helm's ^k overlay lists threads and d resolves
them through the API.
- Amendments target scene contracts: output → the successor's input
(⛔), input → the predecessor's output (⛔), anchored promises/facts
(⚠ tracked debt). Ledger anchors are scene ids; a fact's revealed_at
is (arc, position). Frontier = the last scene in tree order with
prose — where the book runs dry.
- Davy pre-warms: context gathering runs on a background thread
keyed to the open scene, so ^g fills in the instruction and starts
streaming immediately; the recipe's V1/V2 are now the scene contract
and its neighbours. Proofread's output ceiling doubles to 16k tokens.
- Docs, the sample novel, seeds, codec fixtures, and parity hashes all
regenerated for the new model (315 Rust + 61 Yard tests green; the
Store::Yard e2e drives review → approve → canon and comments live).
[1.4.0] — 2026-08-28
The backlog round: the preview grows a table of contents, the prose gets
an ear for echoes, the morning gets a ritual, and the manual catches up.
- The preview navigator (#18): the book template plants a marker at
every chapter opener (physical page + displayed folio, via typst
query); Preview mode shows a CONTENTS column with live page numbers —
j/k + Enter or click to jump. Inside the rendered window the jump is
instant; outside, a fresh 16-page window renders around the target.
- The echo detector (#11, no AI): a distinctive word (5+ letters, not
a common word, not a name) repeated within ~two pages underlines
yellow on both occurrences — a nudge beside spellcheck on the idle
tick, never an error.
- keel today (#2): the daily ritual — frontier, hanging promises
due-first, unproofread leaves, yesterday's/today's words, and one
suggested next action. In the palette; the verb stays for scripts.
- The foot counters tell the truth: ⚑ is the open leaf's real
per-revision proofread mark; ✎% is the real accepted-Davy share from
the provenance log. The placeholders are gone.
- The served manual catches up to the windowed Helm (19 chapters:
keelhelm.exe, the two modes, the toolbar and mouse, in-app pages, the
console lesson; the footprint learns keel-wind and both binaries).
[1.3.0] — 2026-08-28
The Helm learns its manners: two modes, a mouse, an icon, and one door
into the editor.
The app round (2026-08-28, owner requests)
- The whole surface answers the mouse: clicks act through a hit map
the draw pass registers (zones live exactly where the pixels are
painted) — lens tabs switch, rail rows and codex names select,
worldline marks select and a second click opens, toolbar chips as
before. The wheel scrolls the help/changelog/console overlays, steps
list selections, and turns preview pages; the windowed shell now
forwards wheel events. The write chip left the toolbar — i is the
editor's door; clicking into edit mode lands typing like i does.
- The two-mode model: INTERFACE mode (every key belongs to the app —
←→ rove the toolbar with Enter to activate, Tab/⇧Tab step the lens
strip, ↑↓ walk the active view's content) and EDIT mode (every plain
key belongs to the prose). i enters the editor straight into typing;
Esc taps out — insert › normal › interface. The badge top right names
the mode in its own color and the key that flips it. Retired: the 1–7
view digits, ^←/^→ on the lens strip, and quitting on q from inside
the editor. The worldline walks with ↑↓ now (←→ is nav). F5 preview
returns to whichever mode it came from; Esc out of the editor (or
preview) lands on the map — interactive mode's home. The badge reads
INTERACTIVE (light green) / EDITING (light orange), naming the flip key.
- keelhelm.exe opens maximized, carries the keel icon — the EB Garamond
"k." mark, ink on paper with the red dot (tools/icon/keel-icon.typ;
build-icon.ps1 renders the .ico + window PNG; winresource embeds it).
- The login screen defaults to https://keel.pub.
- Series creation left the picker: the picker only opens existing
local or hosted series now — new series are made in the Yard (`keel
init / auto-novel` remain as debug CLI verbs). An empty picker points
at the Yard.
- start-keel.ps1 slimmed to exactly launch duty: KEEL_HOME, build if
missing, launch. Sample-building and Yard docker auto-start removed.
- keel.pub: the wordmark grows 25%; the site defaults to LIGHT mode (the
OS-preference fallback is gone) — an explicit bulb choice is still
remembered client-side and wins.
[1.2.0] — 2026-08-28
The Helm leaves the terminal, and the book leaves the defaults: one day,
two rounds — the native windowed app, then the design card driving the
rendered PDF end to end.
The Helm becomes a native windowed app — keelhelm.exe (overnight 2026-08-28)
- keelhelm.exe (new crate
keel-wind): the whole TUI rendered
edge-to-edge in a real window by wgpu — vendored JetBrains Mono with true
bold/italic (DejaVu Sans Mono fallback), themed ground, F11 borderless
fullscreen, close-safe worker shutdown. winit runs the window on the main
thread; the unchanged keel-tui shell runs on a worker thread fed
translated events (macOS ⌘ maps to ^). The terminal TUI survives as a
debug fallback: KEEL_DEBUG_TUI=1 keel. start-keel.ps1 launches the
app; the dotted keel.helm.exe copy hack is gone.
- The preview shows the real book page: F5 also exports typst PNGs for
a ~16-page window around the leaf being written (`keel render
--pages-png`), browsable with ←/→, composited full-resolution as a
wgpu texture in the preview pane.
- A clickable toolbar row — views, preview, palette, theme, help —
with hit zones drawn from the same table the mouse reducer checks.
- ratatui 0.30 migration (+ crossterm 0.29, ratatui-wgpu 0.6, wgpu 30).
- ^e/$EDITOR is dropped — the Helm is the editor.
- The
?help is restyled as the typography showcase: badge section
headers, accent key columns, true italics, Plank directives in color,
double-line frame.
- Earlier the same day:
^←/^→walk the lens strip (now a one-line tab
strip under the head); the help grew getting-started content; keel.pub
gained the mobile hamburger nav.
Round 2 — design → PDF (2026-08-28)
The book designed in the browser is now the book typst produces.
- DesignMeta lands in keel-core: the frozen
m-designcard parsed and
emitted Rust-side (byte parity with the Yard's codec pinned by tests and
a fixture regenerated from a real keel co m-design); bad styles refuse
check-in loudly. m-design joins the init seeds on both sides and both
sample generators (18 → 19 objects; parity hash re-verified).
- The render reads the whole design: imprint, dedication and epigraph
pages, contents style, opener style — and the page geometry itself:
book.typ no longer hardcodes B-format; trim/margins/face/size/leading
flow from m-vol-01 [page] into the render, so demy actually changes
the page. Pre-Round-2 stores render on in-memory defaults (render stays
read-only; the Yard's design page keeps the self-heal).
- Five contents styles (classic-leaders · minimal · centered ·
two-line · hairline) and four chapter openers (sunk-caps ·
drop-cap via @preview/droplet 0.3.1, imported lazily so the other
styles render offline · raised-cap on the unstretched baseline grid ·
ornament). The generator wraps each chapter's first scene in
#firstScene, splitting the initial Rust-side; a scene opening with
markup degrades honestly to the plain body.
- The cover reaches the PDF: new authed
GET /api/series/{slug}/cover
(the public /cover/<slug> stays the web's door); yard-bound renders
fetch it as page 1 plus a blank verso, with the folio counter reset at
the half-title so print folios never move. No cover is not an error;
a network failure falls back to the cached cover with a warning.
- True italics: EB Garamond's italic variable font is now vendored —
every italic in the book (part/chapter titles, epigraphs, thoughts) had
been silently rendering upright.
keel geometry --check: geometry-check.typ is parameterized by
sys.inputs and the new flag proves lines-per-page against a real typst
render of the volume's actual geometry (34/35 at B-format, 37/38 demy).
- TUI:
^←/^→walk the lens strip both ways (Tab still cycles), with
the shortcut shown in the foot and rail. The ? help is rewritten as
a getting-started guide: the screen decoded (head, rail, foot fields),
the full Plank @ directive reference, Davy, tension, the console
verbs, and step-by-step workflows.
- keel.pub: on phones every navigation collapses behind a header
hamburger; the docs chapter list becomes a Chapters toggle.
[1.1.0] — 2026-08-27
The two 2026-08-27 lines rejoin: the web overhaul, developed in parallel
and released as 0.11.0, merges onto the signed-off 1.0.0 — one history,
both surfaces current. Naming reconciled in the merge: the app and its
editor engine share one name, the Helm (keel.helm); the web line's
short-lived "Rigging" split is retired.
[1.0.0] — 2026-08-27
The MVP, signed off. Two surfaces, one store — and now the Helm reaches
the hosted store too. (Owner declaration 2026-08-27 with Store::Yard
landed; the sign-off supersedes the separate verification pass.)
Store::Yard — the last feature before 1.0.0
- The Helm opens hosted series.
YardStoreimplements the whole Store
trait over the Yard's HTTP API: checkout/checkin (changesets included),
locks, log, list — same semantics, same loud errors, mapped from the
Yard's machine-readable {error, code} bodies onto StoreError (new
variants: Transport, Unauthorized, Protocol).
- The immutable-revision cache (
.keel/cache.sqlite, keyed
(object, rev)): pinned-rev reads never re-cross the network; checkout,
checkin, create, and head reads seed it from their own responses. The
index rebuild reads at pinned head revisions and so runs mostly from
cache on a remote store.
- Workspaces route by
.keel/workspace.toml(mode/yard_url/slug):
keel init --yard <slug> binds a directory to a hosted series; the
series picker lists hosted series as "slug (yard)" rows when signed in
and materializes the workspace on first open. Store construction moved
after the TUI login (a yard store needs that session).
- The store trait gained
meta(); every consumer now takes&dyn Store. - E2E:
tools\e2e-yard.ps1drives login → init --yard → co → ci → log
against a real local Yard on sqlite (no Docker).
The fleet (owner decisions)
- 2026-08-27: the app is keel.helm.exe — one name, the Helm, for
the TUI app and its editor engine; the "C-shell" label retires. CLI
verbs are debug-only (zero-CLI hardened). deploy.ps1 ships the Yard
to keel.pub in one command; .gitattributes pins byte-exact checkouts.
- 2026-08-26: the AI companion the Ghost is now Davy, and the
editor engine ProseView is now the Helm (crate keel-prose →
keel-helm). keel, the Yard, Plank, and the Ledger keep their names.
Renamed throughout both surfaces; model-routing keys are now
davy.draft / davy.continue.
- 1.0.0 lands with the MVP sign-off.
[0.11.0] — 2026-08-27
keel.pub grows up: a public face, real collaborators, and the whole book
designed from the browser.
The site (keel.pub)
- A real home page: "Write your novel one leaf at a time", the spine
diagram, the keel.x module rolodex (six illustrated mockups with dot
navigation and cross-fade), and a Start-today call to action. Content
fades softly into view on load.
- Nav regrouped: Home · How to use · Docs, with the Yard as a pill;
version, API, and Admin left the header (Admin and the changelog live
in the footer); the wordmark reads keel.pub and always goes home.
- The Begin chapters moved to
/how-to-use/(no sidebar, a chapter
strip); /docs/ keeps the sixteen reference chapters; the changelog
page widened; the footer sticks to the viewport bottom.
- Dark mode: a bulb in the footer — dark grey ground, orange text,
persisted, defaulting to the OS preference. Website only.
- Shared
static/yard.css; the old inline-CSS duplication is gone.
The Yard (né the Planner — keel.yard, at /yard/)
- Roles without voting: Membership (admin | editor per book), the
creator becomes book admin, the superuser (exactly one — the owner)
sees everything. The Chart was this rename's one-day interim name;
301s cover /planner/ and /chart/.
- A signed-in secondary nav: Yard home (my books with role badges),
New series, Activity (with the approval queue — the book admin lands
◐ pending spine cards into ● canon via an ordinary checkin),
Previews, Profile (name, email, initials disc), Logout.
- Its own graphical login at
/login/— and a session of its own:
signing in to the admin or the Yard signs you out of the other.
- The book-design page: trim, margins, and type on
m-vol-01 [page];
imprint, dedication, epigraph, five contents styles, and four chapter
openers on the new self-healed m-design card; cover upload served
at /cover/<slug>; a live geometry echo. The render pipeline reads
it in Round 2.
The admin (superuser only)
- A Yard-style subnav (Admin home · Change password · Log out), user
management with membership inlines, token revocation by prefix,
stale-lock breaking, per-series storage stats, PreviewPdf and
CoverImage registered.
[0.10.0] — 2026-08-26
The Yard becomes an author's workspace, and the road to keel.pub opens.
The Planner (author-facing book setup)
/planner/— series list, create-a-series (seeds the fullkeel init
object set, instantly usable in planner and TUI), and the one-click
sample-novel builder.
/planner/<series>/— the spine tree: volumes → arcs → movements →
beats → leaves with status glyphs ◌○◐●, word counts and rollups,
inline add-child at every level, id conventions enforced, the write
gate honored for new leaves.
- Card editing per canonical field order; every save is an honest
checkout → checkin revision as yard:<user>; a leaf locked by a TUI
writer shows who holds it and since when — never force-unlocked.
- Python canonical codec with byte-exact parity to the Rust emitters
(fixtures generated by the release binary; 17 parity tests).
- The sample novel ported to Python: 18 objects, blake3-verified
byte-identical to the Rust keel auto-novel --offline output.
The manual and the shell
- 19-chapter documentation system in the Yard at
/docs— graphical
getting-started, hierarchy & glossary with recommended ratios, full
annotated file footprint, and everything between.
- Zero-CLI: the
:console in the palette runs any keel command in
place; a bare keel outside a workspace opens the series picker.
Going online (Fly.io + keel.pub)
- Production hardening: env-driven hosts/CSRF/secret key, gunicorn +
whitenoise, TLS-proxy-aware cookies, ADMIN_PASSWORD secret — the
printed test login shows in local dev only.
fly.tomlfor the keel-yard app; localdocker composeunchanged.
Fixes
- Admin contrast (model-group captions, recent-actions sidebar), footer
with the changelog link, ? help overlay on Windows, seeded password
self-heals on every startup.
[0.9.0] — 2026-08-25
The entire solo tool, built in one run (M0–M7 plus the morning's decisions).
The writing surface
- ProseView: custom prose editor — soft wrap on the printed measure,
typewriter scrolling, focus dimming, decoration spans, vim-lite keys,
undo/redo. ^e hands off to $EDITOR and reloads.
- Plank markup:
@name{…}inline,@name … @endblocks, structural tier
emitted never typed; fmt on save, strip to CommonMark, errors block
check-in. ^m contextual markup palette.
- Spellcheck via the bundled dictionary plus the project's proper nouns.
- Proofreading in the status chain:
keel proofread(AI pass with
accept/reject, --mark-only for human passes), per-revision ✂ marks,
warnings at render/export.
Structure
- The Keel: Series → Volume → Arc → Movement → Beat → Leaf, ids carrying
position; parents required in order; containers hold premise+intent only.
- The write gate: no leaf outside a specified-or-better beat; leaf status
can never outrun its beat.
- Frontier warnings (never blocks),
keel synopsis, frames with real page
budgets, the Map with the tension sparkline.
- The Worldline (view 7): leaves on a horizontal line — chronological or
temporal across five customizable eras (Mythic · Old · Present · Future ·
Far Future); Enter opens a leaf to write.
Memory & change
- Strict RCS store: exclusive locks, immutable monotonic revisions,
stale-base failures are loud, reads never lock.
- The Ledger: facts with story-time validity and reveal positions, promises
with due-bys, quote-anchored refs; the two clocks (true_at / known_at)
and the do-not-reveal list.
- Amendments as changesets:
keel amendcomputes the blast radius, `ci
--changeset reconciles, land` refuses unresolved ⛔ unless waived with
the reason recorded, warnings become tracked ⚠ stale debt; abandon
walks heads back over retained history.
The Ghost
^ginstruct → streamed suggestion → accept/reject; nothing is written
until accepted. ^; inspects the exact context (pinnable sections).
- Raw Messages API client (SSE, cached stable prefix) with an offline mock;
provenance log and the ✎% density; cost meter (keel ai usage).
keel voice seed,keel ai draft, extraction with human triage.
The book
- Preview mode (F5): Typst renders the volume to a true B-format PDF —
running heads, recto/verso, generated contents, sunk openers, the exact
13.6pt line grid (~300 words/page verified on renders).
keel export --tree(the whole series as plain files),--epub/--docx
via pandoc, named snapshots, keel stats burn-down.
Groundwork for M8
keel login/logoutand the TUI login lock (dev mode when no Yard is
configured), versioning surfaced in the TUI head.