Two Apps, Two Postures, Zero Decisions
Encryption at rest existed in two of the three original siblings, and they disagreed. One refused to start if its key was missing — a fail-fast gate, on the reasoning that silently writing plaintext is worse than not running. The other degraded quietly: no key, write plaintext, log a warning. The third had no encryption at all, and got it from the shared layer when it adopted.
Neither posture is wrong. What is wrong is that the difference had never been decided. Two authors made a local call on a question that was actually one question, and the resulting divergence looked like architecture from a distance and was two unexamined opinions up close.
The unification required somebody to choose, and choosing meant answering something concrete: what should happen to a person whose machine is not fully provisioned? The answer taken was graceful everywhere. A machine without the key writes plaintext and logs one warning; encrypted lines from another machine pass through opaque. The fail-fast gate was retired.
Why That Answer, and Why It Is a Judgment
The reasoning is about people, not about cryptography. It also had to cover the app that was getting encryption for the first time, which is the one most likely to meet a machine that has never been provisioned. These apps run across several machines, and provisioning is uneven — a fresh machine, a restored one, a peer that has not had a key installed yet. A fail-fast gate turns each of those into a stopped application, and the person in front of it usually wanted to read yesterday's notes rather than to write a new secret.
You could reasonably decide the other way. What you cannot reasonably do is decide it twice, differently, without noticing that it is the same decision — nor leave the third app with no answer at all because nobody owned the question.
The Other Policies, and the Shape They Share
Three more arrived together three weeks later, and they rhyme. One vocabulary for visibility, everywhere — one app had used a different word for the same state, and both continued to be readable because the fold-time normalizer keeps projecting old records. One media policy: existing attachments first, new ones after, with caps, and a missing file warns and is skipped rather than failing the whole request. One emotion list, fetched from its owner with a shared fallback, so nobody hand-mirrors a different list.
Each replaced a place where apps had diverged without deciding to. And each has the same structure: a question that looks technical, an answer that is actually about what should happen to a person, and a written record so the next app inherits the answer instead of the question.