First half of brain#21: the applicability envelope — half_life (volatile|
seasonal|durable), applies (local|homelab|universal), and claim_provenance
(asserted|inferred). The strength half (confidence, contested) follows once
the ingest-time contradiction detector exists to populate it.
writeHallNote already passed unknown frontmatter keys through verbatim, so
preservation was free — a test now pins it so a refactor of the merge loop
cannot silently drop the fields. What was missing is validation, and it
fails closed:
- a value outside the enum is rejected. An unvalidated value is worse than
an absent one, because a lint skips what it cannot parse and the note then
reads as classified while nothing acts on it;
- an envelope field without claim_provenance is rejected. A value a model
inferred must never be indistinguishable from one Mathias asserted —
otherwise a single classifier pass launders machine guesses into apparent
human judgement across 1113 notes, which is precisely how a weak claim
hardens into accepted fact;
- provenance without any envelope field is rejected too: it says who set
fields that are not there.
Validation runs before MkdirAll, so a rejected write leaves nothing behind —
not even an empty hall directory.
The field is `applies`, not `scope`, as brain#19 proposed: `scope:` has been
in use since brain#5 for glossary terms (homelab-core, project:<repo>), a
disjoint value space on the same key. The shipped schema keeps the name.
Notes with none of these fields are byte-identical to before. Bulk backfill
across the corpus stays out of scope — the same failure mode as the
extraction pass that produced 28 wrong wikilinks out of 67.
Schema documented in brain/CLAUDE.md (via brain_edit_root, which produced
the #97 audit record for the rewrite).
Refs brain#21, brain#19 (superseded), brain#5, hyperguild#97.