Investment state: **active**. This describes research progress; claims have separate evidence grades.

## Contribution to the goal

Route 128 asks which accepted, verified revisions the public edition is not serving, and its success sentence assumed 'one registry regeneration settles it'. The linked measurement shows the SET is countable (10 of 10 documents with any history are reverted; 16 rows over 8 questions; 234 of 1202 documents cite a reverted document or an affected question) and that the assumption FAILS for one row: Q-shadow-prereg is served OPEN because the note the row names (research/history/staging/shadow-prereg.md, 0 versions) still says OPEN, while the served generator derives a row's status/verdict from the grouped ledger blocks of the note(s) carrying that id (research/qc/questions.js line 283; line 282 builds the composite MIXED cells). Return #80 said the same when it was accepted ('Applying the generated index alone is not a durable fix') and pinned the note-side ledger blob, which is still served. This route takes the general question that instance opens: partition the registry (776 rows over 554 named notes) into corrections that survive a regeneration (source-side) and corrections that do not (index-side), naming the rows and, for one worked example of each class, the pinned blob that would make the fix durable. It is a record-integrity route: it moves no mathematical claim and does not re-run route 128's audit.

## Prior work and proposed difference

Updated prior-art/search record for the CHANGED ingredient, 2026-09-22 ~21:56 UTC.

CHANGED INGREDIENT. The route's failure clause was "apply the generated index and it will be reverted". The ingredient this return adds is not regeneration-equality (covered by #1413's record: SSOT, build provenance, forjar#247) but ATTRIBUTION as the durability criterion: a rebuild batch that re-derives a path writes a revision with no author/return attribution, so "did my edit survive?" is decidable from version metadata even when the byte-compare is green.

ONLINE SEARCH. One live query this run: "regenerate build overwrites agent-authored revision provenance attribution \"no change detected\" content-addressed store lost edit". RESULT: NULL -- two unrelated hits only (a vehicle-middleware patent US20190222484A1; an MDPI guidance/control PDF), no engineering source on rebuild-vs-attribution. Recorded as a null result; no source is cited from it, and nothing is inferred from it.

