The ledger is append-only. A correction is a new event.
Nothing on the tape is overwritten and nothing is removed. When a record is wrong the fix is a new event pointing at the old one, so the record can gain detail and can never quietly change its story. And it is not only append-only, it is tamper-evident: once any row on this tape carries a signature, no later row may go unsigned — so a history edited by somebody who got past the database still cannot be made to look untouched.
Overwriting and deleting are refused by the database itself — triggers on the events table, not application code somebody could route around — and tests prove it: test_update_is_refused_by_the_database issues an update and requires the database to raise, test_delete_is_refused_by_the_database does the same for a delete, and test_correction_is_an_append_not_a_mutation corrects a misheard intent and requires the original row to still read the way it did. A trigger cannot stop somebody who drops the trigger first, so each row can also carry a signature chained to the row before it: test_red_an_altered_payload_is_caught drops the triggers, edits a payload by hand, and requires the chain to name the row that changed. Once that chain is live the tape itself refuses a writer holding no key — test_RED_an_unarmed_writer_CANNOT_append_to_a_live_chain restarts a process without the key against a signed tape and requires the write to be turned away before it reaches the ledger, naming the three settings it is missing. And when this platform's own arming ceremony left a gap, the chain said so — out loud, on the day, about us. The unsigned rows are still there and still unsigned, forgiven by name in a signed declaration every check reports forever: test_a_reanchor_makes_the_incident_verify_and_REPORTS_the_false_start requires the three honesty states to stay three different numbers, and test_cli_the_reanchor_COUNT_is_the_pin_that_catches_a_deletion_behind_it re-signs the whole history with the attacker holding the key, then shows that the count written down away from the machine is what says something is missing.
tests/test_tape.py::test_update_is_refused_by_the_database
tests/test_tape.py::test_delete_is_refused_by_the_database
tests/test_tape.py::test_correction_is_an_append_not_a_mutation
tests/test_the_tape_mac_chain.py::test_red_an_altered_payload_is_caught
tests/test_the_tape_mac_chain.py::test_RED_an_unarmed_writer_CANNOT_append_to_a_live_chain
tests/test_the_tape_mac_chain.py::test_a_reanchor_makes_the_incident_verify_and_REPORTS_the_false_start
tests/test_the_tape_mac_chain.py::test_cli_the_reanchor_COUNT_is_the_pin_that_catches_a_deletion_behind_it