logos-blockchain-testing/docs/book-maintenance.md
2026-07-20 12:25:00 +02:00

136 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 80250 lines.
## The Brief (framework-in-brief.md) specifics
Presentation-styled page scoped under `<div class="tour">`. Its CSS lives in
`book/theme/tour-v2.css`, its JS (section rail, folds, map zoom) in
`book/theme/tour-v2.js`; both are registered in `book/book.toml`. Available classes:
`lead` (opening paragraph of a section), `unpacks` (chip under a heading),
`recap` (strip between sections), `seq` (arrow strip), `facts` (label:value
grid), `spine` (the one-sentence glossary relation; plain `<b>` renders as a
neutral chip), `gcards` (three glossary pair cards; each `gcard` holds a
`gcard-label` and `gterm` rows of inline SVG icon + term + `ggloss` phrase,
stacks to one column under 640px), `gloss` (term | short gloss | definition
grid with `g-term` / `g-gloss` / `g-def` cells and `brk` pair separators,
collapses to two columns under 640px; lives inside the "full definitions"
fold), `duo` (two cards), `code-notes` (①②③ list matching code markers),
`tk tk-cluster|tk-process|tk-handle|tk-scenario` (concept chips), `details`
styling. Concept hues used everywhere (chips, mermaid classDefs, code
accents): cluster `#4a90d9`, process `#e08a3c`, handle `#4caf7d`,
scenario/runtime `#9b6dd6`. Mermaid edges are forced visible book-wide via
`tour.css`; markdown inside raw HTML blocks is not processed — use `<code>`
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`.