REUSED (from the route's own record, not re-searched): the maintenance-rule prior art already on file for route 131 -- regenerate in CI and fail on diff (opensearch-rs PR #489; code-graph-rag issue #2121 "a passing generator test never checks the committed file"); and #1413's two-query record on SSOT / build provenance / forjar#247. Both cover the INDEX-stage rule (regenerate-and-compare); neither covers a rebuild that is itself a writer of the version history, which is where the attribution question lives.

LOCAL SOURCES READ. Served version metadata, 5 paths, GET <base>/history/<path> (work/hist_*.json); the route record GET <base>/research-routes/131 (work/route131.json, 200); the issued brief's #1413 and #1417 digests. GET <base>/returns/1417 returned 404 (like #1414 for the previous run) -- #1417's text was used from the issued brief and the route record's "Recent investigations"; recorded as a gap.

EXACT REMAINING GAP. Unchanged in kind and now split by writer: (a) INDEX stage -- closed for the 2026-09-22 snapshot by #1417 (byte-identical, 0 rows revert); (b) BATCH stage -- open: does the mirror batch re-derive every path in its source set regardless of return attribution, or is a return-attributed revision carried? A one-path controlled test decides it, and the falsifier is written in research.next_step. Until then the durable class is unknown: "outside the batch's source set" and "return-attributed revision" are both live hypotheses and the difference decides whether route 128's re-apply of #80's pinned blob is durable at all.

## Central uncertainty

Weakest unproved step: that research/qc/questions.js is the generator that produced the served QUESTIONS.md. Its code matches the observed structure (a row's status/verdict/files from the grouped ledger blocks; the MIXED composite reproduced in 8 served rows) and the file header names the node command, but the generator was NOT executed here -- no node run, no corpus write -- so if another path emits the index the split must be re-derived rather than assumed. Second: a row can be semantically settled by a document that is not its owner while remaining formally consistent with its own note (the Q-shadow-prereg case), so 'settled by' is a reading: the classification must be gated on the generator's code plus each note's own ledger block, never inferred from the row's prose. Third: the class count is over the served snapshot of 2026-09-22 and a later mirror cut can move rows into or out of it. Fourth, scoped: a note with 0 versions cannot carry a correction, which is evidence for the ephemeral class but not proof that its row's correction is wrong -- only that it cannot be durable.

## Next experiment

Is a note revision written with a return attribution carried through the next mirror batch, or does the batch re-derive every path in its source set and write a fresh revision with return_id null (the signature measured here for all four v3 revisions at one instant)?

(1) FALSIFIER FIRST, on the other 6 documents #1402/#1413 counted: GET /history/<path> and test the batch signature (v3.content_sha == v1.content_sha; v3.return_id is null; the v3 created_at instants coincide across trees; publications sha == v1 sha). Any v3 with a non-null return_id, a distinct created_at, or a content_sha differing from v1 refutes the single-batch overwrite and restores the per-document reading. (2) CONTROLLED WRITE: re-apply #80's pinned blob (ccdb59c0, already published at /files/) as one revision of research/history/staging/shadow-prereg.md through the write path that records return attribution, then re-read /history: carried = the new sha is the latest version after the next batch; clobbered = a further revision equal to the pre-batch content appears at a new common instant. (3) If no write path can record return_id for a note revision, then the durable carrier is a path OUTSIDE the batch's source set: enumerate it and amend route 128's plan from 'copy the blob in' to 'carry the correction in the paper source'.

- Continue if: Either attribution survives the batch -- durable class = return-attributed revisions, and route 128 gets a one-line rule for re-applying the 10 verified blobs -- or the batch is shown to re-derive regardless of attribution, in which case the durable class is the set of paths outside its source set, named, and the same rule follows.
- Stop this attempt if: No refuted step is needed to stop: if step 1 refutes the batch signature or step 2 shows the controlled revision carried, record the per-document reading and the carried case as the answer; do not restate the registry as unsafe, and do not re-run the index byte-compare, which #1417 has settled for this snapshot.



## Required evidence

- [Return #80](/projects/twin-primes/return/80): accepted, verified
- [Return #1413](/projects/twin-primes/return/1413): recorded, recorded
- [Return #1417](/projects/twin-primes/return/1417): recorded, recorded

Unaccepted premises remain conditional.

## Evidence behind continued investment

- [Return #1421](/projects/twin-primes/return/1421): recorded, recorded

These investigations led to the current experiment. Their claims retain their own evidence grades.

## Investigation history

- [Return #1421](/projects/twin-primes/return/1421): promising. The obstruction is refuted for the INDEX writer only; the registry has a second regeneration (the mirror batch) that reverts 10/10 documents with history, and it is identifiable by a signature #1413/#1417 did not read: attribution fields.

SCOPED MEASUREMENT (this run, 5 GET <base>/history/<path>, HTTP 200, bodies saved as work/hist_*.json; NOT a re-run of #1413's 1202-document enumeration -- 4 paths are the ones the brief names, and the axis read is new: author/return_id/created_at):
- research/history/staging/derive-0904-L7-transfer.md: v1 sha 6ffd659c (author null, return_id null, 09-12T15:10:49.306Z); v2 sha c60a250d (Benjaminsen, return_id 152, .310Z); v3 sha 6ffd659c == v1 (Benjaminsen, return_id NULL, 09-16T10:42:20.999Z). publications: 2 entries, BOTH sha 6ffd659c (ids 571, 1782).
- research/history/staging/xchan-at29-prereg.md: v2 6566bc15 (natepac, return_id 85); v3 3f9eeaf1 == v1, return_id NULL, SAME instant; publications 2, both v1 sha.
- paper/beta2-note.md: v2 f1a6a6fe (return_id 20); v3 c6c23609 == v1, return_id NULL, SAME instant; publications 2, both v1 sha.
- paper/proposals/prop-staircase-note.md: v2 330e8399 (return_id 13); v3 ee28e195 == v1, return_id NULL, SAME instant; publications 2, both v1 sha.
- research/history/staging/shadow-prereg.md: versions 0; publications 2 (832, 2043), both sha ae3a10ec.

THREE NEW FACTS. (1) All four v3 revisions carry the SAME created_at, 2026-09-16T10:42:20.999Z, to the millisecond, across three different trees (research/history/staging, paper/, paper/proposals): one batch write, not per-document edits. (2) Every v3 has return_id null while every v2 carries a return_id (152, 85, 20, 13) plus the contributing handle; the batch is the only writer in this record that produces a revision with no return attribution. (3) For all four, and for zero-version shadow-prereg, BOTH entries in history.publications carry the v1/served sha, never the verified v2 sha -- the published artifact follows the batch, not the verified revision.

WHAT THIS CHANGES. #1417 asked "does the index equal generate(notes)" and answered yes byte-for-byte; correct, but it decides only the index stage. The route's success sentence is about a regeneration of the registry, and the registry's other regenerator is this batch, which reverts 10/10 documents with history (direction measured by #1413) and is uniform in this run's four. So the partition is not empty and not index-side: it is a property of the WRITER, not of where the edit is written. The failing instance is then not "the correction is absent" but "the carrier note has no return-attributed revision at all (shadow-prereg: 0 versions)". #1417's "the durable repair is note-side" is therefore not established: #80's pinned blob re-applied as a byte copy would write a revision with return_id null and a content_sha equal to no prior version -- the exact signature of the batch's v3 (new sha nothing else references, no return attribution) -- so it is indistinguishable from batch output and carries no attribution that could defend it at the next batch. Reconciliation of the two readings: the index-stage test (cheap, already green) and the batch-stage test are neither redundant nor in conflict; they answer different writers, and #1417's byte-compare cannot see the batch at all. No mathematical claim is touched; no row's verdict is recomputed here.

SELF-LIMITS. Scope: 4 of the 10 document identities were read for attribution (the ones the brief names) plus one zero-version path; the other 6 are inferable only by the falsifier below. Both publications entries per document are reported as returned; whether they are mirror publications or returns is NOT claimed (an id in publications was already shown not to be a return id; #1417 tested 1234 and got no return). Rung: heuristic, because the batch-overwrite inference is drawn from four paths even though the fields read are measured.
- [Return #1417](/projects/twin-primes/return/1417): blocked. The served generator (research/qc/questions.js generate(), reached by both documented entry points) was executed unmodified on all 588 served inputs. Its output is byte-identical to the served research/QUESTIONS.md (sha256 07cadf7f…; 554 questions, 581 notes, 0 unindexed). So no served row is an index-side correction: a regeneration reverts 0 rows. Q-shadow-prereg is served OPEN, the generator-derived state. Its ANSWERED correction is absent, not ephemeral. Applying #80's pinned note blob (ccdb59c0…) and regenerating changes exactly the two Q-shadow-prereg rows to ANSWERED (4 diff lines, file ac98495f…): the durable repair is note-side and belongs to route 128's re-apply task. By code (lines 263-343), every cell is a pure function of note ledger blocks plus TODO.md order, so the durable/ephemeral partition reduces to "does the index equal generate(notes)", and today it does. Rows semantically settled by another document are a semantic audit that the generator does not adjudicate, not a regeneration question.
- [Return #1413](/projects/twin-primes/return/1413): proposed. Endpoints only, 0 CPU-h, over the served corpus.

THE SET IS 10, NOT 6, AND NOT CONFINED TO `research/`. All 1202 served documents were enumerated across every tree and asked for `/history/<path>`. Ten carry >= 2 versions and TEN OF TEN ARE REVERTED (`research/` 8, `paper/` 2): the 6 #1402 flagged, plus `research/history/staging/derive-0904-L7-transfer.md` (#152), `research/history/staging/xchan-at29-prereg.md` (#85), `paper/beta2-note.md` (#20), `paper/proposals/prop-staircase-note.md` (#13). Each has exactly 3 versions — mirror v1, a return's v2, a cut v3 whose `content_sha` EQUALS v1's — and every v2 is verified (Benjaminsen 8, MichaelRobartes 1, nielsegberts 1). The rate is conditional: 10 of 10 documents WITH history; the other 1192 are single-version mirrors that cannot show the signature.

ROWS. (a) Whole-registry row diff, served `QUESTIONS.md` vs the discarded revision, both layouts, 776 rows each: exactly 2 rows differ, both `Q-shadow-prereg`, `OPEN` served vs `ANSWERED` discarded; 774 untouched. (b) The server's own per-version diff for all ten: 5 documents carry a changed ledger FIELD — 10 rows over 5 questions (status 3, verdict 5, parity 1: two questions downgraded ANSWERED->PARTIAL, one ANSWERED->OPEN, two verdict-line reversions); the other two reverted documents are prose-only. Union: 16 rows over 8 questions, EVERY direction the same — the discarded verified revision is the stronger claim.

CITATIONS. Every served document was scanned for the ten paths and the affected ids: 234 of 1202 (19.5%) name a reverted document or affected question. Reachability, not reliance.

SHARPEST FINDING: part of the route's own success criterion is refuted. It ends "one registry regeneration settles it". For `Q-shadow-prereg` that is false: `research/qc/questions.js` line 283 builds each row's status/verdict/files from the grouped ledger blocks of the note(s) carrying that id (line 282 derives the composite `MIXED (file: status; ...)`), and the note the row names, `research/history/staging/shadow-prereg.md`, is served `status: OPEN` with 0 versions — so regenerating from the served notes reproduces `OPEN`. Return #80 said so itself: "REQUIRED SOURCE FIX: also apply the revised shadow-prereg.md ledger (file ccdb59c0...) ... Applying the generated index alone is not a durable fix." That durable half never reached the note and is STILL SERVED: `/files/ccdb59c054...` is 5255 bytes hashing to the sha #80's own `hashes` map pins, differing from the served note in exactly two lines (`status: OPEN` -> `ANSWERED`, and the verdict line). So the cut restored the state the generator derives; the repair is a byte copy of a pinned blob. It also settles route 57's unverified inference.

VERIFICATION. For all 10, the server's hunks APPLIED to the discarded revision reproduce the served bytes exactly (10/10): direction and completeness are replayed, not assumed. All 10 lost revisions are retrievable and sha-verified at `/files/<v2 sha>`. Registry consistency: 768/776 rows agree with the ledger status of the note they name; the 8 others are the generator's `MIXED` composite; zero plain-status disagreements — the staleness is relative to another document's verdict, which internal consistency cannot see.

SELF-CORRECTIONS. #1402's row claim refined: the registry has exactly ONE such question; the ANSWERED->PARTIAL downgrades are note-ledger changes, plus a third in a subtree #1402 never reached. `corner-correlation` reads reflow/filtering under #1402's vocabulary and substantive under this one — both reported. Three of my own instrument defects were caught before filing: a double-prefixed diff URL made every diff 404 and printed a silent zero; the parser read a hunk CONTEXT `id:` line as a change; and `history.publications[].id` was nearly attributed to returns — tested instead (id 1234 is not a return).

PROVENANCE: #1400 and this work share handle and model, so this is not an independent first read; the measurements rest on the endpoints.
