Skip to content

0.12.0 release acceptance: the refactored runtime is proven end to end, or the milestone does not close #545

Description

@stephrobert

The gate this milestone cannot be closed without. It adds no product code:
it is impossible to close until the whole of feint has been exercised under the
new contract.

Why it exists

0.12.0 replaced three diverging runtime paths with one. The temptation after
such a change is to merge the refactor, watch the unit tests pass, and defer the
rest. This repository already knows what that costs: #475 survived for months
because every test was green while two packs of three enforced nothing.

So the criterion is not that the contract compiles. It is that the contract
can really express everything the three clouds need
. A stack that passes at
the API level while its traffic no longer flows proves the contract is
incomplete.

What must be exercised, per provider

The same sequence on each, with the resources that provider actually serves:

apply  →  empty second plan  →  runtime witnesses  →  destroy  →  nil delta

And it must be real traffic

API says running is no longer enough — that sentence is exactly what hid four
defects on 2026-08-26. For every claimed dataplane:

claim what must be observed
a machine it exists on the host, booted, carrying the address the API published
a network the interfaces are really attached; isolation and reachability behave as declared
a firewall a port a rule opens answers, and a port no rule opens refuses — in the same pass
a balancer a packet really reaches more than one backend
cleanup nothing is left behind, measured rather than swept

Reachability is measured the way a user reaches it — through the published
address — never through incus exec, which bypasses the network, the firewall
and the address and would have found none of the four defects.

The release invariant: no axis regresses unexplained

v0.11.0 → v0.12.0
  driven  probed  contract  dataplane  shape  behaviour  negative   >= baseline

A fall is either a defect or a proof that was false. The second is
legitimate
, so this invariant must never become a number that stops a bad
proof being withdrawn: a regression is acceptable when it is written down with
its reason, on the model corpus/accepted.json already uses.

One trap, measured on this repository: three of the seven axes are verdict
strings, not booleans.
"unobserved" and "unchecked" are non-empty and have
been counted as successes here more than once. A comparison that treats them as
numbers will report a green regression check over a milestone that measured
less. #488 designs exactly this machinery and should be read before any
comparison is written.

What the fourth provider does and does not prove

internal/cli/testdata/provider-four/ (#517) answers is the contract generic
enough?
It does not answer does Scaleway still work? The two are
complementary and this gate needs both: synthetic pack for the architecture
proof, three real packs for the product proof.

Where it stops

Closing this issue requires, all of them:

  • architecture — no pack reaches the concrete driver, no pack knows Incus or
    OVN, the fourth pack passes, the contract is closed and falsified;
  • functional — the three providers pass their reference scenarios; network,
    firewall and balancing really exercised where claimed and skipped by name
    where not; snapshot and restore; cleanup; concurrency;
  • clients — the official CLIs, Terraform and OpenTofu, the retained
    third-party stacks;
  • conformance — replay, contract, shapes, negative, behaviour, dataplane, and
    no unexplained fall against 0.11.0;
  • quality-race, crash and recovery, generated docs checked, changelog,
    release preflight.

One thing this gate must not become

A checklist somebody ticks. Every line above is a measurement with a witness,
and the pass that produces them says which of them it did not obtain. A gate
that reports only what it managed to check reads exactly like a gate that
checked everything.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions