ADR 0019: A platform says whether its base can fetch
Status: accepted (2026-10-18)
Context
A BinaryArtifact is downloaded at build time and verified against its declared sha256, and RpmFile is the same
shape for an RPM taken from a URL; the Containerfile backend fetches both with curl. That makes curl an assumption
about a base, and it was wrong once: the Ubuntu base ships none, so the build died with /bin/sh: 1: curl: not found
minutes in, naming no resource. Invariant 9 asks the opposite, and this is a platform fact because which bases carry a
fetcher varies by vendor, and the package name is the platform's, not Core's. Core knows neither curl nor
ca-certificates (ADR 0004, the shape of iconCache.package).
Decision
-
A platform declares how its base gets a verified artifact onto the image:
downloads:baseFetches: false # this base ships no fetcherpackage: curl # and the image installs this onebaseFetches: trueis the common case and names no package;baseFetches: falserequirespackage. -
Composition fails on a plan that downloads from a platform that says nothing, naming the platform and the resource that asked for the download; a plan that downloads nothing composes anywhere.
-
The composition installs the fetcher when the base cannot provide it: the package joins the plan's installed packages, carrying the provenance of the download that needed it, so the plan answers "why is this installed" without the reader consulting a platform resource.
-
The backend keeps naming its own tool. The backend fetches with
curland its flags; what the platform declares is that a base can satisfy it. A command line in a resource would be a per-platform copy of backend knowledge, and the copies would drift. -
A fetch retries transient failures and bounds the attempts that never answer: a connection error, a 5xx and a timeout are retried within a bound; a 404 or a checksum that disagrees fails at once.
Consequences
- Ubuntu declares
baseFetches: falsewithpackage: curl, measured on its base; the EL and Fedora platforms declarebaseFetches: true, measured on theirs; RHEL's base cannot be pulled here (no subscription), so its declaration rests on the EL bases that can. - A new platform cannot be silent about this: composing a workstation that downloads onto one fails at composition, with the platform named, instead of failing on a missing command minutes into a build.
- The plan's package list becomes the record of what the image installs to be able to fetch, and
deskos checkalready reports installed packages as outside its scope. curlremains Core's own choice, and the platform states the base can satisfy it, or the package that makes that true.- This covers the one capability a build cannot proceed without, and leaves the rest to be added the same way.