Files

71 KiB
Raw Permalink Blame History

2026-10-10 — merlin

Screen. Every claim below carries a path, a hash, a URL, or a command with its output, or the word unverified. Nothing secret is printed anywhere in this check-in or in the files it lands.


Did

Claimed and finished Q12 — are the evidence tiers earned?, the top unclaimed executable item (WORK-QUEUE.md: Q1–Q11 closed or claimed, Q13/Q19 gated on Alexander, Q9 blocked on the audio handover, Q20 open behind it, and my own 2026-10-09 check-in named Q12 as my next pick).

Deliverable: recoveries/evidence-tier-audit.md (19,516 B, sha256 625bfb1e9afd9ba3541dc83c09fab39032c7e77095dea616dea60fa70c4ca1dd) — sample rule, legend, method, 18-row table in the fixed column order entry | badge as published | strongest cited source | verdict | settling evidence, verdict counts, five named findings, and the full read list.

Result: 18/18 justified, 0 too strong, 0 too weak, 0 indeterminate. No badge in the sample misstates its evidence. What the audit did find is three citation defects and two legend-policy problems — which is the distinction the item's own framing asked for, and the reason a clean badge result is not a clean report.

Sample rule, stated before any fetch: every non-documented entry (all 6 — 5 testimony_only, 1 corroborated, 0 unrecovered) plus every 9th documented entry in published index order (12) = 18 of 121. Census reproduced from the live index (https://alexanderwhitestone.com/stackchain/blocks/, HTTP 200 / 34,488 B / sha256 4f764ef4dfb9c08b2654ff0783550d20ad1bb7a31cb0c32070974a5fe451557e): grep -o 'badge documented' → 115, testimony → 5, corroborated → 1, unrecovered → 0, <li id= → 121. The 2026-09-26 census in the queue reproduces to the entry.

All 18 entry pages and 17 cited sources fetched live from this host, ~09:01–09:35 UTC; 18/18 entry pages HTTP 200 on the first attempt (3,181–5,146 B). 33 of 37 quoted excerpts ≥25 characters are verbatim in a source the entry cites; the 4 that are not are one passage repeated on four pages (finding 1). For 8 of the 12 sampled magazine entries the entry's displayed date equals the cited article's own article:published_time to the day — e.g. magazine-085 shows 2026-08-13 and the-diy-signing-device-revolution-is-just-beginning/ (200 / 162,809 B / sha 5d6b1a9801ca1792…) carries article:published_time 2026-08-13T14:00:25+00:00.

Five findings, none of them a badge overstatement:

  1. block-25, block-88, block-89, block-90 cite their corroborating quote at a URL that does not contain it. All four Provenance panels say the practice "is independently corroborated: a published Stackchain Magazine account records the term 'Skinner Stacking' and describes it, quoted below" — and link the bare site root, https://www.stackchainmagazine.net (200 / 215,836 B / sha e7df6364180a…), which detags to 5,036 characters containing Skinner 0 times. The passage is verbatim at https://www.stackchainmagazine.net/a-conversation-with-burnchainers/ (200 / 155,217 B / sha 50a2e57e3ba661a6…), the publication's only result for ?s=Skinner (200 / 107,021 B / sha 95f57a614ebc…). The claim holds; four pages need the permalink.
  2. event-2022-08-18… names a source it does not link, and that source 404s. The summary says "StackchainQuant's October account also embeds Yellow's August 18 donation appeal and reports several thousand dollars raised under #Stacks4Hodlonaut"; StackchainQuant appears twice in the page and is an anchor nowhere, and https://x.com/StackchainQuant returns 404 / 37,702 B / sha 2dfa62a242e6…, <title>User Profile Not Found - X | 404 Error</title>. The badge is still earned by what is linked and checked: the quoted post text is verbatim ×3 in x.com/AnthonyDessauer/status/1560325688481026048 (200 / 111,659 B / sha b03ba32bdbd4…), and the printed tx ae63c499155ce14064686fc7218af6630cf64fd58a601bba48368b13cf955aa1 is confirmed, height 749999, block time 2022-08-18T17:45:12Z, one output of 851,979 sats (https://blockstream.info/api/tx/ae63c499…).
  3. magazine-026 names @a_koby with no anchor (minor, same defect class, no badge effect).
  4. The legend's Unrecovered tier is defined and applied 0/121 times, while material fitting its definition ("known to exist, no copy and no independent account") sits in lower-tier Uncertainty panels — block-6: "The $6 post itself has not been produced"; block-88: "No post, capture or timestamp located."
  5. Documented on the 91 magazine entries is a liveness claim, not a held-artifact claim. The legend's first tier says "the archive holds the post, capture or receipt"; all 12 sampled magazine entries answer with a Receipt panel reading "No receipt is held for this entry." and a live third-party URL. 12/12 resolved 200 today, but the fragility is measurable: the Bitcoin Magazine URL returned 403 / 4,545 B to a Chrome user-agent and 200 / 341,802 B / sha e1826c17863d… to a bare curl agent, in the same minute.

Method note worth keeping: bitcoinmagazine.com 403s a browser UA and answers curl, so a 403 there is a wall, not a dead link — the same class of false negative Q2's record already warns about for the Wayback availability API.

Blocked

Nothing blocked the run. Two things deliberately unverified, both recorded as such in the deliverable:

  • Whether any of the other 103 unsampled documented entries has the same defect class. The 6 non-documented entries are a complete census of their tiers; the 12 documented are an every-9th sample and license no rate for the rest. A clean 18/18 is evidence that the discipline holds where the evidence is thinnest, not that all 121 are clean.
  • Whether magazine-012's "a year where official CPI was 6% while food, rent, electricity and gas ran higher" is true of the article's figures. The article is live (200 / 141,125 B / sha 8f6efedbd052…) and carries 6% once; whether the surrounding sentence says what the summary says is Q8/Q10's lane, not a badge question, so I left it alone rather than half-grade it.

Next

Q20 — excerpt fidelity and placement for the 91 magazine entries (open and unclaimed, opened by the pipe 2026-10-08). It is the natural successor: Q12 just measured that 33/37 sampled excerpts are verbatim in their cited source, and Q20 asks the question this audit did not — whether an excerpt is a literal quotation or a paraphrase, and where inside its source it sits, with offsets and fractions. Its finish line is recoveries/excerpt-placement-audit.md under a stated sample rule.

Q13 stays gated on Alexander: findings 1 and 2 above are link/provenance fixes to live pages and belong in that channel, not in this run. Nothing in this tick executed on decisions/.

Ask

Three decisions that are yours, none of them blockers:

  1. The four Skinner links — repoint block-25/88/89/90 from stackchainmagazine.net to /a-conversation-with-burnchainers/? It is a link change on four live pages, so it waits for you through Q13.
  2. event-2022-08-18's StackchainQuant clause — link a surviving capture of the October account, or withdraw the clause? The account's handle 404s today, so the clause currently rests on an unreachable source.
  3. The legend's Documented wording — either narrow it for the magazine class to "a published source the archive cites, resolving at read time", or start holding captures. As written the badge claims an artifact the archive says it does not hold.

No new queue item opened — depth is not thin (Q9 blocked on the audio handover, Q13/Q19 gated on you, Q20 open).


Run detail — Q12, claimed and finished

Clock and host. All fetches from this host, 2026-10-10 ~09:01–09:35 UTC. Working tree at /root/crucible/q12/; repo at /root/troupe-standup, branch main, HEAD before this run aab23e5, working tree clean.

Scripts, all re-runnable. parse_index.py (index → 121 entries with badge + external hrefs), sample.py (the sample rule), fetch_entries.py (18 entry pages), fetch_sources.py (17 cited sources), check.py, deep.py (bitcoinmagazine retry, blockstream tx, homepage term counts, Skinner post, siggy commits), excerpts3.py (the verbatim matcher), dates.py (entry date vs article:published_time), skinner2.py (search → permalink), unlinked.py (named-but-unlinked handle test), evidence.py (emits EVIDENCE.txt).

The matcher, printed. Strip <script> <style> <svg> <noscript>, replace <br> and block closers with a space, strip tags, HTML-unescape, NFKC-normalise, collapse whitespace, normalise quotes and dashes. Verbatim = substring under exactly that rule. Split the "From the sources" panel on each re-cited permalink so distinct excerpts stay distinct — my first two extractors merged adjacent excerpts and produced 73 false misses, which is logged here because it is the kind of defect that would have shipped a wrong number.

Counts, recomputed not accepted. 121 entries parsed, badges 115/5/1/0. Sample 6 + 12 = 18. Entry pages 18/18 HTTP 200. Cited sources 17 unique, 16 at 200 first attempt, 1 (Bitcoin Magazine) 403 → 200 on retry. Excerpt fragments ≥25 chars: 37; verbatim in a cited source: 33; not: 4 (one passage × 4 pages). Verdicts: 18 justified / 0 / 0 / 0.

Two of my own defects, logged first. (a) fetch_sources.py's first version omitted the URL argument from the curl invocation and reported ERR for all 17 sources — caught because 17 identical failures is not a network shape. (b) excerpts.py and excerpts2.py merged adjacent excerpts (URL removal) and left <a href=" residue in the fragment text; both produced false misses and were replaced by excerpts3.py, whose 33/37 is the figure reported.

Limits. All byte counts and hashes are dated readings from this host at ~09:0x UTC — third-party pages drift, so the hashes re-check this run, they do not pin the pages. Testimony only: nothing in the archive's own build was read; every grade comes from a public fetch. Not tested: the summaries' content accuracy (Q8/Q10), the 103 unsampled documented entries, and any documented magazine entry citing a since-removed article outside the sample. Not touched: no live page, no blocks.json, no other party's file, nothing in decisions/.

Landing evidence.

$ sha256sum recoveries/evidence-tier-audit.md
625bfb1e9afd9ba3541dc83c09fab39032c7e77095dea616dea60fa70c4ca1dd  recoveries/evidence-tier-audit.md
$ wc -c recoveries/evidence-tier-audit.md WORK-QUEUE.md checkins/2026-10-10-merlin.md
 19516 recoveries/evidence-tier-audit.md
283818 WORK-QUEUE.md
 10870 checkins/2026-10-10-merlin.md
314204 total
$ git status --porcelain
 M WORK-QUEUE.md
?? checkins/2026-10-10-merlin.md
?? recoveries/evidence-tier-audit.md

Files written this run:

  • recoveries/evidence-tier-audit.md (new — the deliverable)
  • WORK-QUEUE.md (Q12 status block appended)
  • checkins/2026-10-10-merlin.md (this file)

Landed and read back over the public forge, not just written:

$ git push origin main
   aab23e5..67b892d  main -> main
$ git log -1 --format='%h %an'
67b892d Merlin
$ curl -sS -o /tmp/verify-audit.html -w '%{http_code} %{size_download}' \
    https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/recoveries/evidence-tier-audit.md
200 19516
$ sha256sum /tmp/verify-audit.html recoveries/evidence-tier-audit.md
625bfb1e9afd9ba3541dc83c09fab39032c7e77095dea616dea60fa70c4ca1dd  /tmp/verify-audit.html
625bfb1e9afd9ba3541dc83c09fab39032c7e77095dea616dea60fa70c4ca1dd  recoveries/evidence-tier-audit.md

The anonymous raw path serves the same 19,516 bytes with the same digest as disk, so the deliverable is live and byte-checkable from outside this host.

— Merlin


Run 2 — Q21, claimed and finished (excerpt → anchor binding census)

Screen. Every claim below carries a path, a hash, a URL, or a command with its output, or the word unverified. Nothing secret is printed anywhere in this check-in or in the files it lands.

Did

Claimed and finished Q21 — does every quoted excerpt resolve at the URL it is printed against?, the item the pipe opened at 09:20Z when Q12 closed and the unclaimed executable set fell to one (Q20). This is the first complete census of the property — Q12 found the defect class inside an 18-entry sample; Q21 measures all 121.

Deliverable: recoveries/excerpt-binding-audit.md (110,696 B, sha256 47ff51b0eb7bfe22235ed980fe103572c8534c53669f7030d6c23e77a1b5e66e) — reading rule and detag/normalisation rule in the header, the census, four findings, the 38-row named-source list, and 319 per-excerpt rows in the fixed column order entry | excerpt text (first 60 chars) | anchor as printed | binding verdict | settling evidence.

Result: 319 excerpts — 311 bound (300 verbatim / 7 marked-elision / 4 URL-tokenised), 4 mis-bound, 4 unanchored, 0 unreadable. All 121 entry pages fetched HTTP 200 on the first attempt (2026-10-10T13:25:18–13:25:32Z); all 116 distinct anchors fetched HTTP 200 (one 301 re-fetched with -L, 2026-10-10T13:26:08–13:28Z). Every excerpt carries exactly one anchor (315) or none (4).

Findings:

  1. The four mis-bound rows are one defect, and it is Q12 finding 1 promoted from sample to census. block-25/88/89/90 attach the Provenance panel's "independently corroborated … 'Skinner Stacking'" quote to the bare site root https://www.stackchainmagazine.net (HTTP 200 / 215,836 B / sha256 df86fbd68fb1480ede1ffc447a159c4d32c1f9e9c2d13db2695d968b1baf1667 / 2026-10-10T13:32:11Z), which detags to 5,009 characters containing Skinner 0 times with the passage absent. The passage is verbatim at https://www.stackchainmagazine.net/a-conversation-with-burnchainers/ (HTTP 200 / 155,160 B / sha256 3320342482ba43ce3c2c9781147468352c2689a7b6e10b64f3d56f87a798e648 / 2026-10-10T13:32:12Z, Skinner ×1) — the publication's only article result for ?s=Skinner (HTTP 200 / 107,021 B; the other result links are site pages). The claim holds; four live pages carry the wrong URL.
  2. The four unanchored rows are the The block testimony quotes on those same pages — no source, no anchor, no following anchor in document order. Correct shape for a Testimony only badge.
  3. 38 named-source rows: every @handle and bare URL in an entry's own prose with no anchor on the page (prose sections only; From the sources blockquotes are verbatim third-party text and excluded). Q12's two named-source findings reproduce: event-2022-08-18 names StackchainQuant (no @, hand-checked) twice unanchored and https://x.com/StackchainQuant → 404 / 37,702 B, <title>User Profile Not Found - X | 404 Error</title> (2026-10-10); magazine-026 names @a_koby once unanchored.
  4. Zero blockquote anchors with an empty excerpt, and zero excerpts bound to an internal archive URL — all 116 anchors are external; the ledger never cites itself as the source of a quotation.

Blocked

Nothing blocked the run. Limits, stated in the deliverable:

  • This tests the binding only — not whether the excerpt is a faithful quotation (Q20), not the summary prose (Q8/Q10), not link resolution (Q3).
  • All byte counts and hashes are dated readings from this host at the printed clocks. The Bitcoin Magazine anchor (cited six times) answered HTTP 200 / 341,805 B / sha256 9c5df6c23b824e1cd4dfbf98e6d401e8e22b55656d08e8f82efa184fa76e1ea5 at 2026-10-10T13:26:08Z under a bare curl UA — Q12's morning 403 did not reproduce in this census, so finding 5 of that audit stays unreproduced, not refuted.
  • Whether the 38 named sources' handles resolve at all was not tested — that is the proposed Q22.

Next

Q20 — excerpt fidelity and placement for the 91 magazine entries is now the only open executable item, and it is the natural successor: this census settled which URL an excerpt is printed against; Q20 asks whether the excerpt is a literal quotation of that source and where inside it it sits, with offsets and fractions. Its finish line is recoveries/excerpt-placement-audit.md under a stated sample rule.

Because the queue fell to one, Q7's never-dry obligation is triggered: Q22 — do the named-but-unlinked sources resolve? is proposed at the foot of WORK-QUEUE.md (one fetch per distinct named source; handle-liveness census of the 38-row list). Not opened, per the queue's convention.

Q13 stays gated on Alexander: finding 1 is a link change on four live pages and belongs in that channel. Nothing in this tick executed on decisions/, a live page, blocks.json, or another party's file.

Ask

Three decisions that are yours, none of them blockers:

  1. The four Skinner links — repoint block-25/88/89/90 from stackchainmagazine.net to /a-conversation-with-burnchainers/? Yesterday's ask, now backed by a complete census instead of an 18-entry sample: four pages carry a URL that does not contain the quote they cite.
  2. The 38 unanchored named sources — add anchors for the ones that resolve (and strike or mark the ones that do not, like StackchainQuant, whose handle 404s), or leave the names unlinked as-is? Q22 measures which handles are alive before that call needs making.
  3. Open Q22? It is one fetch per distinct named source and turns the named-source list from a citation-style note into a liveness record.

Run detail — Q21

Clock and host. All fetches from this host, 2026-10-10T13:25–13:33Z. Working tree at /root/crucible/q21/ with every fetched body kept beside the scripts; repo at /root/troupe-standup, branch main, HEAD before this run 87e89ab, working tree clean.

Scripts, all re-runnable. fetch_entries.py (index → 121 entry pages), parse_bindings.py (excerpts + anchors), fetch_anchors.py (116 anchors), refetch301.py (the one redirect), check3.py (the binding matcher — check.py/check2.py were its defective predecessors), probe.py (per-residual prefix diagnosis), named2.py/mknamed.py (named-source rule), skinner.py (the finding-1 verification), emit.py (writes the deliverable).

The matcher, printed. Detag/normalisation rule is in the deliverable's header; the two classes that earned it: (a) the entry pages double-escape (&amp;#8217;), so a single html.unescape leaves literal entities and graded four byline rows mis-bound; (b) 4<sup>th</sup> detags to 4 th, so an ordinal rejoin rule is part of the rule. Elisions are honoured (the excerpt's own ...), and URLs are tokenised in both strings where an X post prints a t.co link where the excerpt prints the expanded URL.

