styxx shelf — a re-derivation built to run somewhere that is not the box

built to fetch each row's published ledger, re-derive its chain with the shelf's own pinned copy of the verifier, run the row's conformance vectors, check every anchor the row's index lists against the chain and its opentimestamps proof against the bitcoin block header as two explorers return it, count the days with no anchor, and compare the bytes with the previous night's fetch, every night, as a github action. as of 2026-11-09 no report here came from that action: the workflow is not in this repository yet (the operator adds it), and every report so far is a local run from the lab's box — 1 of 1 nightly report says "not the action (a local run)", and the 8 reads by url kept under reports/reads/ were run by hand. each report is dated; this page is written by shelf.mjs from the reports on disk and loads nothing.

written 2026-11-09T20:16:06Z · 1 nightly row · 2 rows read by url · schedule 07:00 utc · explorers https://blockstream.info/api, https://mempool.space/api

rowfetched at / whereledger sha256linesheadchain re-derivesvectorsanchors verifiedgapsappend-onlyverifier driftlines after last attested headexit
darkflobi 2026-11-08T21:27:15Z
not the action (a local run)
ab9d4fc95e4fb668 729 0e5a698dece0bb33 yes 10 of 10 14 of 14 1 of 15 days (2026-11-06) yes no 5 of 729 0

what this is / what this is not

run it yourself

git clone https://github.com/fathom-lab/styxx-shelf && cd styxx-shelf && npm ci && node shelf.mjs --row darkflobi --out ./docs

node 20+. compare your docs/reports/<row>/<date>.json with the one here: the sha256 of every fetched file, the head, the per-anchor merkle roots and the block headers should agree when the url served the same bytes. each row's "rerun" line below carries the --date and --through of the recorded run.

darkflobi https://fathom-lab.github.io/styxx/ledger/

run 2026-11-08T21:27:15Z → 2026-11-08T21:27:21Z on not the action (a local run), shelf 0.1.0, node v24.13.0, date 2026-11-08. full record: reports/darkflobi/2026-11-08.json (latest).

no check failed

(0 anchors pending, 1 of 15 days with no anchor, 5 lines after the last bitcoin-attested head)

chain

re-derives: 729 published lines (730 file lines), head 0e5a698dece0bb33764c5202a03745a140a6ef66dba7bbcbc3896842795e152f, kinds {"started":22,"send":344,"delivered":349,"anchor":14}, withheld 5 (bridged 5), the ledger's own anchor lines in chain 14 of 14, pinned by a posted head 692 of 729 lines, not pinned because of a withheld line 32, after the last posted head 5.

the row's SNAPSHOTS.jsonl last line names the fetched ledger's sha256.

vectors

10 of 10 answered as the row's vectors file says (pinned runner, pinned verifier).

ok   identity
ok   rewrite-one-field
ok   rewrite-prev
ok   drop-a-line
ok   drop-a-line-withheld
ok   drop-a-line-withheld-wrong-digest
ok   cr-byte
ok   duplicate-key
ok   truncate-last-line
ok   flip-and-rechain
10 of 10 vectors answered as the file says

verifier drift

no: the row's published verify.js and check_ledger.cjs hash to the pinned copies.

filepublished sha256pinned sha256same
verify.js6bb1b6c4642d6251153d0a3bc6a30ac3fee9c6529cc0540291dbb38f983eba466bb1b6c4642d6251153d0a3bc6a30ac3fee9c6529cc0540291dbb38f983eba46yes
check_ledger.cjs85c76195a194b5901bcf3f99f0aee19584925f9a1b44ae385b2057b0649e650385c76195a194b5901bcf3f99f0aee19584925f9a1b44ae385b2057b0649e6503yes

anchors — verified 14 of 14, pending 0 of 14, in chain 14 of 14

