GENERATE the persistence obligation from CHANNEL_CONTRACT: one
FactPersistenceCase per (fact, kind) pair the contract actually declares — every kind
in kinds, crossed with the fact's own persisted bit. This is the enumeration a hand-written
suite would otherwise keep in step by hand; a fact or a kind added to the contract widens the
list with NO edit here.
Deliberately NOT scoped to ChannelSnapshotJson the way persistedSnapshotFields is: a
fact persisted on a bus/matrix/group kind rides a SIBLING snapshot section (buses, matrix,
dcas, muteGroups) or a bespoke field. This names WHICH (fact, kind) pairs the contract
obligates, never WHERE the value lives — locating it is a consumer concern, because the
contract has no single vocabulary for "which snapshot section" yet. The generator SURFACES
that gap rather than papering over it.
Its consumer is the TEST TIER, and that is the point rather than a shortfall: this is task
#92's "generate the obligations" — the positive obligations a client must satisfy, derived
instead of transcribed. It is not a contract COLUMN, so the connector gate
(contract-connector-conformance.test.ts) does not govern it; that gate asks whether a
DECLARATION is read by production, and this is a derivation whose whole job is to be asserted
against.
RESCUED: written 2026-08-07 on feat/generate-the-persisted-obligation, found unmerged
2026-08-11 in a worktree inside a job tmp directory. Re-applied against current main rather
than merged — the branch was 176 commits behind.
GENERATE the persistence obligation from CHANNEL_CONTRACT: one FactPersistenceCase per (fact, kind) pair the contract actually declares — every kind in
kinds, crossed with the fact's ownpersistedbit. This is the enumeration a hand-written suite would otherwise keep in step by hand; a fact or a kind added to the contract widens the list with NO edit here.Deliberately NOT scoped to
ChannelSnapshotJsonthe way persistedSnapshotFields is: a fact persisted on a bus/matrix/group kind rides a SIBLING snapshot section (buses,matrix,dcas,muteGroups) or a bespoke field. This names WHICH (fact, kind) pairs the contract obligates, never WHERE the value lives — locating it is a consumer concern, because the contract has no single vocabulary for "which snapshot section" yet. The generator SURFACES that gap rather than papering over it.Its consumer is the TEST TIER, and that is the point rather than a shortfall: this is task #92's "generate the obligations" — the positive obligations a client must satisfy, derived instead of transcribed. It is not a contract COLUMN, so the connector gate (
contract-connector-conformance.test.ts) does not govern it; that gate asks whether a DECLARATION is read by production, and this is a derivation whose whole job is to be asserted against.RESCUED: written 2026-08-07 on
feat/generate-the-persisted-obligation, found unmerged 2026-08-11 in a worktree inside a job tmp directory. Re-applied against current main rather than merged — the branch was 176 commits behind.