Counts, recomputed not accepted. 121 entries / 319 excerpts (311 From the sources, 8 The block) / 116 distinct anchors, all external. Verdicts 311 / 4 / 4 / 0. Named-source rows 38. The four mis-bound and four unanchored rows are all on block-25/88/89/90.

Two of my own comparator defects, logged first in the deliverable. (a) The first detag treated </a> as a block closer and unescaped once — seven false mis-bound grades (four byline rows, one ordinal, two entity rows). (b) The first elision splitter required a spaced ellipsis and missed the no-space trailing form — a further seven false mis-bound grades. Both were found by prefix-probing each residual rather than by eyeballing, and the published counts are the fixed run's.

Landing evidence. Committed and pushed as Merlin, then read back over the anonymous forge path — all three files byte-identical to disk.

$ git -c user.name=Merlin -c user.email=merlin@agents.invalid commit -m "queue: Q21 excerpt-binding census DONE (Merlin) ..."
[main e3b2f4b] ... 3 files changed, 673 insertions(+)
$ git push origin main
   8dfc2e3..e3b2f4b  main -> main
$ git log -1 --format='%h %an %ad'
e3b2f4b Merlin Sat Oct 10 13:35:36 2026 +0000
$ curl -sS -o /tmp/verify-binding.md -w '%{http_code} %{size_download}' \
    https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/recoveries/excerpt-binding-audit.md
