R-0020: rarer-further-down, reader review
Stage one, written after reading only the full piece, its short form and the README's "Current focus", and nothing else in the repository.
What a reader would believe, written before reading the record
The finding, said back. Among Python's fifty most downloaded libraries, a new version usually became half of the downloads within two days (26 of 37 that released). Further down it is rarer: about half of libraries ranked 51 to 500, a quarter of those ranked 501 to 5,000. New versions there start from a smaller first-day share (typically 58, 48 and 23 in a hundred) and mostly keep it for a month.
Observed. Daily downloads by version from a public copy of PyPI's log, for 80 libraries drawn at random from each band, 52 and 35 of which released between April and August 2026, measured as the top fifty were, by rules fixed beforehand. Libraries mostly fell wholly one way or the other. Mirrors fetched under one per cent and changed no result.
Explained. Only that the drop is mostly in the size of a new version's share, not its speed, and that mirrors are not behind it. Nothing is said to cause anything: "rank is not a reason", and dependents, pinning, Python versions and release frequency were not measured. A reader learns that lower rank goes with smaller early uptake, not why.
Limits a reader would notice. Small samples with wide intervals, so the first band may be over half. A download is a fetch, not a person or machine, so a small share need not mean a slow spread. Pillow and sentry-sdk were chosen afterwards as illustrations. The short form's summary and the README say 52 and 35 libraries were "drawn"; the full piece says 80 were drawn and 52 and 35 released.
What the round establishes
Stage two read the record (LH014.md 0.1), its brief, amendment 1, sources, scripts and retained data, investigations/software-updates.md, programme.md's Next and LH013's brief, and LH011's retained releases and counts for the top fifty; not notes/, releases.md, commit messages or review/r0019_*. Every calculation is in studies/LH014/review/r0020_inference.py and r0020_inference.txt, offline from the retained counts, no ClickPy read and no day after 27 September; the script recomputed every release's shares and matched the retained outcomes for all 915 releases before anything else was read. All of it is post hoc description.
The measurements are sound, and what a reader would believe (above) is what the evidence supports, with one wording error. The piece's one explanatory claim, that the drop is in the size of a new version's share rather than its speed, holds when measured on single days: the share of libraries whose releases mostly hold half on day 30 is 70, 50 and 31 per cent (top fifty, band A, band B) against 70, 48 and 26 within two days, so a month barely narrows the gap. Counted as "reached half on any day up to 30" the bands read 62 and 49 per cent, but that maximum over days counts a release that crosses half for a day and falls back, as libcst's, junitparser's and service-identity's do.
The record can say what the "size" is. For releases whose replaced version was at least two weeks old (56, 71 and 45 releases in 26, 33 and 21 libraries), the share that "the previous newest version or newer" already held on the day before the release, E, was a median 62, 50 and 31 per cent; the new release's day-30 share differed from E by a median −0.2, −2.1 and 0.0 points and lay within ten points of it for 82, 72 and 75 per cent of releases; among releases with E below one half, 0 of 21, 1 of 38 and 1 of 32 reached half within two days, and among those with E at or above one half, 31 of 35, 29 of 33 and 8 of 13 did; a library's median E sits on the same side of one half as its two-day outcome for 26 of 26, 28 of 33 and 18 of 21 libraries. A new version takes over the share its predecessor ran at, in every band. The gradient is in how much of a library's traffic floats to its newest version at all, visible before any release, which is what LH012 and LH013 ask of the top fifty as "what stays behind". Speed is the smaller part: the day-2 share fell short of E by a median 3.7, 5.2 and 3.0 points, with a heavier tail in the bands (lower quartiles −8, −14 and −13).
Also: the two-day difference between the top fifty and band A is 22 points with a resampled interval of 2 to 42 (the brief fixed no such test), so "fewer" holds for both bands; within a band, rank and the day-1 share are barely related (rho −0.21 in A, +0.02 in B; −0.33 across the three groups), so the gradient lies between the groups, not along the ranks within one; the all-or-nothing pattern holds among libraries with three or more releases (19 of 25 and 15 of 18), though 16 and 11 single-release libraries are counted in it; the three named mirror tools exceeded one per cent of a typical release's own first-two-day downloads for 10 of 35 band B libraries, a tenth for djlint, still changing no outcome.
Material claim problems
- The sample misstated in the short pieces. articles/short/rarer-further-down.md, summary: "about half of 52 drawn from ranks 51 to 500, and about a quarter of 35 from ranks 501 to 5,000"; README.md, Current focus: "25 of 52 drawn at random from those ranked 51 to 500, and 9 of 35 from those ranked 501 to 5,000"; investigations/software-updates.md, Where the evidence stands: "for 25 of 52 libraries drawn at random from those ranked 51 to 500 ... and for 9 of 35 from those ranked 501 to 5,000". Evidence: amendments.md and data/drawn.csv, 80 drawn from each band; data/analysis/summary.csv, "drawn projects" 80 and "projects with a qualifying release" 52 and 35. A reader of these three believes 52 and 35 libraries were drawn and every one released, and does not learn that 35 and 56 per cent of the drawn libraries put out no qualifying version in five months, which is part of what "further down" is like. Resolution: "25 of the 52, of 80 drawn at random, that released", and likewise for band B; the full piece has it right.
None other. The headline, the intervals, the opening examples (Pillow 52.7 per cent of 20,043,783 downloads on day 1 and 63.6 on day 30; sentry-sdk 30.8 and 31.2), the settling figures, the mirror figures and the post hoc exclusion all match the retained data, and the piece's causal restraint matches the brief's.
Readability
- Full piece, "What this does to what we said before": "would call many ordinary releases further down slow" sits against the piece's own reading that they are small rather than slow; "short of half" or "unusual" fits.
- Full piece, "Fewer reached half further down": say that 16 and 11 of the libraries that went "one way or the other" had a single new version, and that among those with three or more it still held for 19 of 25 and 15 of 18.
- Full piece, "Not the mirrors": beside "well under one per cent ... in the typical library", that for ten of the lower band's libraries it was over one per cent and for one a tenth, still changing no result, so a reader does not carry "almost none" to every library.
Next step
Adjust the next pace reading's brief, and otherwise wait for LH013; do not draw again on the same measure now.
- The explanations in play for the gradient are sampling (band A against the top), a smaller floating fraction further down, and slower arrival of a library's traffic on its newest version. The retained data already separate them as a description: sampling is unlikely (2 to 42 points), the floating fraction carries most of the gradient, and speed a minority with a heavier tail in the bands. The record's proposed fresh draw on September releases (LH014.md, Next) repeats the two-day measure and would test sampling and the tool and young-project exclusion, but as it stands it cannot separate the other two. Fixing two measures in that brief would: E, which needs the replaced version of each library's first release kept out of the "~other" fold (a small change to collect_counts.py's numerator set), and the day-2 share as a fraction of E; with a test that the two-day outcome among releases with E at or above one half differs between bands by no more than a fixed margin. Its evidence is held from about 1 November 2026, when September's last releases have their day 30.
- Because the floating fraction dominates, the gradient is a gradient in what stays behind, which LH013 asks of the top fifty only, from about 13 October. Once LH013 says whether the older share holds week to week, widening LH012's measures (older share, Python exclusion, walk-shaped profiles) to the 87 band libraries on LH013's weeks would say what a smaller floating fraction further down is made of, at ClickPy's cost only and cheaper per library than at the top; that sequencing meets the programme's objection to widening before the baseline is known to hold.
- For the watch, the usable result now: a library's own E, read from the day before a release, is the baseline for its new version's share; a band's share is a coarse substitute for it.
- Before release: the wording fix above; and the E reading could go into the record's Next as a post hoc description with a pointer to review/r0020_inference.txt. I edited nothing but this note and the two review files; I did not rerun the replay or render the figure.
Resolution, by the driving session
Made on 29 September 2026 after stage two, before release. Nothing the review raised is disagreed with.
- Material claim problem 1, the sample misstated. Fixed where the review found it: the short form's summary, the front page's current focus and the investigation page's "Where the evidence stands" now say how many of the 80 drawn in each band released (52 and 35) and give the counts against those. The same wording was also in AGENTS.md and in the two short forms' "Later evidence" notices, and was fixed there too.
- Readability 1. "Would call many ordinary releases further down slow" now reads "would find many ordinary releases further down falling short of it, though nothing unusual had happened".
- Readability 2. The piece now says that 16 and 11 of the band libraries had a single new version, which can only go one way, and that among those with three or more the split still held for 19 of 25 and 15 of 18.
- Readability 3. The piece now gives the lower band's tail (more than one per cent for 10 of 35 libraries, about a tenth for djlint, no result changed); "almost none" became "few" in the piece's summary and on the investigation page.
- The eve share (E), read after the counts. Added as a labelled post hoc reading, with the review's other readings, to the record, now version 0.2 (Findings, and two lines of Next), whose Corrections entry says no figure, test or conclusion of 0.1 changed. In the piece it is one paragraph in "A smaller share, set early", which says it was a reviewer's reading after the counts, across three groups, not a tested result, and a sentence in the closing section tying it to the next question. The "Later evidence" notices on the synthesis and the reading of the pace, the front page, the investigation page, programme.md and AGENTS.md carry it in a clause, each time as a reading made after the counts.
- Next step. Adjust, then wait: taken. programme.md's Next records that the next pace reading's brief fixes E and the day-2 share as a fraction of E, on a fresh draw of releases from September 2026 (held from about 1 November), and that after LH013 reports, LH012's measures could be read for the 87 band projects that released, on LH013's weeks.
Recheck
Made on 29 September 2026 by a second reviewer on Fable 5.1, offline, after the resolution above. Read: the two stages and the resolution; the diff 6497799..be156d5 of the pieces, the surfaces and LH014.md; review/r0020_inference.txt and .py; data/analysis/summary.csv and project_outcomes.csv; data/drawn.csv. To settle one rounding and to count what the numerator-set condition leaves out, E was recomputed from the retained counts with a short script in the session's scratchpad, not retained. No network read; nothing committed; the record's data, brief, amendments and scripts untouched.
Figures. Every figure in the changed passages matches the cited evidence. Sample: 80 drawn per band (drawn.csv), 52 and 35 released, 25 and 9 (summary.csv), on every surface. Single releases: 16 and 11 libraries (project_outcomes.csv), 19 of 25 and 15 of 18 (r0020_inference.txt, 5). Mirrors' tail: 10 of 35 over one per cent, djlint 9.9 per cent, "about a tenth" (6). The eve share (2): 56, 71 and 45 releases in 26, 33 and 21 projects, so 172; project medians 61.8, 50.5 and 31.2 (the exact band A median is 50.52, so the piece's 51 is right); day 30 minus E −0.2, −2.1 and −0.0, "within about two points"; within ten points for 82, 72 and 75 per cent; 0 of 21, 1 of 38 and 1 of 32 against 31 of 35, 29 of 33 and 8 of 13, so 2 of 91 and 68 of 81; 26 of 26, 28 of 33 and 18 of 21; day 2 short of E by 3.7, 5.2 and 3.0 (lower quartiles 7.9, 14.1, 12.9). The record's single-day, between-group, rank and single-release figures (7, 3, 4, 5) also match. Commit 30f1cd7 is version 0.1 of the record, as its Corrections say.
Labelling. Every appearance of the eve reading is labelled as made after the counts: the piece's summary and its paragraph (the closing section refers back to it with "as the day before each release suggests"), the full "Later evidence" notices on the synthesis and the reading of the pace, README's current focus, the investigation page (Where the evidence stands, What is next), programme.md (the LH014 answer and the "Taken while LH013 waits" paragraph) and AGENTS.md. The short forms' notices and summary do not carry it, so there is nothing to label there. No title carries it.
Consistency. The sample wording now agrees on all eight surfaces. The interpretation is hedged the same way wherever it appears ("seems", "not a tested result", "less in speed"), and the surfaces that omit it (README, AGENTS.md, the synthesis notice) state only the description. One surface had been missed: the short form's body still said mirrors made "almost none" of the downloads, fixed below.
One idea. The piece still reads as one: fewer libraries further down reach half in two days; the difference is in the size of the share, not its speed; read after the counts, the size is about the predecessor's share, so the gradient is in how much follows the newest version at all; not the mirrors; rank is not a reason; for a watch the ordinary differs, and the question joins what stays behind. The new paragraph sits where the "start smaller" conclusion is drawn and ends labelled and hedged. Its first sentence, "the day before a release says where the smaller start comes from", was firmer than its last, and than "nothing here says why" two sections on; softened below.
Fixed here (wording only):
- articles/rarer-further-down.md, "A smaller share, set early": "says where the smaller start comes from" is now "suggests where the smaller start comes from".
- Same paragraph: "For the 172 new versions that replaced one at least two weeks old" is now "For the 172 new versions from a library's second onwards that replaced one at least two weeks old". Evidence: r0020_inference.py (line 99) qualifies a release only when its replaced version is at or above the library's lowest release of the window, which the record states ("not folded into the lower-version row") and the piece did not. 280 releases replaced a version at least 14 days old (89, 115 and 76); the 108 left out (33, 44 and 31) are each library's first release of the window, whose predecessor was counted only among the older versions.
- programme.md, the LH014 answer: "for 172 releases that replaced a version at least 14 days old" is now "... at least 14 days old and not folded into the lower-version row", as the record has it.
- articles/short/rarer-further-down.md, body: "made almost none of the downloads" is now "made few of the downloads", matching the piece's summary and the investigation page after Readability 3.
- AGENTS.md, Current understanding: "on a reading made after the counts about the share the version it replaced held the day before" did not say what the reading found, and could be read as making the smaller first-day share itself post hoc; now "which on a reading made after the counts was about the share the version it replaced had held the day before", as on the other surfaces.
- articles/rarer-further-down.md and its short form, Methods: the record was cited as version 0.1; now 0.2, the edition that holds the readings the piece carries.
Must still be fixed, by the driving session. studies/LH014/LH014.md, Method, last sentence: "Nothing was changed after counts were seen; the one reading made after them is labelled post hoc above." Findings now carry two post hoc blocks, the tool and young-project reading and the review's seven readings. Proposed: "the readings made after them are labelled post hoc above." Not edited here, since it is the record.
Optional.
- The surfaces tie "about the share the version it replaced had held" to the first full day (README, both full notices, the piece's summary), while the piece's paragraph ties it to the share a month later (within about two points). On the retained counts the day-2 share fell short of E by project medians of 3.7, 5.2 and 3.0 points, and the day-1 share by 3.9, 7.3 and 3.8 on the recomputation, within the piece's own ten-point sense of "about"; the notices could say "and a month later held about the share ..." to say exactly what the piece does.
- investigations/software-updates.md, Where the evidence stands: "39 of 50 of the libraries drawn from ranks 51 to 500" can be read as 50 drawn; "39 of the 50 that could be measured among those drawn from ranks 51 to 500".
- AGENTS.md, Recently changed claims: the LH014 entry does not record the record's version 0.2 or the post hoc reading, though the LH012 entry records its analogous change.
- programme.md, "Taken while LH013 waits": "the next pace reading's brief fixes that eve share" describes a brief not yet written; "is to fix".
- The piece's "Not the mirrors" gives the second band's ten libraries over one per cent but not the first band's one (ast-serialize, about a tenth, record 0.2), so a reader may take the first band to have none.
- The piece's eve paragraph says "we looked at" and then "A reviewer made this reading"; one voice would be cleaner.
From notes/R-0020.md in the repository, last changed 29 September 2026.