Back to the journal

Lab

Eleven days after 0.6

Konner MoshierAug 18, 20266 min read

WriteIDE 0.6 shipped on August 7. The work since then is not in a build you can download yet, and that gap is exactly what Lab notes are for. Here is the ledger: what you reported, what was caught before it reached you, and what is still behind a switch.

Bugs you reported

Every one of these came from a reader using WriteIDE on a real book. Every one is fixed on main and will be in the next release.

  • Stat system import between projects failed with "Template ID already exists." A Windows author exported a stat system from one project and imported the JSON into another, and WriteIDE rejected its own file. The export was carrying the record's internal identity and home project along with it. Imports now mint a fresh identity in the project you import into.
  • A character created before its stat system existed kept an empty sheet forever. Applying a system to a project only seeded stats onto characters created afterward, and there was no way to fix an older character short of recreating them. The stats tab now has "Apply Stat System." It fills in exactly the missing stats, skips anything the character already has, and writes no fake story history while doing it. Applying it twice is safely a no-op.
  • Importing a Word document with a title page produced a phantom empty chapter, shifting every real chapter down by one. The title paragraph is now recognized and stripped before chapter detection, while a title that actually starts a story is kept.
  • Outlined-but-unwritten scenes vanished on round trip. Export a manuscript with empty outlined scenes, import it back, and the outline was silently gone. Titled empty scenes now import as what they are: empty scenes.
  • Consecutive blue boxes fused into one box in HTML and EPUB output. Two system messages separated by a blank line came out as a single blockquote. They stay separate now, and the tests assert the structure rather than just the text.
  • Calculated stats sharing a short name dropped all but one definition. If two systems both defined "DEF," only one formula survived evaluation. Each definition is evaluated on its own now.

Bugs I caught myself

These never made it to a report, because review and testing got there first. They deserve the same daylight.

  • Opening backup settings could freeze the entire app. The default backup folder is in Documents, which macOS often syncs to iCloud, and macOS offloads older files there to the cloud. WriteIDE's backup scan read each file on the thread that runs the interface, so every offloaded file stalled the app until iCloud downloaded it back. Fixing it exposed a deeper problem: the backup retention limit pruned database records but never the files, so stale snapshots accumulated forever, including for projects that had been deleted. Backup scanning now runs off the interface thread and never forces a cloud download, and the retention policy finally governs the files on disk. The first run of the new cleanup reclaimed 2,400 stale files on my own machine.
  • Quest import in merge mode could erase your objectives. An import file with an empty objectives or rewards list was treated as a command to replace the existing ones with nothing. Merge now only touches fields the file actually carries content for.
  • Quest objectives never had a real title in the database. The editor collects a title, the table only stored a description, so exports and displays were leaning on the wrong field. A legacy-safe migration adds the column and backfills it without rewriting anything you wrote.
  • Saving a chapter with no text tripped a false "unsaved changes" refusal. Empty chapters are allowed to be empty.
  • Creating a project from the project switcher did not work. It does now.
  • A single missing image file could block an entire project restore. A backup restore now completes and tells you what was missing instead of refusing everything because one portrait was gone.
  • The backup manifest did not know about the newest tables. Found while classifying the schema (more below): tables added for the PDF review work were not yet in the snapshot manifest, so a backup could have missed them without any warning. Every table is now explicitly accounted for, and a test fails if a future table is not.
  • Two backups starting at the same moment could collide. Snapshot creation is now serialized, with a test that proves concurrent requests queue instead of interleaving.
  • The update channel setting reset every launch. Found while building the alpha channel: your channel choice was never persisted, so every start went back to stable before the update check. It persists now.
  • Deleting items and confirming dialogs got the same authority treatment. Item deletion now goes through explicit authority checks with tests on both the handler and the view, and a focus-management pass means confirm dialogs and async actions return keyboard focus predictably instead of dropping it. Screen reader and keyboard coverage got new tests across settings, the quest editor, and the Canon menu.

The Office bridges kept moving

The last Lab note explained the rule: if a Word, Excel, or PDF path cannot round-trip your stat blocks losslessly, WriteIDE refuses instead of flattening. Since then, all three paths built out their production plumbing, still behind their switches:

  • The linked Word document path can now run a real save end to end: bookmark ownership is authenticated before relocation, generation output is staged and leased so a crash cannot leave a half-written file, and the no-op rule held. A text-only document saved with no changes comes back byte-identical.
  • The returned PDF path became a durable service. Reviewer comments import into an inbox with its own triage step, they anchor to the sentence they were written against, and they survive you editing that sentence afterward. If the app dies mid-import, the session recovers instead of duplicating work.
  • The character workbook path proved a lossless XLSX round trip against real Office files, and its production import screens are in place.

None of this is on by default. The switches stay off until each path passes its remaining gates, and the first public exposure will be the alpha channel, not stable.

Every table now answers "what would leave my machine"

WriteIDE is local-first, and I want that to be checkable rather than a slogan. Every table in the database is now classified: what a backup snapshot must capture, and what could ever be allowed to leave your machine if an optional sync existed someday. Manuscript prose and private notes are marked what they have always been, which is local. The point of writing it down per table is that "nothing leaves without you choosing it" becomes something a test can enforce, not something you have to take my word for. What WriteIDE talks to remains the live list, and it has not grown.

The backup system got a golden fixture and recovery drills to go with it: a known project is snapshotted, deliberately damaged, and restored on every run, so "backups work" is a test result instead of a hope. Ordinary project images now live in one registry, so a backup cannot forget a creature portrait because two lists disagreed. That closes an item the last Lab note listed as in motion.

An alpha channel, so this reaches you sooner

Settings now offers an Alpha channel beside Stable on Windows and Linux. Alpha builds publish as prereleases on their own feed, the stable feed is never touched by an alpha publish, and switching back to Stable is one click. This is how the Office bridges will get real-world testing without risking the build most people write in.

When this ships

The fixes above ride the next tagged release. The bridges stay behind their switches until they pass their gates, and if a gate fails you will read about it here rather than notice it in a broken export.

Six of the bullets in this note started as one reader telling me something was wrong. If WriteIDE loses your outline, rejects its own export file, or makes you work around a rule in your own story, tell me. It is the fastest path from your report to a bullet on this page.

Notes worth sending

Release notes when a version ships, plus Lab notes and guides. No weekly filler.