Release review of the published-images piece, its short form, the front page that carries it, the programme paragraph and the record behind them
Findings
This is the release gate for articles/what-an-image-holds.md, its illustration, its short form, the front page above the rule, the LH006 paragraph and LH007 section in programme.md, S24 and S25 in sources.md, and the record studies/LH006/. The reviewer read the dispatch, AGENTS.md and R-0005, then the piece straight through, then sentence by sentence against LH006.md at version 0.1, its brief, its source assessment and the tables in studies/LH006/data/, recomputing each derived count from the tables with short Python. Unlike a review of a summary, this one went to the registries: the two agentcrew images the piece turns on and two of serena's were read again from Docker Hub and ghcr.io with the reviewer's own script, written after reading scripts/registry.py rather than by running it, streaming each image's layers from the top and stopping at the mcp dist-info; agentcrew's Dockerfile, its Docker-specific project file, its lockfile and its publishing workflow were read from a blobless clone at the commits the record names; and jesse's repository was cloned to settle the pin question the writer flagged. The piece's SVG was regenerated from its script and compared byte for byte; the driver had already rendered it in light and dark, and the reviewer did not render it again.
The verdict is that the piece, the short form, the front page and the programme paragraph can be released as they now stand, after the changes below, which the reviewer made. Every figure in the piece was found in the record's tables or derived from them, every registry reading reproduced gave the same version and the same configured build time, and every link resolves. What had to change was one count that the piece, the short form, the front page and the record all gave as 37 images read where the table has 38 read and 37 holding mcp; one header phrase in the record ("two older" bracketing images where there is one); one unlabelled inference in the piece and the short form (the 8 April tag move) and one in the record (keboola moving "with its pin"); and a data label ("lockfile only") that named a lockfile pin the reads never saw. None changes a conclusion.
The piece, sentence by sentence, against the record and its tables
Line numbers are the piece's at ebabb93. "Live" means the reviewer's own registry read on 26 September at 19:24 to 19:26 UTC; "recomputed" means from the tables in data/.
| Piece passage | Checked against | As the record has it? |
|---|---|---|
| Line 3: "At 03:33 UTC on 8 April 2026 ... version 1.27.0 of mcp ... released five and a half days before"; "named 1.26.0 ... until 24 April, sixteen days later" | Live: v0.12.3 configuration created 2026-04-08T10:33:19+07:00, mcp-1.27.0.dist-info in /opt/venv; release 2026-04-02T14:48:07Z (LH005); pin commit 2026-04-24T14:41:51+07:00 (pins_git). 03:33:19 minus 14:48:07 on 2 April is 5 d 12 h 45 min, 5.53 days; 07:41:51 on 24 April minus 03:33:19 on 8 April is 16 d 4 h 9 min, 16.17 days |
Yes |
| Line 3: "agentcrew was one of those that had not taken it up in the four weeks we watched" | LH002.md line 33: R01 among the five that did not move | Yes |
| Line 5: the download log "showed the new version at half of all the library's downloads within two days" | LH005: 48.1 per cent on 3 April, 51.0 on 4 April | Yes |
| Line 13: "between 25 and 211 megabytes of compressed data"; "on 26 September, four to six months after" | image_mcp.csv bytes_read, images with a version: 24,641,769 to 210,746,597; builds 20 March to 27 May | Yes |
| Line 17: "37 projects ... Seven name a published image ... six could be read ... Seven more keep ... a Dockerfile" | candidates.csv: 10 + 34 minus 7 shared; qualifies yes 7 (cognirepo unreadable); "Dockerfile, no published image named" 7 | Yes |
| Line 19: "we read which mcp was installed in 37 images ... and found one image, of a project called jesse, that held no mcp" | image_timeline.csv: 37 rows "mcp dist-info found", 1 row "no mcp dist-info in any layer read" (jesse 1.13.8), 4 rows undetermined | No: 38 read to an answer, 37 with mcp (finding 1) |
| Line 19: "about a hundred image descriptions an hour"; "we allowed ourselves 30, and left 79 of the 109 Docker Hub images" | Live HEAD: ratelimit-limit: 100;w=3600; read_log: 30 counted GETs, all 200; images.csv positions on Docker Hub: 35 + 9 + 46 + 7 + 12 = 109 |
Yes |
| Line 23: agentcrew asks for "1.24.0 or later"; the image "copies a separate project file made for the image ... and installs from it without the lockfile" | Clone at 42a774e: pyproject.toml mcp>=1.24.0; docker/Dockerfile COPY docker/pyproject.docker.toml pyproject.toml then uv pip install .[cpu,redis] into /opt/venv; docker/pyproject.docker.toml mcp>=1.24.0 |
Yes |
| Line 25: the 2 April build "at 04:37 UTC ... ten hours before ... holds 1.26.0"; the 8 April holds 1.27.0; the 22 April automated build "from a commit whose lockfile still said 1.26.0, holds 1.27.0" | image_timeline (2 April 04:37:44Z, 1.26.0); live: 0.13.0 amd64 created 2026-04-22T16:29:59Z, label revision 42a774ec152a, mcp-1.27.0.dist-info; uv.lock at 42a774e name = "mcp" / version = "1.26.0" |
Yes |
| Line 33: serena's 3 April image 1.26.0 "as do the three built after it up to 14 April"; pin 24 April; 27 April image 1.27.0, "three days after the pin, and 25 days after the release" | Live: 1.1.2 created 2026-04-14T15:48:25Z, 1.26.0; 1.2.0 created 2026-04-27T11:38:19Z, 1.27.0; 1.1.0, 1.1.1, 1.1.2 in the table; pin 2026-04-24T16:26:08+02:00; 2.88 and 24.87 days |
Yes |
| Line 35: mcp-snowflake-server "1.0 or later", lockfile 1.14.0, images of 5 and 6 May hold 1.14.0; pin "17:03 UTC on 6 May"; image "11 minutes later"; "34 days after the release" | pins_git 7bd1aa30df 2026-05-06T19:03:00+02:00; image 0.11.0 created 17:13:44Z (10 min 44 s); 34.1 days | Yes |
| Line 37: keboola "no public repository ... pins mcp exactly"; images moved 17 April "between one built at 09:17 UTC and another at 12:50"; "the package version that became, three days later, its first published release to require 1.27.0"; octobot pins 1.26.0, next listed image 30 July still 1.26.0 | image_mcp own_installed 1.56.0 at 09:17, 1.56.2 at 12:50; pins_pypi 1.56.2 published 2026-04-20T06:19:42Z mcp==1.27.0, 1.56.1 and earlier ==1.26.0 (2.73 days); octobot 2.1.1 mcp==1.26.0; 3.0.0-beta1 created 30 July, 1.26.0, the only octobot image after March in images.csv |
Yes |
| Line 39 alt text and line 41 caption | The table: agentcrew 8 April against 24 April; serena 27 against 24 April; keboola 17 against 20 April; snowflake 5 and 6 May at 1.14.0; octobot three images 22, 29, 30 March | Yes |
| Line 43: "On 3 April ... 48 per cent ... On 8 April ... 54 per cent" | LH005 share_1.27.0: 0.4809, 0.5399 | Yes |
| Line 49: "1,453,176" pulls; "612 of keboola's 730 tags ... 17 August 2026" | context_reads.csv; recomputed from tags_hub.csv: 612 of 730 (and 255 of agentcrew's 387) | Yes |
| Line 51: "The 8 April agentcrew image was published by moving a tag"; "none of the labels the automation writes"; "seven hours ahead of UTC"; "Nine of agentcrew's versions from those weeks have two different images under their two version tags" | Live: v0.12.3 configuration has no labels and created with +07:00; workflow at bc17243 tags type=ref,event=tag, type=match,pattern=v(.*),group=1 and type=sha,prefix=<ref>-,suffix=-<run>; the CI build carries 0.12.3 and v0.12.3-bc17243-65 and the 8 April image carries v0.12.3; recomputed: 29 version pairs both pushed in the period, 9 differ, the v image single-platform in all 9, 0.4 to 142.6 hours apart |
The facts yes; the tag move is an inference from the workflow, which the record labels and the piece did not (finding 3) |
| Line 55 and 57: the closing statements and "We think the nearer question" | Record Answer and Next | Yes; the verbs carry the labels |
| Colophon: sources, "module v1.1.1, published 24 February 2025", "20 March to 27 May 2026 ... one from December 2025 and one from July 2026", "between 18:26 and 19:03 UTC", record "version 0.1" | LH006 sources.md D7; image_timeline (serena dev 2025-12-11, octobot 3.0.0-beta1 2026-07-30); D1 18:26:15 to read_log 19:03:16 |
Yes; the record is now version 0.2 (finding 7) |
The record against the primary sources
Every registry reading below was made on 26 September 2026 between 19:24:44 and 19:25:54 UTC, about an hour after the study's, through the same shared proxy, with anonymous tokens whose values were not kept. The reviewer's script chose layers by their history lines (skipping steps that only make directories or set the working directory, which the study read), so its byte totals differ from the study's where the layer choice did; the layer that held mcp and the bytes into it are the same.
| Reading | Record | Reviewer | Notes |
|---|---|---|---|
docker.io/daltonnyx/agentcrew v0.12.3: digest, media type, created, labels, installed mcp |
sha256:6ec93dd1..., single manifest, 2026-04-08T10:33:19.814254437+07:00 (03:33:19Z), no labels, 1.27.0 | identical: HEAD 19:24:45 and GET 19:24:55 gave sha256:6ec93dd1..., application/vnd.docker.distribution.manifest.v2+json; created identical to the nanosecond; Labels null; opt/venv/lib/python3.12/site-packages/mcp-1.27.0.dist-info/METADATA after 110,821,376 bytes of the 502,284,046-byte COPY /opt/venv layer |
The record's "about 110 MB" holds |
docker.io/daltonnyx/agentcrew 0.13.0: index, amd64 digest, created, labels, installed mcp |
index sha256:4999a722..., four entries, amd64 sha256:e14056be..., 2026-04-22T16:29:59Z, revision 42a774ec152a, version 0.13.0, 1.27.0 | identical: GET 19:25:00; mcp-1.27.0.dist-info after 112,525,312 bytes of the 503,914,475-byte venv layer |
Three counted pulls in all for this review (one manifest, one index, one platform manifest); ratelimit-remaining 64 and 51 on the HEADs, 81 and 48 after the GETs, from egress addresses 160.79.106.130 and .135, limit 100;w=3600 |
ghcr.io/oraios/serena 1.1.2 |
2026-04-14T15:48:25Z, revision 1e6345cae95b, 1.26.0, 35,258,368 bytes | identical, to the byte: workspaces/serena/.venv/lib/python3.11/site-packages/mcp-1.26.0.dist-info after 35,258,368 bytes (19:25:52) |
ghcr.io returned no rate-limit headers |
ghcr.io/oraios/serena 1.2.0 |
2026-04-27T11:38:19Z, revision 0a96f71bd90c, 1.27.0, 35,323,904 bytes | identical, to the byte (19:25:54) | |
| agentcrew's Dockerfile claim | "copies a Docker-specific pyproject.docker.toml that asks for mcp>=1.24.0 and runs uv pip install .[cpu,redis], without the lockfile"; uv.lock at the 0.13.0 commit holds 1.26.0 |
Clone at 19:25:03; at 42a774e (committed 2026-04-22T23:27:13+07:00): docker/Dockerfile as quoted, docker/pyproject.docker.toml line 30 "mcp>=1.24.0", uv.lock lines 1942 to 1943 name = "mcp" / version = "1.26.0", pyproject.toml line 30 "mcp>=1.24.0" |
Yes. The git tag v0.12.3 points at bc17243 (2 April); the workflow at that commit builds on tag pushes for linux/amd64 and linux/arm64 |
| Lag arithmetic in first_1_27_0.csv and the table | 5.5; 16.2 before; 14.9 and 2.7; 24.9 and 2.9; 34.1 and 11 minutes | 5.53; 16.17; 14.92 and 2.73; 24.87 and 2.88; 34.10 and 10 min 44 s | Yes |
| Derived counts | 37 images with mcp; 30 counted pulls; 101 layer reads, 2,960,812,225 bytes; 649 requests; 29 pairs and 9 differing, 0.4 to 142.6 hours; 38 keboola commits under both prefixes, 24 differing, 3 in the period, sha- at the later build in all 24; 612 of 730 and 255 of 387 last pulled 17 August; 109 Docker Hub images in scope; images in the period 10, 44, 33, 8, 5, 10 |
identical, recomputed from the tables | The first 429 in read_log is at 18:43:58; the record's "from 18:43:57" is the request time from the scripts' output |
The writer's open questions
-
Must fix, fixed. The count of images read. The Answer said "37 images had their installed
mcpread and one was found to hold none", which a reader takes as 37 in all; the piece, short form and front page said "37 images of six projects" and then named jesse'smcp-less image among them. The table has 38 images read to an answer: 37 with anmcpversion, across five projects, and jesse's one with none. All five places now say 38 read, 37 holdingmcp. The programme paragraph's "the installedmcpin 37 images" was already right and is unchanged. -
Must fix, fixed. Header: "two older and one later bracketing image". The images outside 20 March to 27 May are serena
dev(11 December 2025) and octobot 3.0.0-beta1 (30 July 2026): one older, one later, as the piece's colophon already said. -
Should fix, fixed. The 8 April tag move is an inference. The record labels it ("the tag's history is inference from the workflow"); the piece said "was published by moving a tag" and the short form "as agentcrew's was on 8 April". The evidence is strong (the workflow gives every CI build the
vX.Y.Ztag, the CI build of 0.12.3 no longer carries it, the 8 April image does, has no labels and a +07:00 clock) but no registry shows the tag's history. One clause in each. -
Should fix, fixed. keboola "moved only when the pin did". keboola has no public repository, so its pin commit is not seen. What is seen is that the image built at 12:50 on 17 April holds package version 1.56.2 with
mcp1.27.0, and that PyPI 1.56.2, published 2.7 days later, is the first release to require 1.27.0. The Answer now says the move with the pin is inferred from that, and the piece's own sentence already said it that way. -
Settled. jesse's 14 February pin against its
mcp-less 28 March image. From the clone: the commitrequirements.txtgainedmcp==1.26.0in (7300efb5, 14 February) is on master's first-parent chain, which is what scripts/collect_pins.py walks, and is an ancestor of the 2.1.3 commit (08b81849, 20 May). It is not an ancestor of the 28 March commits (cad0cfae, "Fix package build inputs", 15:04 UTC, eleven minutes before the 1.13.8 image was built and PyPI 1.13.8 published) nor of "Bump version to 1.13.8" (b64c867d, 16 March); at those commitsrequirements.txthas nomcpline,setup.pyreads its requirements from that file, and the Dockerfile runspip3 install -r requirements.txtthenpip3 install -e .. So the 1.13.x images and releases came from another line of the repository than the one the pin table follows, and the record's three statements (a pin from 14 February, nomcpin the 28 March image, no PyPI requirement until 2.1.3) are all true of different lines. A Findings entry and a Limits entry now say so. Not checked: when that line was merged, and from which line 2.0.0 to 2.1.2 (which require nomcp) were built. -
Fixed. image_mcp.csv
method"lockfile only". The value meant "no dist-info seen; a requirements or lock file was seen", and in both rows the file had nomcppin. Renamed in scripts/collect_images.py and in the two rows of the table; analyse.py does not test for the old string; the Method sentence names the old value. -
Consequential. Record version. Findings 1, 2, 4 and 6 change figures or labels in the record, so it is now version 0.2 with a Corrections entry, and the piece's colophon cites version 0.2 (R-0004 finding 1 and R-0005 finding 1 were this slip in the other direction).
The interpretation boundary and labelling
-
Note. Kept. The record labels each paragraph (observation, derived, interpretation, inference) and names the cause of agentcrew's early move as interpretation; the piece carries it in verbs ("What the image records is what the installer gave", "that fits a build made on someone's own machine", "We think the nearer question"). The piece's one qualification, the section "A thin record, and not a run", is present and matches the record's Limits: six projects are not a population, one held no
mcp, an image is not a run, a pull is a request. Line 25's "The images show exactly that" rests on the Dockerfile read from the repository and the 22 April CI build whose lockfile said 1.26.0 while the image held 1.27.0, which is observation, so it stands. The front page's lead says "we counted it among the projects that had not moved", which LH002 did. Nothing in any file claims harm now, names a system as compromised, or did anything irreversible: the study and this review created no account, read no credential and made anonymous reads only. -
Note. The programme. The LH006 paragraph's figures (37 packages, 7 and 6, 37 images with
mcp, 5.5 days, 2.9 days, 11 minutes, 17 April and three days, end of July, nine tags, 100 an hour, 30 pulls) are the record's. The LH007 section is a design, not a claim, and its access note (prefer ghcr.io, HEAD where a digest suffices) matches what the reads showed. S24's "100 pulls an hour, against six hours in Docker's documentation" is what the reviewer's HEADs returned.
House style and the rules
- Note. Kept. No em or en dash in the piece, short form, front page, programme, sources, record, brief, source assessment or figure (checked by code point). British spellings. No internal reference in the piece's or short form's prose: "record" appears as a plain word and the study number only in colophon links. Every relative link in the three reader files resolves (6 in the piece, 1 in the short form, 26 on the front page). The Draft labels are on both bylines for the driver to remove. One idea a reader can say back: a published image records what was installed, and it was not always what the project had pinned. The piece's SVG regenerates byte for byte from scripts/draw_piece_figure.py against the three tables it names.
What the review could not check
- The other 34 image readings, and the four undetermined ones: they are the study's tables, taken as published; the four that were reread agreed to the byte on ghcr.io and to the nanosecond in
createdon Docker Hub. - The tag lists, tag records, pull counts and the Docker Hub search count (data/tags_hub.csv, tags_registry.csv, context_reads.csv) were not re-fetched; the derived counts from them were recomputed.
- The 26 repository clones behind candidates.csv and Open Source Insights' 34 dependents: not repeated; only agentcrew and jesse were cloned.
- The eight documentation pages D1 to D8 were not re-fetched; the one quantity that matters, the limit as served, was reproduced from the headers.
- The figure was not rendered by the reviewer; the driver rendered it in light and dark and reported it legible.
- Whether Docker Hub still serves a replaced, untagged manifest, and ghcr.io's version history: unreadable anonymously, as the record says.
- The review's own cost is not measured here; the driver prices it from the transcript. Its network use: three counted Docker Hub pulls, two ghcr.io manifests and two indexes, 403,429,983 layer bytes streamed, two blobless clones.
Changes made by the reviewer
- studies/LH006/LH006.md: version 0.2; header "one older and one later bracketing image"; Answer "38 images were read to a result: 37 held an installed
mcpand one, jesse's, held none"; Answer's keboola sentence rewritten as inferred; a Findings entry on jesse's two lines; the Method sentence onmethod; a Limits entry on first-parent pin tables; the Corrections entry. - studies/LH006/scripts/collect_images.py and data/image_mcp.csv: "lockfile only" renamed "no dist-info; requirements or lock file seen" (two rows).
- articles/what-an-image-holds.md: line 19's count; line 51 "as far as we can tell"; colophon cites record version 0.2 and names this review.
- articles/short/what-an-image-holds.md: "38 images"; "appears to have been"; the review line.
- README.md: "38 images" in the lead and in the table row.
Verdict
Nothing remains that must be fixed. The piece, the short form, the front page above the rule, the programme paragraph and S24 and S25 can be released as they now stand; the driver removes the Draft labels, fills the piece's version and date on release, adds the releases.md line, and commits the record at version 0.2 with the piece.
From notes/R-0006.md in the repository, last changed 26 September 2026.