200 110696
$ sha256sum /tmp/verify-binding.md recoveries/excerpt-binding-audit.md
47ff51b0eb7bfe22235ed980fe103572c8534c53669f7030d6c23e77a1b5e66e  /tmp/verify-binding.md
47ff51b0eb7bfe22235ed980fe103572c8534c53669f7030d6c23e77a1b5e66e  recoveries/excerpt-binding-audit.md
$ cmp /tmp/verify-binding.md recoveries/excerpt-binding-audit.md && echo BYTE-IDENTICAL
BYTE-IDENTICAL

The queue and this check-in were read back the same way: WORK-QUEUE.md 200 / 304,736 B / sha256 3da86586d160c140300ec8262951af58d89863aa3f5c7df5c68b970d30086c7c, checkins/2026-10-10-merlin.md 200 / 20,789 B / sha256 6c2c05b20cbe5fab34d56a3c84ab9ddd996f01401fa2c8c943eabd55c01d78d0 — each identical to disk. The digests above are for the e3b2f4b tree; the follow-up commit that filled in this evidence block changes this file only.

Files written this run:

  • recoveries/excerpt-binding-audit.md (new — the deliverable)
  • WORK-QUEUE.md (Q21 status block; Q22 proposal appended)
  • checkins/2026-10-10-merlin.md (this section)

— Merlin


Run 3 — Q22, claimed and finished (named-source liveness)

Screen. Every claim below carries a path, a hash, a URL, or a command with its output, or the word unverified. Nothing secret is printed anywhere in this check-in or in the files it lands.

Did

Claimed and finished Q22 — do the named-but-unlinked sources resolve?, the item the pipe opened on my Q21 finding at 13:53Z and assigned to me (Q20 was routed to zephyrus-sparkborn instead, since the magazine class is the one he already swept for Q8).

Deliverable: recoveries/named-source-liveness.md (16,731 B, sha256 f12b8a42595a6fd9ba2ebeafc15d4f9cee8631cb2a5725e2cb37ac0a3e04d69a) — population re-derived from the live pages, the reading rule, the verdict vocabulary, the six-row fix table, the 28-row census in the fixed column order source | entry/entries naming it | verdict | URL | byte size | sha256 | clock, five findings, method and limits.

Result: 28 fetches → 27 distinct sources — 20 resolve (19 X accounts + the 1 archive URL), 1 resolve-moved, 2 suspended, 3 404. Six entries name a source that does not resolve.

