{"forks":[{"first_orphaned_at":"2026-09-11T11:58:41.138983+00:00","from_block":966491,"to_block":966500,"blocks_removed":10,"blocks_replaced":1,"blocks_no_canonical":0,"blocks_returned_identical":9,"distinct_block_hashes":10,"events_removed":175,"events_truly_orphaned":2,"first_block_time":"2026-09-11T09:52:12+00:00","last_block_time":"2026-09-11T11:35:19+00:00"},{"first_orphaned_at":"2026-08-24T11:56:00.751958+00:00","from_block":963844,"to_block":963853,"blocks_removed":10,"blocks_replaced":1,"blocks_no_canonical":0,"blocks_returned_identical":9,"distinct_block_hashes":10,"events_removed":96,"events_truly_orphaned":2,"first_block_time":"2026-08-24T09:56:48+00:00","last_block_time":"2026-08-24T11:25:04+00:00"},{"first_orphaned_at":"2026-08-16T10:46:43.622724+00:00","from_block":962713,"to_block":962722,"blocks_removed":10,"blocks_replaced":1,"blocks_no_canonical":0,"blocks_returned_identical":9,"distinct_block_hashes":10,"events_removed":366,"events_truly_orphaned":2,"first_block_time":"2026-08-16T09:48:15+00:00","last_block_time":"2026-08-16T10:39:30+00:00"}],"forks_observed":3,"limit":50,"truncated":false,"totals":{"forks":3,"blocks_removed":30,"blocks_replaced":3,"blocks_no_canonical":0,"blocks_returned_identical":27,"events_removed":637,"events_truly_orphaned":6,"first_seen":"2026-08-16T10:46:43.622724+00:00","last_seen":"2026-09-11T11:58:41.138983+00:00"},"as_of_block":969513,"preservation":{"available":true,"since":"2026-08-16T04:10:21.983256+00:00","since_source":"schema_migrations.applied_at","reason":null},"absence_means":"a fork absent from this log was not observed by THIS node while it was running and migrated — it is not a claim that the chain did not reorg. Reorgs before preservation.since, and reorgs while the poller was stopped, deleted their rows with no copy and left nothing here. ","counting_note":"forks_observed counts DISTINCT FORKS OBSERVED, never reorgs and never rewinds. Both orphan inserts are ON CONFLICT DO NOTHING keyed on the block hash, so a repeat rewind of the same fork writes nothing and keeps the first orphaned_at — measured on this archive 2026-08-16, where ten rewinds of one fork left one row. Read every count here as a LOWER BOUND (>= 1 rewind each, never more). A reorg EVENT count is not derivable from what is stored and this route does not invent one.","over_capture_note":"events_removed is what the REWIND removed, NOT what the chain lost. REORG_WINDOW is a step size, so a shallow fork still rewinds ten blocks and the common ancestors are copied out and then re-ingested identically. events_truly_orphaned is the honest figure: rows whose block hash is no longer the canonical hash at that height. On this archive's one recorded fork the two are 366 and 2. Quote the second one.","block_hash_note":"blocks_replaced, blocks_no_canonical and blocks_returned_identical are reported separately and must not be summed into one 'orphaned' figure. `no_canonical` means either the chain SHORTENED or we are inside the window between the DELETE and the re-ingest; folding it in would publish the raw over-count as if it were the honest one.","source":"opreturn.art archive — events_orphaned / blocks_orphaned, copied out by ingest.db.invalidate_from before the DELETE"}