Build1 distinct publisher3 min readUpdated
A developer's build tagged from current source carried a day-old compiled object, with no error anywhere. The check written to catch it next time was sampling three modules out of 65.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A developer writing on dev.to reports tagging an image from current source and finding that the compiled `openapi.so` inside it was a day old [1][2]. The failure did not raise an error at any step, which means the tag was accurate about the commit and wrong about the contents, and nothing in the pipeline said so [5].
According to the account, the builder stage was not at fault: the artifact it produced matched what the current source should compile to, byte for byte [3]. The final image got the wrong bytes because the runtime stage's `COPY --from=builder` took a layer cache hit and carried the previous build's output forward [4]. Rebuilding the same commit produced a different, correct image, which the author calls the worst available outcome, since a reproducible failure can be chased and a self-healing one guarantees the next occurrence is just as invisible [6][7].
The uncomfortable part is that Docker's documentation says this should not happen this way. For most instructions the cache key is the instruction text, and the docs are explicit that when processing a `RUN apt-get -y update` command the updated files in the container are not examined, only the command string [8]. `ADD` and `COPY`, and `RUN` with a bind mount, are the documented exception: the checksum comes from file metadata rather than the instruction string, with modification time deliberately excluded [9]. Source had changed, so the metadata should have moved with it and the cache should have missed [10]. The author says the mtime exclusion is the only thread available and declines to build an explanation on it [11].
What replaced the explanation was a check that stops trusting the tag: for each module, pull the compiled artifact out of the image, hash the source file it should have come from, compare against the compilation cache entry that source must have produced, and stop the build before anything is pushed if they disagree [12].
Weeks later, a release existed to change exactly one module, and the check printed `OK: <image> carries the current source (3 modules checked)` [13]. The three modules it checked were three other ones; the module the release was for was not among them [14]. The witness list is three names in a hand-maintained tuple against a package of 65 modules [15], which leaves 62 modules unwitnessed and coverage at about 4.6 percent [21][22].
The comment next to that tuple is not careless. It says the list is small on purpose, that these are the modules whose staleness would be both invisible and expensive, and that widening it would cost time for little gain because one stale layer stales the whole `COPY` [16]. That last clause is load-bearing. If staleness always arrives a layer at a time, three witnesses are as good as 65 and the sampling is sound; if staleness can ever land on one module while its neighbours stay current, three witnesses are three lottery tickets [17]. The check has never tested that assumption and prints the same word either way [18].
The author's remedy is fault injection in both directions and run twice: one run proves the checker can fire, the second shows what it is blind to [19]. The pasted example does exactly that, with a two-name witness tuple and three cases: unchanged, stale on the list, and stale off the list [20].
Two things to watch in your own pipelines. First, whether the whole-layer assumption holds when you deliberately stale a single module, because that is a cheap experiment and the entire sampling argument depends on the answer [17]. Second, whether your green output reports a count next to the word OK, and whether anyone reads the count [13][14].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The author reports that a build tagged from current source produced an image whose compiled openapi.so was a day old.
The author rebuilt the same commit and got a different image, and says that is the part they cannot explain.
The builder stage had done its job: the artifact it produced matched what the current source should compile to, byte for byte.
New source, new tag, old image, and not one error anywhere along the way.
Rebuilding fixed it, which the author calls the worst available outcome.
The author's reasoning: a reproducible failure is a thing you can chase, while a build that comes out right the second time means the next occurrence will be just as invisible.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Single self-reported incident, verifiable reasoning, no reproduction
One publisher, one first-person account, no image digests, build logs, Docker/BuildKit versions, or reproduction steps for the stale-artifact incident; the author states the mechanism is unexplained and that the decisive experiment (staling one module inside a real image) has not been run. What is independently checkable is stronger: the quoted Docker cache-invalidation behaviour and the runnable MD5 snippet whose output demonstrates the sampling blind spot directly, plus arithmetic (3 of 65 modules) that needs no trust.
One developer's pipeline; no external uptake signal
Adoption evidence is limited to a single self-described build pipeline: the hash-comparison gate is in use and did run on a real release, and the witness tuple was subsequently widened by one name. There is no second team, product, repository, or vendor adoption of either the failure diagnosis or the verification pattern in the supplied material, so the measured value reflects a real but minimal, single-team footprint.
Understated relative to the generalizable lesson it demonstrates
The post makes unusually modest claims: it refuses to assert a mechanism, labels its own successful check 'true, and useless', and flags the experiment it has not run. Meanwhile the part that is fully evidenced — a sampling verification gate that prints OK while the module that changed goes unchecked — generalizes well beyond the author's repo and is demonstrated by runnable code. The negative score reflects rhetoric that lands below the demonstrated substance; it is only mildly negative because the headline incident itself remains unreproduced and unexplained, which limits how much can fairly be concluded.
Personal developer blog, no product or vendor stake visible
The single source is an individual dev.to post with no product, service, sponsor, tool, or vendor being promoted, and no funding or pricing angle. The visible incentives are reputational and engagement-driven for a community platform, tempered by content that is self-critical, admits ignorance, and solicits correction from readers — behaviour that runs against incentive-driven overstatement.
Moderate-low: one publisher, mixed verifiability
Confidence is limited by a single-publisher, single-source cluster with an unreproduced central incident and no version or artifact detail, and by the internal contradiction between the author's cache diagnosis and the Docker behaviour they quote. It is lifted above the floor because the secondary and more transferable claims — coverage arithmetic, the untested assumption, and the code-demonstrated blind spot — are checkable without trusting the narrative.
build
Before you spend quota on an agent skill, make it pass an eval harness1 distinct publisher
build
The merge gate that turns "works on bad networks" into something CI can fail1 distinct publisher
build
Web Crypto hands you four hash algorithms free. MD5 is the one that bills you.1 distinct publisher
build
A RAG stack lived seven hours before a hosted embedding endpoint returned 4041 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 14, 2026