You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
Scaleway — VPC, private network, server, public IP or gateway, security
group, and the load balancer's control plane (its dataplane is declared absent, enforced.balancing = ["outscale"], so the balancing assertion skips out
loud rather than passing).
Outscale — Net and Subnet, Vm, root volume, security group, public
address, LBU with its dataplane, which is the only one this emulator
materialises.
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
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;
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.
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.0replaced three diverging runtime paths with one. The temptation aftersuch 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:
group, and the load balancer's control plane (its dataplane is declared absent,
enforced.balancing = ["outscale"], so the balancing assertion skips outloud rather than passing).
address, LBU with its dataplane, which is the only one this emulator
materialises.
NLB where applicable, block storage. Driven by the
exoCLI: Terraform isrefused for this pack until upstream honours the endpoint (feint down on the exoscale stack sent five signed requests to api-ch-*.exoscale.com: the published provider splits, the stack lifts the only refusal, and only the fake signature stood #525), and what
that leaves uncovered is named rather than skipped in silence.
And it must be real traffic
API says runningis no longer enough — that sentence is exactly what hid fourdefects on 2026-08-26. For every claimed dataplane:
Reachability is measured the way a user reaches it — through the published
address — never through
incus exec, which bypasses the network, the firewalland the address and would have found none of the four defects.
The release invariant: no axis regresses unexplained
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.jsonalready uses.One trap, measured on this repository: three of the seven axes are verdict
strings, not booleans.
"unobserved"and"unchecked"are non-empty and havebeen 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 genericenough? 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:
OVN, the fourth pack passes, the contract is closed and falsified;
firewall and balancing really exercised where claimed and skipped by name
where not; snapshot and restore; cleanup; concurrency;
third-party stacks;
no unexplained fall against 0.11.0;
-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.