Air-gapped delivery pipeline
Stack
OCI bundles · cosign · Helm · offline registry
Text
The figures this page carried until 2026-09-03 (six sites, zero failed installs since 2024-09) were the handoff prototype's, as was its summary, and both are removed under erratum 7.20. No replacements are invented.
1. The constraint
There is no network path, and there is never going to be one.
Not a firewall with an exception process. Not a proxy someone can whitelist a host on. A disconnected estate, in a building you will not enter, running on hardware you will not see, installed by an operator who has never met you and may not share a language with you. You cannot ship a hotfix, read a log, attach a debugger, or ask what the screen says.
Everything difficult about this follows from one property: the feedback loop is weeks long and runs through a person who is not an engineer. In a connected system a bad release is found in minutes and fixed in an hour. Here it is found when somebody writes an email, and the email omits the part you need.
So the artifact has to be complete, it has to be verifiable by someone with no way to ask a question, and it has to fail in ways that are legible to a person reading an error message for the first time.
2. The decisions, and where each one is enforced
2.1. One artifact, genuinely complete. Every dependency, every base layer, every chart and migration, and the registry to serve them from, inside a single bundle. Anything resolved at install time is a network call in disguise. This is enforced at build time by denying egress in the pipeline, so a package that would have been fetched on the far side fails here instead, where somebody can fix it in ten minutes.
2.2. The same image ships everywhere, and configuration alone decides. No separate air-gap build. A special build for the hardest environment is the build that gets the least testing, and it is the one that has to work with no way to intervene. Connected estates run the same bytes, which means the air-gapped path is exercised continuously by everybody else.
2.3. Verification is refusal, not a warning. The installer checks the signature and the hash against a key distributed out of band, and stops if either fails. Not a prompt, not a flag to continue anyway. An override exists in every system that has one, gets used under deadline pressure, and the property being protected is the only reason a regulated site accepted a vendor artifact at all.
2.4. Install is idempotent and resumable. The operator will run it twice. Something will time out halfway, the media will be re-inserted, a step will be repeated. An installer that is only correct on a clean first run is an installer that will corrupt a site, and no one will be watching when it does.
2.5. Diagnostics are produced locally and designed to be quoted. Preflight checks run before anything is written and fail with messages meant to be read aloud or pasted into an email, not interpreted. A support bundle the operator can generate on demand is the entire remote debugging story, so it is a feature with a spec rather than a log directory somebody tars up.
3. Why this decides which customers exist
An air-gapped delivery path decides which customers can buy at all, which is a larger claim than hardening usually gets to make.
Central banks, defence and government estates, and telecom operators under sovereignty rules do not have a procurement route for software that requires a connection home. The requirement arrives as a precondition, and a vendor without an answer is filtered out before the technical evaluation starts.
The second effect is on everyone else. A product that installs with no network dependency installs cleanly in a restricted enterprise environment too, where the customer’s security team has opinions about egress but not a physical gap. The work done for the strictest customer lowers the integration cost for every customer below them, which is unusual: hardening usually taxes the common case, and this is one of the times it subsidises it.
4. Figures
This note reports none. The four that would matter are the number of sites under management, install success rate on first attempt, the version spread across the estate at a given moment, and elapsed time from release to a site being updated.
They exist and are not published here, because site counts and identities are the customer’s information rather than mine. The figures this page did carry (six sites, zero failed installs since a given month) were the handoff prototype’s, and erratum 7.20 removes them.
5. What I would do differently
Deny egress in the build pipeline on day one, not after the first failure across the gap. Failure 5.1 is entirely preventable and it is normally discovered the expensive way, because a connected pipeline is quietly forgiving and the gap is not. This is one line of CI configuration and it should predate the first bundle.
Version the bundle format itself, separately from the software. The installer on a site is whatever version arrived last, and it has to read a bundle produced by a much newer build. Treating the bundle as a versioned interface with its own compatibility rules avoids the failure where a site cannot be upgraded because it cannot read the thing that would upgrade it.
Write the operator’s runbook before the installer. The error messages, the preflight output and the support bundle are the product for the person actually doing the work, and they get treated as documentation to be written afterwards. Failure 5.5 is open, and the part of it that is addressable is entirely a writing problem that engineers schedule last.