Changelog
Every shipped change,
in chronological order.
BookForge ships often — most weeks see one or two releases. This page is auto-generated from the same source the desktop app's What's New modal reads, so it's always in sync.
-
Feature Hand off your manuscript to a human translator
- **You can now export a copyedited volume as a portable .zip** — chapters with frozen markers preserved verbatim, your style sheet, a glossary built from your Reference Library and Translation Memory, and translator notes from your project blueprint. Hand it to a human translator, a freelancer, or a third-party AI on a different stack. Translation is no longer locked to the in-pipeline AI chain. New **Translator Handoff** step (T0) sits between Plain Language and Translate.
- **Existing translation projects: run Translator Handoff once.** The 1.26.8 rewire makes the **Translate** step (A6) depend on T0 instead of Copyedit directly. If you were mid-translation and now see A6 newly blocked, run the new Translator Handoff step on each volume — A6 / Humanize (translation) / Supervise (translation) all unlock once T0 completes for that volume. Your existing translated chapters stay valid; only NEW translation runs are gated by the new step.
- **Determinism by design** — running T0 twice with the same source files produces a bit-identical zip (every file timestamp inside the package locks to 1970-01-01 on purpose, so re-generation is reproducible). One byte changed in any chapter docx produces a different SHA-256, and the artifact registry tracks it. **No AI calls, no token cost, no latency beyond disk I/O.**
- **Choice-point preserved** — T0 is excluded from the auto-continue loop on purpose. The runner won't silently move past T0 into the AI translation chain; you click "Run Translator Handoff" explicitly. After T0 finishes, you choose: stop and send the zip externally, OR continue with the in-pipeline Translate step.
- **Security hardening** — T0 is BookForge's first archive-producing step, so we locked the zip-slip / path-traversal class shut: every zip entry name routes through a `sanitizeZipEntryName` helper, output filenames sanitize project titles (Korean / Chinese / Arabic / bidi-override-spoofing all handled), cover-image discovery lstat-guards against symlinks, and the new `blurb` / `foreword` YAML fields in book.project.md cap input size at 64KB to prevent block-scalar DoS on parse.
- **Accessibility win**: the status badge across the matrix now renders a non-color glyph alongside the colored dot (`✓` complete, `✕` failed, `!` review, `↻` running). Honors WCAG 1.4.1 Use of Color so deuteranope readers get the signal. Compact dots use `aria-label` instead of `title` for reliable NVDA / JAWS announcement.
- **New unmet-dependency error decoder** in the matrix tooltip: when a step is blocked on T0 (or any other step), the cell tooltip now surfaces the readable step display label (`13 · Translate · needs 12 · Translator Handoff`) instead of bare technical IDs (`A6 · needs T0`).
- **Author-facing User Guide section** for Translator Handoff seeded in this release with searchable terms ("send to translator", "how do I translate", "why is translate locked"). Future Guide-AI assistant (1.27.17) will use it as the canonical knowledge corpus for translation-workflow questions.
-
Improvement Declarative pipeline shape — internal refactor (no user-visible changes)
- **Internal refactor — no user-visible changes.** The pipeline definitions migrated from absolute `sequenceNumber: N` integers to a declarative `position: { after, before }` syntax. Sequence numbers are computed at boot via topological sort. Adding a new step in a future release is now a one-field edit — no renumbering across other steps. Display labels are byte-identical to 1.26.6 (locked by snapshot test).
- **Two silent bugs caught + fixed in flight.** 1.26.5's accessibility apply steps (C10.7.A / C11.5.A) had two latent issues that surfaced when the architecture audit was added as a coordinated lockstep test: (a) they were missing from the runner's authoritative APPLY_DOWNSTREAM_STEPS map, meaning approving them didn't actually mark C10 / C11 stale (silent feature break); (b) they carried sequenceNumbers against the apply-step opt-out convention, leaving gaps in the Pipeline C numbering. Both fixed. Pipeline C now renders contiguously 1-15.
- **Compose-soft / audit-hard rule locked in code.** New `gateStrength: 'soft' | 'hard'` field on `PipelineStepDef` documents the family convention (audit steps gate downstream contracts; compose steps have inline-build fallbacks). Per-step `softGate: { preferredAfter, hint }` replaces the hardcoded matrix tooltip for C10's 'run C10.1 + C10.2 first' hint with a fully declarative config.
- **PHASE_GROUPS membership derived from step.phaseGroup.** The 14 phase groups' `stepIds` arrays — which had to be kept in lockstep with every C9.x addition — are now computed from each step's `phaseGroup` field at module load. The 'change-here-then-change-there' contract that lagged behind 3 prior C9.x additions is replaced with a single source of truth.
- **Artifact-registry backfill.** Pre-1.26.4 deterministic runs (C9.7 / C9.11 / C10.6 / C9.8 / C9.9 / C9.10) were invisible to the artifact registry because the runner's dispatcher returned before recording artifacts in that branch. The 1.26.4 fix is forward-only; this slot adds a one-time idempotent backfill that scans completed runs + records missing artifact rows. Runs on first boot post-upgrade, gated by a settings flag, try/catch-wrapped (must not block startup). Unblocks the 1.26.9 authorship-ledger UI from showing pre-1.26.4 runs as 'untraceable'.
- **Skill-doc hygiene.** Patcher / edition / EPUB SKILL.md `last_updated` bumped from 2026-04-11/15 to 2026-05-22 (they had accumulated 5+ layered (1.26.x) clauses since the original timestamp). Edition skill page-anchors + conformance-metadata clauses now carry explicit cross-references to where the actual write happens in the Build Pipeline section. Patcher routing block reorders the kind-evaluation order so the 1.25.4 unknown-kind catch-all is LAST. PDF/UA-audit SKILL.md fixed two stale `pdfHash` references to match the actual field name `audit.inputSha256`.
-
Fix Hotfix — accessibility apply steps (C10.7.A / C11.5.A) sidecar parse
- Fixes a ship-blocker discovered in 1.26.5: the new accessibility apply steps C10.7.A (PDF/UA) and C11.5.A (EPUB) threw on the first sidecar parse. Cause: `'accessibility'` was added to the TypeScript RemarkKind union but missing from the runtime VALID_KINDS validator set; and the strict `rephrase action requires paragraph anchor` rule rejected the structural-defer pattern the audit services correctly emit (`anchor.strategy: 'exact'` + `action.type: 'rephrase'`). The audit steps themselves (C10.7, C11.5) ran fine — only the auto-fix apply path was affected.
- If you ran C10.7 or C11.5 in 1.26.5 and the audit verdict was `pass`, no action needed. If verdict was `fail` or `warning` and you clicked C10.7.A or C11.5.A in 1.26.5, the run threw a `kind not in supported set` or `rephrase action requires paragraph anchor` error — re-run after upgrading to 1.26.5.1 and the apply will succeed.
- Added an integration-style round-trip test exercising both audit services' output through the strict sidecar parser. The 1.26.5 ship had pure parser tests on the audit services (which passed) but never exercised the end-to-end audit → sidecar parser → apply path. M4 (full audit → registry → consumer integration test) was deferred to 1.26.7 per the architecture review; this hotfix's narrow round-trip is the lightweight regret-prevention net.
-
Feature Accessibility audits (PDF/UA + EPUB Accessibility 1.1)
- Two new deterministic pipeline steps validate your published outputs against the accessibility-conformance standards Apple Books, OverDrive, library distribution, and EU institutional channels increasingly require for upload acceptance: **C10.7 PDF/UA Audit** (ISO 14289-1) runs your print PDF through the `verapdf` binary; **C11.5 EPUB Accessibility Audit** (Level AA) runs your EPUB through the DAISY Consortium's ace-core library. Same upload-rejection class C10.6 Print-spec Lint addresses for KDP/Ingram/B&N — but for accessibility.
- **Auto-fix loop**: C10.7.A and C11.5.A apply steps route auto-fixable findings through the existing patcher skill. Language tag insertion, alt-text from `_image_manifest.json`, EPUB semantic roles (`epub:type`), page-list nav, and `schema:accessibility*` OPF metadata all patch automatically. Structural issues (heading hierarchy, color contrast, reading order) flag for human review — never invented from thin air.
- **Honest-conformance contract**: once an audit passes, the next C10/C11 render embeds PDF/UA-1 or EPUB Accessibility 1.1 Level AA conformance markers. Markers embed ONLY when the audit's `inputSha256` matches the current render — re-rendering invalidates the audit and removes the claim. Prevents stamped-but-flunked PDFs / EPUBs that distribution channels reject at automated checks.
- **Color-blind glyph fallback** on matrix audit cells (WCAG 1.4.1): ✕ / ⚠ / ✓ glyphs render alongside the red/amber/green tint so the ~8% of users with red-green color blindness get the signal too.
- **Screen-reader verdict announcement** (WCAG 4.1.3 Status Messages): audit verdicts ('C10.7 PDF/UA audit — fail · 5 errors, 2 warnings') announce via `aria-live` to NVDA / JAWS / VoiceOver without forcing matrix-cell inspection.
- **Pipeline phase group split**: the monolithic Finalize block (which had grown to 18 steps) splits into **Compose** (C9.5-C9.11 + C10.1 + C10.2 — assembly) and **Publish** (C10 + audits + applies + EPUB + metadata — distribution). Cleaner mental model; same step IDs (just the visual grouping changes).
- **Declarative verdict-tint flag** on `PipelineStepDef` (`surfaceVerdictTint`): C10.6, C10.7, C11.5 all opt in via the same flag. Future audit steps inherit the cell-tinting + glyph + screen-reader behavior automatically.
- **Locked conformance-metadata constants** in `conformance-metadata.ts`: edition + EPUB skills cite the constants module by path so PDF/UA-1 + EPUB AA field tweaks land as one-file changes, not skill redeploys.
- Pipeline C sequence renumbering: C10 → 9, C10.6 → 10, C10.7 → 11, C10.7.A → 12, C10.5 → 13, C11 → 14, C11.5 → 15, C11.5.A → 16, C12 → 17. Step IDs are stable.
-
Feature Front+back matter compose + Book Metadata form
- Two new pipeline steps split C10's inline front/back matter build into deliberate compose nodes: **C10.1 Front-matter Compose** emits title page + copyright + dedication + epigraph + TOC placeholder + dramatis personae as structured HTML; **C10.2 Back-matter Compose** emits author note + acknowledgments + bibliography + index + glossary + also-by + colophon. C10's Final Edition step splices both in when present and falls back to its existing inline build when absent — pre-1.26.4 projects render identically.
- New **Book Metadata** form on the project Settings tab — six locked fields (dedication, epigraph, LCCN, imprint logo path, manufactured-in, paper origin) that feed C10.1's front-matter compose. Auto-saves 800ms after the last keystroke; persists as YAML frontmatter at the top of book.project.md. Your authored body content stays untouched across writes.
- New **Front-matter preview** Workshop panel (Tools → Production prep) with a sandboxed iframe over the C10.1 output. Spot-check title-page / copyright / dedication formatting before triggering C10's 30-45min render — saves a wasted long-running step when (e.g.) the LCCN typo'd through.
- **C9.8 Index now renders real page numbers** when C10 has emitted the `_page_anchors.json` sidecar (Pass 1 chapter page detection). Falls back to chapter labels per-entry when the sidecar is missing or partial — clean per-entry switch, no `Ch. 03, page 87` hybrids.
- **Soft-gate matrix tooltip on C10** surfaces `💡 Run C10.1 + C10.2 first for the 1.26.4 quality bar` when those steps haven't completed for the volume — advisory, not a hard lock. Pre-1.26.4 projects keep working via the inline-build fallback.
- Architecture-review ride-alongs (2026-05-22): **C1** shared book.project.md round-trip helpers (single source of truth for the YAML); **C2** atomic-write consolidation across 6 services (eliminated a silent power-cut data-loss class + concurrent-writer collision class — every back-of-book artifact write now goes through the canonical fsyncSync helper); **M2** IPC reader generalisation. Also fixed a latent artifact-registry bug — every deterministic step (C9.7 / C9.11 / C10.6 / C9.8 / C9.9 / C9.10 + the new C10.1 / C10.2) now lands a row in the registry, unblocking the 1.26.7 authorship-ledger work.
- Sequence renumbering in Pipeline C: C10 → 9, C10.6 → 10, C10.5 → 11, C11 → 12, C12 → 13. Step ids are stable; only the display label moves.
-
Feature Back-of-book: Index + Glossary + Dramatis Personae
- Three new deterministic pipeline steps that turn your References tab into the back-of-book artifacts published books reach for: C9.8 Index (alphabetical list of every reference attached to chapters), C9.9 Glossary (kind=term definitions with optional See-also cross-refs), C9.10 Dramatis Personae (kind=character cast list with major-character markers).
- Three new Workshop panels (Tools tab): ✏️ Index + 📖 Glossary in Quality audits, 🎭 Dramatis Personae in Writing & Voice. Read-only viewers with one-click Regenerate buttons — same shape as the 1.26.1 Bibliography + Style Sheet panels.
- All three steps are deterministic — no LLM, no token cost, sub-5-second runtime. Definitions and character notes come from YOUR References tab; BookForge never AI-generates them (empty-body terms are skipped from the Glossary entirely).
- Index uses chapter labels today (Ch. 03, Ch. 07). Page numbers land in 1.26.4 alongside the front+back-matter compose refactor that wires all three artifacts into the final PDF.
- Audit fixes from the 1.26.2 review also ship in this release: C10.6 Print-spec Lint verdicts now surface in the matrix cell tooltip + drive cell tint (pass=green, warning=amber, fail=red); the Finalize phase group includes every back-of-book step.
- Sequence renumbering in Pipeline C: C9.11 → 6, C10 → 7, C10.6 → 8, C10.5 → 9, C11 → 10, C12 → 11. Step ids are stable; only the display label moves.
-
Feature Print-spec Lint (C10.6) — refuse uploads KDP would reject
- New Print-spec Lint step (C10.6) reads your Final Edition print PDF and validates it against the published rules of Amazon KDP, IngramSpark, and Barnes & Noble Press — page count minimum / maximum, supported trim sizes, color profile, file-size cap, bleed. Catches the kind of failure that gets you bounced at upload time so you can fix it before you hit "Publish."
- Deterministic — no LLM, no Claude subprocess, sub-5-second runtime. Reads the PDF directly via pdf-lib and writes a structured report to Final_Edition/print_spec_lint.json.
- New Settings → General → Print deliverables → Print-spec provider dropdown lets you scope the lint to a single provider (KDP / IngramSpark / B&N Press) or run all three at once (the default). Pick once; every C10.6 run honors the choice.
- Per-provider rules sourced from each provider's 2026-05 published spec page. Documented with a 6-month refresh cadence so the constants stay current. Trim-size matching is orientation-agnostic and tolerates ±0.05 in of PDF-point conversion drift.
- Verdict roll-up: 'pass' if every provider in scope passes, 'warning' if any provider raised a soft warning (e.g. missing bleed), 'fail' if any provider hit a hard violation. The matrix cell colors accordingly.
- Backward-compatible: pre-1.26.2 projects render exactly as before. C10.6 is purely additive — only runs when you click it.
-
Feature Bibliography + descriptive style sheet
- New Bibliography step (C9.11) composes a per-volume Works Cited from every source you cite — automatically, in your project's citation style (APA / MLA / Chicago / Harvard / Vancouver). The Final Edition step picks it up as back-matter, so a real bibliography lands in your print PDF without you composing it by hand.
- New Bibliography Workshop panel (Tools tab → Quality audits) renders the auto-composed bibliography with a one-click Regenerate button. Curate sources in the References tab, click Regenerate, ship.
- Descriptive style sheet (Tools tab → Writing & Voice) grows automatically as Copyedit (A5.5) runs on each chapter. Records the editorial conventions the copyeditor has settled into — Oxford comma yes or no, US vs UK spelling, hyphenation rules — with chapter-by-chapter attribution. Conflicts between chapters surface a warning callout so you can codify the canonical decision in the prescriptive Style Guide.
- C9.11 is deterministic — no LLM, no hallucinated citations, no token cost. Dedup is exact-tuple only; two manually-created reference rows describing the same source stay as two entries (curate dupes in References, not in the composer).
- Style sheet is read-only and idempotent — re-running Copyedit on the same chapter replaces that chapter's prior contributions, never duplicates. The prescriptive Style Guide (which you author) and the descriptive style sheet (which A5.5 records) stay distinct.
-
Feature Professional Editorial — DOCX round-trip + scorecard
- Send a chapter to your editor as a .docx, get it back, and BookForge now classifies their edits: small typo / date / citation fixes land as structured remarks (replayable deterministically), while genuine prose rewrites stay as annotations you can review one by one.
- New Editorial Scorecard panel on the dashboard rolls up audit-derived quality signals — voice drift, fact coverage, copyedit density, continuity flags, pacing variance, citation density — into a single composite score for your most-recent project. Empty state shows "0/6 signals" until your first audit fills it in.
- Pipeline matrix hover tooltips now show each chapter's editorial scorecard line, so you can spot under-audited chapters at a glance without opening Step Detail.
- DOCX round-trips through editor handoffs now preserve `{{frozen}}` blocks and `[[ref:id]]` / `[[claim:id]]` citation tokens even when Word splits them across formatting runs. A new "citation drift" check in the toast warns you if any citation got dropped on save, so you can recover from the .bak before re-running anything downstream.
- C9.7 Resolve Citations now carries a "beta" badge in Step Info + Step Detail with a short explanation of what it does well and what to spot-check — the resolver is deterministic and never invents citations, but it can skip a token whose source row is incomplete.
- Corrupted voice_profile.json files are now caught at app launch (not at next A5 run) and surface the existing one-click .bak restore toast.
-
Improvement Admin panel polish — search, error rollup, and more
- Users tab has a real search + filter bar: search by email, filter by role (admin / user), active state (active / disabled), and tier — no more eyeball-scanning rows.
- Errors & failures tab now has a Grouped view that collapses repeated crashes into one row with count, last-seen, and number of affected users — much faster to spot patterns than scrolling chronology.
- Feedback rows now show a clear “no email” badge when a user submitted anonymously, and the Send-reply buttons are disabled in that case (no more drafting a reply you can’t send).
- Overview “Total users” and “Active users” stat cards are now clickable — they drill into the Users tab with the right filter applied.
-
Improvement Admin tools moved out of Settings into their own tabbed area
- The admin fleet view no longer appears at the bottom of Settings → Usage. It lives only in the dedicated Admin sidebar tab (admins only) — Settings → Usage is now strictly your own activity.
- The Admin area is organised into six sections: Overview, Users, Beta capacity, Waitlist, Feedback, and Errors & failures — instead of one long scroll.
- The section bar is keyboard-navigable (arrow keys, Home/End) and remembers which section you were on.
-
Fix Settings now tells you when a save fails
- If saving a setting ever fails (e.g. the disk is briefly unavailable), BookForge now shows an error and keeps your change so you can retry — previously it failed silently and the change was lost.
- The System tab no longer gets stuck on “Checking system…” forever if the check errors — it shows the error with a Re-check button.
- Refreshing the skill library now reports an error if the sync fails instead of just stopping with no message.
- Fixed an invalid markup pattern on the account email buttons (improves screen-reader behaviour).
- The System & Skills tab now splits into a clear “System check” card and a separate “Skill library” card.
-
Improvement Settings is now organised into tabs
- The Settings page is split into six tabs — General, AI & Models, Performance & Cost, Usage, System & Skills, and Account — so you can find a setting without scrolling past everything else.
- The tab bar stays pinned at the top while each section scrolls, and BookForge remembers which tab you were on the next time you open Settings.
- Fully keyboard-navigable: arrow keys move between tabs, Home/End jump to the ends.
- Nothing about how settings save changed — every option lives in the same place it always did, just grouped.
-
Improvement Clear message when a local model runs out of memory
- If your local model’s runner crashes mid-chapter (almost always because it ran out of memory), BookForge now says so in plain English instead of showing a raw network error.
- The message points you straight at the fix: lower the “Model context window” setting or choose a smaller Ollama model — and reminds you your existing chapter was left untouched.
- The failed step in the pipeline also shows a matching retry hint.
-
Improvement Local Write keeps going until the chapter is full-length
- Smaller local models tend to write a complete but short chapter and stop — BookForge now automatically asks the model to keep writing the same chapter until it reaches a full chapter length.
- Each continuation picks up exactly where the model left off; repeated sentences at the seam are detected and removed, so the chapter reads as one continuous piece.
- It stops on its own once the chapter is long enough, after a few passes, or when the step’s time budget is reached — local runs still cost nothing.
- A bigger local model (or a higher context-window setting) still produces the richest results; this just stops small models from short-changing your chapters.
-
Fix Local chapters come out clean — no word-count tag or notes
- Local models sometimes append a “[Word count: 923]” tag or a “sources I used / how I wrote this” note after the chapter — BookForge now strips those automatically before saving, so your chapter file is just the chapter.
- The cleanup is conservative and trailing-only: it never touches the body of your prose, only the obvious machine leftovers at the very end.
-
Fix Local Write now asks for a whole chapter, plainly
- Fixed local models stopping after a paragraph or two on the Write step: BookForge no longer hands the local model the full Claude skill (written for a tool-using assistant) as its instructions — it now gets a short, direct “write the complete chapter” brief it can actually follow.
- The writing instruction now explicitly demands the entire chapter, every scene, with no summaries or early stops.
- Your book blueprint and chapter brief still drive the content and voice exactly as before — only the local model’s framing changed.
-
Fix Local models now write full chapters, not snippets
- Fixed the main cause of Ollama producing only a paragraph or two: BookForge now talks to Ollama in a way that respects the context-window setting, so long writing prompts no longer crowd out the chapter the model is supposed to write.
- New “Model context window” setting under AI Provider — raise it if chapters still come out short, lower it if Ollama runs out of memory (default 16384 suits a 7B model on ~16GB RAM).
- Capable local models (7B and up) can now generate complete chapters through the Write step instead of a few sentences.
-
Fix Local-model writing is harder to get wrong
- If a local model returns an implausibly short draft, the run now fails with a clear message instead of overwriting your chapter — your existing draft is left untouched.
- The Write task instruction is now sent before the reference material, so a small local context window can’t cut off the actual writing brief.
- Trimmed how much project context is sent to local models so prompts fit common Ollama context sizes.
- Settings now advises using a 7B-or-larger model for prose — tiny models can’t write a usable chapter.
-
Feature Write chapters on a local model
- The Write step now runs on your chosen Ollama model when Ollama is selected — drafting a chapter no longer requires Claude.
- BookForge feeds the local model your blueprint, the chapter brief, and the previous chapter for voice, then saves the draft for you — the model never needs file access.
- If a local draft can’t be saved cleanly the run is marked failed instead of overwriting your work, so a weak local generation never corrupts a chapter.
- Settings now states plainly that Write and Humanize run locally today; the other writing steps move to local support in upcoming updates.
-
Improvement Pick a local model with zero friction
- Your Ollama models now appear automatically when you open Settings → AI Provider — no need to switch providers or click anything first.
- Clicking a local model selects it and switches writing steps to Ollama in one step; the Claude/Ollama toggle flips back anytime with one click.
- Removed the blocking confirmation dialog — the editorial-stays-on-Claude note is always shown inline instead, so switching is instant and reversible.
- Fixed a stale message that wrongly said the setting had no effect — the Humanize step does run on your chosen local model when Ollama is selected.
-
Fix Fix: Ollama “Test connection” now always reports a result
- The Ollama Test connection button no longer spins and then shows nothing — you always get a clear result: connected, no models, or a specific error you can act on.
- BookForge now reaches Ollama over 127.0.0.1 instead of localhost, fixing the common Windows case where the app couldn’t connect even though Ollama was running (ollama list worked in a terminal).
- Ollama connection checks are now written to the app log, so a failure can be diagnosed without guesswork.
-
Feature Run Humanize on a local model (Ollama)
- New Settings → AI Provider section: point BookForge at a local Ollama server, scan your installed models, and pick a default — all runs stay free and on your machine.
- The Humanize step can now run on your local Ollama model instead of Claude. Turn on Ollama in Settings and Humanize routes locally; everything else still runs on Claude.
- Editorial steps (Fact-Check, Continuity, Supervise, all proofing and typesetting) always stay on Claude — they read your prior chapters and References, which local models can't. More writing steps move to local support in upcoming updates.
- Safety first: if a local model drops or alters your {{frozen}} passages, that run is marked failed and your original is kept — a weaker local model can never silently corrupt a chapter.
-
Fix Matrix step numbers are contiguous + headers align cleanly
- Pipeline step numbers in the matrix no longer skip 7, 10, 12, 14. Apply steps (Apply Supervisor Edits, Apply Dialogue Edits, Apply Sensitivity Edits, Apply Legal Edits, Apply Galley Edits, Apply Panel Edits) are satellite passes of their parent step and are hidden by default — including them in the linear sequence made the visible numbers look broken. They now render with a small ↪ arrow badge + the existing “→ applies X” caption so the relationship stays clear without breaking the count. Pipeline A reads 1–16 contiguous, Pipeline C reads 1–6, Panel reads 1–8.
- Fixed the matrix column-header alignment. Step name + sequence-number badge now sit at the same vertical position across every column, regardless of whether the column has a “CHOOSE ONE” caption, an “applies X” caption, or a review-gate (👁) icon. The header cell uses a fixed 4-row grid layout so the rows are always slotted at the same Y — no more drift when a name wraps to two lines.
-
Improvement Friendlier Claude setup + plain-English pipeline steps
- When BookForge sets up Claude for you, it now updates your terminal PATH automatically as the last step — no more noticing a yellow "Add to PATH" button and wondering what PATH is. The button still appears as a fallback if the auto-fix can't complete (usually antivirus blocking PowerShell), but the happy path is now invisible.
- Renamed "Claude Code CLI" to just "Claude" in every setup screen, banner, dashboard row, and the User Guide. Authors don't need to know what a CLI is to write a book.
- The install dialogue now shows a clean four-step progress checklist — Downloading installer, Verifying signature, Installing, Updating PATH — instead of raw terminal output. The streaming output is still there for power users, behind a "Show details" disclosure.
- New "Test Claude connection" button in Settings → System and the final step of the onboarding wizard. One click sends a tiny test prompt through Claude and tells you ✓ Ready, ✗ Not signed in, or ✗ Network down — so you know your setup actually works before running your first chapter.
- Pipeline steps now show as "1 · Write", "2 · Developmental Edit", "3 · Fact-Check" etc. — sequence numbers + plain names instead of cryptic technical IDs (A1, A2, A2.5). The technical IDs are still visible in Step Detail and Settings for support / log cross-referencing.
- Renamed "Apply X Remarks" to "Apply X Edits" across the board (Supervisor, Dialogue, Sensitivity, Galley, Panel). Renamed "Adapt" to "Translate", "Legal / Libel Screen" to "Legal Screen", "Claim Resolution" to "Resolve Citations". The old names were editorial jargon; the new ones are what authors call them.
-
Fix Hotfix — Add to PATH no longer times out + clearer error message
- The "Add to PATH" button (added in 1.25.34) was timing out at 5 seconds on slower machines — PowerShell's cold-start JIT plus antivirus scanning of `powershell.exe` plus the registry broadcast all together can take longer than that. Bumped the read timeout to 10 seconds and the write timeout to 15 seconds. The error message you see when it does time out is now clearer too: "PowerShell took longer than X seconds — most often caused by antivirus scanning powershell.exe."
- When the auto-fix fails, BookForge now tells you the exact folder to add to PATH manually (the Claude binary's parent directory) instead of the binary path itself. 1.25.34 had a regex bug that pointed users at `claude.exe (v2.1.139)` — which you can't add to PATH because (a) it's a file not a folder and (b) the version suffix isn't part of the actual path. Now it says e.g. `C:\Users\You\.local\bin` — the right thing to paste into your environment variables.
-
Fix Claude install — terminal-PATH verification + one-click Add to PATH
- BookForge now verifies that the Claude Code CLI is reachable from your terminal — not just from inside BookForge. Anthropic's installer drops the binary at `~/.local/bin/claude` and updates the PATH, but that update doesn't always propagate (already-open terminals keep their old PATH, and on some systems the install script's PATH-update step is interrupted). If BookForge can run Claude but your terminal can't, you now see a yellow warning with an "Add to PATH" button.
- The "Add to PATH" button writes the Claude folder to your persistent user PATH directly (registry on Windows; `~/.bashrc` / `~/.zshrc` / `~/.profile` on Mac/Linux). One click. Then open a new terminal and `claude` works. Avoids the Windows `setx` 1024-character truncation bug by writing via PowerShell's SetEnvironmentVariable.
- The Connect Claude account flow now warns you about the PATH issue BEFORE telling you to run `claude` in a terminal — no more "BookForge said Claude was installed but my terminal disagrees" frustration.
- Node.js, Python, and Git are now shown as Optional (yellow warning) in the prerequisites list instead of red Missing. None of them are required for BookForge's recommended setup: Electron bundles its own Node runtime, the official Claude installer is a standalone binary that doesn't need Node, Python is only needed for the visual B-pipeline steps (maps, dataviz, print-PDF), and Git is only useful for version control. The red dot was scaring users into installing things they didn't need.
-
Fix Hotfix — Send Feedback section in the User Guide no longer crashes
- Opening the Send Feedback section in the User Guide (added in 1.25.31) no longer breaks the page. The "Where the dialog appears" note inside that section was referencing a callout style that didn’t exist, which threw a render error the moment you scrolled to it. The note now renders as a standard ℹ️ note.
-
Feature BookForge can install Claude Code for you
- If BookForge doesn’t find the Claude Code CLI on your machine, you’ll now see an "Install" button in Settings → System and a yellow banner at the top of the window. Click it and BookForge runs Anthropic’s official install script for you (PowerShell on Windows, bash on Mac/Linux). The progress modal shows the install output as it runs, and you can cancel mid-install if you change your mind.
- After the install succeeds, BookForge walks you through connecting your Claude account. Two clear paths: "I already have a Claude account" (run `claude` in a terminal once to sign in) or "I need to create one" (we open claude.ai/signup or the Anthropic Console for you, then you come back and confirm).
- When Claude Code is missing and you’ve finished onboarding, a persistent yellow banner at the top of the window AND a red row at the top of the dashboard’s "Needs your attention" panel both flag it — pipeline steps will fail until you install, so we don’t hide it behind a settings click. Both surfaces open the same install flow; both disappear the moment the install lands.
- Polish: BookForge’s system check now finds Claude Code installed via Anthropic’s official installer (at `~/.local/bin/claude`) even when it’s not on your shell’s PATH. The runtime had this fix since 1.25.26; the system check on the Settings page was lagging.
- If the install can’t run (no curl on Linux, antivirus blocked PowerShell, etc.) BookForge falls back to opening Anthropic’s docs with an "I’ve installed it — re-check" button. No dead ends.
-
Improvement User Guide gains a Send Feedback section + cleaner search highlighting
- New "Sending feedback to the team" section in the User Guide (Help category). The Feedback button at the top of the BookForge window has shipped twice in the last few days, and until now the User Guide had never documented it. The new section covers where to find the button, what we auto-attach (app version, OS, view location, project, pipeline run/step IDs), what to write in the message, and what happens after you click Send.
- The Keyboard shortcuts section gained a short paragraph documenting the v1.25.30 dialog-positioning change — dialogs open centered in the workspace area (not the whole window), and resizing the sidebar with a dialog open re-centers it live.
- Search highlighting in the User Guide changed from amber to violet. The old amber tint blended into the background of "Heads up" callouts so search matches sometimes disappeared inside them. Violet reads as a selection rather than a warning, and matches the active-sidebar-item color elsewhere in the app.
- CodeBlock language labels went from 9px to 10px (and a slightly lighter grey) — the old 9px size dipped below the size floor used everywhere else in the app and pushed contrast under the WCAG AA threshold.
- Plus a sweep of the entire 1.25.x changelog history: ~30 prior entries were rewritten in plain author-facing language, dropping internal references to file paths, framework names, schema columns, error codes, and operational notes that didn’t help anyone using the app. The What’s New panel and the marketing-site changelog both reflect the cleaner copy.
-
Fix Dialogs always show their full title and options
- When you open Send Feedback (or any dialog) on a smaller window, you can now see the full title bar and every option from top to bottom. If a dialog's content is taller than your window, it scrolls inside the dialog instead of pushing the title off-screen.
- Applies to every dialog: Send feedback, Create project, What's new, Step detail, Reference library editors, Outline editors, the Uncertainty drawer, Workspace bootstrap, Team management, and every confirm dialog.
-
Fix Attempt at fixing the dialog clipping (superseded the same evening)
- First attempt at fixing the dialog-clipping issue introduced in 1.25.28. The fix wasn't sufficient in all window sizes — see 1.25.30 for the version that actually solves it. Shipped the same evening.
-
Improvement Better Feedback dialog and workspace-centered dialogs
- Send Feedback (the button at the top of the window) now shows a "From: …" chip above the form so you can see which project or view we'll receive context for before you click Send. We also auto-attach your app version and a few technical details so we can reproduce bugs without going back and forth in email.
- The bug / feature idea / praise / other selector now reads as a single group to screen readers, instead of four separate buttons.
- Polish: the red error banner clears the moment you start editing your message; the confirmation copy now mentions the receipt email we send; and the rate-limit message reads like a friendly nudge instead of a raw error code.
- Every dialog in the app now opens centered inside your work area (to the right of the sidebar and below the top bar) instead of floating in the middle of the whole window. If you resize the sidebar with a dialog open, it re-centers live. Note: this change exposed a tall-dialog clipping bug in some window sizes — fixed in 1.25.30.
-
Fix User Guide — Critical staleness fixes
- The in-app User Guide had been lagging shipped features by several major versions. Today's audit found five sections that were actively misleading new users — describing UI elements that no longer exist, options that were renamed, install paths that no longer apply. 1.25.27 fixes the worst-misleading copy as a same-week patch so anyone opening the guide right now doesn't bounce off bad instructions. A comprehensive guide refresh covering the dashboard, Workshop tab, References tab, Editor trust foundation, Uncertainty drawer, Review Center, Compare tab, Timeline tab, and the new cost surfaces is slotted as a separate ~5-day MINOR.
- Updated: the onboarding-wizard "Folders" step (no longer asks for a skills folder — skills are server-side since 1.17), the prerequisite table's `claude` row (mentions both the official installer at `~/.local/bin/claude` and the npm-global install, since 1.25.26 probes both), the Skills system section (Settings page is now "System" not "System & Skills"; button is "Refresh skills"; explanation of the per-user cache replaces the legacy three-counter SHA256 dest-copy story), the Per-step parallelism preset names (renamed in 1.25.9 from "1 per 2 chapters / 1 per 3 / 1 per 5" to "Half / Third / Fifth" because the old names implied chapter bundling rather than spawn-count throttling), the App settings section list (now includes Per-step model overrides, Cost mode, Cost insights, Uncertainty resolution — all previously undocumented).
- Single-file edit in `src/renderer/components/layout/guide-content.tsx`. ZERO skill redeploys, ZERO schema changes. The comprehensive MINOR follow-up will land after 1.27.13 Editor reframe so the editor section gets written once against the final editor IA.
-
Fix BookForge now finds Claude Code installed by the official installer
- If you installed Claude Code with the official installer (the one that runs `irm https://claude.ai/install.ps1 | iex` on Windows or `curl -fsSL https://claude.ai/install.sh | bash` on Mac/Linux), BookForge could fail every pipeline step with a "claude.cmd is not recognized" error. Before 1.25.26 we only looked for Claude Code in the location used by the older `npm install -g` installer. Now we also check the location used by the official installer, and pipeline steps run correctly regardless of how you installed it.
-
Fix Publication-blocking gate actually fires now
- 1.25.24 added a publication-blocking gate that's supposed to flip Final Edition to "needs review" when leaked `[?…]` uncertainty markers survive in your PDF. The gate had a bug — its condition was never true on Final Edition, so the gate never actually fired. 1.25.25 fixes the condition so the gate runs as designed. If you re-publish a Final Edition with leaked tags, the run now correctly stops in "needs review" with the actionable explanation introduced in 1.25.24.
- The post-process scan now ignores stale leftover PDFs from older builds — only the PDFs your current run produced are counted toward the gate. Without this, a perfectly clean re-run could trip the gate on neighbour files in the folder that you can't see were the problem.
-
Fix Publication-blocking gate on uncertainty leakage
- C10 (Final Edition) now flips to "needs review" when the rendered PDF still contains `[?…]` writer-uncertainty markers, so you can't accidentally publish a PDF with leaked tags. Audit-driven from a real incident: an Artificial Wealth project shipped 48 unresolved markers visible in the published Chapter 1 across every Final Edition build. Root cause was a stale project-side `build_edition.py` that predated the SKILL.md Step 2.5 strip helper (added in 1.25.18). The strip helper was correct; the project's build script was reused indefinitely without regeneration, so the helper never reached the rendered output. The post-process service already detected the leak and surfaced a soft warning, but the run still marked `completed` — so unless you read every verdict line, you could ship without ever being stopped. 1.25.24 turns that soft warning into a hard gate.
- When the gate fires, the verdict carries actionable copy: "PUBLICATION-BLOCKING: N unresolved [?…] markers survived in the rendered PDF (e.g. {sample}). Most likely cause: a stale project-side build_edition.py that pre-dates the C10 SKILL Step 2.5 strip helper. Fix: delete <project>/build_edition.py and re-run C10 to force regeneration with the current SKILL — OR resolve tags at source via the matrix ⚠ N drawer. To override and publish anyway, click Approve in the Review Center; the override is audit-traced." Single-file change in `pipeline-runner.ts`; reuses the existing `pdf-postprocess.service.ts` scan and `scanUncertaintyTags()` from `uncertainty-tags.ts`. No new IPC, no new schema, no new SKILL.
- The override path is preserved for the legitimate "ship a draft with markers visible" use case (internal share, pre-print review). Clicking Approve in the Review Center flips the run back to `completed` and auto-stamps a comment in the run's `comments` field with timestamp and tag count for audit trail. Hard-block-no-override would have surprised users who deliberately ship drafts; transparent override + log preserves intent.
-
Fix Hotfix — research:claim-list defensive iteration
- Fixed a noisy "Claim {id} has no claim metadata" toast that fired every time you opened a chapter in the editor (or expanded a source in the References tab). The renderer asks for the project's claim index on every chapter mount so `[[claim:id]]` tokens can show their tooltips — but a single legacy row in `canonical_references` with `kind='claim'` and `claim_text IS NULL` (a fence-post case from the 1.19.0 research_claims migration) used to throw out of the list adapter and abort the whole call, leaving the editor with zero loaded claims. The list path is now defensive: malformed rows are skipped with a quiet log warn and the rest of the claims load through normally. Single-claim getters (open a specific claim by id from References tab) still throw the same error — that's an explicit by-id request where "this id is broken" is the right answer.
-
Improvement Uncertainty resolution polish — jump to tag, suggest fix
- The "Open in Editor →" button in the Uncertainty drawer now opens the right chapter and scrolls to the exact `[?…]` marker — works on both plain-text and DOCX chapters. Before, it dropped you at the top of the chapter and you had to hunt for the tag yourself.
- New "Suggest fix ✨" button on every drawer entry. Click and BookForge searches your References library for a fact that matches the uncertainty — most tags resolve from your own sources without spending a single API token. If there's one high-confidence match you get a one-click Apply; if there are several candidates, a small picker lets you choose. Apply rewrites the marker in place with the verified value and a proper attribution ("Smith 2019, p. 42").
- When your References library doesn't have a match, BookForge can optionally ask Claude for a one-shot fix. API users get a fast call to a cheap model (~$0.005 per tag); subscription users get the same flow through your existing Claude Code quota. The fallback only proposes values it's confident about and explicitly says "unresolved" when uncertain. Turn it on or off in Settings → Uncertainty resolution.
- Apply edits the chapter in place with three safeguards: it refuses if the marker isn't unique in the chapter (falls back to the editor jump so you can pick the right occurrence), refuses if the chapter changed on disk while you had the drawer open, and refuses if applying would accidentally remove a `{{frozen}}` block. Counts in the matrix `⚠ N` chip and the status digest update immediately after a successful apply.
-
Fix Editor trust foundation — autosave, crash recovery, mtime guard
- Your unsaved chapter edits now survive an app crash, a power loss, or accidentally clicking away to another tab. The editor autosaves a hidden draft next to the chapter file every 2.5 seconds while you type. The next time you open that chapter, if a draft is newer than the file on disk we surface a "Restore unsaved edits from <time>?" banner with [Restore] and [Discard] buttons. The draft is cleared automatically the moment you save, so a clean session never leaves orphaned files behind.
- Saves are now crash-safe. Before, if your computer lost power mid-save you could end up with a half-written chapter file that wouldn't open. Now we write to a temp file first and only swap it into place once it's fully written — a crash leaves either the old version or the complete new version, never a corrupted file in between.
- Editor save now warns when the file on disk has changed since you opened it. If a pipeline apply step (C9.6 / PNL.A / A5.A) or another tool modified the chapter while you were editing, clicking Save shows a conflict dialog: [Reload from disk] (drop your edits, take the new version), [Show diff] (see what changed before deciding), [Overwrite anyway] (keep your version, discard theirs). No more silent overwrites of pipeline output you didn't know had landed. Combines with 1.25.20's "fresh changes" banner: the banner warns you it happened, the mtime guard prevents you from clobbering it.
- Frozen markers ({{frozen}}…{{/frozen}}) are now invariant-checked on every save. If a save would gain or lose a frozen marker — typically because the editor accidentally stripped one during DOCX round-trip, or you manually mismatched a pair — we warn before writing. The save proceeds (your manual control is preserved), but the toast tells you exactly which markers diverged so you can fix them before the next prose step runs.
- New "Saved 12s ago" pill replaces the binary "Unsaved" badge. The pill cycles through three states: amber "Unsaved" while you have a dirty buffer, blue "Saving…" during a save round-trip, green "Saved 12s ago" with a self-updating age counter after a successful save. At a glance you always know whether your typing is on disk and how stale that snapshot is.
- Switching tabs or closing the window with unsaved changes now shows a confirmation. The autosave sidecar already catches the case where you click through anyway (your edits restore on reopen), so this is a politeness banner, not the only line of defense. The browser-level beforeunload prompt fires for window-close / refresh; an in-app dialog fires for tab-switch within ProjectView and names the file you're about to leave.
-
Feature Returning user + uncertainty editor surface
- Writer uncertainty tags ([?…]) are now visible in the editor before C10. The CodeMirror surface for plain-text chapter drafts gets an amber underline on every [?…] marker plus a matching amber dot in a dedicated gutter, with the marker's reason as a hover tooltip. Pre-1.25.20 the only in-editor surface was the TipTap-only "⚠ N uncertainty tags — review and resolve" strip on DOCX files; CodeMirror plain-text drafts (where most authoring happens) showed nothing until C10 ran the desktop scan and surfaced a verdict count. Now you spot uncertain facts while you're writing and triage them inline.
- The Pipeline Matrix shows a per-chapter `⚠ N` chip on every chapter row that has any [?…] tags in its current working file. Click the chip to open a drawer listing every tag in that chapter with a paragraph excerpt around each one, plus an "Open in Editor →" jump. The scan resolves each chapter's latest working file via the canonical probe order (copyedited → supervised → humanized → drafts), runs the same scanner used by C10's desktop verdict, and refreshes whenever a pipeline run completes. mtime-keyed cache so the scan is O(1) per chapter when nothing has changed.
- A new status digest panel above the matrix gives a returning user the narrative they need instead of a color grid. "3 awaiting your review · 2 failed at A2.5 · 5 ready for next step / Last activity Tuesday 4:12 PM · weekly cost $2.40 · 12 runs this week" — pulled from existing pipeline_runs aggregates plus a renderer-side derivation of "ready for next step" from the matrix the project already loaded. When the panel detects unresolved [?…] tags anywhere in the project, a dedicated "⚠ Review uncertainty tags (N) →" button appears alongside, opening the same drawer in project-wide mode.
- When an apply-step (A5.A / C9.6 / PNL.A / E*.A) modifies the chapter you have open in the editor, an amber "fresh changes" banner now appears above the editor body announcing "[stepId] just applied changes to this chapter" with [Reload] and [Compare] buttons. Reload re-reads the working file via probe order (closes the staleness gap that used to require close-and-reopen). Compare jumps to the Review tab where the PatchJournalReview surface shows the diff that just landed. The banner only appears for the currently-open chapter (no cross-chapter spam during batch C9.6 runs across 30 chapters), auto-dismisses on your next keystroke, and on a 30s timeout otherwise.
-
Fix Watchdog fixes, dashboard hygiene, non-English editions, Discovery context
- Long-running steps (Final Edition, future bibliography / index generators) no longer get killed mid-success. A combination of small bugs in the safety watchdog could mistakenly fail a long run that was actually progressing fine. Final Edition specifically now has a 60-minute ceiling instead of 20 — legitimate runs on long volumes hit 30-45 minutes and the old default was failing honest work.
- French / Spanish / German / Italian / Portuguese Final Edition PDFs now get proper bookmarks and page labels, the same as English. Before, the chapter-detection rules only recognized English ("CHAPTER ONE", "Prologue") so translated volumes silently shipped without an outline tree.
- Discovery now keeps context across messages even if your Claude Code session files on disk get deleted (by manual cleanup, antivirus, OS cache eviction, etc.). Before, this silently restarted the conversation from scratch and the AI lost everything you'd discussed. Now BookForge detects the missing session and rebuilds it from the project database.
- Dashboard polish: the Cost panel updates the moment a step finishes (no need to refresh manually); cancelled-on-shutdown rows no longer appear as a "resume" target; activity-feed rows are keyboard-accessible (Tab + Enter); sparklines now have proper screen-reader labels; the greeting strip surfaces a "Today" line ("Today: 3 runs · 1 awaiting review · $0.42 spent"); the 0-4am greeting now says "Good morning" instead of "Good evening". The legacy dashboard escape-hatch setting and its old panels are gone — every cold start now lands directly on the redesigned layout.
-
Fix Final Edition — absolute page numbering + uncertainty-tag strip
- When you open a Final Edition PDF in any reader, the page indicator at the top of the reader now matches the printed page footer. Before, navigating to (say) PDF page 14 showed "1" in the reader's page indicator and "14" in the printed footer on the same page — three different surfaces (reader indicator, printed footer, table of contents) disagreed about what page you were on. They now all agree: front matter uses Roman lowercase (i, ii, iii…) and the body uses absolute Arabic numbering from the first body page onward. Re-run Final Edition on any existing project to regenerate a corrected PDF.
- Writer uncertainty tags (the `[?…]` brackets the writer leaves on guessed facts so you can review them later) no longer leak into published Final Edition PDFs. Before, the chapter-PDF path stripped these tags but the Final Edition path didn't, so books could ship with research markers still visible in the body (one real Final Edition shipped with 9). Now Final Edition strips the markers before rendering, keeping only the candidate fact and dropping the meta-explanation. BookForge also scans every published PDF and surfaces any survivors in the run verdict, so leakage is visible at a glance from the matrix.
-
Fix PDF Final Edition — page-number indicator now matches the rendered footer
- When you opened a Final Edition PDF in any reader (Acrobat, Preview, browser), the page-number indicator showed Roman numerals (i, ii, iii…) all the way through the body of the book — even though the printed footer showed the correct Arabic numbers. The indicator and footer disagreed across most pages. Root cause: BookForge's automatic chapter detection was looking at text the PDF reader gives us, and our typeset chapter labels include letter-spacing that came out as "P R O L O G U E" / "C H A P T E R F O U R", which our pattern matcher didn't recognize. The boundary between front-matter and body then landed at a random body page. Fixed: we now strip the letter-spacing before matching and require a real chapter heading (instead of body prose containing the word "chapter"). Verified on a 352-page real-world PDF. Re-run Final Edition to regenerate a corrected PDF.
-
Fix Timeline tab — failures show, chapter labels read, bars click
- Failed and cancelled runs now appear on the timeline. They were previously hidden because the renderer filtered out anything without a recorded duration — exactly the runs you open the timeline to investigate. Failed runs render as red bars, cancelled as dashed zinc, runs awaiting review as amber, and in-flight runs (queued/running) pulse in brand color.
- Chapter rows now read "Ch 03 — The Foundations" instead of a UUID slice. Rows are sorted by chapter number ascending, with project-scope runs pinned at the bottom in a "Project" row.
- Click any bar to jump straight into the Step Detail modal for that step + chapter. Bars are now keyboard-focusable (tab to navigate, Enter to open) with the same visual ring used elsewhere in the app.
- The timeline now refreshes live as runs start, complete, fail, or get reviewed — no more reloading the tab to see the latest pass. Updates are debounced 500ms so a multi-chapter pass doesn't thrash the view.
-
Improvement Release pipeline now blocks the crash patterns from earlier today
- Three crashes shipped today (1.25.10 / 1.25.11 / 1.25.12) were caught only after real users hit them. The release pipeline now runs two automated checks that catch the same class of bug before any release leaves the build machine. No user-facing change — internal release-quality improvement.
-
Fix Hotfix — step picker menu was clipped behind the sidebar
- The new step picker (the chevron next to "Run Next Steps") opened in the wrong direction on narrower windows, so the left half of the menu hid behind the sidebar. It now opens toward the content area and stays fully visible at every window size.
-
Feature Run-Next Steps split button — pick any step from the whole pipeline
- The "Run Next Steps" button on the production status card is now a split button. The primary side still runs whatever the auto-resolver picks; the new chevron next to it opens a step picker that lists every step in the pipeline (Discovery / Pipeline A / Pipeline B / Pipeline C / Cover / Reader Panel) with live counts: how many targets are ready right now, how many are already running, how many are already done. Click any step with a green "ready" count to enqueue every eligible chapter or volume for it — no more being forced through the auto-resolver's linear path when you want to jump ahead or re-run a specific stage.
-
Fix Hotfix — Compare tab crash on first open
- Fixes a crash on the Compare tab that fired as soon as the deliverables list finished loading. Same class of bug as the 1.25.10 matrix crash; 1.25.15 wires up an automated check that would have caught it pre-ship.
-
Fix Hotfix — Serial / Beta / Audiobook / Editor Handoff crash on first open
- Fixes a crash that hit Serial Publishing the first time you opened it on a project without any saved schedule. Three sister panels (Beta Readers, Audiobook Prep, Editor Handoff) had the same latent issue and got fixed in the same patch — they would have crashed the next time someone opened them on an empty project.
-
Fix Hotfix — Pipeline Matrix crash on empty / freshly-loaded projects
- Fixes a crash that could hit the Pipeline Matrix right after you opened a project, before the run history finished loading. The bug was latent for a long time; 1.25.9's additional live updates happened to surface it more reliably. No behavior change beyond the crash going away.
-
Feature Cost transparency — model picker, Cost insights, Cost mode, bad-start cancel
- Per-step model overrides now have their own section in Settings — you can pick Haiku, Sonnet, or Opus per step, and every option shows the measured cost-per-run plus cache-hit ratio from your own prior runs. The diagnostic showed a typical book wastes $200+ on Opus runs that Sonnet would have handled for ~$1.50. This is the surface that lets you see that gap before you commit.
- New "Cost insights" panel under Settings summarizes total spend, overall cache-read ratio, and the top 5 steps by spend. When Sonnet would have delivered comparable cache rates to Opus on a step you've been running, a green suggestion line tells you exactly how much you would have saved.
- New project-wide "Cost mode" toggle (Settings → Cost mode). When on, every chapter/volume step runs one agent at a time so each subsequent chapter reads the warm prompt cache from the prior chapter. Trades wall-clock for measured 30-50% savings on editorial spend.
- Per-step parallelism presets relabeled "Half / Third / Fifth" (at most half / a third / a fifth of chapters at once). The old "1 per N chapters" wording read as bundling — each agent has always processed exactly one chapter; the preset controls spawn count.
- A5 Supervise and A7.5 Supervise Adapted are now flagged "locked-serial" in Settings. Both accumulate cross-chapter state (voice profile / translation continuity), so only Default and Serialize presets are enabled. Each row in the parallelism table also shows a 12-chapter projection (~time, ~cost) using your measured model data.
- New bad-start watchdog: if a Claude process emits fewer than 500 tokens in its first 30 seconds, it gets SIGTERMed instead of waiting out the 20-minute hard timeout. Stops wedged subprocess from quietly burning through the rate-limit window.
- A8 Chapter PDF and B6 Re-Export PDF max-concurrency raised to 5 (was 3 / 4). Pure typesetting steps with no shared state — free throughput on a mechanical pass that already runs at ~$0.58/run with 94% cache hit.
- A2.5 Fact-Check and A3 Continuity max-concurrency raised 1 → 2 — both are per-chapter audits with no cumulative state, and the 2026-05-05 parallelism diagnostic measured 2 agents as the cache-vs-throughput sweet spot. A7.5 Supervise Adapted lowered 3 → 1 to match its locked-serial UI contract (its translation-track continuity ledger is cumulative, like A5's voice profile).
-
Improvement B-pipeline foundation — visual brief gate, B5 cascade, image-credits sidecar
- B2 (Map Generation), B3 (Data Visualization), and B5 (Image Placement) now refuse to spawn if the upstream B0 visual brief is missing or malformed. Pre-1.25.8 a corrupt brief would cascade as silent no-ops — specialists would report "0 opportunities matched" without indicating the brief itself was broken. Now you get a specific error pointing back at B0.
- Re-running B5 (Image Placement) on a chapter now automatically marks that chapter's prior B6 (illustrated chapter PDF) and the volume's B7 (re-assembly) as stale. The eligibility picker re-schedules them on the next pass, so you never ship a stale assembled PDF after a placement edit. If auto-continue is on, the cascade fires immediately.
- B7 Re-Assemble now writes an `IMAGE_CREDITS.md` file into your `Final_Edition/` folder, drawn from your project's Image Rights table. Every re-assembly regenerates it from the current rights state. A full credits page inside the PDF itself follows in a later release.
- B2 Map Generation now runs up to 3 maps in parallel instead of 1 — same cap as the other visual specialists. On multi-chapter volumes this roughly halves the time the map pass takes.
-
Fix Final Edition PDF metadata + bookmarks + page labels
- Every Final Edition PDF now ships with proper metadata. Title, author, subtitle, keywords, producer ("BookForge"), and creation/modification timestamps land on the file directly — pre-1.25.7 the metadata dictionary was empty (`{ "/Producer": "pypdf" }`), so the file appeared untitled in every PDF reader, library catalog, and screen reader.
- PDF bookmarks are now generated automatically. After C10 finishes, BookForge walks `Final_Edition/` and stamps a hierarchical outline onto each PDF: front-matter sections (Cast of Characters, A Note on Method, Contents), Prologue, every chapter, Epilogue, and back-matter sections — all linkable from the viewer's Bookmarks pane. Pre-1.25.7 there was zero chapter navigation; readers had to scroll page-by-page.
- PDF page labels match trade-publishing convention. The viewer's "Go to page" UI and current-page indicator now show Roman lowercase numerals on front matter (i, ii, iii…) and restart at Arabic 1 when the body begins — the standard for non-fiction. The visible CSS-rendered footer still shows continuous Arabic until the C10 skill ships its full TOC fix.
- Re-run the Final Edition step on any existing project to regenerate compliant PDFs — no migration script, no skill change. The post-process is pure deterministic Node code via `pdf-lib`; it runs every time C10 completes and re-applies cleanly to already-processed PDFs.
- Source-driven from a 2026-05-05 audit of a real produced final edition. PRODUCTION_REPORT.md's "✓ PASS" status only validates page count + trim size, so these defects shipped silently across every book the pipeline produced. Now they don't.
-
Improvement Cost visibility + review fatigue + quiet-failure surfacing
- Per-project cost is now visible at the top of every project. The tab bar header shows "1.2M tokens · $4.30" for what this book has cost end-to-end (Pipeline runs + Discovery turns combined). Subscription users see token totals; API users see token totals plus dollar cost.
- Discovery now tracks cost per turn. Each phase row in the Discovery sidebar shows a "$0.42 · 12 turns" pill so you can see where the budget went.
- Patch journal review at scale. With 50+ entries from a multi-chapter A5.A apply step, scrolling and clicking through one-by-one was an afternoon of work. Now the journal has filter chips (severity / chapter / outcome) and bulk-action buttons ("✓ Accept N visible" / "✗ Reject N visible") that walk the filtered set through the existing per-entry approval gate.
- Notification deep-links. Clicking a "review needed" or "step failed" notification now jumps you to the right project + tab. New schema columns (additive) record the target view and run id; existing rows get a sensible default backfilled. Plus a "Mark all read" bulk action in the panel header.
- Each project row in the dashboard now shows a "Last: Vol I · Ch 7 · A4 needs review →" resume anchor. Multi-project users escape the cold-start ritual of "where did I leave off?" with a single click.
- Voice profile is more resilient. The per-volume `voice_profile.json` artifact now writes a `.bak` backup before each atomic rewrite, so a corrupt file doesn't silently collapse the cumulative voice baseline (which would compound drift across remaining chapters). On parse failure, a toast surfaces the issue so you can act, and a one-click `restoreVoiceProfileFromBackup` recovers from the .bak.
- When BookForge recovers orphaned pipeline runs on launch (rows that were "running" when the app last closed — usually because you closed mid-A5), a banner now tells you what happened. Pre-1.25.6 this was silent — you only found out by hovering red matrix cells.
- Friendlier error messages across seven new failure cases — corrupt voice-profile artifact, missing supervised file for A5 Apply, unknown supervisor remark kinds, sidecar parse failures, a journal that still has unanswered decisions blocking the approve button, Discovery primer failures, and A5 Apply approval cascade errors. Each now comes with a specific "what to do" suggestion instead of the raw error text.
- Long matrix-cell tooltips no longer get clipped on smaller laptop screens — they wrap to multiple lines so they're readable at every screen width.
-
Feature Discovery experience uplift — auto-kickoff, starter chips, markdown rendering
- Discovery phases 0.2 through 0.9 now auto-kickoff when you enter them with an empty chat. Instead of staring at a blank box waiting to type, the skill walks in with a one-line summary of what's known about your book so far, what this phase is for, and 2-3 specific guiding questions you can react to. Phase 0.1 stays as cold-start by design.
- Phase 0.1 (cold start) now offers four quick-start chips — Memoir / Technical / Investigative / I have notes — that pre-fill the textarea with a templated prompt you edit before sending. The blank-box first impression is gone.
- Chat bubbles render markdown properly. Claude's **bold**, headings, lists, inline code, and blockquotes used to ship as raw asterisks and pound signs because the chat component wrapped output in <pre>. Now they render as formatted prose, consistent with the User Guide and What's New surfaces.
- After phase 0.9 produces book.project.md, the phase header now shows a primary "Open the Pipeline →" CTA so you don't have to guess what comes next. Combined with a one-line completion banner ("✓ This phase has produced its planning output. Your blueprint is ready — open the Pipeline to start drafting chapter 1.") for every phase that completes.
- A "View output file" link on every completed phase opens the produced markdown artifact (planning/discovery_notes.md, planning/thesis_statement.md, etc., or book.project.md for 0.9) in your default editor. No more hunting through the project folder to inspect what a phase produced.
- Cancelling Discovery is now safe across multiple windows or rapid retries. Before, hitting Stop with two phases active could leave one run alive in the background still spending tokens, and its eventual reply could land in the chat. Now Stop reliably kills only the run you targeted, and the orphan case is closed.
- If a Discovery turn dies mid-conversation (you cancelled, the network dropped, the machine ran out of memory), the next turn now picks up the conversation Claude had already started — instead of pretending nothing happened and re-introducing itself from scratch. The "the AI keeps forgetting what we just discussed" symptom is gone.
- On Windows, very long Discovery prompts (which happen by phase 7 or 8 as conversation history accumulates) could occasionally get silently cut off at the tail end. Fixed — the full prompt now reaches the model every turn.
-
Improvement A5 family observability + cascade transparency + operator quick wins
- A5.A apply step is more discoverable. The Supervisor Evidence panel in Review Center now renders a "Show A5.A in matrix →" call-to-action when the chapter has remarks, flipping the "Show apply steps" toggle on for you. Every apply-step column (A5.A / C9.6 / PNL.A / E1.A / E2.A / E3.A) gets a tiny "→ applies X" caption above the step ID, mirroring the existing alt-group "⇄ choose one" pattern, so the column's special semantics are visible at a glance.
- The "Show apply steps" toggle pill now turns amber and shows "N hidden — M need review" when at least one hidden apply step has a chapter awaiting your approval. No more accidentally ignored apply work because the column was hidden.
- Approving an apply step now shows a cascade preview before you click. "Approving will mark 18 prior runs as stale (A5.5, E1, E2, E3, B6, B7 across chapters 3, 7, 11, 14)" — collapsible, lists every step + chapter that'll need re-running. Surfaces the hidden state-machine knowledge that used to be "what just happened?" the morning after.
- BatchRunBar now estimates wall-clock time for sequential audit steps. When you select multiple chapters and the runner cap is 1 (A5 since 1.25.2 — voice-profile coherence depends on sequential processing), the chip shows "≈ 85 min · sequential" in amber so you can plan accordingly. Other steps get an estimate when the chapter count is large enough to matter.
- When the apply step skips a supervisor remark, the journal entry now explains why in plain language — "edit ratio 0.52 exceeds 0.4 cap for voice kind" — instead of just showing a "deferred" badge with no reason. No more guessing which safety gate fired.
- A5 Apply now refuses to start (with a clear "re-run A5 first" message) if the supervised chapter file it needs is missing — instead of letting the underlying patcher fail with a confusing error.
- The Supervisor Evidence panel in Review Center now has an "Open voice profile" link that opens the volume's voice baseline file in your default editor. Useful when you want to inspect what the supervisor has been tracking across chapters.
-
Feature A5 Apply Supervisor Remarks + Review Center voice panel
- New A5 Apply step in the pipeline. Reads the supervisor's structured remarks (from 1.25.2) and applies each voice / metaphor / ethos / chapter-ending remark to the chapter prose deterministically. Same per-remark review gate as Apply Galley Remarks — you accept or reject each one before the step can be approved.
- New Supervisor Evidence panel in the Review Center. Renders four sections — Voice / Metaphor / Ethos / Chapter Endings — with severity dots, paragraph excerpts, and stance chips for any remark backed by a canonical reference. Includes a small chart showing this chapter's voice metrics (formality / concreteness / momentum / proximity) against the volume baseline, with large drift highlighted in amber.
- Pipeline matrix tooltips on A5 cells now include a "Voice: drift X% · N voice · N metaphor · N ethos · N chapter-ending" line so the cumulative supervisor signals are visible at a glance without opening the run.
- New "Show apply steps" checkbox in the matrix header. The new apply steps (A5 Apply, Apply Galley Remarks, Apply Panel Remarks, plus three editor handoffs) are hidden by default to keep the matrix readable on big projects. Status still flows for them so dependent steps unlock at the right time. The toggle is remembered between sessions.
- Approving A5 Apply re-schedules the audits that saw pre-apply prose — Copyedit and the three editor handoffs — for the affected chapter. Their verdicts are invalidated by an applied A5 patch and need to re-run against the patched text.
-
Improvement A5 Supervise — structured remarks sidecar + per-volume voice profile
- A5 Supervise now emits a structured findings file alongside its human-readable report. Each finding becomes a machine-readable entry the new A5 Apply step (in 1.25.3) can apply to the chapter automatically. Four new categories of finding: voice, metaphor, ethos, and chapter-endings.
- New per-volume voice profile file in each volume's `editorial_reports/` folder. The supervisor uses it as a running baseline across chapters, so voice drift between chapter 3 and chapter 10 is detected reliably instead of having to re-read prior chapters every time. Cross-chapter voice coherence is now deterministic.
- A5 Supervise now runs one chapter at a time instead of three in parallel. The new voice profile is updated chapter-by-chapter and each chapter needs to see the running baseline from the prior chapter to detect drift correctly. The trade-off: a 17-chapter book takes ~85 minutes for the A5 pass instead of ~30 minutes, but cross-chapter voice work that wasn't working before now works.
- The fact-check evidence table the References tab reads from now also accepts evidence from A5 Supervise. Once the supervisor starts attaching evidence ids to its voice / metaphor / ethos findings, the References tab will show them under "Backs verdicts in" alongside fact-check evidence — same way, same surface.
-
Improvement Pipeline correctness, A5 hardening, Workshop polish, and a working Compare tab
- Cross-pipeline dependencies now resolve correctly when you filter the matrix to a single pipeline. Switching to Pipeline B and seeing every B0 cell locked even though A5.5 was green — fixed. The matrix payload now carries every chapter step's status regardless of which pipeline view is active, and review-gated steps (needs_review) count as satisfied for downstream eligibility, matching what the runner already does server-side.
- A5 Supervise has been hardened. It refuses to spawn on Haiku-class models with a friendly redirect to Settings → Model overrides, the supervisor skill now treats {{frozen}}…{{/frozen}} blocks and fact-checked verified passages as off-limits at the contract level, and the project's References library is injected at prompt time so voice / metaphor / ethos verdicts can ground in specific sources. The A5 input path now probes humanized → drafts so chapters that skipped A4 still supervise cleanly.
- Compare tab actually works. The previous diff would call any duplicated line "shared" regardless of where it appeared — reordered passages showed as no change, and insertions inside unchanged regions rendered as scrambled stripes. Replaced with a proper line-by-line diff. Silent loading failures now surface as toast errors instead of just leaving the panel blank.
- A new "Stop" button on running matrix cells. Clicking a running cell now offers to cancel the step — the subprocess is terminated, the run is marked cancelled, and the concurrency slot is released so the queue advances. The Live Scribe Stop button now uses the same cancel-step path so the cell transitions immediately instead of sitting visually "running" until the watchdog catches up.
- Better signaling when Claude Code's 5-hour rolling subscription rate limit is hit. Instead of a generic "API 429" message, you now see "Claude Code 5-hour rate limit hit" with three concrete unblocks: switch model class (Sonnet uses a different pool than Haiku), wait for the window reset, or switch to API mode in Settings → Cost & Usage.
- B-pipeline step descriptions are accurate again. B2 / B3 / B4 / B5 / B6 / B7 had stale copy-pasted descriptions from unrelated audit steps showing in matrix tooltips ("Audit the chapter's pronunciation guide" on Map Generation, etc.) — replaced with actual descriptions of what each step produces.
- B1 (Image Sourcing) refuses to spawn when you're offline. Previously the call would silently spawn and fail with an opaque skill error; now you get a clear "requires an internet connection" message before any subprocess launches.
- Print Specs prefills the page count from your project's galley PDF. When C10 has produced a print-ready PDF (or B7 has assembled a volume PDF), the Print Specs calculator opens with the actual page count instead of the placeholder 300, with a "Detected" chip showing where the number came from.
- Workshop now hides niche tools that don't match your project's template. Image Rights, Translation Memory, Audiobook Prep, and Serial Publishing only show on templates where they earn their keep (illustrated / academic / investigative for Image Rights, etc.). A "Show N more tools" button reveals them when you do need them.
- The Style Guide and Typography panels stopped re-rendering their own title and description (the outer Workshop header already shows them). The save state is now a unified pill across both panels instead of two slightly different inline indicators. Cleaner, denser, less repetitive.
-
Feature Workshop — auxiliary tools get cohesion, stage hints, and matrix cross-links
- The "Tools" tab is now "Workshop" — a name that signals what the surface is actually for. Each tool now shows a stage chip telling you when in the lifecycle it earns its keep, so opening Translation Memory at chapter 3 says "Pre-load term pairs BEFORE A6 / A7 runs" instead of leaving you staring at an empty table that reads as broken.
- Pipeline matrix cells now show a "💡 Workshop" hint in the tooltip for steps that have stage-relevant tools. Hover an A6 cell and you'll see "open Translation Memory"; hover A1 and you'll see Voice Samples + Style Guide. This is the discoverability fix — tools that previously lived in a tab nobody opened are now suggested at the moment they'd be useful.
- Auxiliary panels finally refresh when the pipeline does. Voice Monitor, Translation Memory, Image Rights, and Pacing Dashboard now subscribe to pipeline events; you'll no longer see stale data after a fresh A1 / A4 / A6 run.
- Silent IPC failures are gone. When a tool can't load its data, you now see the specific error in a red banner with a Retry button instead of an empty state that looked indistinguishable from "you have no data."
- Per-project Workshop memory: switching projects no longer drops you into whichever tool the previous project ended on. The active tool is remembered per project.
- Accessibility sweep on Workshop — screen readers now announce the active tool, category labels are proper headings, and keyboard navigation lands where you'd expect.
-
Improvement Fact-check evidence is visible from the References tab
- New "Cited by fact-check" filter chip in the References sidebar — one click restricts the list to references that ground at least one A2.5 verdict. Composes with kind filters so you can narrow to "sources cited by fact-check" or "claims cited by fact-check."
- Each reference row in the list now shows a green 📊 badge with the count of verdicts it grounds. Hover for the tooltip; click for the chapter backlinks.
- The reference detail pane gained a "Backs verdicts in" section grouped by chapter. Each verdict shows its stance (✓ verified / ⌥ partial / ✗ contradicted), locator, and a quoted excerpt. References that don't ground any verdicts hide the section entirely — no clutter.
- Sidebar counts and detail-pane backlinks refresh automatically when a fresh A2.5 run completes — no manual refresh needed.
-
Feature Fact-check now grounds verdicts in your References library
- A2.5 Fact-check now ties every VERIFIED verdict to one or more canonical references from your project's References tab. The skill receives the references library as context and attaches `evidence.refIds` to each remark — no more "verified, see Smith 2023" without a clickable link back to the actual source.
- When the fact-checker discovers a credible source not yet in your library, it emits a `proposedReference` block instead of fabricating a citation. The Review Center surfaces this as an amber chip with an "Add to References" button — one click promotes it into a real canonical reference and links it back to the verdict.
- Pipeline matrix tooltips on A2.5 cells now show fact-check evidence counts alongside tokens and cost (e.g. "23 verified · 2 partial · 4 refs"). Hover to see the breakdown without leaving the matrix.
- Downstream prose steps (continuity, supervisor, copyedit) automatically receive a "Fact-checked claims grounded by these sources" block in their editorial brief — no more re-questioning verified claims, and the editor knows which passages have grounding to preserve.
- A2.5 has a model floor: Sonnet-class or Opus-class only. Haiku is refused with a friendly error pointing at Settings → Model overrides. Citation hallucination on smaller models is too high a risk for reference-grounded fact-check work.
- New "Cited by fact-check" surface in the References tab — see which sources have grounded which verdicts across your book, separately from author-cited sources.
-
Fix Words drafted now works, per-step tokens visible in matrix + activity table
- The dashboard's "Words drafted" sparkline finally shows real numbers. The chapters table has had a word_count column since launch but no service ever wrote to it; the runner now refreshes it after every chapter-prose step, the project artifact scan refreshes it on import, and a one-time backfill on app boot picks up any pre-existing chapters with files on disk.
- Recent activity is now a proper metrics table with columns for tokens (in / out / cache↓ / cache↑), cost, duration, and time. Hover the cost cell to see which model produced the run.
- Pipeline matrix cells now show full token + cost detail in their hover tooltip on completed / failed / awaiting-review cells — the same numbers you've always been able to see by clicking through to Step Detail are now visible at a glance, without leaving the matrix.
-
Fix Multi-select drains itself, live matrix updates, per-step token detail
- Per-step concurrency settings now apply to multi-select runs. The "1 per 3 chapters" / "Serialize" / "Max" overrides you configure in Settings → Concurrency are honored when you check several chapters in the matrix and click Run, not only when Auto-Continue picks them up.
- Multi-select batches now drain themselves as agents free up. Selecting 6 chapters with a "1 per 3" cap will spawn 2 immediately and fire one more from your selection each time an agent finishes — no more silent drops past the cap, no more re-clicking the matrix wave by wave. The bar shows live "X running · Y queued" while it drains, and Cancel queued drops anything that hasn't fired yet.
- The pipeline matrix now updates the moment a step starts running — no manual refresh needed. Cells flip from idle to running on spawn, and the status reflects review-requested transitions immediately.
- Each run now records full token detail (input, output, cache-create, cache-read) and the model used, all viewable in the Step Detail drawer alongside duration and verdict. The numbers persist after the run finishes, so you can audit any past step instead of relying on the dashboard roll-up.
- Marketing site skill count corrected (39 → 52); admin feedback panel no longer leaks the email service env-var name when sending fails.
-
Fix Pipeline reliability — concurrency cap, error visibility, scanner deps
- Multi-select + run no longer fires every chapter's step in parallel. The runner now enforces each step's built-in concurrency cap on every spawn path, not just Auto-Continue. Selecting all 17 chapters and clicking Run will queue them at the configured rate (3 by default for the Write step) instead of hammering the API and getting rate-limited.
- Failed steps now show the actual failure reason. The terminal error from Claude — including HTTP 429 rate limits, API errors, and refusals — is now captured into the step's error message and surfaced in toasts and the Step Detail pane. No more empty "failed" with no explanation.
- Scanner-recovered review-gated steps no longer block downstream work. If the project-folder scanner promoted a step to needs_review (verdict SCANNED_PENDING_REVIEW), dependent steps now correctly treat it as satisfied — matching the long-standing behavior promised by the docs and used by the panel-synthesis precheck.
-
Fix Auto-fill timeout fix + live agent output
- The "Auto-fill from Discovery" subprocess timeout was raised from 6 to 12 minutes — a real Discovery session with all 9 phases worked-through can produce a plan large enough that the prior cap fired before generation finished.
- The Discovery aggregate fed to the bootstrapper is now tighter: per-phase cap reduced from 8 KB to 5 KB and a global 36 KB ceiling truncates the longest phases first if the total still runs over. Plans take less time to generate without losing the parts that matter.
- New "Show agent output" panel inside the generating state — Claude's live stdout streams into a scrolling tail so you can watch the plan being produced instead of staring at a spinner. Auto-follows the tail unless you scroll up; auto-trims if output exceeds 100 KB.
- The dialog now tells you up-front that generation can take up to 10 minutes for a fully-worked Discovery, and that closing the dialog keeps the run going — reopen any time.
-
Feature Auto-fill your workspace from Discovery
- New "✨ Auto-fill from Discovery" button in the References tab. Reads every Discovery phase you've completed (Subject Exploration, Idea Harvest, Thesis, Chapter Architecture, Blueprint, …) and proposes a structured plan of canonical references and chapter beats — characters, places, sources, claims, concepts, plus per-chapter scene or argument outlines.
- A guided dialog lets you pick what to fill (references, beats, or both), choose your preferred reference kinds and beat granularity (light / standard / detailed), and decide how conflicts get handled before anything is written.
- Preview-and-apply flow. Every proposed reference and beat is shown grouped (by kind / by chapter), with source-phase pills that tell you which Discovery phases supported it and a confidence badge. Deselect anything you don't want, then apply atomically.
- Existing references are never overwritten. Conflict mode is "skip" by default — name and alias matches are surfaced but skipped unless you explicitly choose "merge", which only appends new aliases and attributes. There is no "replace" mode by design.
- Per-run undo. After applying, a single button reverts every reference and beat that hasn't been edited since insertion. Items you've modified are preserved with a clear count.
- Bible and Research are no longer separate tabs. The unified References tab is now your sole reference surface — both legacy tabs have been retired. Existing data is unaffected; the underlying canonical-references store is what the References tab has always read from.
- Re-running auto-fill against the same Discovery is idempotent: a deterministic hash per proposed reference means duplicates are silently detected, so you can safely run the workflow again after expanding your Discovery.
-
Feature Dashboard refresh — needs-attention inbox, multi-phase progress, momentum
- A redesigned studio dashboard. The greeting strip replaces the old four-metric row with a time-of-day greeting, your active project count and weekly delta, and a manual refresh button (also bound to the "r" key while the dashboard is focused).
- Needs your attention — a new inbox surface at the top of the dashboard. Lists failed runs (red), steps awaiting review (amber), projects stalled for 7+ days, outstanding skill warnings, and unresolved beta-reader annotations. Each row is clickable; non-skill rows offer a one-click 24-hour snooze. When the inbox is empty you see a clear "All clear" state.
- Active projects now show progress across every pipeline phase, not just text production. Each row carries five mini-bars (Discovery, Production, Visual, Galley, Final), a single overall percentage, an action chip ("2 need attention" / "all clear"), the time of last activity, and the week's run count.
- Momentum sparklines — three new cards (Words drafted, Chapters touched, Pipeline runs) chart the last 4 weeks so you can see whether your week was up or down at a glance. The runs sparkline visually splits successes and failures so a degraded week is unmistakable.
- Recent activity got rescued out of the old Analytics panel and given filter chips (All / Completed / Failed / Reviews). Always renders, even at zero runs, with a useful empty-state hint.
- Cost & usage gained a manual refresh button and a "?" popover that explains the methodology behind the headline number — the long-standing confusion about subscription tokens vs API dollars is now one click away.
- Keyboard shortcuts on the dashboard: r refreshes, n creates a new project, i opens the import dialog. Bindings ignore inputs and textareas so they don't fire mid-typing.
- A `dashboardV2` setting in `settings.json` defaults to true; flip it to false if you need the legacy dashboard back during the soak period.
-
Improvement Hide projects from the dashboard and sidebar
- Each project in the sidebar now reveals a small "Hide" button on hover. Hiding a project removes it from the dashboard counts, the recently-active strip, and the sidebar's Active Projects list — without changing its workflow status, deleting any data, or affecting pipeline runs in flight.
- Hidden projects collect into a collapsible "Hidden (N)" section at the bottom of the sidebar project list. Click to expand, then click the "Unhide" pill on any row to bring the project back. Hidden projects stay accessible by clicking through; only their dashboard surfaces are suppressed.
- If every project in the workspace is hidden, the dashboard now shows a clear "All N projects are hidden" message that points back to the sidebar, instead of falling through to the new-user welcome screen.
-
Improvement Beta capacity gate enabled (Phase 3) + friendly signup error
- The beta-capacity gate is now enforced server-side. Signups are rejected once seats are full or the operator has closed the beta from the admin panel; until then, signups continue to succeed exactly as before. The number you see on the homepage is now load-bearing — the counter and the gate move together.
- Friendly error mapping for the new beta-full state. Instead of "Something went wrong (beta_full). Please try again," the signup screen now shows "The BookForge beta is currently full. Join the waitlist at bookforge.synaptrixai.com and we'll let you know when seats open up."
-
Feature Beta capacity counter — public on the homepage, controlled from the admin panel
- The homepage now shows live beta-seat availability under the hero. Three states drive the visual: green when there is plenty of room, amber when fewer than 30% of seats remain, red when the beta is full or closed. The number is computed live from the users currently occupying seats and cached for sixty seconds at the edge so a homepage view spike never hammers the database.
- A new "Beta capacity" card lives in the admin panel above the waitlist. Adjust the total cap, hard-close the beta, or post a public message that overrides the default copy on the homepage. Every change writes one row to a new audit log so you can answer "who raised the cap last week?" without scrolling server logs. Refuses to lower the cap below the current used seat count, which would silently lock out beta users you have already accepted.
- A new column on users — consumes_beta_slot, default true — lets internal accounts not count against the public beta cap. Future admin-created accounts default to false, so spinning up a test account does not move the public counter.
- The signup gate (rejecting new accounts when the cap is reached or the beta is closed) is feature-flagged behind BETA_GATE_ENABLED, defaulting to false. Phase 1 ships the schema and the admin UI; Phase 2 ships the homepage display; Phase 3 enables the gate via a single .env edit. This release lights up Phase 1 + Phase 2 — signups still always succeed for now, the counter is informational while the operator gets comfortable with the tooling.
-
Fix Crash on launch fixed — DB migration no longer hits a dropped table
- Fixes a hard crash on launch that affected any project database that had been through the 1.19.0 schema collapse. The root cause: a leftover legacy migration block tried to ALTER TABLE entities and CREATE INDEX ON entities even though entities was dropped in 1.19.0 — so any second-and-later boot of a post-1.19.0 database threw "SqliteError: no such table: entities" before the main window could open. Symptom looked like "the app silently does nothing" — no window, no error dialog. The block is now gated on the legacy table still existing, so it runs once on pre-1.19.0 DBs (preserving series-shared-entity data through the canonical-references migration) and is a no-op forever after.
- If you saw 1.20.0 or 1.20.1 fail to open, install 1.20.2 over the top — your data is safe; only the migration logic changed. Auto-update will not rescue you because the crash is in the very first step of startup, before the updater runs; this one needs a manual download from the website. From 1.20.2 forward you are back on the auto-update path.
-
Fix Single-instance lock — clicking the icon always brings BookForge forward
- Fixes a silent failure mode where clicking the BookForge desktop icon appeared to do nothing. The cause: if a previous BookForge process was still alive in the background (e.g. its window had been closed but the main process was hung shutting down a Claude CLI subprocess), a second launch would fail to open the SQLite database — locked by the first process — and quietly exit before any window appeared.
- BookForge now acquires a single-instance lock at startup. If another instance is already running, the new launch hands focus back to the existing window (or creates one if all windows were closed) and exits cleanly. No more invisible zombie processes; no more "click does nothing." If you see this happen on the build prior to 1.20.1, kill BookForge in Task Manager once and the next launch will work; from 1.20.1 forward, this category of failure is impossible.
-
Feature References tab — curated, automatic, visible
- The References tab now curates its kind sidebar to the project template. Pick "Memoir" at create-time and you see Characters, People, Places, Events, Periods, Objects, Organizations — not Notations or Formulas. Pick "Academic Monograph" and you lead with Sources, Claims, Concepts, Terms. Templates surface their primary kinds in the sidebar; everything else stays one click away under "More kinds…" in the Add modal so power users keep full freedom.
- When the writer (A1) finishes a chapter, BookForge can now automatically scan it for new characters / places / concepts / persons and queue them up as candidates in the References tab. A soft toast invites you to review when candidates land. Default is on for memoir / popular nonfiction / investigative templates (where named entities pile up fast) and off for academic / illustrated reference (where claim work matters more than entity work). Toggle per-project in Project Settings → References tab.
- The pipeline matrix now shows a 📌 N pill on every chapter row indicating how many references are attached to that chapter. Hover for a tooltip; refer to the References tab for the actual list. Reference-blind chapters get no pill, so you can spot at-a-glance which chapters might benefit from a manual scan or a citation pass.
- Project create dialog now previews each template's curated kinds as a chip strip on every template card — fiction-vs-research-vs-memoir-vs-illustrated is visible before you commit, not as a surprise after.
- Internal: pre-1.19.0 installs whose chapter_beats table still pointed its pov_entity_id / location_entity_id foreign keys at the dropped `entities` table now get an automatic table rebuild on first launch. Data integrity was preserved through 1.19.x (same primary keys), but PRAGMA foreign_key_check would flag it and edge-case writes against those columns could have errored. Fresh installs and projects created on 1.19.0+ already had the right schema; this just cleans up the stragglers.
-
Feature New unified References tab — A/B against Bible + Research
- A new "References" tab now lives between Bible and Outline. It shows everything this book references — characters, places, sources, claims, concepts, terms — in one polymorphic library, with a kind sidebar on the left, search-and-list in the middle, and a kind-aware detail pane on the right. Same data your Bible and Research tabs already see (the underlying tables were unified in 1.19.0); this is the front-end that finally treats them as one thing.
- Pick a kind on the left and the list filters; type in the search box and it filters live across name, aliases, description, tags, and claim text. Add new references with a single button — the kind picker defaults to whatever sidebar slot you have selected, so adding three sources in a row does not make you re-pick "source" three times.
- The detail pane polymorphs: a character shows its attribute editor, a source shows type / publication / URL / trust tier / extracted-text length, a claim shows its parent source, claim text, kind, and confidence. Editing any field hits Save once and round-trips through the unified service.
- Drag a PDF, DOCX, TXT, or Markdown file anywhere on the new tab to ingest it as a research source. The same drag-drop flow the Research tab has — text extraction, metadata inference, SHA-based dedup, automatic claim extraction on the magical-moment path — now happens inside the unified library. Or paste a URL via the inline link under the search bar.
- AI extraction also moves in: pick "Scan chapter for entities" in the sidebar to propose new characters, places, and concepts from the latest prose of any chapter; on a source detail pane, hit "Extract claims" to surface candidate claims for review. Each proposal commits with one click into the unified store, no copy-paste between tabs. Alias-merge proposals from chapter scans still surface in the legacy Bible tab for this release.
- The existing Bible and Research tabs keep working unchanged so you can A/B the new tab against your normal workflow. Once it has soaked we will retire the older tabs in a follow-up release.
-
Fix References regression fix + polymorphic [[ref:id]] foundation
- Fixed a silent regression introduced by the 1.19.0 schema collapse: when the legacy `entities`, `research_claims`, and `research_sources` tables were dropped, three prompt-building paths (the A1 chapter outline, the per-chapter attached-claims context, and the C9.7 claim resolver) were still reading from those names via raw SQL. The failure was swallowed by their try/catch wrappers, so the symptom on 1.19.0 was invisible degradation — A1 generated chapters without seeing your beat outline, attached research claims didn't reach the writer/fact-checker prompts, and citation resolution to footnotes silently produced empty bibliographies. All three paths now read through the unified canonical-references service, so beats, attached claims, and citation resolution are restored. If you ran A1 on 1.19.0 against a chapter with attached beats or claims, re-run it on 1.19.1 to get the outlined draft you originally expected.
- Editor decorations and citation-insertion now use a polymorphic `[[ref:id]]` token form. Existing prose with `[[claim:id]]` tokens keeps rendering with the same chip and resolves to footnotes exactly as before — no re-saves needed. New citations inserted from the research dock land as `[[ref:id]]`, paving the way for the unified References tab in 1.19.1.x where the same token form will let you cite characters and places inline alongside research claims.
-
Improvement Foundation: bible + research collapsed into one references module
- Internal architectural refactor that paves the way for the upcoming references-module rebuild. Behind the scenes, BookForge now stores characters, places, concepts, research sources, and citable claims in one unified table — replacing two parallel modules (bible and research library) with a single canonical-references registry. The Bible and Research tabs you use today are unchanged in 1.19.0; the work pays off in 1.19.1 (one combined References tab, polymorphic [[ref:id]] tokens in prose) and 1.19.2 (per-template kind defaults so an astronomy textbook gets concept/term/notation/formula instead of character/villain/sidekick, plus auto-extract on draft completion). Existing project data was migrated automatically on first boot. No user action needed.
-
Improvement Pipeline clarity pass — every step now explains itself
- Major UX cleanup of the pipeline matrix — none of the orchestration logic changed, all 39 steps still do exactly what they did before, but they now tell you what they're doing. Hover any step header for a one-line plain-English explanation aimed at an author rather than an engineer; locked cells now decode their unmet dependencies (and explicitly handle alternative groups, so a tooltip reads "waiting for A2 *or* A2G — choose one" instead of the previous opaque "needs A2"); alternative-pair steps like A2 / A2G now wear a "⇄ choose one" caption above their column so the choice is obvious before either runs; the empty matrix shows a guided welcome with the 5-phase pipeline overview plus situation-aware next-steps depending on whether you have no volumes or no chapters yet; review-pending chapters now have a per-row "👁 Review →" badge that opens the review surface in one click; collapsed phase columns now show a per-status breakdown ("12 done · 3 failed · 2 awaiting review") on hover; phase tabs in the "blocked" state now explicitly say "paused at a review gate"; failed steps now come with View full logs / Retry buttons plus pattern-matched hints for common failures (rate-limited, network down, frozen-prose collision, missing skill, etc.); the variants feature is rebranded as "Try multiple writing styles" with discovery hints in the matrix-cell tooltips for the four steps that support it (A1, A4, A5, A5.5); a persistent month-to-date footer shows your project's spend or quota usage so you're never surprised by the cost dialog. Eleven separate audit findings, all in one release.
-
Improvement New BookForge logo — including the splash screen on app launch
- BookForge now wears its real logo — the open-book-and-flame mark, in blue gradient — everywhere it shows up: the boot splash you see while the app starts up, the sidebar brand block, the sign-in screen hero, the marketing site nav, the favicon in your browser tab, and the Windows installer + taskbar icon. The splash uses the full lockup at 224px tall on a centred dark canvas, so the very first frame after launch is the brand instead of a black void. Previous builds used a placeholder gradient block in those spots; the installer used the default Electron logo. Same identity across surfaces, no extra asset shenanigans.
-
Improvement Sessions stay signed in for 30 days, not 7
- BookForge sign-in sessions now last 30 days instead of 7. The previous 7-day token meant the app would silently sign you out roughly weekly during the heartbeat check, often mid-task. The longer window keeps you logged in across normal weeks of use; an admin disable still revokes access on the next 15-minute heartbeat. Existing tokens keep their original 7-day expiry — the change applies to your next sign-in.
-
Improvement Research: paste URLs, drop EPUBs, and only see claims that match your thesis
- The Research tab now has a "Paste URL" button alongside Upload files and Add manually. BookForge fetches the page, runs Mozilla's Readability extractor to strip nav and ads, auto-detects title, byline, publication, and date from Open Graph tags or article metadata, falls back to a Claude inference call when those are missing, and adds the article to your library — same dedup and auto-claim-extraction as a dropped PDF. Direct links to PDFs are downloaded and routed through the existing PDF pipeline. Anything paywalled stays a save-as-PDF-first job, but everything else is one paste away.
- EPUB files now ingest like PDFs and DOCXs. BookForge unzips the container, walks the OPF spine in reading order, concatenates each chapter's text, and pulls title/author/publisher/date from the Dublin Core metadata block — so a research book in EPUB form lands with full provenance instead of "Untitled (random.epub)".
- AI claim extraction now filters to your book's thesis. When a project has a Discovery thesis (phase 0.7) or final blueprint (phase 0.9), the researcher reads it before scanning the source and scores every candidate 0–1 by how directly it bears on what your book is actually about. Off-topic claims (relevance < 0.5) are dropped server-side; the rest are sorted highest-relevance-first with a "92% relevant" pill so you accept the strongest 8 instead of triaging a list of 30. Projects without Discovery yet keep the legacy unfiltered behavior with a one-line nudge to run Discovery for filtering.
-
Improvement Forgot your password? Reset it from the sign-in screen.
- Added a "Forgot password?" link to the sign-in screen. Enter your email and BookForge sends a single-use reset link that expires in 30 minutes; click it, set a new password on the BookForge website, and sign back in. The request endpoint always responds with the same "if that email is registered, we sent a link" copy whether or not the address has an account, so it never reveals which emails are signed up.
-
Feature Staging channel — test releases without touching production
- BookForge now ships through a two-stage release pipeline. Internal builds publish to a parallel "BookForge Staging" app that installs side-by-side with the production version, talks to its own backend at staging.bookforge.synaptrixai.com, and pulls auto-updates from a separate downloads bucket. Once a staging build has been verified, a single `npm run promote <version>` copies the byte-identical artifact into production — so what users get is exactly what was tested.
- Staging builds now display a persistent amber "STAGING" banner at the top of the window plus a channel badge in Settings → About, so testers can never confuse a staging install with the live one.
- New cloud-health monitor: the app now probes the BookForge backend every two minutes and surfaces a top-of-window banner when the API is unreachable or degraded — distinguishing "you appear to be offline" from "our servers are responding slowly" so you know whether to retry or wait.
- Confirm and prompt dialogs are now hosted globally via the new DialogHost, so any deep panel can `await confirmDialog(...)` without prop-drilling — used immediately by Settings → Reset to Defaults to ask before wiping configuration.
-
Fix Hotfix — modal centering & backdrop reliably render
- In 1.17.18 the feedback dialog rendered at the very top of the window with no backdrop dim because the overlay's viewport-filling classes weren't being applied. Pinned the overlay's position, size, flex centering, and the panel's 90% max-height directly via inline styles so they can't be purged or compiled away. Modals now reliably appear centered with a darkened backdrop, and tall content scrolls inside the panel with the title bar and action buttons always visible.
-
Fix Hotfix — modals fully visible again, body scrolls inside panel
- In 1.17.16/.17 the feedback modal showed only its title bar — the body was missing because the new flex centerer didn't resolve in the Electron renderer. Reverted to a single-layer overlay that always fills the viewport, with the panel itself capped at 90% viewport height and its body owning the scroll. Tall modals now scroll inside the panel instead of clipping; short ones stay centered.
-
Fix Hotfix — modals not opening after 1.17.16
- Modals (Feedback, Onboarding, Create Project, Search, all delete confirmations) failed to appear at all after the 1.17.16 layout change. Replaced the dual-handler centering structure with the canonical scrollable-overlay pattern, so modals now reliably open, center when they fit, and scroll cleanly when they don't.
-
Fix Fix — tall modals (Feedback, Onboarding) no longer get clipped
- Modals taller than the window — most visibly the feedback panel — had their top edge cut off because the centred layout couldn't scroll. The dialog now sits inside a scrollable overlay: it stays vertically centred when it fits, and gracefully scrolls into view when it doesn't.
-
Fix Fix — feedback textarea no longer appears transparent
- The feedback modal's text box looked see-through against busy app content because the modal's backdrop blur was bleeding into form controls inside it. Modals now isolate their stacking context, and the feedback textarea uses an explicit opaque dark background — what you type is the only thing you see.
-
Feature Admin tools — promote / demote users without leaving the app
- Admins can now flip a user's role between "user" and "admin" directly from the Admin → Users table — no more SSH-and-psql for granting operator access. The button shows "Make admin" for regular users and "Demote" for current admins, and confirms with a clear warning before the change.
- Promotion uses the existing admin-patch endpoint, so role changes propagate to the affected user within ~15 minutes (heartbeat) or immediately on next sign-in.
-
Fix Bug fixes — review approval, signup, native dialogs, hidden crash
- Fixed: apply-step reviews (C9.6, PNL.A) with an empty patch journal could not be approved — the "Step is safe to approve" notice appeared but the Approve button stayed disabled. It now enables as soon as every entry is decided (or there are no entries at all).
- Fixed: signup form said "min 8 characters" but the server required 12 — typing 8–11 produced a confusing "validation error". The form now correctly says 12, pre-checks before submit, and the fallback error message points users at the real rule.
- Fixed: a latent crash in the Voice Monitor that triggered "Rendered more hooks than during the previous render" the moment a project gained voice data. Hooks are now hoisted above the early-return guards.
- Polish: every native browser alert / confirm / prompt across the app (delete confirmations in the entity bible, research, beats, beta readers, image rights, translation memory, voice samples; admin user disable / delete; settings reset; pipeline re-run; structure normalize; etc.) now renders through the in-app design system instead of the OS modal.
- Internal: dead variable assignments and missing error-cause chains cleaned up in seven services; lint surfaces real findings again after a config rebuild.
-
Improvement Polish — disabled UX, health banner, live cost & velocity
- If your account is paused server-side, you now see a friendly "account disabled" panel with a contact link instead of being silently bounced to the sign-in form.
- A new top banner lights up amber when BookForge servers are slow and red when you appear to be offline, so you know up front whether a failed action is your network or ours.
- The Agent Monitor footer now shows a cumulative cost tally across every running step and a live tokens/sec readout in the per-agent header, so you can spot stalled or runaway turns at a glance.
-
Feature Email comms — welcome, feedback ack, admin reply
- New users get a welcome email on signup with getting-started guidance.
- When you submit feedback through the in-app button, you now get an automatic acknowledgement so you know it landed somewhere a human reads.
- Admin (operator-only): the feedback panel grew a reply box — typing a message and clicking "Send reply" emails the user directly. "Send + resolve" does both in one click.
-
Improvement Friendlier failures — Claude CLI, auth, skill warnings
- When Claude Code CLI is missing or fails to spawn, BookForge now shows a clear top banner with a help link to install Claude Code, instead of burying the error in a tiny step-history box.
- When Claude returns an auth or quota error, you get a specific banner (sign in to Claude Code / check billing) instead of a generic "step failed".
- "Skill missing" warnings are now sticky — they stay visible until you dismiss them, so silently degraded output never scrolls past unnoticed. "Skill fallback" still auto-dismisses after 12s.
-
Feature Admin tools — top-level access + per-user drill-down
- Admins now get a top-level "Admin" sidebar entry, no more hunting through Settings → Usage to triage.
- User table has Disable / Enable / Delete / View buttons — no more SSH-and-psql for account changes or GDPR deletion requests.
- Click "View" on any user to see their full activity timeline (runs, errors, feedback) merged chronologically.
-
Improvement Better bug-triage signals
- Crash reports and feedback now include the pipeline run + step you were on, so the support team can see what you were doing when something broke.
- When a skill fails to load from the cloud, the warning is now uploaded — silent quality degradation is no longer invisible.
- When a pipeline step lands in failed state, its error message is mirrored to the support dashboard automatically (in addition to the in-app step history).
-
Feature Account profile + periodic access check
- New profile card in Settings → Account & Privacy: editable display name, plan badge, email verification state, join date.
- Sidebar user row now shows your actual display name and plan/role instead of a hardcoded "Administrator" label, and clicking it opens Settings.
- Every 15 minutes the app silently re-verifies your session with the server. If your account is deactivated server-side, you're signed out immediately instead of staying in the app until the next restart.
- Server: users can now be soft-disabled without deleting them. Attempting to sign in to a disabled account returns the same error as a wrong password (no account-status leakage).
-
Improvement Settings cleanup — remove stale "install skills" flow
- Settings → System renamed from "System & Skills". The "Install Skills to Claude CLI" button is replaced by a "Refresh skills" button that syncs your local cache from the Synaptrix cloud instead of copying bundled files into ~/.claude/skills.
- OnboardingWizard no longer asks for a "skills folder" — skills are fetched from the server and cached automatically, no user path configuration needed.
- Skill-sync result display simplified: no more references to "bundled skills" or "drifted from bundle" (concepts that disappeared in 1.17.4).
-
Fix Version display fixes
- Settings → About now shows the actual running app version instead of a stale placeholder.
- What’s New modal now reports the correct current version — the 1.17.4 build had a build-order hiccup where the modal still showed 1.17.3.
-
Improvement Multi-user polish + security hardening
- Default organization name is no longer pre-filled — new users enter their own imprint name instead of inheriting a placeholder.
- Settings now has an Account & Privacy section: signed-in email, current tier, and one-click support requests for password change, data export, or account deletion (per the privacy policy).
- Crash reporter scrubs more Windows path variants (including UNC extended paths) before uploading stack traces.
- Installer metadata (publisher, app ID, copyright) is unified under Synaptrix AI across package.json, electron-builder, LICENSE, and the server.
- Settings → About now shows the actual running version instead of a stale placeholder.
- Server security: JWT sessions now expire in 7 days (down from 30), password minimum raised to 12 characters, brute-force rate limits on auth and feedback endpoints.
-
Improvement Settings save coalescing + internal cleanup
- Settings page now coalesces rapid field changes: tabbing through three fields triggers one `settings:update` round-trip with all three values, not three separate saves that could race. A live "Saving…" pill (amber, pulsing) appears whenever a save is in flight, followed by a "Saved" pill for 4 seconds once it completes.
- Beta-invite chapter expansion is now a single typed Drizzle JOIN (volumes × chapters) instead of a raw-SQL-then-Drizzle two-pass. Half the DB round trips and full TypeScript coverage.
- schema.ts `cost_usd_micros` column picked up an explicit units-warning comment — the TS field name (`costUsd`) hides the fact that the stored value is integer micros (1 USD = 1,000,000), so every call site must assume micros until a coordinated rename is done.
-
Improvement Polish — settings auto-expand when customised, editor-handoff auto-clear
- Settings → Per-step parallelism section now auto-expands when you have any step overrides in place, so you see your customisations at a glance instead of hunting for a Configure button.
- Editor handoff import success strip now auto-dismisses after 20 seconds (matching Beta Readers). Per-row `importCount` and `lastImportAnnotationCount` badges keep the information available for later lookup.
- schema.ts now opens with an architectural note explaining its intentional partial-mirror relationship with connection.ts — so future contributors know to update both files in lockstep when adding schema changes.
-
Improvement Internal refactor — shared Claude CLI helpers
- Nine services (audiobook, beat-proposer, copilot, entity-extract, recap, research-extract, research-ingest, serial-publishing, style-guide) no longer duplicate `resolveClaudeBinary` / `resolveSkillPath` / `hasSkillFolders` — they now import from a single `src/main/utils/claude-cli.ts`. A future Claude Code install-path change is now a one-file fix.
- Fixed a latent bug in `research-ingest` along the way: the local `resolveClaudeBinary` fallback returned the bare name "claude" on Windows instead of "claude.cmd". Now uses the unified platform-aware fallback.
- Patcher skill documentation heading renamed from "Error Handling" to "Self-check before emitting" so the skill's name-the-case guidance reads consistently with other sidecar-aware skills.
-
Feature Skip onboarding, undo settings reset, focus-aware modals
- Onboarding wizard now has a "Skip for now" button on every step. Accepts the auto-detected defaults (projects folder, Claude model, concurrency) and marks onboarding complete so first-launch users who don't yet know their preferences aren't hard-blocked from the dashboard. You can tune anything in Settings later.
- Settings → Reset to Defaults now keeps the old configuration recoverable: after you confirm, a 15-second "Undo" toast appears. Click Undo to put every field back verbatim — no more "oops I hit reset" data loss.
- Toast stack gained a first-class action button + custom TTL, so any call site can offer "Undo" / "Open" / "Retry" on a toast.
- Modals now focus the first interactive element inside the dialog (input / button / textarea / select / explicit `autofocus`), not the dialog div itself. Keyboard users can start typing immediately instead of having to Tab once first.
- Diff viewer now shows a friendly "Binary file differs" notice for non-text files (docx, PDF, images), instead of rendering raw garbled bytes. Detection is based on git's own "Binary files … differ" marker.
- Tool cards in the Tools tab now clamp long descriptions to two lines with break-words — no more layout jumps at narrow widths.
-
Improvement Polish sweep — dates, avatars, animations, edge-case guards
- Serial publishing cadence preview now formats dates as "Mon, Apr 19, 2026" (locale-aware, UTC-anchored) instead of raw YYYY-MM-DD strings.
- Audiobook Prep pronunciation guide now shows a "1–50 of N" hint above the preview table when the guide has more than 50 entries.
- Team page avatars now fall back through name → email → "?" so a partially-hydrated user row or empty-name entry never crashes the initial.
- Onboarding wizard progress bar now animates smoothly between steps (500ms ease-out) instead of snapping.
- Sidebar "What's New" badge: dismissing the modal now always drops the dot, even if the localStorage write fails (private mode / quota) — previously the dot could stay lit until next launch.
- Beta Readers import success strip auto-dismisses after 20s so it doesn't linger across sessions. The invite rows still carry per-reader importCount badges for lookup.
- Citation picker button tooltip now documents the full keyboard flow (↑/↓ wraps, Enter inserts, Esc cancels).
- Onboarding wizard progress bar + project tablist now include proper ARIA semantics (progressbar, tablist, aria-valuenow, aria-selected).
- CLAUDE.md architecture note updated to reflect the current 17 IPC module layout (was stale "5 IPC modules").
-
Improvement Polish sweep — a11y, header overflow, clearer onboarding
- Long project titles now truncate cleanly in the header with an ellipsis + full-title tooltip, instead of stretching the layout.
- Project tabs are now a proper `role="tablist"` — screen readers announce which tab is selected, badges have `aria-label="N pending"`, and tab navigation respects `tabIndex`.
- Timeline bars got `role="img"` + aria-label so screen readers announce each run as "A1: Writer — 42s" instead of reading the container's cryptic colour class.
- Audiobook Prep per-chapter re-export / open-file icon buttons got descriptive aria-labels and tooltips.
- Search modal: the arrow-key highlighted row now has a brand accent bar on the left + a stronger background tint, so you can see which result Enter will open. Arrow keys also wrap at the list ends.
- Style Guide textarea got an aria-label and the voice-intent input now has a proper `htmlFor`/`id` pairing.
- Typography panel loading state now uses a real `<Spinner />` + the shared text treatment instead of a plain sentence.
- Onboarding wizard: the "Global parallelism ceiling" field is now "How many Claude runs at once (max)" with a one-sentence plain-language hint — no more CS jargon on first launch.
- Settings saved-toast now displays for 4s (was 2s) — long enough to notice on wider monitors.
- Series attach button now guards against double-clicks before `busy` state has flushed.
- WhatsNewModal has a defensive empty state if the changelog is ever emptied, so the modal never renders blank.
-
Improvement Polish sweep — search highlights, sort, persistence, live badges
- Guide page search now highlights every match in the rendered body with an amber background — no more scrolling the section wondering where the term actually appears.
- Pipeline matrix phase collapse state is persisted per project in localStorage. Your collapsed layout survives page reloads and stays scoped to the active project.
- Pipeline matrix "to review" badge now updates live the moment a step finishes in needs_review state — you see the new count without waiting to switch tabs.
- Sidebar project status dots got a legend tooltip: hover the ⓘ chip next to "Active Projects" to see what each colour means (Discovery / Production / Visual / Post-production / Complete / Archived).
- Create Project modal now previews the exact folder path where the new project will land ("Will land at: .../Projects/{derived_name}") so you can verify the root before committing.
- Citation picker arrow-key navigation now wraps — ↓ at the last result jumps to the first, ↑ at the first jumps to the last.
- Voice Monitor chapter-metrics table: click any column header to sort by that metric (asc/desc toggle, indicator arrows).
- Guide keyboard-shortcuts reference expanded — Ctrl+. (co-pilot), Ctrl+Shift+[ (citation picker), and the Agent Monitor `/` search shortcut are now documented.
-
Fix Bug-fix sweep — service corner cases + outline modal fix
- Beta invite default expiry now snaps to midnight UTC N days out, consistent with every other date field in the DB. Previously stamped with a precise millisecond which rendered inconsistently against day-only dates elsewhere.
- Series creation now refuses to silently orphan a row if the organization hasn't been set up yet — a clear error asks the user to finish the welcome screen first.
- Recap generator now reads project + series together in a single query so a concurrent series detach/delete between the earlier project read and the recap run can't leave the generator pointing at stale data.
- Pacing dashboard: `computeTempo` now coerces NaN inputs to 0 so a zero-length chapter or punctuation-only paragraph can't crash the sparkline with a non-numeric score.
- Editor handoff: the token-recovery regex is now derived from the same `TOKEN_BYTES` constant that generates it, so the generator and import paths can't drift. Paragraphs clipped at 2000 chars in the change annotation now include a "⚠ clipped — open the source docx" note so reviewers know to check the original.
- Audiobook SSML export: the generation timestamp comment was removed — re-exporting an unchanged chapter now produces an identical file (no more git churn on idempotent exports). Phoneme injection count + source kind are now recovered from the file header in `listExportedSSML`, so the Audiobook Prep panel shows accurate metadata for past exports.
- Co-pilot: if a chapter brief file exists on disk but its content is empty/unreadable, the main-process log now warns so a silently corrupted brief doesn't produce surprising rewrites without any trail.
- Outline → Beat form modal: `projectId` is now actually used to hydrate the entity bible for POV/location pickers when the user opens the modal without visiting Bible first. The dead placeholder comment is gone.
-
Fix Bug-fix sweep — dropdowns, approvals, autoscroll, git retry
- Review Center: the approve-error strip now has a ✕ dismiss button and auto-clears after 12s, so a stale failure message no longer lingers on a card that's since been fixed.
- Agent Monitor transcript: autoscroll during rapid event bursts is now coalesced into a single requestAnimationFrame per frame — no more jitter when a Claude run produces dozens of deltas per tick.
- Print Spec Calculator: page count is now clamped to the KDP valid range (24–828), shows a live amber border when out of range, and snaps to the window on blur.
- Image Rights license dropdown expanded from 5 to 10 options: added CC0, CC-BY-ND, CC-BY-NC, In-house, and All rights reserved alongside the existing set.
- Translation Memory language dropdown expanded from 3 to 31 options: every major European, East Asian, South Asian, Middle Eastern, and Nordic language covered, with PT/ZH locale splits.
- Chapter Brief: save now emits a green success toast (in addition to the inline "Saved" flash), so users get confident feedback even when not looking at the header.
- Git Panel: failed init now surfaces the real error inline with a ✕ dismiss and the primary button re-labels to "Retry Initialize", so users aren't stuck staring at an inscrutable uninitialized state.
-
Fix Bug-fix sweep — races, search, setup errors, path validation
- Comparison mode: file-swap no longer races with the previous in-flight load. A request-id guard discards any stale response, so swapping or repicking quickly can't splice mismatched contents across the two panes.
- Tools tab → Quick AI actions: every one-shot Claude run now reports success (green toast) or failure (red toast with the actual error). Previously both outcomes looked identical to the user.
- Import-result banners (Dashboard + Project Library): now three-tone — red for pure failure, amber for partial / skip-only, emerald for pure success. No more guessing why the banner is grey.
- Voice Samples panel fetches the sample list exactly once on mount (was doing two round-trips).
- Style Guide panel: the main editor textarea is now locked while AI generation is running, so edits typed mid-generation can't get silently overwritten when the model returns.
- Image Rights + Translation Memory: both tables now have a search input in the header (filters across filename / source / attribution / license / status for images; source term / target term / context for translations), with a "N of M" counter and a "no matches" empty state.
- Setup screen: a failed `setupOrganization` call now surfaces a red error strip with the real reason instead of silently re-enabling the button.
- Settings → Default Projects Folder: the path you type or Browse to is now checked against the filesystem (exists / is a folder / is read-writable). Invalid paths show an inline amber warning before the next project-creation fails.
-
Fix Bug-fix sweep — cross-project isolation + launch curve + create-project guard
- Switching projects now resets every per-project store (Entity Bible candidates, Beats, Pacing, Beta invites, Editor handoffs, Audiobook, Serial, Launch plans, Research). Stale candidates and drafts from a previous project can no longer bleed into the new one.
- Serial publishing: the "generating newsletter" flag is now keyed by `projectId:chapterId` composite, so two projects that happen to share a chapter UUID can't collide.
- Launch planner: projections for books launching outside the 24-month window now return a clean zero-curve early, and the main loop now starts at the launch month instead of skipping months with a continue.
- Create Project: submit now requires either a title or a template selection, with an inline red error strip explaining why. Prevents the mystery untitled-no-template rows.
-
Fix Bug-fix sweep — beta bundle hardening, silent serial errors
- Beta reader HTML bundles are now injection-proof: all values embedded into the bundle's inline `<script>` tag (reader name, chapter titles, invite token) are escaped so a `</script>` substring or exotic whitespace in a chapter title can no longer break the bundle's annotation capture.
- Markdown headings in `.md`/`.txt` chapters packaged into beta bundles are now detected and stripped with the same regex; `####NoSpace` is no longer half-recognised.
- Serial publishing panel: Apply-cadence, Save-cadence, and Export-CSV no longer fail silently — rejections now surface in the bottom-right toast stack.
- Editor handoff store: `pickAndImport` / `importFromPath` now throw a descriptive error if called without a projectId, preventing the `lastImportByProject` map from getting a corrupt key.
-
Fix Bug-fix sweep — destructive confirms, visible errors, C10 graph fix
- Destructive actions now ask before destroying: deleting a Translation Memory entry, an Image-Rights row, or an Annotation prompts with a descriptive confirm; advancing a Discovery phase asks before writing the phase artefact.
- Silent IPC failures are now visible. A new global toast stack (bottom-right) surfaces errors from Pipeline cell clicks, Agent stop, Deliverables open-file, Timeline load, and Diff viewer — no more clicks that quietly do nothing.
- Review Center: the Approve button now shows "Approving…" and is disabled while an approval is in-flight, preventing double-clicks from firing two approvals.
- Project Settings: "Sync from book.project.md" shows "Syncing…" and is disabled while running.
- Pipeline graph: C10 (Final Edition) now correctly depends on C9.6 (Apply Galley Remarks) instead of C9.5 (Galley Proof) — so typesetting picks up the applied patches, not just the report.
-
Improvement Tools tab — new left-rail layout
- Tools tab is now a two-pane layout: a categorised left rail lists all 15 tools grouped into 6 sections (Writing & Voice / Quality audits / Collaboration / Production prep / Distribution / Quick AI actions); the right pane shows one tool at a time.
- No more 14-section scroll. Each tool gets its own page with a proper header (icon + title + one-line description) and breathing room to work.
- Left-rail search filters tools by name, description, or category — find Pacing or Launch planner in one keystroke.
- The last-selected tool is remembered per session (localStorage `bookforge.tools.activeTool`), so coming back to Tools returns you to the same surface.
- Per-tool error boundaries: if one tool panel crashes it shows an inline red card with the error + stack + Retry button; the other 14 keep working.
- Quick AI actions (the 6 one-shot Claude runs — marketing kit, cross-refs, reader persona, export package, organize files, sync blueprint) now live under their own "Quick AI actions" tool item.
-
Feature Serial / episodic mode — publish schedule + newsletter drafts
- Tools tab → Serial publishing: pick a cadence (weekly / biweekly / monthly), set a start date, click Apply — BookForge stamps a publish date on every chapter in reading order.
- Per-chapter row with inline date picker, platform badge, newsletter button, and cliffhanger chip sourced live from the Pacing Dashboard (green ≥60, amber 30–59, red <30) so you see weak chapter endings before they ship.
- One-click Newsletter draft per chapter: an AI skill reads the chapter's opening paragraphs + your prior newsletters for voice continuity, then writes a subject line, preview text, spoiler-free hook, CTA, and PS prompt — under 250 words, tuned for Substack / Royal Road / Wattpad / custom.
- CSV export of the full schedule for planning outside the app.
- With this slice, the original 17-item author-craft roadmap is complete: research, bible, outline, co-pilot, dialogue, sensitivity, legal, accessibility, beta reader, co-author, editor handoff, series bible, recap, launch, audiobook prep, serial mode.
-
Feature Audiobook prep — pronunciation guide + SSML export
- Tools tab → Audiobook prep: two deliverables for sending a manuscript to a narrator or TTS service.
- Pronunciation guide generator reads your entity bible + a sample of chapter prose and produces a markdown table of every proper noun, invented word, and technical term with respelling + IPA + usage notes.
- Per-chapter SSML export converts each chapter's latest working file to an .ssml document with paragraph breaks, emphasis for bold/italic, and — crucially — <phoneme> tags for every term in the pronunciation guide, so TTS services pronounce "Elara Voss" the way you wrote her.
- Batch "Export all chapters" action for when the whole manuscript is ready to send.
- Audiobook track lives under `<project>/audiobook/` alongside the manuscript — independent from the main PDF/EPUB pipeline.
-
Feature Longitudinal launch planner
- Tools tab → Launch planner: map out release dates, pricing, and projected revenue curves across every book in a series.
- Per-book controls: launch date, list price, royalty rate, first-month units, monthly decay — editable inline with instant chart updates.
- Combined 24-month SVG revenue chart with a per-book coloured line plus a bold white aggregate line on top.
- Aggregate strip shows books scheduled, year-1 combined revenue, and peak month.
- Clamps every input to sane ranges and flags unscheduled books + mixed-currency series in amber warnings. Treat as a sanity check, not a forecast.
-
Feature Series recap generator
- Project Settings → Series recap: one-click "previously on…" recap drafted from every prior volume in the series.
- Reads each sibling project's blueprint and chapter summaries (ordered by creation date) plus the series-shared cast from the bible.
- Four tone options — narrative / first-person / in-universe chronicle / neutral summary — and a configurable word target from 200–1200.
- Writes to `planning/recap.md` alongside the other planning artefacts; open in your editor for final polish, paste into front matter.
- Hard constraint: the recap never spoils the new book. It covers prior volumes only and flags gaps when source material is thin.
-
Feature Series bible — share entities across volumes
- New Series concept: attach a project to a Series in Project Settings, and entities you "promote to series" appear in every other project in the same series automatically.
- Recurring characters, locations, magic systems, and concepts in a multi-volume series no longer need to be duplicated chapter-by-chapter — write them once, share everywhere.
- EntityBible shows a ✨ Series-shared badge on shared entities; sibling-project entities surface read-only with a "from sibling project" hint so it's always clear who owns what.
- A1 / A3 prose prompts pick up series-shared entities automatically — no skill changes needed; the bible-prompt builder merges them transparently.
- Detaching a project from a series demotes its shared entities back to project-only so you never end up with orphaned series references.
-
Feature Editor / proofreader handoff
- Tools tab → Editor handoff: export a chapter as a stamped .docx, email it to a human copyeditor or proofreader, and import their edited file back to surface every change as an annotation.
- Each changed paragraph lands in the AnnotationSidebar with a ✏️ EDITOR badge, before/after text in the comment, and the editor's name as the author.
- The filename carries a short token so the importer auto-matches the returned file to the right handoff — no manual selection needed.
- Works regardless of whether the editor used Word's tracked-changes feature — the importer diffs the returned text against a snapshot taken at export time.
- Editor notes flow into the next AI editing pass's editorial brief alongside native and beta reader notes.
-
Feature Co-author workflow
- New Team tab (replacing the "Coming in Phase 4" placeholder) — add, edit, and remove authors, editors, designers, and other collaborators.
- Every chapter now has an owner picker in the Volumes & Chapters tab. Assigning a chapter to a co-author routes AI voice samples through that author's register automatically.
- Voice Samples panel gains a scope selector: Shared (house voice) or per-author. Files dropped into an author's scope apply to chapters owned by them.
- A1 (writer) and A4 (humanizer) now prefer the chapter owner's voice samples first, then fall back to shared — so a single project with multiple co-authors can keep distinct voices chapter by chapter.
- Folder layout: `voice_samples/*.md` for shared, `voice_samples/<userId>/*.md` for per-author. Existing projects continue to work unchanged (all samples stay shared).
-
Feature Beta reader invites
- Tools tab → Beta Readers: create time-boxed invites, export a self-contained HTML bundle, email it to a beta reader, and import their annotations back when they return the JSON — no server, no accounts.
- The exported HTML opens in any browser with an inline annotation UI (text selection → comment modal → per-reader sidebar); the reader clicks "Download annotations" and emails the JSON back.
- Imported annotations land in the existing annotations table tagged with `source: beta` and `beta_invite_id`, and flow into editorial briefs alongside your own notes.
- AnnotationSidebar now shows a BETA · reader-name badge on every beta-sourced note, so you always know who said what.
- Invites carry expiry, revoke, import-count, and scope (whole project or specific chapters); revoked / expired invites refuse new imports while keeping prior work intact.
-
Feature Plain-language accessibility version
- New optional step E4 runs after A5.5 copyedit and produces a parallel plain-language version of each chapter at roughly CEFR A2–B1 reading level.
- Designed for dyslexic readers, cognitive-accessibility audiences, ESL readers, and statutory easy-read requirements (EU Accessibility Act, June 2025).
- The main manuscript is never touched — plain-language output lives in its own folder (Volume_N/plain_language/) alongside the literary original.
- Preserves every fact, named entity, date, frozen block, and citation token verbatim; simplification is limited to register, not content.
-
Feature Legal / libel pre-screen
- New optional pipeline pair E3 (audit) + E3.A (apply) runs between A5 and A5.5 — flags real-name references, unverified statements of fact about identifiable people, reputational-risk language, private facts, trademark issues, and unsourced quotations.
- Designed to prep manuscripts for counsel review — every flag explains the specific legal concept (defamation, privacy, trademark) and calibrates public-figure vs. private-individual standards.
- Every rationale ends with "This is a legal-risk heuristic, not legal advice — consult counsel"; every severity ≥ error routes to counsel before applying.
- Supports both paragraph rephrase and exact name-anonymisation swaps via the existing patcher + patch-journal review flow.
-
Feature Sensitivity / bias audit
- New optional pipeline pair E2 (audit) + E2.A (apply) runs between A5 and A5.5 — flags stereotypes, ableist language, cultural bias, gendered defaults, and outdated terminology.
- Advisory only: every flag names a specific group and a specific harm, and every remark carries `requiresHumanConfirmation: true` so nothing auto-applies.
- Supports both paragraph-scoped rephrase and exact terminology swaps (e.g. "stewardess" → "flight attendant"), routed through the existing patcher.
- Conservative severity tiers and a 10-remark-per-chapter cap — signal over noise.
-
Feature Pacing dashboard
- Tools tab → Pacing Dashboard: seven per-chapter stylometric sparklines across the whole volume.
- Tracks avg sentence length, rhythm (sentence-length σ), dialogue density, emotion density, hook strength, cliffhanger strength, and tempo.
- Outlier dots are colour-coded by direction-of-better (green/red for directional metrics, amber for neutral).
- Pure text analysis — no LLM calls, no cost. Recompute on demand after any edit.
-
Feature Dialogue sculpting pass
- New optional pipeline pair E1 (audit) + E1.A (apply) runs between A5 and A5.5.
- Extracts every dialogue line, attributes it to a speaker, and flags lines where the character drifts from their established bible voice attributes.
- Rephrase-only remarks route through the existing patcher with the standard ±20% diff gate and token preservation.
- Paired with the bible: accuracy scales with the quality of your primary-cast `voice` attributes.
-
Feature AI beat proposer
- Outline tab → ✨ Propose with AI: the proposer reads your blueprint, primary cast, and existing beats, then drops 4–8 candidate beats into a review strip for you to accept or dismiss one-by-one.
- Never invents characters — POV names must match a primary-cast character in the bible (case-insensitive); misses save the beat unlinked.
- Seven beat kinds covered (fiction scene/beat, non-fiction argument/evidence/counter/synthesis, plus notes).
- Re-running is safe: the proposer sees already-accepted beats and fills gaps rather than re-proposing.
-
Feature Inline AI co-pilot in the editor
- Select a passage in any chapter, hit Ctrl+. (or click the ✨ Co-pilot chip in the toolbar) to get a single candidate rewrite.
- Seven modes: Rewrite, Tighten, Expand, Raise tension, Soften, Plain language, and Custom (type your own instruction).
- Preserves [[claim:id]] tokens and {{frozen}}…{{/frozen}} markers; flags warnings if the model drifts.
- Works in both CodeMirror (plain-text) and TipTap (DOCX rich-text) editor modes. Accept replaces the range in place, undoable with Ctrl+Z.
-
Feature Initial release
- 40+ "book production" skills spawning through the Claude Code CLI, orchestrated by a dependency-aware pipeline runner with review gates and auto-continue.
- Research library with claim citation, Entity bible with primary-cast voice attributes, Chapter outline with seven beat kinds.
- Structured remarks sidecars + patch journals for galley proofing, reader-panel synthesis, and any future audit-and-apply flow.
- Live Scribe agent monitor, typography studio, print spec calculator, translation memory, image rights manager.
130 releases shipped so far. Have a look at the homepage or download the latest build.