An ordering mistake in an end-to-end test shouldn’t cost you a Docker boot. Today
a wrong import order, a deploy without its prerequisite, or a missing required
config bites at runtime — thirty seconds or more into a heavy container run,
when the failing celilo call finally executes. The static check catches those
same mistakes in milliseconds, before a single container starts.
Why check before Docker boots
Most sequencing errors are decidable from manifest data and the call sequence
alone — no network, no live state. If knot-unbound-internal requires a
dns_registrar provider, and nothing earlier in the sequence imports one, that’s
knowable the instant you write the test. Waiting for the topology to spin up,
modules to publish, and machines to register just to be told what a manifest
already implies is wasted time and a broken feedback loop.
The classes of mistake worth catching are all statically detectable:
- Import-time capability requirements — importing a module before anything provides the capability it needs.
- Deploy-time capability requirements — deploying before the provider is deployed, not just imported.
- Missing required config or secrets — a
module deploywithout every required user variable set first. - Missing aspect approval — importing an aspect-declaring module without accepting its aspects, which would otherwise hang a non-interactive test.
- Typos and out-of-order config — a misspelled module ID, or configuring a module that hasn’t been imported yet.
How it works
You hand the check a sequence of celilo invocations. It walks them in order,
maintaining a model of celilo’s state — what’s imported, what’s deployed, which
config and secrets are staged, which aspects are approved — and applies the rule
for each step against that model. Violations are collected, not thrown one at a
time, so you see every problem at once, each with the offending step and a
concrete fix (“insert module deploy namecheap before this line”).
If the sequence is clean, the steps run exactly as they do today. If it isn’t,
the check aborts before docker compose up — no containers started, the full
list of problems in hand, at edit-time speed.