Status: synthetic acceptance complete; this is not an automatic enforcement decision.
main was restarted into the merged 0.5.12 implementation at 07:22 CDT and
again at 07:28 CDT after removal of the temporary canary policy. The safe
GET /health/liveliness endpoint returned "I'm alive!" after each restart.
The value-free report was generated with:
.venv/bin/python scripts/measurement-report.py pii-egress \
logs/airlock-2026-08-11.jsonlThe report contained five airlock_pii_egress events, all in observe mode:
| Synthetic route | Decision | Reason | Client result |
|---|---|---|---|
| configured round-trip email | allow | round_trip |
exact value hydrated |
| exfil email without residual grant | deny | exfil_not_allowlisted |
exact value hydrated (observe) |
| exfil email with scoped residual grant | allow | residual_allow |
exact value hydrated |
| sensitive test payment identifier in round-trip route | deny | sensitive_class |
exact value hydrated (observe) |
| unknown email tool | deny | unknown_tool |
exact value hydrated (observe) |
The payment test identifier was recognized as US_BANK_NUMBER, which is in the
same default-sensitive veto set as card/SSN classes. The expected policy outcome
was therefore preserved.
No external tool was executed. The client receives hydration only because this
was an observe-mode run; the three deny decisions emitted would_suppress.
- A global JSONL sweep found zero
airlock_pii_mapkeys after the historical logs were scrubbed and rotated. - A sweep for each synthetic value found zero serialized copies in the Airlock JSONL logs.
- The telemetry record retains the response before hydration; only the client return value was checked against the synthetic input.
This run proves the five policy branches and sink containment with synthetic
traffic. It does not prove the traffic-distribution metrics required for
layered enforcement: a single round-trip example cannot establish M1's >=90%
rate; the synthetic window cannot establish M3 residual-list stability or M6
unknown-tool reduction. Four earlier .test-domain requests were not recognized
by the active email recognizer and produced no egress events; the final five
events above use recognizer-supported reserved example.com addresses.
2026-08-11: retain observe. The owner chose to keep the release in its safe default observe mode while representative dogfood traffic is collected. No interim known-bad blocklist is enabled today.
The promotion path is implemented and tested: set
AIRLOCK_PII_EGRESS_MODE=enforce and configure
AIRLOCK_PII_EGRESS_BLOCKLIST as a JSON list of {tool, path, entity_type}
entries, then restart Airlock. The blocklist is a deny override, so it wins over
both a round-trip band and a scoped residual allow. This remains a future owner
change after the representative metrics justify it.