Two nullable DkgSession columns and one tag on the ritual proposal, so the thing
a subgroup is being made for reaches the certificate.
It has to travel this way rather than in the coordinator's head. The certificate
is proposed *after* the ceremony and by whoever is able to -- any parent admin
holding a share, who may never have seen the screen that started it -- which is
why every step of a subgroup reads stored rows rather than a session handed down
from a screen. The origin is one more row to read. And because it rides the
proposal, every participant's session carries it and not only the coordinator's:
an admin asked for the certificate reads what the room is for off their own
session instead of taking the proposer's word.
That is the same road `subject` and `participantPublicKeys` took in v19, for the
same reason, and the migration comment says so.
Neither column is a foreign key, following parentChatRoomId's precedent in v17
and with a sharper version of its reason: these entities live in the *parent's*
tables, and a subgroup's admins need never have been in the parent, so naming a
row this device does not hold is the normal state. A cascade would also mean
deleting a project deletes a room. There is a test for the dangling case, since
nothing in the schema would otherwise say it was intended.
It authenticates nothing. Anybody can put any kind and any id on a proposal, as
with the parent beside it, and `parseOrigin`'s comment says so where a reader
will be standing. The claim that decides anything is the certificate, which the
parent's quorum signs.
One deviation from the plan, which said `proposeBirthCertificate` would take an
`origin` parameter and the view model would pass it. It already takes the whole
`DkgSession`, so it reads `key.origin()` instead -- a parameter would have been
a second source for one fact, and the proposer's copy of it at that. Nothing in
the repository or the ritual view model had to change.
Schema 23 collides with an unmerged branch holding 23, 24 and 25; Phase 0.2 of
docs/subgroups-for-entities.md records why this takes 23 anyway.
Phase 5 of docs/subgroups-for-entities.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>