diff --git a/WORK-QUEUE.md b/WORK-QUEUE.md
index 2489bcd..69c9707 100644
--- a/WORK-QUEUE.md
+++ b/WORK-QUEUE.md
@@ -5605,6 +5605,19 @@ two corrections logged, one subject-import hazard measured. 2026-10-12 11:5xZ (t
the Q20 ladder printed with the `
` → space clause explicit, one named class per row, and a per-row
reconciliation against Q21's binding verdict. **Claimed/offered to zephyrus-sparkborn** (his Ask this tick);
declining with a reason remains legitimate under Q7.
+
+**Status: DONE 2026-10-12 — `recoveries/excerpt-placement-nonmagazine.md` (33,645 B / sha256
+`d16761a827dfe5de9868dc0e1e513153d6acaa802983000959172d873de98c84`), Merlin (claimed by this pipe,
+not by zephyrus, whose 10-12 check-in declined it).** Population re-enumerated from the live index
+(200 / 34,488 B / `4f764ef4…`, 2026-10-12T13:46:28Z): 30 entries, 50 excerpts, 35 distinct anchors,
+all anchors HTTP 200. Final tally: **30 `literal` / 5 `normalised-literal` / 7 `elided` / 4
+`paraphrase` / 4 `unreadable`**; placement measured on 42 rows over 26 of 30 entries — mean
+fraction **0.2294** (vs the magazine class's 0.4735), 21 of 42 in the first fifth. The Q21 join is
+exact: 42 `bound` = the 42 non-paraphrase rows, 4 `mis-bound` = the 4 `paraphrase` rows (the
+known home-page defect on `block-25/88/89/90`), 4 `unanchored` = the 4 `unreadable` rows. Two of
+this run's own defects are logged first in the deliverable: the source-type `unreadable` rule
+(23 non-article rows re-graded) and three successive URL-tokenisation failures fixed before the
+join closed. Scratch tree `/root/crucible/q41/`; scripts and logs under `out/`.
- **Q7, measured, and the disk no longer holds this lane:** the unclaimed executable set was empty before this
tick (Q37 is the pipe's), so one archive item is opened (Q41) rather than invented; Q9/Q13/Q19 and the Helm
adoption stay gated. Free space on this host is **960 MB of 154 GB (100% used)** at 13:19Z — up from 12 MB at
diff --git a/checkins/2026-10-12-merlin.md b/checkins/2026-10-12-merlin.md
index b259a39..2bf62f7 100644
--- a/checkins/2026-10-12-merlin.md
+++ b/checkins/2026-10-12-merlin.md
@@ -695,3 +695,100 @@ sides).
— Merlin
+---
+
+## Run 7 — Q41: excerpt fidelity class and placement, the 30 non-magazine entries
+
+### Did
+
+Took **Q41** — the top unclaimed, executable item (zephyrus's 10-12 check-in declined it:
+*"Q37 is the only open executable item and it is claimed by the pipe … nothing unclaimed exists
+today, so I take nothing"*). Population, method and finish line are Q41's own spec; the
+deliverable is a new file, not an edit of a closed one.
+
+- **Population re-enumerated from the live index** (`https://alexanderwhitestone.com/stackchain/blocks/`,
+ HTTP 200 / 34,488 B / sha256 `4f764ef4dfb9c08b2654ff0783550d20ad1bb7a31cb0c32070974a5fe451557e`,
+ read 2026-10-12T13:46:28Z): 121 slugs = 8 `block-*` + 22 `event-*` + 91 `magazine-*`; this run
+ took the 30 non-magazine entries. **50 excerpts** (42 `From the sources`, 8 `The block`),
+ **35 distinct anchors**, all fetched **HTTP 200** (`curl -sS -L -o … -w '%{http_code} %{size_download}'`,
+ 2026-10-12T13:46:13–13:47:00Z). Anchor hosts: `www.stackchainmagazine.net` 11, `x.com` 12,
+ `raw.githubusercontent.com` 5, `web.archive.org` 2, `github.com` 2, `bitcoinmagazine.com` 1,
+ `europeanbitcoiners.com` 1, `podcasts.apple.com` 1.
+- **Deliverable:** `recoveries/excerpt-placement-nonmagazine.md`, **33,645 B**, sha256
+ `d16761a827dfe5de9868dc0e1e513153d6acaa802983000959172d873de98c84` — screen header, rules (the
+ Q20 ladder with the `
` → space clause explicit, as Q41's finish line requires), counts, 50
+ per-row rows (fixed column order `entry | seq | excerpt | class | normalisation | source class |
+ space | offset | fraction | occ | anchor | Q21 verdict | settling evidence`), aggregates,
+ findings, limits, and this run's own defects. Scratch tree `/root/crucible/q41/`; scripts
+ `fetch.py`, `classify.py`, `place.py`, `regrade.py`, `s3e.py`, `reconcile.py`, `aggregate.py`,
+ `emit.py`; logs under `out/`.
+- **Final tally:** **30 `literal` / 5 `normalised-literal` / 7 `elided` / 4 `paraphrase` /
+ 4 `unreadable`** (of 50). Placement measured on **42 rows across 26 of 30 entries**: min 0.0,
+ max 0.8048, **mean 0.2294** — against the magazine class's Q20 mean of 0.4735. Fifths:
+ 21 / 10 / 9 / 1 / 1. 8 excerpts occur more than once in their body; placement is
+ first-occurrence and the occurrence count is printed per row.
+- **The Q21 join is exact, row for row:** the 42 `bound` rows = 30 literal + 5 normalised-literal +
+ 7 elided; the 4 `mis-bound` = the 4 `paraphrase` (the known home-page citation defect on
+ `block-25/88/89/90`, already carried by Q21 and Q4 — **no new archive-side wording fix follows
+ from this item**); the 4 `unanchored` = the 4 `unreadable` (the `The block` testimony quotes with
+ no anchor printed). 50 = 42 + 4 + 4.
+- **Two of this run's own defects, logged first in the deliverable:**
+ 1. The source-type rule: stage 2 classed the 23 non-article-source rows (X posts, SIP text
+ files, repo pages, the podcast page, Wayback captures) `unreadable` on source type alone —
+ Q21 graded every one of them `bound` with the text found in the detagged body, so they were
+ re-graded under the same ladder with the source class named in the row. `unreadable` is
+ reserved for the two cases Q41's finish line names: no anchor, or a non-200 target.
+ 2. The URL-tokenisation rule failed three times before it held: `https?://\S+` swallowed the word
+ after a bare URL; stopping at a quote character still failed when a URL was followed by a
+ closing quote (`…down? https://t.co/Go9kd8c6dh"`); and tokenising at S0 before quote
+ normalisation left one character unmatched. The final rule (run stops at whitespace **or** a
+ quote, applied at **S1** on both strings) resolves the witness row —
+ `event-2022-08-21-block-1414-becomes-the-first-million-target` seq 1, where the entry prints
+ the expanded `x.com/i/spaces/…` URL and the page carries the `t.co` short link:
+ `paraphrase` under the broken rules, `normalised-literal` (URL-tokenised, S3) under the fixed
+ one.
+- **Queue updated:** Q41's block now carries the DONE status line; the offered-to-zephyrus
+ sentence is kept as history. No new item opened: Q37 stays the pipe's, and Q9/Q13/Q19 and the
+ Helm adoption stay gated on Alexander.
+
+### Blocked
+
+Nothing in my lane. Same standing gates: Q9 (checksum handover), Q13 (the wording fixes), Q19
+(wizard onboarding) and the §4 `cp` adoption are Alexander's calls. Host disk: 931 MB free of
+154 GB at 13:46Z, measured (`df -h /root`); no action taken from this lane.
+
+### Next
+
+- Offer Q41's rows file and method to zephyrus as a second pass — the non-magazine half his lane
+ can recompute independently (his Q20 sample agreed with the population verdict).
+- The two standing Helm candidates remain un-opened and wait on Alexander: the post-`cp`
+ verification run of the deployed pair, and a stronger behavioural destination guard.
+- Keep the reply-reading and independent-verification discipline on whatever the counterparty
+ lands next.
+
+### Ask
+
+Alexander: nothing blocking. The same two standing items — the **§4 adoption** (collector
+`4e45021d…` + gate `9b09f328…`, a two-file `cp`; Q40 showed the shipped gate has no
+subject-selection path at all, so none of Q31–Q39's protection is in force in `/root/.helm/bin/`
+until it lands) and the **`manifest_match` pin** (stale since 2026-10-08; a static render cannot
+say so).
+
+### Evidence table
+
+| item | value | how obtained |
+|---|---|---|
+| index | HTTP 200 / 34,488 B / sha256 `4f764ef4…` | `curl -sS -L -o index.html -w '%{http_code} %{size_download}'`, 2026-10-12T13:46:28Z |
+| 30 entry pages | all HTTP 200 | `fetch.py`, clocks 13:46:29–13:46:32Z |
+| 35 anchors | all HTTP 200 | `fetch.py`, clocks 13:46:13–13:47:00Z |
+| deliverable | 33,645 B / sha256 `d16761a827dfe5de9868dc0e1e513153d6acaa802983000959172d873de98c84` | `wc -lc` + `sha256sum` on the written file |
+| final tally | 30 / 5 / 7 / 4 / 4 of 50 | `aggregate.py` over `out/rows.json` |
+| placement | n = 42, min 0.0, max 0.8048, mean 0.2294, fifths 21/10/9/1/1 | `aggregate.py` |
+| Q21 join | 42 bound / 4 mis-bound / 4 unanchored = 42 / 4 / 4 | `reconcile.py` against `recoveries/excerpt-binding-audit.md` |
+| host disk | 931 MB free of 154 GB | `df -h /root`, 2026-10-12T13:46Z |
+
+Nothing secret is printed. Every reading above is from this host, this run, and is reproducible
+from the scripts named.
+
+— Merlin
+
diff --git a/recoveries/excerpt-placement-nonmagazine.md b/recoveries/excerpt-placement-nonmagazine.md
new file mode 100644
index 0000000..11385a2
--- /dev/null
+++ b/recoveries/excerpt-placement-nonmagazine.md
@@ -0,0 +1,181 @@
+# Excerpt fidelity class and placement — the 30 non-magazine entries (Q41)
+
+> **Screen.** Every row carries the anchor URL with its HTTP status, byte size, sha256 and fetch
+> clock, or the word `unverified`. All readings are from this host, 2026-10-12 13:46-13:5xZ.
+> Nothing secret is printed. Scratch tree `/root/crucible/q41/`.
+
+## Rules (stated before any test)
+
+- **Population / sample rule:** every published non-magazine entry — **30 of 30**
+ (8 `block-*` + 22 `event-*`), no sampling. **50 excerpts** (42 `From the sources`,
+ 8 `The block`). The 91 magazine entries were Q20's population and are outside this item.
+- **Enumeration:** `https://alexanderwhitestone.com/stackchain/blocks/`
+ (HTTP 200 / 34488 B / sha256 `4f764ef4dfb9c08b2654ff0783550d20ad1bb7a31cb0c32070974a5fe451557e`, read 2026-10-12T13:46:28Z) by the href matcher
+ `/stackchain//` filtered to `^(block|event|magazine)-`; the magazine class is dropped here.
+- **Excerpt unit:** the quoted material inside the entry page's ``, with the
+ `` citation display text removed — the same unit Q20 and Q21 used. The citation URL
+ printed inside the blockquote is the citation, not quoted material.
+- **Detag / normalisation ladder (printed so the numbers are re-runnable; the `
` clause is
+ explicit, as Q41's finish line requires):**
+ - `S0 raw` — strip `