"verified" means: the fetched text hashes to what the index says, the proof is over those bytes, the text's head and seq are in the fetched chain, and every bitcoin attestation's merkle path ends at the block header that 2 of 2 explorers return (https://blockstream.info/api, https://mempool.space/api). "pending" means the proof holds calendar promises only; the shelf does not ask the calendars for a row's proof, and a proof pending for more than 7 days after its anchor date is a failed check. "explorer unreachable" is an explorer that did not answer, not a header that disagreed; both leave the anchor not verified.

dateseqtext sha256ots sha256in chainblock(s)status
2026-10-24 57 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-10-25 116 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-10-26 145 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-10-27 166 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-10-28 173 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-10-29 184 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-10-30 199 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-10-31 240 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-11-01 243 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-11-02 316 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-11-03 336 yes yes yes 974530 x4 bitcoin: block 974530, header from 2 of 2 explorers agree (attestedTime 2026-11-04T13:24:55Z); 4 attestations in block 974530 x4
2026-11-04 664 yes yes yes 974635 x2, 974643, 974654 bitcoin: block 974635, header from 2 of 2 explorers agree (attestedTime 2026-11-05T07:19:14Z); 4 attestations in blocks 974635 x2, 974643, 974654
2026-11-05 704 yes yes yes 974768, 974770, 974799, 974808 bitcoin: block 974768, header from 2 of 2 explorers agree (attestedTime 2026-11-06T06:12:20Z); 4 attestations in blocks 974768, 974770, 974799, 974808
2026-11-07 729 yes yes yes 975028, 975030, 975060, 975074 bitcoin: block 975028, header from 2 of 2 explorers agree (attestedTime 2026-11-08T05:45:00Z); 4 attestations in blocks 975028, 975030, 975060, 975074

index against the ledger's own anchor lines: 14 of 14 ledger anchor lines are in the index, 14 of 14 index entries have a ledger anchor line.

gaps — 1 of 15 days

window 2026-10-24 .. 2026-11-07 (America/New_York; the end is the day before the run day in America/New_York (2026-11-08)): no anchor for 2026-11-06. a gap is a day with neither an index entry nor a ledger anchor line; printed, not failed.

append-only

extends the previous fetch (2026-11-08: 1233153 bytes, 729 lines) by +0 bytes, +0 lines

no anchor's text, proof or block changed since the previous fetch (14 compared).

lines after the last bitcoin-attested head: 5 of 729 (anchor 2026-11-07 pins seq 729, block 975028, by explorers). those lines are pinned by nothing outside the lab tonight.

the previous fetch is history/darkflobi/latest.json, a record in this repository (see "what this is not").

the shelf's own stamps

--stamp-self not passed: the shelf's own report is not stamped and earlier stamps are not upgraded on this run

fetched

filehttpdate headerbytessha256
ledger.jsonl200Sun, 08 Nov 2026 21:27:15 GMT1233153ab9d4fc95e4fb66837a3acff29a156df14a1a93241e429691d3a1a007e5e04c2
withheld.json200Sun, 08 Nov 2026 21:27:15 GMT1777096e3123c16e10bfcf8853ba82c6bc1bd75bdb935c34674d9ceba829b6c60f59
verify.js200Sun, 08 Nov 2026 21:27:16 GMT138726bb1b6c4642d6251153d0a3bc6a30ac3fee9c6529cc0540291dbb38f983eba46
check_ledger.cjs200Sun, 08 Nov 2026 21:27:16 GMT412285c76195a194b5901bcf3f99f0aee19584925f9a1b44ae385b2057b0649e6503
vectors/vectors.json200Sun, 08 Nov 2026 21:27:16 GMT5725be43667f1662e822fd31d5941e6166fdd7ce145de72b6dfea9b32bbb4ae69d4b
vectors/base.jsonl200Sun, 08 Nov 2026 21:27:16 GMT1942048029fce0bed73a52067d2e7e3552555d45c81d837187a93b6dd20d48ad8861f1
anchors/index.json200Sun, 08 Nov 2026 21:27:16 GMT13573e36bd72935d6bba08c710483c0fcd6769c77511ea70fac7cfc3713f82a4258a8
SNAPSHOTS.jsonl200Sun, 08 Nov 2026 21:27:16 GMT56733b0afeb58d11107f9e14f4289a08c6d0774a5d19fedacd8f48c0997c3e9b7c19
STATS.json200Sun, 08 Nov 2026 21:27:16 GMT5719d3c783a23715e8b82030c164016dae615b6ae5ec130ebd6ab5b51c0a8b1fefca

plus 28 anchor files (in the json record).

rerun

git clone https://github.com/fathom-lab/styxx-shelf && cd styxx-shelf && npm ci && node shelf.mjs --row darkflobi --out ./docs --date 2026-11-08 --through 2026-11-07

by hand, inside the clone: 39 commands (every curl and every node line) are listed under commands in the json record. the rerun carries --date and --through so the gap window is the recorded one.

ledgers read by url — 2 rows, 2 of 2 the lab's own; outside ledgers read: 0; v1 rows 0 of 2; withdrawn 0 of 2

who wrote each ledger is the row's written_by. no row names a ledger written outside the lab: the 2 of 2 rows written by the lab (darkflobi, red) show the shelf reading the lab's own ledgers by url, not an outside one. since styxx-ledger f29ae3d (2026-11-09) the census scorer reads condition (c) from the shelf: it fetches the report a section 15 shelf read line names, only from under https://fathom-lab.github.io/styxx-shelf/reports/reads/ (since 94e4181; a report on any other host fails (c) unfetched), and checks it against the registration and the chain. (c) holds for an outside window only after the shelf has read that ledger and its report is kept here.

the register outside_ledgers.json lists the ledgers the shelf reads with shelf_read.cjs, one url each, protocol v0 or v1. the shelf is the lab's: a ledger listed here, whoever wrote it, is read by the lab's shelf, with the lab's copy of the verifier and the lab's code, and the reports below are the lab's. a report says whether the bytes at the url re-derive and where the earliest anchor that holds was looked for; it says nothing about the agent behind a ledger, or whether a line records what happened. rows are appended by the lab in a dated commit and never edited; a row taken off gets withdrawn_at and stays. a v1 row for an outside operator's ledger is added when that operator has published one and asks: how to ask, what the lab does and the url to paste are under get your ledger read; the places an anchor may be posted, under anchor places in the readme.

rowprotocolledger urlanchor placecommitted report (kept copy, its sha256)bytes / sha256linesheadre-derivesanchors holdingearliest anchor that holdsin your browser
darkflobi
written by the lab
v0 https://fathom-lab.github.io/styxx/ledger/ledger.jsonl the lab's exhibit copy of each day's anchor text (anchors/<date>.txt); the telegram post itself needs an account to read, so the shelf reads the lab's copy, not the post
https://fathom-lab.github.io/styxx/ledger/anchors/{date}.txt
2026-11-09T14:37:14Z
reports/reads/darkflobi/2026-11-09T14-37-14Z.json
sha256 10de3b63321243d7c8afb1c9f5704a5cf76e67b821bb5024d3b57a778254e17f
shelf 59c182ac5fbafc6bdcadb3101289b1c1f41b9010
1341750
20f6d62058a3c195
787 3f9fe35a1b276ed3 yes 15 of 15 2026-10-24 seq 57
text sha256 1d187807253d257f
place: found (http 200)
re-derive now in your browser
red
written by the lab
v0 https://fathom-lab.github.io/styxx/ledger/red/ledger.jsonl the ledger's own page on the lab's github pages site; the lab can edit it, so it is not a place outside the lab
https://fathom-lab.github.io/styxx/ledger/red/
2026-11-09T14:37:15Z
reports/reads/red/2026-11-09T14-37-15Z.json
sha256 a10642f03863b4ca976bba4cdc21907f6b4efa8872ba5cb9d6b3c6450f6422b7
shelf 59c182ac5fbafc6bdcadb3101289b1c1f41b9010 (uncommitted changes present)
274193
c999b33fc2a4d409
107 95194d08c31ea102 yes 1 of 1 2026-11-08 seq 106
text sha256 f03ab11d15f7f794
place: found (http 200)
re-derive now in your browser

how old each read is: darkflobi: read 2026-11-09T14:37:14Z, 5 h 38 min before this page was written, 787 lines; the nightly row darkflobi read the same url at 2026-11-08T21:27:15Z and counted 729 lines, 17 h 9 min before this read (+58 lines from the earlier count to the later: the ledger grows, so the two counts are two times, not two answers). red: read 2026-11-09T14:37:15Z, 5 h 38 min before this page was written, 107 lines; read from a shelf checkout with uncommitted changes (its shelf_commit says so).

every read here so far was written when the lab ran node shelf_read.cjs --row <name> by hand on its box; the workflow written for this repository runs it for every register row each night once the operator adds it (not in this repository as of 2026-11-09). every read is kept at reports/reads/<row>/<read_at with each : written ->.json and never rewritten; reports/<row>.json is the latest and is replaced by the next read. the census template's section 15 line (shelf read: <url> sha256 <64 hex> at <read_at>) names the kept copy. the report's fields: outside_report_schema.json. the browser page fetches the ledger from its url and runs the same code (shelf_core.js and the verifiers below); it can read a host that allows a cross-origin read (github pages hosts do).

v1 rows run the kit's verifier as copied from styxx-ledger commit 838a003 (838a003fa4f65d8efdb185c88a951f74ac2366c9, https://github.com/fathom-lab/styxx-ledger), 5 files, none changed (v1/VENDORED.json):

filekit pathsha256
verify.jsjs/lib/verify.js72b2d988d5bce1a2c0332928c283ec1c0509f6b58a31f5d9d5b1e65a06d2fa32
chain.jsjs/lib/chain.js9f2abfd11597458553f0387a67004b3dd2c138de5819068d9f9ad5c805c2b516
jcs.jsjs/lib/jcs.jsabeddd50d3f09ad8f222c1d7bf3ebe0f64b1c458c3df25d4cad5b8f8c1a6fabb
day.jsjs/lib/day.jsc4e19c8bba96b6f8e122caba33835c6d3188ec2d39ea1c0c8500ce63e9aa3deb
LICENSELICENSE562ab2caa6477ecc385d6b85e5e18798dbe5b35ac1d302674173a9827d83b2a9

v0 rows run the shelf's pinned tools/verify.js (sha256 6bb1b6c4642d6251153d0a3bc6a30ac3fee9c6529cc0540291dbb38f983eba46), served to the browser as v0/verify.js.