Population, re-derived rather than copied from Q21 (named.py over the 121 live entry pages, https://alexanderwhitestone.com/stackchain/blocks/ HTTP 200 / 34,488 B / sha256 4f764ef4dfb9c08b2654ff0783550d20ad1bb7a31cb0c32070974a5fe451557e / 2026-10-10T15:38:02Z; 121/121 entry pages HTTP 200 first attempt, 2026-10-10T15:38:02–15:38:13Z): 39 prose rows = 37 @handle rows + 1 bare URL + 1 handle named without an @; 25 distinct @handles after case-insensitive dedupe; 27 distinct sources → 28 fetches, because @HappyClownTime and @happyclowntime are one account and I fetched both spellings as the archive prints them.

Findings:

  1. Q21's anchor rule was defective and lost two rows. Anchored was a suffix match, so the article permalink https://www.stackchainmagazine.net/rest-in-paradise-staceski/ ends with staceski and @staceski read as anchored. The corrected rule requires the last path segment of an x.com / twitter.com href to be the handle exactly. magazine-003 names @staceski in What happened and in In plain English; it resolves — Stacey Berisford (@StaceSki) / X, 200 / 58,628 B / sha256 54367e6a1b643d13277bd28a6fd1e2bf82112bec32402261d9dddf6fc3a1e7c5 / 2026-10-10T15:39:13Z. Logged as a correction against my own Q21 census, not folded in silently.
  2. Three named handles 404, and one is named in prose as a source of record. @_overflow__ (magazine-020, 404 / 37,678 B / sha256 6b05f29fef55d421813c08bec0c5e6d117ae511b19c6539e2e5a95f9aa076b74 / 2026-10-10T15:39:17Z); @humblebitcoiner (magazine-051, named twice — Contributor and What happened — 404 / 37,702 B / sha256 f28a6675624ee6c1d6e8c94e7738a6dd2da77914206d8a19a4146988ca65fdbf / 2026-10-10T15:39:33Z); StackchainQuant (event-2022-08-18, named without an @, 404 / 37,702 B / sha256 47f73c39ebdbe437559c9532aa1cceeaf69dc3724670f6f3b4ce756f9ec76bf3 / 2026-10-10T15:39:39Z). All three serve <title>User Profile Not Found - X | 404 Error</title> and "The user profile you're looking for could not be found." StackchainQuant is the worst case: the entry's summary asserts what the account "reports", and that named warrant 404s.
  3. Two suspensions answer HTTP 200, so a status-code check grades them resolve. @BTC_Freeborn (magazine-035 Contributor, 200 / 40,800 B / sha256 36d526cdf90b655874f6f73c5158a952e9033e1853ff734720b434d4c1898687 / 2026-10-10T15:39:21Z) and @RedTailHawk1923 (magazine-056 Contributor, 200 / 40,839 B / sha256 0bf960adefead1e37bf4ac5dd7a5e20cbcc1d6a53fb44355116073dcd414ca85 / 2026-10-10T15:39:33Z) both serve <title>Profile / X</title> with <h2>Account suspended</h2> — "X suspends accounts which violate the X Rules".
  4. One handle is live but its owner moved. @captainsiddh (magazine-039) answers — Sidd (@captainsiddh) / X, 200 / 68,579 B / sha256 d2dfc77ad5c01e4bad7554add5ceae3b1e7c037ee994c635d1650bc7af25633d / 2026-10-10T15:39:22Z — while its own description reads "Now at @captainsidd", and https://x.com/captainsidd resolves: Evan (Captain Sidd) (@CaptainSidd) / X, 200 / 159,957 B / sha256 38e0e29618a8b0ef599ede39f1396f0e5af6040b8143d13d236f7003437b0e27 / 2026-10-10T15:40:39Z.
  5. The one bare URL in the list is the best-behaved source on the page. block-5's Provenance prose names the Wayback capture of the genesis tweet without linking it; fetched with -L, HTTP 200 / 64,518 B / sha256 5ca88e586bfc6b026ff027d1cdf1887e24686ac0d71e2f5fc3237bfd51c8716c / 2026-10-10T15:39:40Z, <title>AriZonan HODL on Twitter: "Even on days when I'm broke as hell I still stack. Feel free to join me." / Twitter</title> — the live-404 genesis tweet, held by its capture. The archive already knows the Wayback route for a dead X source and prints it in prose without a link.

Blocked

Nothing blocked the run. Limits, stated in the deliverable:

  • A 404 says the name is unreachable today, not that the person never existed. Rename and deletion are indistinguishable from here, so nothing in this census decides whether @_overflow__, @humblebitcoiner or StackchainQuant were retitled or removed.
  • Liveness only. Whether a named source actually supports the claim printed beside it is Q8/Q10/Q20's lane; whether the anchored sources resolve is Q3 and Q21's. Neither was re-tested.
  • X byte sizes and hashes are dated readings. The pages carry a per-request <meta property="csp-nonce">, so the two 404 pages at 37,702 B are byte-different from each other and the two suspended pages at 40,800 / 40,839 B are not identifiers. The clock is the evidence.
  • No 301-to-a-different-owner case occurred, so that verdict class the queue's Status line asked for is defined and unused.

Next

Q20 — excerpt fidelity and placement for the 91 magazine entries is the top unclaimed item, routed to zephyrus-sparkborn this tick on the queue's own correction (the magazine class is the one he swept for Q8). From my side the natural successor to Q22 is the same question Q22 just answered for handles, asked of the anchored sources: Q21 established that 319 excerpts bind to 116 external anchors and all 116 answered 200 at 13:26Z, and Q3's record already carries one anchor whose liveness is a wall rather than a death (bitcoinmagazine.com 403s a browser UA and answers bare curl). That is a re-run, not a new item, and it belongs inside Q3/Q21 rather than opening anything.

Q13 stays gated on Alexander. All six fixes are live-page edits — anchor event-2022-08-18, magazine-035, magazine-039, magazine-056; strike or mark magazine-020, magazine-051, StackchainQuant. Nothing executed on decisions/.

Ask

Two decisions, neither a blocker:

  1. Anchor or strike, per entry. Anchor where the name is defensible and merely unlinked (event-2022-08-18, magazine-035, magazine-039, magazine-056); strike or mark where the handle 404s (magazine-020, magazine-051, StackchainQuant)? A struck name loses the reader a claim the badge still earns; an anchored 404 gives them a dead link. That trade is yours.
  2. @captainsiddh — update the handle? The prose is not wrong, it is one handle behind (@captainsidd is live). It is a wording change on one live page, so it waits for you.

No new queue item opened. Depth is not thin: Q20 is active and assigned, Q9 is blocked on the audio handover, Q13 and Q19 are gated on you, and Q8's sweep stands at 73/91 with batch 072–080 next.

Run detail — Q22

Clock and host. All fetches from this host, 2026-10-10T15:38–15:41Z. Working tree /root/crucible/q22/, every fetched body kept under pages/ (121 entry pages) and targets/ (28 profiles + the archive URL). Repo at /root/troupe-standup, branch main, HEAD before this run b89cfca, working tree clean.

Scripts, all re-runnable. fetch_all.py (index + 121 entry pages), named.py (the named-source rule and its printed output), fetch_targets.py (28 fetches), classify.py (verdict class per response), verify.py (the exact evidence strings for every non-resolving row), rename.py (handle-in-description scan), recount.py (independent recount of the emitted tables), emit.py (writes the deliverable).

The invocations, printed. curl -sS -o <path> -w '%{http_code} %{size_download} %{redirect_url}' --max-time 60 <url> without -L, so a 3xx would report its own code and Location rather than being silently followed — no redirect occurred. The archive URL used -L with %{url_effective} %{num_redirects} and reported 0 redirects.

Counts, recomputed not accepted (recount.py, splitting on unescaped pipes): 35 pipe-lines, 34 data rows of 7 columns, 0 malformed, 0 rows missing a sha256 or a clock. Verdicts over the 34 rows 22 resolve / 1 resolve-moved / 2 suspended / 3 404 — which is the 28-row census (22/1/2/3) plus the 6-row fix table (3/1/2/0). Distinct sources case-insensitively: 27.

Three of my own defects, logged first. (a) I carried Q21's suffix-match anchor test into named.py unchanged and it silently dropped @staceski; the corrected rule is an exact last-path-segment match on x.com/twitter.com, and the two recovered rows are the difference between Q21's 38 and this run's 39. (b) emit.py first keyed its target lookup case-insensitively, which collapsed HappyClownTime and happyclowntime into one entry and printed the second fetch's bytes on both rows (145,323 vs 146,235); fixed with an exact-name lookup plus a case-insensitive fallback for the fix table. (c) recount.py's first version split table rows on every | and reported 8 malformed rows, because X's own page titles contain one — the file was correctly escaped and the counter was wrong.

One thing I got wrong and corrected before it shipped: my first draft of the queue's Q22 status block printed a placeholder sha256 for @staceski with a note pointing at the deliverable. That is exactly the failure the screen forbids, so it was replaced with the fetched digest 54367e6a1b643d13277bd28a6fd1e2bf82112bec32402261d9dddf6fc3a1e7c5 before commit. Logged here rather than quietly fixed.

Landing evidence.

$ sha256sum recoveries/named-source-liveness.md
f12b8a42595a6fd9ba2ebeafc15d4f9cee8631cb2a5725e2cb37ac0a3e04d69a  recoveries/named-source-liveness.md
$ wc -c recoveries/named-source-liveness.md WORK-QUEUE.md
 16731 recoveries/named-source-liveness.md
313733 WORK-QUEUE.md
330464 total
$ git status --porcelain
 M WORK-QUEUE.md
?? recoveries/named-source-liveness.md

The push and the anonymous read-back are recorded in the block appended after this run commits.

Files written this run:

  • recoveries/named-source-liveness.md (new — the deliverable)
  • WORK-QUEUE.md (Q22 status block → DONE)
  • checkins/2026-10-10-merlin.md (this section)

— Merlin

Landing evidence — Q22, committed and read back

$ git -c user.name=Merlin -c user.email=merlin@agents.invalid add \
    recoveries/named-source-liveness.md WORK-QUEUE.md checkins/2026-10-10-merlin.md
$ git -c user.name=Merlin -c user.email=merlin@agents.invalid commit -m \
    "queue: Q22 named-source liveness DONE (Merlin) - 28 fetches, 27 sources, 6 entries with a dead name"
[main 5c7a75f] ...
$ git push origin main
   5c7a75f Merlin Sat Oct 10 15:46:04 2026 +0000
$ for f in recoveries/named-source-liveness.md WORK-QUEUE.md checkins/2026-10-10-merlin.md; do
    curl -sS -o /tmp/v.bin -w "%{http_code} %{size_download} " \
      https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/$f
    cmp -s /tmp/v.bin "$f" && echo "$f BYTE-IDENTICAL" || echo "$f DIFFERS"
  done
200 16731 recoveries/named-source-liveness.md BYTE-IDENTICAL   disk/live sha256 f12b8a42595a6fd9...
200 313733 WORK-QUEUE.md              BYTE-IDENTICAL          disk/live sha256 652de13b7543740b...
200 32647 checkins/2026-10-10-merlin.md BYTE-IDENTICAL        disk/live sha256 27537f591adf9857...
$ git status --porcelain
(no output — working tree clean)

The anonymous raw path serves all three files byte-identical to disk, so the deliverable is live and checkable from outside this host. No secret is printed in this check-in or in either file it lands: the long strings in them are X page titles, archive prose and sha256 digests.

— Merlin


Run 4 — Q23, claimed and finished (prose-named sources the @ token rule cannot see)

Screen. Every claim below carries a path, a hash, a URL, or a command with its output, or the word unverified. Nothing secret is printed anywhere in this check-in or in the files it lands.

Did

Claimed and finished Q23 — do the named-but-unlinked sources resolve?, the item the pipe opened at 16:04Z on my Q22 finding and the top unclaimed executable item (Q20 is active and assigned to zephyrus-sparkborn; Q9 blocked on the audio handover; Q13/Q19 gated on Alexander).

Deliverable: recoveries/named-source-liveness-unlinked.md (10,493 B) — the enumerating rule in the header, the fetch invocation, the four-row census in the fixed column order source | entry/entries naming it | kind | verdict | URL | byte size | sha256 | clock, verdict counts, four findings, the named fix set, and the method/limits.

Result: 4 distinct sources — 3 resolve, 1 404, 0 resolve-moved, 0 suspended. The population was re-derived from the 121 live pages, not copied from the item's text, and the item's text is wrong on one count: the bare-word class is two rows, not one.

Population inputs, measured this run: index https://alexanderwhitestone.com/stackchain/blocks/ HTTP 200 / 34,488 B / sha256 4f764ef4dfb9c08b2654ff0783550d20ad1bb7a31cb0c32070974a5fe451557e / 2026-10-10T17:47:50Z; 121/121 entry pages HTTP 200 on the first attempt, 2026-10-10T17:47:50–17:48:02Z. Prose panels seen: HEAD 121, Receipt 121, In plain English 121, Provenance 121, Uncertainty 121, From the sources 118, What happened 113, Contributor 99, The block 8. The carve-out re-measured, not assumed: 91 pages carry an Original: self-permalink, all on host www.stackchainmagazine.net — exactly the 91 magazine entries the pipe's carve-out predicted.

The four rows:

  1. StackchainQuant — 404. Named as a source of record on 3 entries / 5 mentions: event-2022-08-18 (What happened: "StackchainQuant's October account also embeds Yellow's August 18 donation appeal and reports several thousand dollars raised under #Stacks4Hodlonaut."), also In plain English; event-2022-08-28 ("The October 2022 StackchainQuant article independently confirms 1492 as a notable fork"); event-2022-10-05 ×2 ("StackchainQuant's Bitcoin Magazine guest post reports about 400 participants in the early weeks and cumulative purchases of $1.5 million / 75 bitcoin in eight weeks."). https://x.com/StackchainQuant → 404 / 37,701 B / sha256 5e85355d11f40d83949414a3c083fe98615eb6af93a94922d8ae7f749ebb9475 / 2026-10-10T17:49:31Z, <title>User Profile Not Found - X | 404 Error</title>. The underlying article survives via its own anchor — event-2022-10-05's page links https://bitcoinmagazine.com/culture/how-5-bitcoin-purchase-cascaded-into-1-5-million-viral-movement (verified from the fetched page) — so the report is reachable; the named warrant is not.
  2. AriZonanHODL — resolve, and it is the row the item's population missed. event-2022-07-18-the-5- invitation-becomes-a-chain prints it bare, with no @ and no link on that page, twice: "AriZonanHODL posted a $5 bitcoin purchase; Bob / @HappyClownTime replied with $6 and Satskeeper with $7." https://x.com/AriZonanHODL → 200 / 130,908 B / sha256 0ce19ce08a64417198d6fe81cadf8b28661b9bf18f2669baa5e91d291b90ecc3 / 2026-10-10T17:49:31Z, <title>AriZonan HODL (@AriZonanHODL) / X</title>. Found by the residual sweep (a token that appears as an x.com path segment somewhere in the archive, printed bare and unlinked on the page) — the only detector here that can see a bare-word name the @ census never recorded.
  3. bitcoinbekka@getalby.com — resolve at its canonical target. magazine-024's What happened: "the magazine's closing note jokes about tipping her at bitcoinbekka@getalby.com." The LNURL-pay well-known endpoint https://getalby.com/.well-known/lnurlp/bitcoinbekka → 200 / 469 B / sha256 5cfc17a204b1c004ea18d78d1f24e8ce50ad8d3596b051b21537157eca987eb0 / 2026-10-10T17:49:31Z, body {"status":"OK","tag":"payRequest","callback":"https://getalby.com/lnurlp/ bitcoinbekka/callback","metadata":"[[\"text/identifier\",\"bitcoinbekka@getalby.com\"],[\"text/plain\", \"Sats for bitcoinbekka\"]]",...}. The vanity path https://getalby.com/bitcoinbekka → 404 / 5,201 B / sha256 6f48aec35400a1e5fb88b7cef034a18d55ce810653b04f93d7162e02053745d0, "The page you were looking for doesn't exist". Q22 struck this name as "not a handle"; Q23's question is resolution, and the answer is yes — at the endpoint, not the page.
  4. block-5's Wayback capture — resolve. Provenance prose: "Exact wording recovered 2026-09-21 from an Internet Archive capture taken the same night - https://web.archive.org/web/20220718230820/https://twitter.com/AriZonanHODL/status/1549169119924080640". Fetched with -L: 200 / 64,515 B / sha256 48402e3d328639d98fb0dabe61294c689465d8c9ba2c426192036ae9b35b71f7 / 2026-10-10T17:49:32Z, 0 redirects, body carrying the tweet text "Even on days when I'm broke as hell I still stack. Feel free to join me."

Named fix set, routed to Alexander through Q13: strike-or-mark event-2022-08-18, event-2022-08-28, event-2022-10-05 (the 404); anchor event-2022-07-18 and magazine-024 (live names, merely unlinked); no action on block-5.

Blocked

Nothing blocked the run. The limits, stated in the deliverable and repeated here because they bound the verdict:

  • A 404 says the name is unreachable today, not that the account never existed. Rename, deletion and suspension are distinguishable only by the body, and none occurred here.
  • The blind spot the item's own premise names is real. A bare-word name never printed as an @handle anywhere in the archive and never appearing as an x.com path segment anywhere is invisible to every detector here. Detector 3b (the residual sweep over 8 globally-linked path segments) found AriZonanHODL; it cannot find personal names printed bare ("Yellow", "Loko"), which are not handles.
  • Liveness only — whether a named source supports the claim beside it is Q8/Q10/Q20's lane; whether the anchored sources resolve is Q3/Q21's. Neither re-tested.
  • X byte sizes and hashes are dated readings from this host at the printed clocks; the CSP nonce makes two 404 pages byte-different from each other. The clock is the evidence.
  • The 8 href-only tokens (linked somewhere, never @-printed on the same page) are the anchored class — Q21's lane — and were measured, not silently folded into this population.

Next

Q20 remains the top unclaimed item, active and assigned to zephyrus-sparkborn (the magazine class he already swept for Q8). From my side the unclaimed executable set is now empty, so Q7's never-dry obligation would be triggered if anything closed: the next natural item is the same liveness question the queue already carries in Q3/Q21 — a dated re-run of the 116 anchored external URLs under one rule, since Q3's record notes the Bitcoin Magazine wall (403 to a browser UA, 200 to bare curl) and Q12's finding 5 (fragility) rests on it. That is a re-run, not a new item.

Q13 stays gated on Alexander: every fix above is a live-page edit. Nothing in this tick executed on decisions/, a live page, blocks.json, or another party's file.

Ask

Two decisions, neither a blocker:

  1. Strike or mark StackchainQuant on the three entries? The sentence attributes the report to the account and the account is gone; the article itself is separately cited, so a mark ("via the Bitcoin Magazine guest post") preserves the claim without a dead warrant.
  2. Anchor the two live names (event-2022-07-18's AriZonanHODL, magazine-024's Lightning address), or leave the archive's unlinked-prose style as-is?

No new queue item opened. Depth: Q20 active and assigned, Q9 blocked on the audio handover, Q13/Q19 gated on you, Q8's sweep stands at zephyrus's next batch.

Run detail — Q23

Clock and host. All fetches from this host, 2026-10-10T17:47–17:52 UTC. Working tree at /root/crucible/q23/ (121 entry pages under pages/, five target bodies under targets/); repo at /root/troupe-standup, branch main, HEAD before this run 0f98234, working tree clean apart from this run's writes.

Scripts, all re-runnable. q23-fetch_all.py (index → 121 entry pages), q23-named_unlinked.py (the three detectors), q23-residual.py (detector 3b, the global-token sweep), q23-context.py (verbatim prose context per token), q23-fetch_targets.py (the five fetches), q23-orig.py (the self-permalink carve-out count), q23-links.py (the ev-2022-10-05 anchor check).

One of my own defects, logged first: q23-fetch_targets.py's first version ran os.makedirs('targets') before os.chdir, so the directory was created one level up and every fetch died with FileNotFoundError: targets/x-StackchainQuant. Caught on the first invocation; fixed by reordering.

Counts, recomputed not accepted. 121 pages, sections as printed above; address rows 1; bare-URL rows 1 (self-permalinks excluded: 91 pages / 91 distinct URLs, all stackchainmagazine.net); bare-word rows 5 mentions / 2 distinct names (StackchainQuant ×5 across 3 entries, AriZonanHODL ×2 across 1 entry); residual sweep rows 2, both AriZonanHODL on event-2022-07-18. Verdicts 3 resolve / 1 404 / 0 / 0.

Landing evidence. Committed and pushed as Merlin, then read back over the anonymous forge raw path — byte-identical to disk for all three files; the committed digest is in the block below.

Files written this run:

  • recoveries/named-source-liveness-unlinked.md (new — the deliverable)
  • WORK-QUEUE.md (Q23 status block appended)
  • checkins/2026-10-10-merlin.md (this section)

Landing evidence — Q23, committed and read back

$ sha256sum recoveries/named-source-liveness-unlinked.md
8a28efe9d84f222593473ea38b69a57cbacf624c4311bfdb06d69aaa6dca58d2  recoveries/named-source-liveness-unlinked.md
$ wc -c recoveries/named-source-liveness-unlinked.md WORK-QUEUE.md
  10493 recoveries/named-source-liveness-unlinked.md
 324516 WORK-QUEUE.md
$ git -c user.name=Merlin -c user.email=merlin@agents.invalid add \
    recoveries/named-source-liveness-unlinked.md WORK-QUEUE.md checkins/2026-10-10-merlin.md
$ git -c user.name=Merlin -c user.email=merlin@agents.invalid commit -m "queue: Q23 named-unlinked source liveness DONE (Merlin) - 4 sources, 3 resolve / 1 404"
$ git push origin main
$ for f in recoveries/named-source-liveness-unlinked.md WORK-QUEUE.md checkins/2026-10-10-merlin.md; do
    curl -sS -o /tmp/v.bin -w "%{http_code} %{size_download} " \
      https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/$f
    cmp -s /tmp/v.bin "$f" && echo "$f BYTE-IDENTICAL" || echo "$f DIFFERS"
  done

The anonymous raw path serves every file byte-identical to disk, so the deliverable is live and byte-checkable from outside this host. No secret is printed in this check-in or in either file it lands: the long strings in them are X page titles, LNURL JSON, archive prose and sha256 digests.

— Merlin


Run 5 — Q24, claimed and finished (the Q13 fix pack)

Screen. Every claim below carries a path, a hash, a URL, or a command with its output, or the word unverified. Nothing secret is printed anywhere in this check-in or in the files it lands.

Did

Claimed and finished Q24 — the Q13 fix pack: stage every verified live-page fix as one reviewable approval, the item the pipe opened at 18:0xZ, nominated to me, and the top unclaimed executable item (Q20 is active and zephyrus-sparkborn's; Q9 blocked on the audio handover; Q13/Q19 gated on Alexander).

Deliverables: docs/q13-fix-pack.md (32,942 B, sha256 77faaaa5f8939f5ecde7f46d7acfcd5b535321dbbc31f688a02ec66a14616b4e) — the build-chain evidence, the 25-row clause table in the fixed column order entry | live page | panel | current string | proposed string | authority (artifact + clock) | decided / undecided | staged file, the counts, the decisions/ reconciliation, the structural finding, the excluded rows, the alternative remedies, the staging record, the method and the limits — and docs/q13-fix-pack/apply_fix_pack.py (25,361 B, sha256 2d39df3cdfe466b33e45b19b8741f43b536d93e7ccde90f871e50e5cd6ffd1cd), the staged script, committed unrun.

Result: 25 clauses, 31 deltas — 1 DECIDED and 24 undecided-for-Alexander (2 of them conditional rows). Every clause is one explicit old → new delta against /root/stackchain-legends-build/blocks.json, located by its entry's unique title and scoped to a single field's own JSON span.

The build chain was measured end to end before anything was staged. blocks.json 278,459 B / sha256 63c9cee6103a6824c90c71440fa983d2f5592e380f9c3fb40f7ad366ae41723d; build_blocks.py 22,256 B / sha256 97fedb5dd5e85d2b10071e8e4904b3a9b1573072149e722fbece93eaf0774672; a build on a scratch copy at /root/crucible/q24/build/ → Built 123 pages from 121 entries (121 cleared, 0 research-only), and diff -rq of that output against the build tree's own site-ledger → no output, 125 files each, byte-identical. Then every page fetched HTTP 200 and byte-identical to the freshly emitted file — the 20 entries the pack touches plus 5 controls, 25 pages (/root/crucible/q24/LIVE-READS.txt), e.g. magazine-091 200 / 4,559 B / sha256 8b00bbb09a13a47679a7082cf915b97d2c66f16dcbd5fdfe4fba945da5f14377. Ledger index unchanged at 200 / 34,488 B / sha256 4f764ef4dfb9c08b2654ff0783550d20ad1bb7a31cb0c32070974a5fe451557e. So blocks.json → build_blocks.py → site-ledger/<slug>/index.html → the live page holds byte-for-byte at all four legs.

The structural finding, which is the item's real result: the ledger build has no anchor mechanism for the prose panels. build_blocks.py emits <a href> in exactly three places — contributor.handle (render_entry line 310), body_source_url (323), excerpts[].url (333). body, plain_summary.text, body_provenance and uncertainty are emitted through esc() with no anchor support. Every "anchor it" clause naming a source printed inside prose — StackchainQuant on three entries, AriZonanHODL on four, Satskeeper, the Lightning address — cannot be staged as a link by any blocks.json field, so those are staged as dated uncertainty appends or handle-form wording changes instead. Only the five contributor-anchor rows are real links. contributor also has one handle slot, so G1 anchors BTC_Freeborn and leaves @AnthonyDessauer unanchored on a byline naming both.

Blast radius, measured by a real scratch build, not inferred. Per clause: 25 of 25 change exactly one emitted file — the entry's own index.html; no clause touches blocks/index.html, sitemap.xml or ledger.css. Combined: 20 of 125 emitted files (/root/crucible/q24/BLAST-RADIUS.txt, BLAST-ALL.txt). Spot checks on the applied scratch pages: block-25 carries the a-conversation-with-burnchainers permalink, no longer carries the bare site root as an anchor, and reads "quoted above"; magazine-091 no longer contains "Comparing Strategy", contains "Comparing Twenty One", and carries the correction note; magazine-039 carries href="https://x.com/captainsiddh" and the move note; magazine-070 carries href="https://x.com/MidyReyes".

The proposed new values were validated, not assumed. https://www.stackchainmagazine.net detags to 5,024 characters with Skinner 0 times and the passage absent; https://www.stackchainmagazine.net/a-conversation-with-burnchainers/ (200 / 155,367 B / sha256 33af2c4d78c7642db9a935cd9852ac22fffb151b443db3f49b097bc3964d9d8f) carries Skinner 1 time and the passage verbatim; https://github.com/plebiolira/stackchainsiggy_nostr → 301, Location: https://github.com/flav1000/stackchainsiggy_nostr, and the flav1000 URL → 200 / 279,677 B (/root/crucible/q24/TARGET-READS.txt).

Four candidate rows excluded with the reason stated, one of them a detector defect. The Saylor rows (magazine-036/038/053/068) fired only because https://x.com/saylor/status/1578479561750110208 is an excerpt URL on event-2022-10-07-gui-s-2079-and-saylor-s-2080; in the four pages the word is "Saylor Academy's free Bitcoin for Everyone course" and "Michael Saylor and Nayib Bukele" — a person and an organisation named in the narrative, not a citation of the account. No dead source was missed; the residual sweep cannot tell the two apart. block-5 needs no action. The x.com/i/… addition is withdrawn per the pipe's 18:13Z addendum.

Blocked

Nothing blocked the run. One thing is deliberately unresolved rather than executed: decisions/2026-09-26.md item 13 (magazine-091) is approved at 2026-09-26T14:51:11.019Z with proposed_action "publish the corrected wording to the live magazine-091 page" against a decided note "Do we even have authority to fix the publication? Add our note and escalate it to the author and mag publisher." Per the item's own rule the decided note controls, so D1 is staged and not published. Nothing in decisions/ was executed.

Limits, stated in the deliverable:

  • 25 clauses is not 121 entries. No rate is claimed and the 96 untouched entries were not swept.
  • The staged script is committed unrun. Every clause was exercised in check mode (locator, field span, and old occurring exactly once inside it) and none was applied to the build tree's blocks.json. The scratch applications used for blast radius ran against copies under /root/crucible/q24/blast/. /root/crucible/q24/CHECK-RUN.txt holds all 25 runs with exit codes.
  • Every byte count and sha256 is a dated reading from this host at the printed clock. The site root is byte-stable at 215,8xx B but has carried two digests today; X pages carry a per-request CSP nonce.
  • Whether the proposed wording reads well in the archive's voice is an editorial call and was not made. The note texts are drafts in the archive's register, staged for you to accept, edit or reject.

Next

Q25 — a prose-anchor convention for the ledger build, proposed at the foot of WORK-QUEUE.md because Q24 closed and the unclaimed executable set fell to zero, which is Q7's never-dry trigger. It is the direct successor to this run's structural finding: design and implement the convention in the build tree unpublished, prove a no-token build still emits byte-identical output for all 121 entries, and census which handle-shaped tokens in the prose panels it would anchor and which of Q24's 25 clauses it would upgrade from a note into a link. Scope boundary stated in the item so it cannot drift into a publish.

Q13 stays gated on you. Every clause in the pack is either a live-page text change or a link change, and the one decided clause is blocked by its own decided note. Nothing executed on decisions/.

Ask

Three decisions, none of them blockers:

  1. Release D1 (magazine-091) or hold it? The approval and the note disagree, and the note is the one that controls. If you want the wording published, say so against the note; if you want the courtesy note and the escalation first, D1 stays staged. Either way it is one rebuild of one page.
  2. The 24 undecided clauses — approve as a pack, or clause by clause? The pack exists so the answer can be one line. A1–A4 and B1–B4 are the lowest-risk eight (a URL that does not contain its quote, and a direction word pointing the wrong way, on four pages); E1–E3 change what three entries assert about a source that no longer exists and are the ones worth reading in full.
  3. Build the prose-anchor convention (Q25), or leave the archive's unlinked-prose style as-is? Until it exists, ten of these clauses can only ever be disclosures rather than links.

Run detail — Q24

Clock and host. All fetches from this host, 2026-10-10 ~18:40–19:1x UTC. Working tree at /root/crucible/q24/ (scratch build at build/, 25 live pages at live/, four target bodies at targets/, per-clause scratch applies at blast/<id>/, the combined one at blast/ALL/). Repo at /root/troupe-standup, branch main, HEAD before this run afc6ec3, working tree clean.

Scripts, all re-runnable. mkclauses.py (the clause table and its field-span verifier), gen_apply.py (the staged-script generator), blast.py (per-clause radius), blast_all.py (combined radius + applied-page spot checks), fetch_live.py, fetch_targets.py, run_checks.py, emit_pack.py (writes the deliverable), plus explore*.py, rawfmt.py, contexts*.py, dbg.py.

Counts, recomputed not accepted. 121 entries; entry titles unique across all of them (checked — that is what makes the title locator safe); the bare site root appears as an excerpt URL exactly 4 times in the whole file, so the A group is a complete census of that defect, not a sample. 25 clauses / 31 deltas; kinds 6 uncertainty-append, 5 excerpt-url, 5 contributor-anchor, 4 direction-word, 4 prose-handle-form, 1 body-clause. Verdicts 1 decided / 23 undecided / 2 undecided-conditional. 25/25 check-mode runs exit 0. Blast radius 1 file × 25; combined 20 of 125.

Four of my own defects, logged first in the deliverable's §10. (a) The first verifier searched each entry's whole JSON region and reported body old-strings occurring 2× on event-2022-07-18, because body and plain_summary.text share the sentence — field-span scoping is what makes H1's two deltas land in two places and nothing else. (b) The staged script's first version parsed arguments so --decision's value was read as the clause id, and every apply failed with the usage message. (c) The same version spliced region-relative offsets into the full file text, producing invalid JSON (json.decoder.JSONDecodeError: Expecting ',' delimiter). (b) and (c) were caught by the blast-radius run, which is the only step that would have caught them, and both were fixed before any count was published. (d) magazine-070 was missing from the first live-fetch list, which surfaced as an empty cell in the emitted table rather than as a silent gap.

The control that mattered. The build tree's pre-existing EDITS/apply_editorial_fix_091.py was re-run in check mode and still passes against today's blocks.json (entries: 121, note carried by entries: [91], body now reads "Comparing Twenty One, …", CHECK ONLY — blocks.json not written, /root/crucible/q24/CONTROL-091.txt). So D1 is that delta restated in the pack's format, not a second staging, and the pack's one decided clause is the one the archive already agreed to.

Files written this run:

  • docs/q13-fix-pack.md (new — the deliverable)
  • docs/q13-fix-pack/apply_fix_pack.py (new — the staged script, committed unrun)
  • WORK-QUEUE.md (Q24 status block → DONE; Q25 proposed per Q7)
  • checkins/2026-10-10-merlin.md (this section)

Landing evidence. The commit, push and anonymous read-back are recorded in the block appended after this run commits.

Landing evidence — Q24, committed and read back

$ git status --porcelain          # before the commit
 M WORK-QUEUE.md
 M checkins/2026-10-10-merlin.md
?? docs/q13-fix-pack.md
?? docs/q13-fix-pack/
$ git add docs/q13-fix-pack.md docs/q13-fix-pack/apply_fix_pack.py WORK-QUEUE.md checkins/2026-10-10-merlin.md
$ git -c user.name=Merlin -c user.email=merlin@agents.invalid commit -m "queue: Q24 the Q13 fix pack DONE (Merlin) ..."
[main 3c8623f] ... 4 files changed, 486 insertions(+)
$ git log -1 --format='%h %an %ad'
3c8623f Merlin Sat Oct 10 20:07:48 2026 +0000
$ git push origin main
   afc6ec3..3c8623f  main -> main
$ for f in docs/q13-fix-pack.md docs/q13-fix-pack/apply_fix_pack.py WORK-QUEUE.md checkins/2026-10-10-merlin.md; do
    curl -sS -o /tmp/v.bin -w "%{http_code} %{size_download} " \
      https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/$f
    cmp -s /tmp/v.bin "$f" && echo "$f BYTE-IDENTICAL" || echo "$f DIFFERS"
  done
200 32942 docs/q13-fix-pack.md BYTE-IDENTICAL   sha256 77faaaa5f8939f5e...
200 25361 docs/q13-fix-pack/apply_fix_pack.py BYTE-IDENTICAL   sha256 2d39df3cdfe466b3...
200 348913 WORK-QUEUE.md BYTE-IDENTICAL   sha256 f8e9a457a5530b9c...
200 57670 checkins/2026-10-10-merlin.md BYTE-IDENTICAL   sha256 2a75236fde5f7a6a...

The four digests above are for the 3c8623f tree; the three files other than this one are unchanged by the block appended here. Full digests at 3c8623f: docs/q13-fix-pack.md 77faaaa5f8939f5ecde7f46d7acfcd5b535321dbbc31f688a02ec66a14616b4e, docs/q13-fix-pack/apply_fix_pack.py 2d39df3cdfe466b33e45b19b8741f43b536d93e7ccde90f871e50e5cd6ffd1cd, WORK-QUEUE.md f8e9a457a5530b9cb081c85697f8e81d1d9b361accc120cf24e1d747a7e4df2a, checkins/2026-10-10-merlin.md 2a75236fde5f7a6a16448d3900a8a3c2c31a24340766017b890c99ec82963ae7.

The anonymous raw path serves all four byte-identical to disk, so the deliverable, the staged script and the queue record are live and byte-checkable from outside this host. One housekeeping item: a __pycache__/ directory left by python3 -m py_compile on the staged script was removed before the read-back, and git status --porcelain is empty at 3c8623f.

No secret is printed in this check-in or in the files it lands. The long strings in them are archive prose, X page titles, blocks.json field values, GitHub URLs and sha256 digests.

— Merlin


Run 6 — Q25, claimed and finished (the prose-anchor convention)

Screen. Every claim below carries a path, a hash, a URL, or a command with its output, or the word unverified. Nothing secret is printed anywhere in this check-in or in the files it lands.

Did

Claimed and finished Q25 — a prose-anchor convention for the ledger build, the item the control plane accepted and opened at 20:2xZ after Q24 closed (nominated to me, with the scratch-tree condition: prototype under /root/crucible/, and the shared build tree's build_blocks.py must still be at sha256 97fedb5dd5e85d2b10071e8e4904b3a9b1573072149e722fbece93eaf0774672 with its site-ledger byte-identical when the item closes). Q20 is active and zephyrus-sparkborn's; Q9 blocked on the audio handover; Q13/Q19 gated on Alexander.

Deliverable: recoveries/prose-anchor-convention.md (16,728 B, sha256 f029000f01d13452b86d4bfc11eec436fe6a788b78c8c12570e6b5b442b71c80) — the convention's exact syntax, the diff, the no-token proof, the negative test, the token demo, the 23-row census, the Q24 clause mapping, five findings, the limits, and the script list.

The convention. A prose field may name a handle as {{x:HANDLE}}; render_entry expands it, before esc(), into exactly the anchor the contributor slot already emits (<a href="https://x.com/HANDLE">@HANDLE</a>), and the build fails closed if a token names a handle no entry cites. Expansion is wired to the four prose panels — body where body_kind == "summary", plain_summary.text, body_provenance, uncertainty — and nowhere else. The registry of cited handles = every contributor.handle plus the first path segment of any x.com/twitter.com URL anywhere in blocks.json, minus reserved account paths (the stoplist exists because x.com/i/spaces/<id> URLs put the literal segment i in an unguarded registry).

Result, measured not asserted:

  • A no-token build is byte-identical. Pristine build in the scratch tree → Built 123 pages from 121 entries (121 cleared, 0 research-only), diff -rq against the live site-ledger silent, tree digest 91ecf6bf939a2a499983066a2331bb953eab8a4ca85c66a8a19f42cb1b28f7a8 on both sides, 125 files. The prototype (build_blocks_proto.py, diff -u vs pristine +63 / −6, DIFF.txt 4,960 B) built against the unmodified blocks.json → the same digest, 125 files.
  • The validator is negative-tested. One token {{x:NotACitedHandle}} in an uncertainty field → exit 1, BUILD FAILED: block-25:uncertainty: prose-anchor token names handle @NotACitedHandle which no entry cites. Registry at build time: 8 handles.
  • The token demo. Q24's H1–H4 staged as tokens (6 deltas, 3 entries) → 3 of 125 emitted files changed, the anchors emitted byte-identical to the contributor form.
  • The census. 121 entries re-derived from blocks.json: 46 prose rows, 23 distinct handles — 20 resolve, 1 resolve-moved (@captainsiddh, "Now at @captainsidd"), 2 404 (@_overflow__, @humblebitcoiner), 0 suspended; anchored already 5 of 46 rows; in the validator registry 4 of 23. 25 fetches, curl without -L, 2026-10-10T22:12:28–22:13:07Z.
  • Q24 mapping: 4 of 25 clauses upgraded — H1–H4, the prose-handle-form clauses, each becoming a link instead of a display-form wording change. The other 21 are not upgraded, and the reasons are the finding: E1–E3 (StackchainQuant — uncited and 404, so the validator refuses and a link would be dead), F1/F2 (same twice over), J1 (an LNURL address, not handle-shaped), and A/B/C/D/G/I (structured-field or pure text clauses the build already anchors).

The finding: the registry, not the token, is the binding constraint. 19 of the 23 prose handles resolve and are cited nowhere in blocks.json — they are names, not sources. As specified, the convention can link exactly the 4 registry handles printed in prose (plus @satskeeper_ bare) today; unlocking the rest is content work — adding citations — not build work. The strict rule is also what keeps the archive's discipline: a prose anchor asserts the ledger cites that handle somewhere, which is precisely what Q24's excluded Saylor rows showed a loose rule would break (four magazine pages name a person and a company, not the account).

The scratch-tree condition is honoured. /root/stackchain-legends-build/build_blocks.py is still 97fedb5dd5e85d2b10071e8e4904b3a9b1573072149e722fbece93eaf0774672 and its site-ledger byte-identical at close; the prototype never left /root/crucible/q25/. Nothing published, nothing in decisions/ executed, no live page touched.

Blocked

Nothing blocked the run. Limits, stated in the deliverable:

  • Prototype only. build_blocks_proto.py lives at /root/crucible/q25/ and was never copied into the shared build tree. Publishing any build change is Alexander's, as Q13 states.
  • A token in the quote branch prints literally. expand_prose is wired only to the four prose panels; a {{x:…}} inside body_kind == "quote" renders as text. Deliberate — third-party text is not edited — but it fails silently rather than loudly. A future hardening step would extend the validator to scan every field for tokens and fail on any outside the four panels.
  • 23 handles is a census of the prose panels, not of the archive. Contributor handles, excerpt URLs and the two suspended accounts (@BTC_Freeborn, @RedTailHawk1923 — contributor fields the build already anchors) are outside the population by construction.
  • X byte sizes and hashes are dated readings (per-request CSP nonce; the two 404 pages are byte-different from each other). The clock is the evidence.

Next

From my side the unclaimed executable set is empty again — Q20 is zephyrus's, Q9 blocked, Q13/Q19 gated — so Q7's never-dry obligation would trigger if anything closes. The natural successors are both content work now, not verification work: (a) for each of the 19 uncited-but-live prose handles, decide whether the ledger should cite it (an excerpt URL, a contributor entry) before the convention can link it; (b) the two resolve-moved/404 handles are already routed to you through Q13.

Q13 stays gated on Alexander. The H1–H4 upgrade is a live-page wording+link change on three entries; nothing here executed on decisions/.

Ask

Two decisions, neither a blocker:

  1. Publish the convention? It is a build-tree change, so it is yours. If you want it, the next step is applying H1–H4 as tokens in blocks.json (three entries, six deltas, one rebuild) — the exact opposite order from a wording-only fix, and the only one that can also link @satskeeper_.
  2. Cite the 19 live names, or leave them unlinked? The convention cannot link a handle the ledger never cites, by design. Adding citations is a content decision (which sources the archive claims to hold), not a build one.

No new queue item opened. Depth: Q20 active and assigned, Q9 blocked on the audio handover, Q13/Q19 gated on you.

Run detail — Q25

Clock and host. All work on this host, 2026-10-10 ~22:0x–22:3x UTC. Working tree /root/crucible/q25/ with every fetched body kept under TARGETS/ (25 profiles + a .meta each) and the prototype, the two test trees (negtest/, tokentest/) and all artifacts beside the scripts. Repo at /root/troupe-standup, branch main, HEAD before this run fd16e53, working tree clean.

Scripts, all re-runnable. baseline.py (pristine build + live-tree diff + tree digest), census_tokens.py / census_tokens2.py (the census and its two fixes), probe_names.py (bare-word contexts + the {{/}}/[[/]] collision check — 0 of each in blocks.json), fetch_targets.py (25 fetches), rename_scan.py, map_clauses.py / dump_clauses.py (the Q24 mapping off /root/crucible/q24/CLAUSES.json), show_registry.py, build_blocks_proto.py (the prototype), verify.py (all five verification legs in one run), census_final.py (the §6 table).

Counts, recomputed not accepted. 121 entries; 46 prose rows / 23 distinct handles; 25 fetches → 20 resolve / 1 resolve-moved / 2 404 / 0 suspended; anchored-already 5 of 46; registry 8 handles, 4 of the 23 prose handles in it; diff +63/−6; no-token digest 91ecf6bf… = baseline; token demo 6 deltas → 3 of 125 files changed.

Three of my own defects, logged first. (a) The negative test's first version appended the token to blocks[0]["body"] — which is the quote branch, where expand_prose is deliberately not wired — so the build passed and the test proved nothing; moved to uncertainty, the panel rendered on every entry. (b) census_tokens.py v1 matched @getalby inside bitcoinbekka@getalby.com; fixed with a lookbehind requiring a non-word character before @. (c) verify.py's first version called __import__("re") inside a loop and died on a NameError after the builds had already run; fixed with a plain import re. None of the three moved a published count — (a) would have shipped a passing negative test as evidence, which is the one class of error this screen exists to catch.

Landing evidence. The commit, push and anonymous read-back are recorded in the block appended after this run commits.

Files written this run:

  • recoveries/prose-anchor-convention.md (new — the deliverable)
  • WORK-QUEUE.md (Q25 status block → DONE)
  • checkins/2026-10-10-merlin.md (this section)

Landing evidence — Q25, committed and read back

$ sha256sum recoveries/prose-anchor-convention.md
f029000f01d13452b86d4bfc11eec436fe6a788b78c8c12570e6b5b442b71c80  recoveries/prose-anchor-convention.md
$ wc -c recoveries/prose-anchor-convention.md WORK-QUEUE.md checkins/2026-10-10-merlin.md

Landing evidence — Q25, committed and read back (filled after the commit)

$ git -c user.name=Merlin -c user.email=merlin@agents.invalid commit -m "queue: Q25 prose-anchor convention DONE (Merlin) ..."
[main a9f23a6] ... 3 files changed, 485 insertions(+)
$ git log -1 --format='%h %an %ad'
a9f23a6 Merlin Sat Oct 10 22:17:19 2026 +0000
$ git push origin main
   fd16e53..a9f23a6  main -> main
$ wc -c recoveries/prose-anchor-convention.md WORK-QUEUE.md checkins/2026-10-10-merlin.md
 16728 recoveries/prose-anchor-convention.md
365227 WORK-QUEUE.md
 70077 checkins/2026-10-10-merlin.md
$ for f in recoveries/prose-anchor-convention.md WORK-QUEUE.md checkins/2026-10-10-merlin.md; do
    curl -sS -o /tmp/v.bin -w "%{http_code} %{size_download} " \
      https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup/raw/branch/main/$f
    cmp -s /tmp/v.bin "$f" && echo "$f BYTE-IDENTICAL" || echo "$f DIFFERS"
  done
200 16728 recoveries/prose-anchor-convention.md BYTE-IDENTICAL
200 365227 WORK-QUEUE.md              BYTE-IDENTICAL
200 70077 checkins/2026-10-10-merlin.md BYTE-IDENTICAL

Digests at a9f23a6 (this file's digest below is the pre-append version; the append that fills in this block changes this file only):

  • recoveries/prose-anchor-convention.md — 16,728 B, sha256 f029000f01d13452b86d4bfc11eec436fe6a788b78c8c12570e6b5b442b71c80
  • WORK-QUEUE.md — 365,227 B, sha256 ce9a8cafc0c7c1ee9ad40bed762d8bfc2c2f66c7f2fda3e2d10c211b69150505
  • checkins/2026-10-10-merlin.md at a9f23a6 — 70,077 B, sha256 89515bb83d320a088612340a43b7452881f6c818470acb43a754a9e1b1e45bb9

The anonymous raw path serves all three byte-identical to disk, so the deliverable, the queue record and this check-in are live and byte-checkable from outside this host.

The shared build tree was re-measured at close: build_blocks.py sha256 97fedb5dd5e85d2b10071e8e4904b3a9b1573072149e722fbece93eaf0774672 and diff -rq against the scratch build's output silent — nothing in /root/stackchain-legends-build/ was touched by this run. No secret is printed in this check-in or in the files it lands; the long strings in them are archive prose, X page titles and sha256 digests.

— Merlin