Small project, hard rules. Everything here exists because a defect in this tool surfaces during someone's bereavement.
- The executor recovery path is stock
age+ssssonly. No repo scripts, no Python, no wrappers, no reimplementations of either tool. The printed page must keep working if this repo vanishes. Owner-side tooling may have optional dependencies; executor-side may not. - No account credentials in the register — ever. The schema holds pointers; the validators reject credential-shaped data. Nothing may weaken that scan (the contacts phone-number allowance is the one deliberate, documented exception).
- Validate before encrypt. Every path that seals a register runs the baseline validator first, and the baseline tier (POSIX sh + awk) must never require Python.
- The share scheme is fixed at 2-of-3. The proof stage, tests, and printed guide are built around it. Configurable cryptography shipped a real defect once; it does not come back.
estate.yamland*.ageare never committed. The gitignore test enforces it; keep it green.- Honesty over comfort in every user-facing string. No claiming
deletion erases, no claiming
clearwipes history, no security theatre. If a promise cannot be kept mechanically, the docs say so.
tests/run-tests.shmust pass under both mechanisms:EXECUTOR_FILE_MECH=batchpassandEXECUTOR_FILE_MECH=expect.- Every new script ships with tests in the same PR — including at least one failure-mode test (what happens on wrong input is the product here).
shellcheck -S warning scripts/*.sh tests/run-tests.shstays clean.- Validator changes need fixture coverage in
tests/fixtures/for both tiers, and the tiers must agree on pass/fail for every fixture (the suite asserts it).
schema/estate.schema.jsonis the single source of truth;schema/estate.schema.yamlis its annotated documentation.tests/schema-agreement.pyfails CI if they diverge — update both, never one.- Any breaking change bumps
format_version, and both validators must accept the previous format for one version with a precise, copy-paste-able migrate message. Additive fields need: both schema files, both validators, the example registers, the renderer, and fixtures. - Schema growth is rationed deliberately (see the v0.3 spec's rejected list): a field ships only if it serves the executor under stress, the annual review, or the safety of the recovery chain.
Docs that face the executor (templates/, docs/WINDOWS-RECOVERY.md,
anything render.sh or make-guide.sh emits) must be tested on a
human: someone who did not write the text follows it, and observed
stumbles get folded back in. Say in the PR who read it and what they
tripped on. Wording changes are product changes here.
Not in issues, PRs, commit messages, or test fixtures: no real
register contents, shares, passphrases, or screenshots of them.
Reproduce everything with examples/ data.