"The journal and the settings load independently. Unreadable settings leave emergency release working; an unreadable journal leaves the saved presets visible." — Tinker architecture
What Tinker Keeps on Disk
Tinker's data directory holds three documents with very different stakes. settings.json is Dad's configuration: presets, commands and their shortcuts. journal.json is ownership: which changes Tinker made and must undo. activity.json is history: the last 200 requests, for reading. A fourth thing, a lock file, keeps two Tinker agents from ever owning the same journal at once — a second copy finds the lock taken and reports "Another Tinker agent already owns this account" instead of running.
The Bug That Coupled Them
The first version loaded settings and journal together and gave up if either failed. The review pass found the consequences. An unreadable settings file meant no engine — so Stop and restore everything, the one command that matters most when something is wrong, was gone too. An unreadable journal made the saved presets look deleted. And worst: with the engine unavailable, the Configuration tab showed an empty document that "Validate and save" would happily write over the real settings.
Independent Loads
Now each document loads in its own do/catch. If the journal reads, the engine exists, and emergency release works even when settings could not be read. If settings read, the presets appear even when the journal could not. Problems from either are joined into one loadProblem that is shown in Settings and returned by /health — and, unlike an ordinary error message, it is never cleared by a later successful command, because it describes the files, not the last action. A settingsReady flag stays false while settings are unreadable, and save refuses outright: "Tinker's settings could not be read and are left exactly as they are. Nothing can be saved until that is resolved."
Activity Is Not a Journal
Activity has its own store and its own failure mode. If activity.json cannot be read, Tinker keeps recording in memory for the current session but never saves over the unreadable file. Its architecture line is blunt: losing it changes nothing Tinker will do. It is neither the ownership journal nor the app door's receipts. Keeping that distinction in the types — separate structs, separate files, separate failure handling — is what stops a convenience file from ever becoming load-bearing by accident.
Writes Only When Something Changed
One more small discipline: at launch, settings are completed (missing commands added) and validated, but written back only if completion actually changed them. An unchanged file stays byte-for-byte untouched, which keeps its modification time meaningful and avoids a pointless write on every launch.