# Release notes

Per-release write-ups for every published Inkhaven version. Each
file walks through what changed at user-facing granularity — new
chords, new modals, new config knobs, new CLI subcommands — plus
migration notes when the on-disk shape moved.

The point of these is **continuity**: a writer coming back to the
TUI after a few months should be able to read one or two notes and
see what they missed without trawling the git log.

| Version  | Released   | Notes                                | Highlights |
| -------- | ---------- | ------------------------------------ | ---------- |
| **1.3.10** | 2026-06   | [`1.3.10.md`](1.3.10.md)          | **Semantic drift.**  The *soft*-consistency counterpart to 1.3.8: two descriptions of the same entity that diverge across the manuscript without a hard fact clash (a tavern "cramped and smoky" in ch.2, "airy and bright" in ch.20).  **Embeddings retrieve, the AI adjudicates** — cosine similarity finds same-topic descriptions but can't tell contradiction from relatedness, so drift reuses the **existing on-save vector index** to pull each entity's description paragraphs (keeping only the ones that name it), then asks the model which contradict.  No new index.  **`inkhaven drift scan`** writes `.inkhaven/drift.json` (`--json` gate); **`drift list`** previews the retrieval deterministically.  Surfaces in `inkhaven edit` + the `Ctrl+V Shift+R` cockpit as the `drift` category (Warn, **jump-only** to the divergent passage); `edit --deep` runs it.  The **`Ctrl+V Shift+L`** story bible shows a ⚠ drift badge + the chapter-ordered description trail under each flagged entity (persisted in the sidecar — no embedding load in the TUI).  Tunable via the `drift` config block.  This is the 1.4 Whole-Book AI Editor bridge — it builds the retrieve-then-reason loop.  Zero new dependencies.  Tests 1339 → 1346. |
| **1.3.9** | 2026-06   | [`1.3.9.md`](1.3.9.md)              | **Finish the Editorial Pass.**  Closes the four deferrals from the 1.3.6–1.3.7 cuts, taking the cockpit to its final 1.3 form.  **Span-scoped rewrite:** `f` on a localized finding now rewrites *only* the flagged phrase and splices it back (show-don't-tell / filter-word), leaving the surrounding prose alone; echo / pacing still rewrite the whole paragraph; the diff shows the full paragraph for context.  Pure char-indexed `splice_span` + `extract_phrase`, the span category marks the phrase between `« »` and asks for just its replacement.  **Filter-words join the worklist** — the last live-overlay detector not yet in `inkhaven edit`, surfaced as `filter` findings at `info` severity (sort last, never bury sharper findings), span-`f`-rewritable.  **Anachronism underlines live** in the editor (its own amber-orange `theme.style_warning_anachronism_fg`), self-gating on the setting `year` + the master style toggle.  **`F` batch fix-all:** walks every rewritable finding in the current filter through the *same* per-item diff review — never blind-applied; `a` accept+advance, `r` skip, `Esc` stop; progress + `N applied, M skipped` summary.  Quick-help / chord descriptions / Tutorial 68 refreshed.  Zero new dependencies.  Tests 1333 → 1339. |
| **1.3.8** | 2026-06   | [`1.3.8.md`](1.3.8.md)              | **World consistency.**  A long book builds a world (climate, geography, a cast with fixed attributes, a setting in time); the tools to keep it consistent were scattered.  1.3.8 fills the four remaining gaps.  **`inkhaven facts check`** runs an AI pass over the *whole* Facts book for contradictions between the facts themselves ("winters are mild" ⟷ "the harbor freezes each January"), cached + `--json`-gateable, also surfaced in `inkhaven edit` (category `world`).  **Anachronism detection:** set `editor.style_warnings.anachronism.year` and terms postdating it (a ~35-term built-in lexicon + your additive `terms`) flag in `edit` (category `anachronism`), jumpable to the word; off until a year is set.  **The story bible** — **`Ctrl+V Shift+L`** (L for Lore) — one consolidated, navigable view: every Character with the attributes `continuity extract` tracked across chapters beneath it, plus Places / Artefacts / Facts; `Enter` jumps to source.  **Series-shared facts:** point `facts.shared_path` at a directory of one-file-per-fact text files and a series shares one canon — `facts check` layers it (local wins), `facts import` snapshots it in.  Zero new dependencies.  Tests 1328 → 1333.  One new tutorial (69). |
| **1.3.7** | 2026-06   | [`1.3.7.md`](1.3.7.md)              | **Close the loop: AI rewrite-in-place.**  The Editorial Pass (1.3.6) *found* every problem and jumped you to it; 1.3.7 lets the AI *fix* the prose-level ones.  In the **`Ctrl+V Shift+R`** cockpit, a `✎` marks the rewritable findings — **echo** (vary the over-repeated word), **pacing** (tighten an overlong paragraph), **show-don't-tell** (rewrite telling to showing) — and **`f`** opens the finding's paragraph, streams a category-specific rewrite, and pops the diff-review (`a` accept snapshot-first, `r` reject), reusing the 1.2.11 rewrite→diff→snapshot machinery.  The rewrite prompt is 3-tier-tunable (`editorial-fix-<category>`).  Judgment findings (structure / continuity / fact / weak-scene) stay jump-only.  **Show-don't-tell** also joins the worklist as a finding (the editor overlay's regex, surfaced per paragraph with a char-range location).  Zero new dependencies.  Tests 1326 → 1328. |
| **1.3.6** | 2026-06   | [`1.3.6.md`](1.3.6.md)              | **The Editorial Pass.**  The 1.3 capstone (the "editorial-pass cycle" flagged back in 1.2.22): unify every detector into one ranked, walkable revision worklist.  **`inkhaven edit`** collapses the editorial `doctor` classes (echo / pacing / continuity / naming / dropped-character / …) + `plan check`'s structural findings + the Facts-scan sidecar into one list, errors first; deterministic (reads computed sidecars, no live AI), so `--json` gates a CI build and `--only` narrows it.  **`Ctrl+V Shift+R`** is the cockpit: `↑↓` navigate, `[`/`]` filter, **`Enter` jumps to the finding's chapter/paragraph** (the new capability — location resolution from a path / chapter title → node id), `s` skips, `d` defers (persisted, fingerprinted by text so it resurfaces only when the prose changes), `D` clears.  **`edit --deep`** re-runs the AI scans (Facts / tension / continuity) then aggregates.  `edit` is *manuscript readiness*; `doctor` stays *project integrity*.  Zero new dependencies.  Tests 1321 → 1326.  One new tutorial (68). |
| **1.3.5** | 2026-06   | [`1.3.5.md`](1.3.5.md)              | **Scene craft: scaffold, sequel, second opinion.**  Deepens the scene grain 1.3.4 opened.  **Scene scaffold:** `inkhaven plan scene scaffold --chapter <slug>` (or `--all`) reads the chapter prose and proposes the goal/conflict/disaster; in the `Ctrl+V Shift+K` scene board, `g` regenerates the selected card (proposal streams to the AI pane, `L` files it).  **Sequel cards:** `inkhaven plan sequel add\|list\|set\|remove` — the reactive counterpart (reaction → dilemma → decision); one unified card model (`Scene` gains `kind`, old cards load unchanged), weak-check flips by kind (scene = no turn, sequel = no decision), plus a two-scenes-in-a-row "unprocessed disaster" hint.  **Tension second opinion:** `inkhaven plan tension rate` AI-rates each chapter's felt intensity 0–100 (cached), adding an `ai` column to `plan check` and a third sparkline to the overlay beside expected + actual — two independent readings of where the middle sags.  Zero new dependencies.  Tests 1316 → 1321. |
| **1.3.4** | 2026-06   | [`1.3.4.md`](1.3.4.md)              | **The Planning Board — the shape of the rise and fall.**  Finishes pillar B (structure).  1.3.2 diagnosed where each beat *lands*; 1.3.4 adds what the Board couldn't see — **intensity** and **scene craft**.  **Tension curve:** every beat carries an *expected* intensity (the framework's authored dramatic shape) vs an *actual* one derived deterministically from open narrative obligations (the `inkhaven tension scan` ledger + open Threads), so a sagging middle is an objective finding ("Midpoint 33% where the framework wants 65%").  `plan check` prints a TENSION section; the **`Ctrl+V Shift+K`** outline draws expected/actual `▁`..`█` sparklines under the bars.  **Scene cards:** `inkhaven plan scene add\|list\|set\|remove` — each scene's goal → conflict → disaster, with a deterministic weak-scene (no-turn) check, folded into `plan check`, the `v` scene board, and `plan analyze`.  **Outline finished:** the deferred `t` (thread-link), `Enter` (jump-to-chapter), `v` (scenes) keys.  Zero new dependencies.  Tests 1307 → 1316. |
| **1.3.3** | 2026-06   | [`1.3.3.md`](1.3.3.md)              | **The Planning Board, fluent & complete.**  Finishes the Board opened in 1.3.2.  **Fluent:** `inkhaven plan map <beat> --chapter <slug> [--threads …]` / `plan unmap` write a beat's Planning-book HJSON in place, and `plan check` now prints the **CHAPTER SLUGS** / **THREAD SLUGS** to use — no slug-hunting.  The **`Ctrl+V Shift+K`** outline is editable: `m` maps a beat from a chapter picker, `s` cycles status, `a` streams the AI analysis (`L` in the AI pane files it into Planning).  **Complete (plan-first):** `plan scaffold --premise "<logline>"` writes a concrete intention into every framework beat; `--chapters` materializes back-linked chapter shells (opt-in, guarded).  **PDF-1 follow-ups:** three new imposition profiles (`us_perfect` / `us_chapbook` / `thick`), aspect-preserving cover art (`--fit cover\|fit\|stretch`) + spine-text auto-fit, JPEG (DCTDecode) grayscale, and preflight press-hazard reporting (overprint / transparency / spot colours).  **Polish:** CLI Prompts-book prompt tier, `stale-submission` doctor scan, `I`-lift of a streamed draft, `actions/checkout@v5`.  Zero new dependencies.  Tests 1294 → 1307. |
| **1.3.2** | 2026-06   | [`1.3.2.md`](1.3.2.md)              | **The Planning Board.**  Opens pillar B — *structure*, the third axis (Timeline = *when*, Threads = *arc payoff*, Planning = the skeleton).  Leads with **diagnosis, not card-shuffling**.  `inkhaven plan init --framework save_the_cat\|three_act\|story_circle\|hero_journey\|seven_point` scaffolds a framework's beats into a new **Planning** system book (HJSON paragraphs; map a beat with `mapped_chapter` + `threads`).  **`inkhaven plan check`** is the deterministic finding — coverage gaps, per-beat **position drift** (Midpoint at 64% vs target 50%), and **act word-share pacing** ("Act 1 is 30% — long"); no AI.  **`Ctrl+V Shift+K`** renders it as a position bar per beat.  **`inkhaven plan analyze`** (and `a` in the outline) maps beats→chapters + names the sag over the 1.3.1 digest.  Thread-links surfaced + validated.  Zero new dependencies.  Tests 1286 → 1294.  One new tutorial (67). |
| **1.3.1** | 2026-06   | [`1.3.1.md`](1.3.1.md)              | **Submission track.**  Pillar A's second half — getting a finished manuscript to an agent or editor, pure-Rust with no new dependencies.  **`.docx`**: `inkhaven docx` emits a hand-rolled Shunn-format Word document (the audit rejected `docx-rs` for hard-pulling a duplicate `zip` major version); `docx` is a `Ctrl+B O` book-take.  **Package (AI)**: `inkhaven submission digest` caches a compact whole-book context (per-chapter one-line summaries + Characters/Threads), then `submission query \| synopsis [--long] \| comps \| logline` draft into a new **Submissions** system book — synopses spoil the ending, comps are Local-pinned labelled suggestions.  `Ctrl+V q` picks a generator and streams it into the AI pane (3-tier prompt resolution).  **Tracker**: `inkhaven submissions add\|list\|status\|add-note\|remove` (the `.inkhaven/submissions.json` log) + the `Ctrl+V u` modal; `add-note` is a timestamped event trail.  Five `ink.export.*` Bund words (`fs_write`-gated).  Tests 1270 → 1286.  One new tutorial (66). |
| **1.3.0** | 2026-06   | [`1.3.0.md`](1.3.0.md)              | **Print production (PDF-1).**  The first minor since the 1.2 line — a complete, self-contained **PDF production subsystem** for taking a built book to a print shop or hand-binding bench, over a pure-Rust core (`lopdf` + `barcoders`, no external apps).  **Imposition** (the marquee): `inkhaven pdf impose` reorders a book into folding signatures — perfect-bound / saddle-stitch / side-stab, creep/shingling from the paper caliper, crop/fold/registration/spine/sig# marks, configurable through HJSON `imposition:` profiles (`--dry-run` plan, `Ctrl+B Q` TUI preview, `imposed_pdf` book-take).  **Cover + spine + barcode**: `pdf cover --pages N` computes the spine from page count + paper stock, with front art, back blurb, and a validated EAN-13 `--isbn` barcode (`cover_pdf` book-take; standalone `pdf barcode`).  **Preflight**: `pdf preflight` catches print-only problems — effective image DPI via CTM tracking (the screenshot-blown-up-to-full-page case), font embedding, page-size consistency, blanks.  **Page ops**: info / extract / delete / rotate / reorder / split / merge / metadata / outline.  **Finishing**: grayscale / optimize / watermark / sample.  All mirrored across CLI (`inkhaven pdf …`), the `ink.pdf.*` Bund stdlib, config (`imposition:` / `cover:` / `preflight:`), and `Ctrl+B O` book-takes.  Two new runtime deps (`lopdf`, `barcoders` — audited, pure-Rust, the first in several cycles).  One new tutorial (65).  Tests 1190 → 1270. |
| **1.2.23** | 2026-06  | [`1.2.23.md`](1.2.23.md)            | **Stability & fixes** — the last 1.2 before the 1.3 editorial-pass cycle.  Broken-pipe on stdout (`inkhaven … \| head`) no longer writes a spurious crash report (panic-hook Step 0, no SIGPIPE reset → TUI untouched).  Whole-tree **panic-surface re-audit**: fixed three UTF-8 byte-boundary slice panics (theme-colour parse, fact-check cursor jump, doctor naming scan — all reachable on multilingual / malformed input) and routed four `store` writes through `io_atomic`.  **SQL hardening**: the JSON/blob + progress stores now bind parameters instead of string-interpolating (both `sql_escape` copies removed; adversarial round-trip test).  **Find & replace polish**: `w`/`i`/`x` toggle whole-word / ignore-case / regex inside the review modal.  **D.8**: three copies of the manuscript walk collapsed into `Hierarchy::user_book_chapters()`.  Tests 1186 → 1190.  Zero new deps. |
| **1.2.22** | 2026-06  | [`1.2.22.md`](1.2.22.md)            | **Project-wide find & replace.**  The cross-book edit Inkhaven couldn't do — rename a character / term over the whole manuscript, safely.  Lexical (literal / whole-word / opt-in regex, *not* semantic) over a linear scan; no FTS index (the `regex` crate already in-tree → zero new deps).  In the editor: `Ctrl+R` → `Ctrl+B` toggles whole-book scope → a **review modal** shows every match in context, `Space` skips individual ones, `Enter` applies the kept ones — **snapshotting each touched paragraph first** (`F6` undo).  CLI: `inkhaven replace <pat> <repl>` with `--dry-run` preview + `--yes` apply (refuses to write otherwise), `--regex` / `--substring` / `--ignore-case` / `--book` / `--include-system`.  Whole-word + user-books-only by default (no `Will`/`will` footgun, won't touch Notes/Facts).  The review-gated apply machinery is the substrate for the 1.3 editorial-pass cycle.  Also: three consolidation-audit items closed as intentional non-duplicates (documented divergence, no merge).  Tests 1169 → 1186.  Zero new deps.  One new tutorial (64). |
| **1.2.21** | 2026-06  | [`1.2.21.md`](1.2.21.md)            | **The Facts book.**  A dedicated **Facts** system book for a world's invariants (climate, geography, seasons, distances, chronology) — free-form prose like Notes — and the AI plumbing to write against them.  **Facts AI scope** (`F9`) seeds a sticky, always-Local fact-analysis chat from the whole Facts book (refreshes when it changes).  **Fact-check chord** (`Ctrl+B Shift+X`) checks the open paragraph against the facts (scope locked to local), emits `claim \| fact \| detail`, and **`Ctrl+B Shift+J`** cycles the findings jumping the cursor to each flagged claim.  **Facts search** (`Ctrl+B Shift+S`) — a semantic-search modal to ground a chat in just the relevant facts (scalable for a big book).  **`inkhaven facts scan`** sweeps every chapter for contradictions (RAG-filtered, `--json` for CI); **`facts extract`** proposes world-facts from the draft for interactive accept (cold-start solver, deduped); **`facts init [--genre]`** scaffolds the starter categories (genre-aware).  Facts join the wiki-link system (provenance → Notes/Research; dependents via `Ctrl+V K`); opt-in `⚑N` status chip.  Multilingual throughout (en/ru/de/fr/es).  Tests 1160 → 1169.  Zero new Rust deps.  One new tutorial (63). |
| **1.2.20** | 2026-06  | [`1.2.20.md`](1.2.20.md)            | **Consolidation, hardening & global themes.**  Pays down the duplication audit the 1.2.19 cycle left behind, then spends the headroom on user-facing polish.  **Live echo overlay** (`Ctrl+B Shift+K`) — the inline companion to the `echo-repetition` scan underlines, in the open paragraph, words echoing across nearby paragraphs of the chapter (open paragraph read live, no per-keystroke I/O), in its own colour (`theme.style_warning_echo_fg`).  **EPUB cover images** — drop a `cover.png`/`.jpg` next to `inkhaven.hjson` and `inkhaven epub` embeds it as the EPUB 3 `cover-image` thumbnail + opening page (zero-config).  **User-global config cascade** — `~/.config/inkhaven/config.hjson` + `conf/*.hjson` layer over each project's `inkhaven.hjson` (global wins; partial overrides; honours `$XDG_CONFIG_HOME`) so one personal theme/keybind set applies everywhere; ships `color_styles/` with 15 popular classic/dark/light schemes (Dracula, Nord, Gruvbox, Solarized, Tokyo Night, Monokai, One Dark, Material Ocean, Catppuccin, GitHub Light, Ayu Light, …).  **Hardening:** `paragraph-too-long` doctor class (read-time threshold), low-disk pre-flight warning, uncommitted-changes quit guard.  **Bug:** Russian `ё`→`е` fold added to three older stem surfaces (concordance / style-warnings / name highlighter) so `пошёл`/`пошла` group.  **Internal:** six duplication categories consolidated into shared helpers (`text::normalize_stem`, `cli::resolve_user_book`, `cli::book_walk`, `ai::stream::collect_blocking`, `typst_prose`, `is_scene_break`).  Two new tutorials (61, 62).  Tests 1121 → 1160.  One new Rust dep (`fs2`). |
| **1.2.19** | 2026-06  | [`1.2.19.md`](1.2.19.md)            | **Revision & continuity (multilingual).**  The draft-3-to-final layer — four detectors + a submission export, built multilingual across a three-tier model (AI prompts / Snowball stemmer / per-language quantity lexicons).  `echo-repetition` flags a distinctive word reused close together (stem + window; all 18 Snowball languages).  `numeric-contradiction` flags reversed directions + mismatched durations via per-language quantity lexicons (`200 leagues north` … `200 leagues south`; `three day` … `a week`) — en/fr/es bundled, others skip cleanly.  `continuity-drift` (the headline): `inkhaven continuity extract` runs an AI pass building a character-fact bible (`.inkhaven/continuity.json`), the scan flags attributes that change across chapters (eyes green→brown), stemmer-normalised so inflection doesn't false-flag.  `unresolved-tension` (opt-in): `inkhaven tension scan` tags introduced/resolved tensions, the scan flags the ones never paid off.  `inkhaven manuscript` exports a submission-ready Shunn standard manuscript format typst doc (monospace double-spaced, title page + rounded word count + running header, scene breaks as `#`).  Config: `editor.echo_*`.  Closes the deferred A.5.b + A.6.b.  Tests 1053 → 1121.  Zero new Rust deps — reuses the existing stemmer / stop-word / whatlang / AI / typst stack.  A real multilingual lesson: the Russian Snowball stemmer needed a `ё`→`е` fold + is a stemmer not a lemmatiser (noun cases collapse, some verb forms don't). |
| **1.2.18** | 2026-06  | [`1.2.18.md`](1.2.18.md)            | **Performance pass + reader experience.**  Two themes.  **I.1 perf:** a deterministic fixture generator (`inkhaven gen-fixture`), a criterion bench harness (`benches/`), timing-instrumented hotspot analysis that overturned the plan's guesses, two algorithmic wins — **lazy embedding-engine init** (cold start 507 ms → 36 ms; the fastembed model no longer loads eagerly on every `Store::open`) and a **parent→children index** that takes `Hierarchy::flatten` from O(n²) to O(n) (31.98 ms → 0.05 ms at 2k) — and a CI regression gate (`inkhaven _bench-report` + `.github/workflows/bench.yml`, fail on >20%).  **Reader experience:** `inkhaven epub` builds a standards-compliant EPUB 3 directly (in-tree `zip` + in-house typst→XHTML, no pandoc); `inkhaven audiobook` synthesises a chapter-marked `.m4b` via the TTS engine + ffmpeg; a status-bar reading-time chip (`📖 remaining / total` at `editor.reading_wpm`); and a reader-pace preview teleprompter (`Ctrl+B Shift+E`) that advances a word-by-word highlight at reading speed.  Two new HJSON knobs (`editor.reading_time_chip`, `editor.reading_wpm`).  Tests 962 → 1053.  Zero new Rust deps in the reader-experience work (`criterion` is a dev-dep; ffmpeg is a documented required external for the audiobook mux). |
| **1.2.17** | 2026-06  | [`1.2.17.md`](1.2.17.md)            | **TTS Piper transition.**  Cross-platform neural TTS replacing the 1.2.9 macOS-only `say` integration.  `editor.tts.engine: "auto"` prefers Piper if resolvable + falls back to System otherwise — macOS users see no regression.  Voices auto-download into `<project>/.inkhaven/voices/` (per-project for language-coverage isolation), Piper binary into `~/.cache/inkhaven/piper-<plat>/` (user-scoped since it's identical across projects).  Voice picker modal on `Ctrl+B Shift+V` with catalog browsing + on-the-fly filter + Enter-to-download.  Headless `inkhaven tts` CLI surface: `engine` / `binary status\|download` / `voice list\|download\|remove` / `catalog refresh` / `test "<phrase>"`.  11 new HJSON knobs (`engine`, `voices_dir`, `auto_download`, `catalog_url`, `catalog_ttl_hours`, `binary_path`, `auto_download_binary`, `cache_max_voices`, `play_command`, `sample_rate_hz`, `auto_gitignore`).  LRU eviction caps the project voice cache at 5 by default.  Idempotent `.gitignore` append on first download.  Stale-catalog + offline fallbacks so synthesis with already-downloaded voices keeps working when the network goes away.  Zero new Rust deps (curl + tar subprocess pattern matches `tui::say`).  Tests 758 → 955 (+197).  Apple Silicon limitation documented: upstream Piper ships x86_64 code in the `aarch64` tarball — mac arm64 users stay on `engine: "system"` for now.  Single-feature cycle. |
| **1.2.16** | 2026-06  | [`1.2.16.md`](1.2.16.md)            | **Author intelligence + polish.**  Headline: manuscript intelligence dashboard (`Ctrl+V Shift+J`) — synthesis pane unifying word count + structure + threads + comments into one view, `e` exports atomic snapshot to `<project>/journal-<UTC>.md`.  Narrative-audit detectors in `inkhaven doctor --scan`: `dropped-character`, `pacing-collapse`, `stalled-thread`, `naming-inconsistency` (Levenshtein over canonical multi-word names).  Worldbuilding glossary chip (`<N>C·<N>P·<N>A`) in status bar (toggle: `editor.show_glossary_chip`).  Carryovers landed: snippet picker placeholders (`{char_lookup}` / `{place_lookup}` / `{artefact_lookup}`) + `bund:` prefix; language CLI exports (`grammar`, `phrasebook`, `csv` round-trip) + `language define-rule` with `$EDITOR`; Bund stdlib expansion (`ink.review.list/add_comment/resolve`, `ink.thread.list`); DB-side health checks (`PRAGMA integrity_check` + HNSW parity + tree-integrity).  Amber backup chip (`backup.amber_threshold`) so users see freshness drift before the warn fires.  Tantivy references purged from active docs (search has been HNSW-only since the in-tree storage migration).  Tests grew across all phases; zero new dependencies. |
| **1.2.15** | 2026-06  | [`1.2.15.md`](1.2.15.md)            | **Stability + self-healing + security hardening.**  Panic-survivability layer: custom panic hook flushes every dirty buffer to `<path>.inkhaven-rescue` atomically + writes `inkhaven-crash-<UTC>.hjson` with panic context + project state + recent action ring; `inkhaven recover` walks the manifest with y/N/diff per buffer.  Stability sweep across `src/tui`, `src/store`, `src/cli`, helper modules + every user-data save path upgraded to atomic via the new `crate::io_atomic` helper — 62 panic sites neutralised; 5 critical-data writes made atomic; lock-poisoning recovery on every shared mutex.  Background health monitor (tokio task) with project-root / backup-freshness / rescue-orphan checks at independent cadences, status-bar chip (`✓ ✎ ⚠ ✗`), per-class auto-repair opt-in, `.inkhaven/health.log` audit trail with size rotation.  Project doctor: `inkhaven doctor --scan/--autofix/--json/--class`, kebab-case scan classes including the new `bdslib-only` (recoverable disk drift), TUI panel on `Ctrl+B Shift+0`.  Security hardening from a full audit: path-traversal patches in recover CLI + HJSON config; `ink.fs.*` sandboxed to project root; Bund script auto-load gated by `<project>/.inkhaven/trust` + `scripting.trust_decision`.  New `Documentation/SECURITY_WARNING.md` discloses known + unknown risks and limitation of liability.  Tests 565 → 695 (+130).  Zero new dependencies. |
| **1.2.14** | 2026-05  | [`1.2.14.md`](1.2.14.md)            | **Plot intelligence + inline comments + quick wins.**  New `Threads` system book (`Ctrl+V Shift+H` picker + swim-lane weave view, `Ctrl+V Shift+A` AI audit, `Ctrl+V Shift+D` deterministic thread doctor modal, `inkhaven thread add/list/doctor/export` CLI).  Inline comments with sidecar JSON storage (`Ctrl+V c` add — span-anchored with char-offset UTF-8 safety, `Ctrl+V Shift+C` project-wide panel with `(N/M in ¶)` dense indicator + `a` AI digest, `inkhaven comments list/resolve/reopen/delete/export` CLI).  Project templates (`inkhaven init --template <name>` + `inkhaven template list`) — 14 scaffolds total including 5 Russian (novel / long-story / scifi / lore / utopia) + 3 international (epic-fantasy / mystery / french-novel).  HJSON-driven snippet expansion with `{date}`/`{slug}`/`{author}`/`{cursor}` placeholders on Space-trigger.  AI continuation drafting (`Ctrl+V d`) + inline footnote (`Ctrl+V f`).  Project word-count goal modal (`Ctrl+V Shift+G`) with 30-day projection.  Style-transfer rewrite (`Ctrl+V y`) from a recent-paragraph picker. |
| **1.2.13** | 2026-05  | [`1.2.13.md`](1.2.13.md)            | **The Language book — a first-class invented-language workbench.**  New `Language` system book with `Meta` / `Dictionary` / `Grammar` / `Phonology` / `Sample texts` chapters; tree-pane scaffolders (`b` on Language scaffolds the 5-chapter shell, `+` under each chapter seeds the right schema-aware HJSON template).  Lexicon overlay + cursor-footer chip in the manuscript editor (`theme.language_word_fg`).  AI translation flow: `Ctrl+B Q` translates the open paragraph INTO an invented language (envelope composes Meta + Grammar + Phonology + RAG-filtered Dictionary + Sample-texts register anchors); `Ctrl+B Shift+Q` reverses direction for roundtrip-drift testing.  Full CLI surface: `inkhaven language init / add-word / import / remove-word / list / doctor / export` with `--format json|anki|dictionary-twocol`.  CSV bulk-import with pre-flight alphabet + phonology validation.  Two tutorials (49 end-to-end + 50 CSV deep-dive) + sample CSV. |
| **1.2.12** | 2026-05  | [`1.2.12.md`](1.2.12.md)            | **Fullscreen split view.**  Four-phase rework that gave two paragraphs full editor chrome side by side.  Universal `Shift+Enter` pin (any pane), `Ctrl+V Shift+B` sibling-book lookup (`manuscript-en/03-rain` → `manuscript-ru/03-rain`), `F12` critique-compare across panes, snapshot-as-secondary draft-vs-current workflow.  Plus the concordance export CLI, HJSON-editor inline LLM review (`Ctrl+R` inside `Ctrl+B 0`), per-detector style-warning underline overrides, and the doc-extractor polish that made every config field show its source comments. |
| **1.2.11** | 2026-05  | [`1.2.11.md`](1.2.11.md)            | **Multilingual prompts.**  Three-phase resolver work (string → directory → per-language prompt fragments) so the AI prompts adapt to the project's working language.  AI sentence-rhythm rewrite (`Ctrl+B Shift+M`) pairs with the rhythm gauge.  Concordance Enter-jump (concordance modal now jumps the editor cursor to the selected paragraph).  AI-diff modal wrapping for long diffs.  Two bootstrap CLIs: `inkhaven bootstrap-sdt` (per-language stop-word + filter-word seeds) and `inkhaven bootstrap-prompts` (per-language prompt seeds).  Config-TUI polish trio: `F3` file picker for path fields, expanded enum widget set, HSL slider with live preview. |
| **1.2.10** | 2026-05  | [`1.2.10.md`](1.2.10.md)            | **Standalone editors for `inkhaven.hjson` and `prompts.hjson`.**  `inkhaven config` — schema-aware TUI editor: auto-derived schema from `Config::default()`, build-time `///` doc-comment extraction so every field has docs, comment-preserving surgical save, `.config-backups/` rollback, per-field annotations (Ctrl+A) + comment inspector (Ctrl+I), map-entry add/delete for `llm.providers`, typed widgets (bool / int / float / string / colour with live preview / path / enum / list).  `inkhaven prompts-editor` — four-pane workbench (list + editor + AI response + AI prompt input) where the LLM acts as a prompt-engineering reviewer; Ctrl+B G lifts the response into the editor; Ctrl+R rollback to `.prompts-backups/`.  Both editors auto-populate from embedded defaults on first launch.  Two new tutorials (44 prompts-editor, 45 config-tui). |
| **1.2.9** | 2026-05   | [`1.2.9.md`](1.2.9.md)              | **Prose-craft tools for novelists.** Inline style-warning overlays (filter words, repeated phrases, show-don't-tell — all multilingual + Snowball-stemmed) under one `Ctrl+B Shift+F` toggle. New modals: project-wide concordance (`Ctrl+B Shift+L`), sentence-rhythm gauge (`Ctrl+B Shift+H`), writing-streak heatmap (`Ctrl+B Shift+G`). New status-bar POV / character chip (`Ctrl+B Shift+P`). Scene-break navigation (`Ctrl+B <` / `>`). TTS read-aloud (`Ctrl+B S`) + save-as-audio file (`Ctrl+B Shift+R`) on macOS. AI-driven show-don't-tell scan (`Ctrl+B Shift+T`). `inkhaven doctor` gains `--voices`, `--tts-test`, `--filter-words-snippet`. Six new tutorials (38-43). |
| **1.2.8** | 2026-05   | [`1.2.8.md`](1.2.8.md)              | **Shell, config editor, and the surface gets sharper.** Embedded nushell pane (`Ctrl+Z o`) running in-process. HJSON config editor (`Ctrl+B 0`) with syntax highlight + restart-required banner. Help book renders as markdown via pulldown-cmark. `inkhaven export-timeline` CLI (SVG / PNG / Typst). Scrivener `<CustomMeta>` date import. Mouse wheel everywhere. Ctrl+Q opt-in confirm. Multi-slot kill-ring + Shift-letter chord-matcher fix. |
| **1.2.7** | 2026-05    | [`1.2.7.md`](1.2.7.md)               | **Polish + plumbing.** Timeline gains two-level Tab/Enter navigation, Space track collapse, span-aware ↑/↓ event select, grid stripes, F12 full critique, per-book session persistence, book-slug prefix, and selection-aware `Ctrl+V Shift+E`. Around it: `Ctrl+B U` paragraph undelete (single-slot kill-ring), `Alt+←`/`Alt+→` visited-paragraph back/forward, `Ctrl+V Shift+P` recent-¶ picker, `Ctrl+Shift+M` mouse-capture toggle for native terminal copy, passive external-change auto-reload, snapshot dedupe, status-bar today widget gets colour, F8 from any pane. Internally: `src/tui/app.rs` refactor 26,605 → 13,939 LOC across 21 new sibling/child modules (zero behavioural delta). Fixes: Ctrl+S no longer jumps the cursor home; clippy clean. 4 new tutorials (32-34) plus 1.2.7 polish section on 31. |
| **1.2.6** | 2026-05   | [`1.2.6.md`](1.2.6.md)               | **Tools for the working novelist.** Tag triad (project-wide picker, rename, `export --tag`, tree pips, `ink.tag.*`, Scrivener keyword import). Diagnostic UX (gutter `●`, F8 list, Ctrl+V N/Shift+N, Ctrl+F12 AI explain, `hook.on_diagnostic`). AI as a partner (F12 critique, per-paragraph memory, diff modal). Snapshot annotations (F5 prompt, F6 picker `✎` rendering). Story view split (Ctrl+V w paragraph mini + Ctrl+V Shift+W book). Render preview live zoom. **Story timeline (1.2.6)** — calendar-aware events; `Ctrl+V e` picker; `Ctrl+V Shift+E` new event from any pane; `Ctrl+V Shift+T` swim lanes with auto-fit on open, scope nav, and Up/Down event-step navigation; `Ctrl+V Shift+I` edit timing; y/Y/Ctrl+Y AI critique; seven `ink.event.*` Bund words + 2 hooks. F11 → Ctrl+F12 (macOS workaround). Seven new tutorials (25 — 31). New **Book of Inkhaven** companion volume. |
| **1.2.5** | 2026-05   | [`1.2.5.md`](1.2.5.md)               | **Typst goes in-process** — `typst_compile.engine = "inprocess"` runs `typst::compile + typst-pdf` inside inkhaven (no shell-out, bundled fonts, `@preview` package fetch). Phase-1 `typst-syntax` parse diagnostics on save/idle; opt-in semantic diagnostics via full compile. `Ctrl+V R` renders the open paragraph to a floating PNG preview with page navigation (←/→) + save-current (S) + save-all (A). `Ctrl+V N` jumps the cursor to the next diagnostic. Esc cancels in-flight compiles; autosave fires before Ctrl+B A/B/O. New `inkhaven doctor` CLI. Embedded logo banners the credits pane. |
| **1.2.4** | 2026-05   | [`1.2.4.md`](1.2.4.md)               | Wiki-links + backlinks (Ctrl+V A/I/L/K), navigation pack (Ctrl+V P/B/M, AI Up history), snapshot diff (F6 V) + pre-restore safety snapshot, per-paragraph word targets + auto-promote, active-time tracking, per-book bar chart, `inkhaven export --status`, `inkhaven stats`, Scrivener importer, tree multi-select + bulk T/O, save-as picker, theme persistence, Bund stdlib gaps closed (`ink.fs.*`, `ink.editor.replace_all`, `ink.search.load`, `ink.ai.poll`, `ink.ai.send_blocking`), F-keys in keybind table, startup splash, Windows CI re-enabled. |
| **1.2.3** | 2026-05   | [`1.2.3.md`](1.2.3.md)               | Multi-format export (markdown / TeX via tylax / EPUB) + `--book-name`, writing-progress subsystem (Ctrl+V G modal, status-bar widget), similar-paragraph side-by-side mode (Ctrl+V S), Bund output pane + Ctrl+Z ? script picker + `ink.input`, dynamic Quick Help. |
| **1.2.1** | 2026-05   | [`1.2.1.md`](1.2.1.md)               | bdslib + tree-sitter-typst absorbed in-tree (crates.io-publishable), Bund scripting (`ink.*` stdlib, hook points, `.bund` Script nodes, Scripts system book), data-driven keymap with HJSON + Bund rebinding, `Ctrl+B M` cycle-type, dirty-flag sync. |
| **1.1**  | 2026-05    | [`1.1.md`](1.1.md)                   | Images first-class, Book assembly / build / take, HJSON-driven `settings.typ`, six LLM providers, AI full-screen + typewriter layouts, document-status workflow, HJSON data nodes, 1000+ commits of polish. |
| **1.0.3** | 2026-04    | (tag-only — see GitHub Releases)     | First public binary release: Linux x86_64 + macOS aarch64. |
| 1.0.2 / 1.0.1 / 1.0.0 | 2026-04 | (tag-only — release-pipeline iteration) | Build / matrix-shaping commits, no user-facing change between them. |

## Reading order

If you're upgrading from an earlier version, read the notes for
every version between the one you came from and the one you're on,
in order. Each release-notes file is self-contained but assumes
you've read the previous one's "Breaking changes" section, if any.

## What we *don't* put here

- Per-commit changelogs — `git log` is canonical for that.
- Internal refactors with no user-visible effect.
- Bugfixes that simply restore advertised behaviour (those land in
  point releases without notes; major behavioural changes get
  notes regardless of size).
