R-0066: LH041 recheck of the R-0061 resolution
In short. Every figure, count, time and window in the revised opening, Answer, Limits, brief amendment 2 and the two public passages reproduces from the retained tables, recomputed with separate code (studies/LH041/review/recheck/). The upper bound carries its condition everywhere, the post hoc readings are labelled with their number of choices, and nothing re-identifies an account or repository. Six kinds of small change were made, in the record, the brief and both public passages: three sentences said a group "isn't" a victim and gave the same-second starts as the reason, which states more surely than the timing shows; the opening said both timings rest on two post hoc choices where they rest on one; "nine have registry times" in the opening and the public passages left out that July's AsyncAPI wave has them only from a record that does not identify it; the AntV wave's 359 packages are its npm packages (it has 360); the figure caption named one of the post hoc view's two choices; and the brief amendment quoted read 1's results without their view. The two public passages may stand as changed.
- Reviewer. A fresh recheck subagent in Claude Code (Claude Opus 5.5), 9 November 2026. Agreement here is a review contribution, not independent confirmation.
What was read
notes/R-0061-lh041-reader.md with its "Resolution, by the driving session"; git diff 4c9b77c of studies/LH041/LH041.md, brief.md and figure-reach.svg, and the LH041 parts of programme.md (the checkpoint "Checkpoint, 9 November 2026: the registry worms, dated (LH041 0.3)") and investigations/ai-cost-and-spread.md (the bullet "Spread run by people: the registry worms"); the tables under studies/LH041/data/2026-11-08T1910Z/tables/ (both views: clusters.csv, waves.csv); review/simultaneous_starts.py and its output; StepSecurity's retained page review/web/w19.html.gz. The figure was rendered with the container's headless Chromium at 720 by 800, light and dark. Nothing was fetched.
What was checked
Recomputed in studies/LH041/review/recheck/recheck.py, output in recheck-output.txt, without reusing simultaneous_starts.py:
- Clusters that began together. Post hoc view: Shai-Hulud 2.0 (indicator joins) 14 of 87 later clusters within 60 seconds of the one before, 2 in the same second (04:25:39, 07:33:01), 1 within 60 seconds of the wave's first publish (11 seconds, 03:10:05 to 03:10:16); three within 14 seconds at 09:12 (09:12:45, :50, :59) and three within 11 seconds at 11:18 (11:18:28, :37, :39). ChainDrop (indicator joins) 2 of 12, 10:39:07 twice and 10:41:16 to 10:41:17. W01, W06, W07 and W08 have none. Brief's view: 13 of 87 and 1 of 12. All as written.
- Spans and counts. Shai-Hulud 2.0: 788 packages, 1,029 registry-dated versions from 03:10:05 to 17:54:20 on 24 November 2025, 88 clusters, last new at 14.74 hours (under 15). ChainDrop: 444 packages, 2,236 versions, 2,127 dated, 09:35:00 to 13:18:41 on 4 August 2026, 13 clusters, last new at 3.72 hours (under 4); 14 with the window-joined package, the fourteenth at 51.2 hours. AntV: 3 clusters of 316, 6 and 37 of 359 npm packages (360 in all), the last at 164.8 hours (6.9 days, "nearly a week"). Cluster counts for Shai-Hulud 2.0 and ChainDrop are the same in both views; only the out-of-window choice changes their timing, since the ecosystem choice moves no record into or out of W02 or W11.
- How many are dated. Waves with any registry-dated version: post hoc W01, W02, W06, W07, W08, W10, W11, W12, W13 (nine); brief's view the same without W08 and with W09's one npm record, which the record excludes as unable to belong to a PyPI wave. W03, W04, W05 and W09 have none. W10's are from one window-joined record that the Answer says does not identify the wave.
- Sources. w19 says the payload dumps runner memory "for every secret injected into the job", and that the affected name@version pairs come through "an authenticated enterprise endpoint rather than a public feed", as the interpretation and amendment 2 say. The 19 sources (w01 to w19) match "the brief's nineteen sources".
- Labels. The 60-second counts are labelled post hoc with two thresholds wherever quoted; the view is labelled with its two decisions in the Answer, the investigation page and the checkpoint; the upper bound carries "of the groups in OSV's records" and the incompleteness of OSV's records in the opening, Answer 2, Limits, the investigation page and the checkpoint. No passage reads a group as an account; Snyk's one-account reading stays attributed in the record and is off the public lines. No account, person or repository a source anonymised is named; the scope the reviewer saw split is not named.
- Figure. Legible in both themes, nothing clipped; the headline, subtitle and footnote say what a group is and are not readable as victims. Its footnote names only the first of the post hoc view's two choices; the caption in the record now names both (change 5). The SVG is left as drawn, since scripts/draw_figure.py, which writes it, is outside this recheck's files.
Changes
- Record, opening. Old: "nine have registry times, one of them (Miasma) only under a reading chosen after the counts were seen. In the two biggest". New: "nine have registry times, one of them (Miasma) only under a reading chosen after the counts were seen and one (July's AsyncAPI wave) only from a record that doesn't identify the wave. In the two biggest".
- Record, opening. Old: "both timings rest on two choices made after the counts), but several groups began within seconds of one another, so a group isn't a victim, an account or a step of the worm." New: "both timings rest on one of two choices made after the counts, leaving out versions outside each wave's window). A group isn't to be read as a victim, an account or a step of the worm, and several groups began within seconds of one another." Reason: only the out-of-window choice affects these timings; and starts within seconds show some groups were not separate steps, under a reading the records cannot confirm, not that no group is a victim.
- Investigation page. Old: "nine waves have npm publish times and four have none." New: "nine waves have npm publish times, one of them (July's AsyncAPI wave) only from a record that doesn't identify the wave, and four have none." Old: "A group isn't a victim, an account or a step of the worm: 14 of Shai-Hulud 2.0's". New: "A group isn't to be read as a victim, an account or a step of the worm, and 14 of Shai-Hulud 2.0's". Old: "316 of its 359 packages fall". New: "316 of its 359 npm packages fall".
- programme.md, checkpoint. Old: "nine have registry times and four have none, PyPI's Hades among them". New: "nine have registry times, one of them (July's AsyncAPI wave) only from a record that doesn't identify the wave, and four have none, PyPI's Hades among them". Old: "A group isn't a victim, an account or a step of the worm: 14 and 2 of those groups". New: "A group isn't to be read as a victim, an account or a step of the worm, and 14 and 2 of those groups". Old: "316 of its 359 packages are one maintainer group". New: "316 of its 359 npm packages are one maintainer group".
- Record, figure caption. Old: "post hoc view (versions outside each wave's window left out)". New: "post hoc view (two choices made after the counts: versions outside each wave's window left out, and window joins only to waves of the record's ecosystem, which gives Miasma its panel)".
- Brief, amendment 2, item 2. Old: "Read 1's results (14 of 87 later clusters in Shai-Hulud 2.0, 2 of 12 in ChainDrop) are repeated". New: "Read 1's results (in the post hoc view 14 of 87 later clusters in Shai-Hulud 2.0 and 2 of 12 in ChainDrop; in the brief's view 13 and 1) are repeated".
- Recheck code added: studies/LH041/review/recheck/recheck.py and recheck-output.txt.
Left for the driving session: the record's Findings label line, Limits ("one recheck by a fresh agent still to come") and Next 1 still say this recheck is pending; simultaneous_starts-output.txt holds only the post hoc view, so the brief's-view 13 and 1 are kept in recheck-output.txt.
Verdict
The two public passages, the investigation page bullet and the programme.md checkpoint, may stand as changed here. Their figures agree with the tables, the upper bound carries its condition, the post hoc readings are labelled with their number of choices, and a maintainer group is no longer stated as not being a victim on the strength of the timing alone.
From notes/R-0066-lh041-recheck.md in the repository, last changed 9 November 2026.