# Book Maintenance Guide Working rules for editing the book. Read this before any book change: layout, wording, new sections, diagrams. It consolidates the conventions the rewrite was built under so later sessions do not rediscover them. ## Ground truth and workflow - The book lives in `book/` on this repository's main line (`master`/`dev`). There is no separate book branch; edit here. A leftover worktree (`../nomos-testing-book`, branch `book-rewrite`) may still exist — it is retired; do not edit there. - Build with `mdbook build book`; preview with `mdbook serve book` (default port 3000). Output goes to `target/book/`. - Deploys: pushing `master` with `book/**` changes publishes to GitHub Pages automatically. `dev` pushes do not deploy. - Commits: title only, no body, no bullets. The taplo pre-commit hook fails offline (schema catalog fetch) — commit with `--no-verify` when it does. Never push. ## Voice (the most-corrected area; follow strictly) Factual reference voice, like a senior engineer's internal wiki page. Andrus has rejected drafts twice over this. - No marketing or lecture language: no "powerful", "seamless", taglines, aphorisms ("teardown design is exposure design"), rhetorical questions, or keynote framing. Headings name topics, not hooks. - No maturity inflation: an uncommitted experiment is a "prototype integration", never a "real adopter" or "production". - No LLM-typical phrasing. Em-dashes at most ~1 per paragraph (table cells and nav lists exempt). Every sentence has a finite main verb — the banned fingerprint is the verbless colon-fronted appositive with participial tails: "A compact mini-book: the framework's main concepts in one coherent read, each section linking to its full chapter." Write instead: "This page summarizes the framework's main concepts. Each section links to a chapter that covers its topic in full." No "X is not Y — it is Z" setup-payoff, no habitual triads, no coined metaphors (machinery, plumbing, "the X story"), no glossy compressions ("at a glance", "in one coherent read"). - Established terms are fixed: entry pattern, imperative side door, ownership mode, handle, run window, cooldown, exposure order. "Deployer" is the backend; "Runner" is what `deploy()` returns — never mix. ## Chapter template H1, then a one-sentence summary with a main verb. `---` between H2 sections. Title Case headings. `**Note:**` / `**Important:**` bold admonitions; blockquotes only for external-project callouts, labeled `> **External example:**`. Code fences: `rust,ignore` / `bash` / `mermaid` / `text`. Cross-links as relative `[Title](file.md)`. External projects (currently only logos-blockchain) appear only in the labeled callouts; everything else teaches through the in-repo example apps. LEZ callouts were removed 2026-07-20 as outdated — do not re-add them. Chapters run roughly 80–250 lines. ## The Brief (framework-in-brief.md) specifics Presentation-styled page scoped under `
`
inside `.facts`/`.seq` divs, never backticks. The page is a slide deck. Slide
anatomy classes: `slide` (the panel), `slide--top` (standalone hand-authored
panels at the page top: the framework, six terms, the whole test, the DSL),
`slide-kick` (small kicker), `slide-line` (one-sentence headline),
`slide-note` (small caption), `nodes`/`nd`/`ndw`/`nd-tag`/`nda` (concept-chip
flow diagrams; `nd-cluster|process|handle|scenario` hue variants),
`tiles`/`tile` (alternative rows; same hue variants plus `tile--dash`/
`tile--dot` border styles encoding attached/external). Visual hierarchy rule:
hued nodes/tiles carry a ~10% tint fill (solidity = the concept to look at;
dashed/dotted variants stay hollow — the tint drains as framework ownership
decreases); enumeration rows take `nodes--list` (small hollow chips) so only
true flows read as flows. Sections: `tour-v2.js`
turns every `## N ·` heading followed by an `.unpacks` chip into a `.sec`
slide card — heading restyled as kicker, chip hidden (still required as the
deck gate), corner `.sec-num` numeral, the authored `.slide` visible, and the
body collapsed via height:0 until clicked; an expand-all control sits above
the deck, anchor navigation (rail, "section N" links, search) opens the
target section, and print forces everything open. Every section needs both
an `.unpacks` chip and a `.slide` (headline + nodes or tiles + note). Sections are numbered "N ·" and
cross-referenced as "section N" — renumber ALL references when inserting a
section (previous miss: a capitalized "Section N" escaped a lowercase-only
sweep).
## Accuracy discipline (drift is the #1 recurring failure)
The codebase moves fast; quoted code rots in days. Rules:
- Document nothing before it lands on the main line. Aspirational API lives
only in `docs/*-plan.md` files as labeled targets.
- Verify every API name against the current source before writing it. For
dense snippets, compile them (temp bin under an example crate, then delete —
this caught real bugs twice).
- Prefer quoting from tested code: acceptance tests (`multi-app-e2e`,
`queue-e2e`) and example bins are the source for snippets. State the run
command with each quoted example.
- After code lands that the book mentions, run a sync sweep: grep the book for
the old names; check `framework-in-brief.md`, `running-examples.md`,
`crate-map.md`, `troubleshooting.md`, `composing-stacks.md` first — they
concentrate cross-references.
## Verification routine before committing a book round
1. `mdbook build book` passes.
2. Link check: every `(*.md)` target in SUMMARY and chapters exists.
3. Banned-token sweep: stale example names, dead API names, "Adopter note",
marketing words, first-person headings.
4. If diagrams changed: load the page in the browser preview and confirm every
mermaid block rendered to SVG (parse errors fail silently to raw text);
check light and dark themes for new colors.
5. If snippets changed: compile-check them.
## Current known state (2026-07-20; re-verify, do not trust blindly)
- The Brief uses the hand-authored `framework-map.svg`, a section deck, and
the queue verb DSL as its compact worked example.
- The full book documents the verb layer in `verb-layer.md` and shared app
cluster provisioning in `cluster-provisioning.md`.
- App handles are access surfaces. Managed app lifetime belongs to the LIFO
cleanup stack; do not reintroduce clone-count ownership language.
- App-layer provisioning has a backend seam, but the only implementation that
starts composed child resources today is local. Keep Compose and Kubernetes
claims aligned with `app-backend-scope.md` and `capability-matrix.md`.