Skip to content

Decision: containment is Linux-only, and the reach we differentiate on is Windows #303

Description

@AminChirazi

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

  1. 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.
  2. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanA loop escalated this: it needs a decision or a protected-path change

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions