needs-human under CHARTER §8 — a strategic scope decision. Filed so it is decided deliberately rather than discovered in a pilot.
The mismatch
The differentiator flowproof sells is reach: the agent's decisions and the enterprise systems it drives — SAP GUI, Windows desktop, Citrix. The strongest guarantee flowproof makes is egress containment, and it exists on Linux only.
Those two sets barely overlap. The systems flowproof uniquely reaches are precisely the ones where the strongest claim is unavailable.
Current state:
run_against_contained on non-Linux is run_against with an empty EgressLog — no filter, no error (crates/flowproof-adapters/src/agent_runner.rs:674-685).
Containment::command_flow() on non-Linux returns NotContained("egress containment is Linux-only; this platform is not contained") (crates/flowproof-adapters/src/egress.rs:74-79).
assert_no_egress hard-errors as a capability error on those platforms, with no bypass flag (crates/flowproof-cli/src/agent_flow.rs:842-848). This behaviour is correct and this issue does not propose changing it.
- Windows was started and is unfinished:
spike/windows-containment is deliberately excluded from the workspace (Cargo.toml:11-28) and its LOG.md:1-3 reads "Status: in progress". There is no WFP code in crates/.
The honest consequence today
A flow that declares allow_egress without an assert_no_egress step still passes on macOS and Windows, uncontained, reaching whatever it likes. check_egress only gates on plan.assert_no_egress, so nothing forces the operator to notice. The tier line printed on stdout is the only signal, and a green build is not a place people read tier lines.
That is not a false green in the strict sense — no assertion claimed containment — but it is the shape of thing that becomes one in a customer's pipeline.
The decision
- Is Windows containment on the roadmap, or is Linux-only the answer? If the pilot motion is SAP on Windows, "we contain on Linux" is a weak answer to the question a pilot will actually ask. If the answer is Linux-only for the foreseeable future, that should be said plainly on the page rather than being discoverable only from a tier line.
- Cheap interim, independent of 1: should
allow_egress without assert_no_egress on an uncontained platform warn loudly — or refuse? Declaring an allow-list is a statement of intent; silently not enforcing it is the gap most likely to bite. This one is small and does not require deciding the roadmap question.
Related coverage note
The seccomp runtime is proven only on Linux CI and only behind RUN_EGRESS_E2E=1 (.github/workflows/ci.yml:167; the test is #[cfg(target_os = "linux")] at crates/flowproof-cli/tests/egress_e2e.rs:14 with an enabled() early-return). On a dev machine without that variable the E2E silently no-ops. Not a defect, but worth knowing when weighing how much of the containment path is routinely exercised.
Context
Filed alongside #300 and #301 (two Priority-1 false greens in the Linux containment path) and #302 (containment is network-only). Those three are about whether containment works where it exists; this one is about where it exists at all.
needs-humanunder CHARTER §8 — a strategic scope decision. Filed so it is decided deliberately rather than discovered in a pilot.The mismatch
The differentiator flowproof sells is reach: the agent's decisions and the enterprise systems it drives — SAP GUI, Windows desktop, Citrix. The strongest guarantee flowproof makes is egress containment, and it exists on Linux only.
Those two sets barely overlap. The systems flowproof uniquely reaches are precisely the ones where the strongest claim is unavailable.
Current state:
run_against_containedon non-Linux isrun_againstwith an emptyEgressLog— no filter, no error (crates/flowproof-adapters/src/agent_runner.rs:674-685).Containment::command_flow()on non-Linux returnsNotContained("egress containment is Linux-only; this platform is not contained")(crates/flowproof-adapters/src/egress.rs:74-79).assert_no_egresshard-errors as a capability error on those platforms, with no bypass flag (crates/flowproof-cli/src/agent_flow.rs:842-848). This behaviour is correct and this issue does not propose changing it.spike/windows-containmentis deliberately excluded from the workspace (Cargo.toml:11-28) and itsLOG.md:1-3reads "Status: in progress". There is no WFP code incrates/.The honest consequence today
A flow that declares
allow_egresswithout anassert_no_egressstep still passes on macOS and Windows, uncontained, reaching whatever it likes.check_egressonly gates onplan.assert_no_egress, so nothing forces the operator to notice. The tier line printed on stdout is the only signal, and a green build is not a place people read tier lines.That is not a false green in the strict sense — no assertion claimed containment — but it is the shape of thing that becomes one in a customer's pipeline.
The decision
allow_egresswithoutassert_no_egresson an uncontained platform warn loudly — or refuse? Declaring an allow-list is a statement of intent; silently not enforcing it is the gap most likely to bite. This one is small and does not require deciding the roadmap question.Related coverage note
The seccomp runtime is proven only on Linux CI and only behind
RUN_EGRESS_E2E=1(.github/workflows/ci.yml:167; the test is#[cfg(target_os = "linux")]atcrates/flowproof-cli/tests/egress_e2e.rs:14with anenabled()early-return). On a dev machine without that variable the E2E silently no-ops. Not a defect, but worth knowing when weighing how much of the containment path is routinely exercised.Context
Filed alongside #300 and #301 (two Priority-1 false greens in the Linux containment path) and #302 (containment is network-only). Those three are about whether containment works where it exists; this one is about where it exists at all.