where(...)->update(...)` * through — which is exactly the shape a careless data fix takes. For a table * whose value IS that it cannot be edited, the guard has to sit where the bulk * operations pass. * * Not a security boundary: anyone with database access can still do as they * please. It is a guard against the application quietly doing it by accident, * which is the realistic way a register loses its meaning. */ class AppendOnlyBuilder extends Builder { public function update(array $values) { throw new RuntimeException( 'The proof register is append-only. Record a correcting event instead of editing history.' ); } public function delete() { throw new RuntimeException( 'The proof register is append-only. A record that can be deleted is not evidence.' ); } public function forceDelete() { return $this->delete(); } }