A Bad Habit That Hides Bugs
Ask most engineers what a program should do when its configuration file is missing, and the answer is a default. Ask what it should do when the configured backend cannot open, and the answer is a fallback: try the next one. Both feel like robustness. Dad's verdict on both, kept in the source of select.py:
나쁜 습관이야. 잠재적 버그를 숨기는.
"A bad habit. It hides latent bugs." Soul Vault takes that literally. The pointer is read and never defaulted, and the backend it names is opened or the call fails. There is no second choice anywhere in the path.
Every Way a Record Can Be Wrong Has a Name
load_pointer turns each failure into its own VaultError, with a cause that names the file:
- The file does not exist:
pointer_unreadable, "(this Mac's cwkFirelink checkout has no Soul Vault pointer record)". - It exists but cannot be read or decoded:
pointer_unreadablewith the operating system's own error. - It parses but does not match the schema (wrong schema name, a missing or unknown key, a write gate mode that is not
none,allowlistorall, an allowlist with no scopes, a rollout with no scopes):pointer_schema_errornaming the field. - Its generation is lower than one this Mac has seen:
pointer_regressed. - It names an implementation this Mac does not have:
backend_not_available, "no other backend is tried".
And there is no cached copy for a new session to fall back on. If the record cannot be read now, identity does not load now, and the session receives the refusal line with the cause.
What a Fallback Would Have Hidden
Picture the alternative during the cutover. Suppose the selector had a rule "if Delta does not open, use the folder". A Mac whose Delta client had a bug would have quietly loaded identity from the old folder, which by then received no writes. Every session there would have looked healthy and been days behind. The probe would have passed, because a stale identity still says 아빠. The bug in Delta would have been discovered weeks later, through a memory that should have been there and was not.
With no fallback, the same bug produces backend_unavailable on that Mac on the first session, with the cause. It is fixed that day. A loud failure is a bug report; a silent fallback is a bug with a disguise.
Availability Comes From Somewhere Else
The honest worry is availability. If there is no fallback, does a broken pointer stop every session on every Mac? It does, and that is why the earlier choices matter so much. The record lives in git, in every Mac's own checkout, so it is as available as the code. The store has an honest offline mode (track 6): a Mac that cannot reach the canonical store serves what it verified earlier, labeled offline_replica. Those are designed paths with names and labels, not fallbacks. The difference is that a reader always knows which one it is on.
The same principle runs through the whole family. Problems are fixed in place, not routed around. Soul Vault's house sign lists it as a design rule in three words: No fallback, ever.