A guard can enforce only what the host registered
The same document and egress guard produce opposite outcomes. The only variable is whether the tool result cycles through process_inbound before returning to the model.
You are here
SourceIngressEgressSink
Loop left open
1. The host appends the tool result directly
STATE RECORDEDThe document goes straight into model context. process_inbound is never called, so no provenance span is registered.
registered spans = 0
2. Egress has nothing to match against
ALLOWEDThe same guard runs on the same content.
clean
Loop closed
1. The host cycles the result through process_inbound
STATE RECORDEDThe identical document is ingested first, which registers its origin.
registered spans = 1
2. Egress can now attribute the span
BLOCKEDThe same guard runs on the same content.
Verbatim overlap (148 chars) with untrusted content from mcp_server:docstore
One variable: both columns use the same document and the same egress guard. The only difference is the ingress call the host did or did not make. Document under test: Partner launch notes: retain the internal pricing assumptions and migration schedule until the public announcement is approved by legal and finance.
Evidence, scope, and reproduction
Adversary A2Ingress + EgressT-IN8A-AS1 · A-AS9Source:
SecurityPipeline.process_inboundTest: tests/test_demo_scenarios.pyExact fixture test: tests/test_demo_scenarios.py::test_tool_feedback_fixture
.venv/bin/python -m pytest tests/test_demo_scenarios.py::test_tool_feedback_fixture -q
Generated fixture