Safe House gateway integration
This page explains how Safe House integrates technically with the Mnemom gateway. If you are new to Safe House, start with the concept overview first.Request pipeline
Safe House runs as Phase 0.5 — after agent identification resolves the agent config and policy, but before quota enforcement or message forwarding. This placement is intentional: the gateway already knows which agent is handling the request (so Safe House config can be loaded), but no downstream resources have been consumed yet. Phase 0.5 is not a single screen per turn. It runs once per inbound surface the request carries: the inbound message, and — whenscreen_surfaces.tool_responses is enabled — each tool result the agent is handing back to the model in that same request body. A turn that makes three tool calls comes back through Phase 0.5 with those results in tow, and they are screened there, before Phase 3 forwards anything. Nothing about tool-result screening is deferred to Phase 4 or to a later request.
Phase-by-Phase breakdown
Phase 0 — Agent identification
The gateway resolves theAuthorization header to an agent record and loads the agent’s alignment card, canonical protection card (including the org’s protected_surface), and policy bundle from KV. If Safe House mode is disabled (the default), Phase 0.5 is skipped entirely with no performance cost.
Phase 0.5 — Safe House screening
Behavior depends on the configured mode:- enforce
- observe
- simulate
Safe House runs synchronously. The gateway awaits the full L1→L2→L3 verdict before deciding whether to continue.
passorwarn: pipeline continues to Phase 1quarantine: request is stored in the quarantine queue with the full message payload; gateway returnsHTTP 400with body:block: request is dropped; gateway returnsHTTP 403with body:
X-Safe-House-Verdict header is present on all responses in this mode. For quarantine verdicts, X-Safe-House-Quarantine-Id contains the entry ID.Tool results are screened here, in the same request
Whenscreen_surfaces.tool_responses is enabled, Phase 0.5 does not stop at the inbound message. The gateway extracts the tool results from the inbound body of the request it is currently handling and screens each on its own tool_result surface — a separate L1 pass, a separate L2 judgement, a separate verdict per tool result. This is a bare await in the request path, not a background task. Coverage is not unconditional: a request that fans out to many tool calls in a single turn is not guaranteed full coverage.
The per-tool verdicts are then applied to that same request body before Phase 3 dispatches it:
The request body is re-serialized after this rewrite and that serialization is what Phase 3 forwards. None of this is handed off to the Phase 4 AIP pass or to the agent’s next request.
Verified against the gateway source. In
mnemom/mnemom-platform at commit c8122e65, judgeShadowScreen() is defined at gateway/src/index.ts:7683 and called with sourceType: "tool_result" at gateway/src/index.ts:8088 (the synchronous acting chain that produces the per-tool decisions applied above), gateway/src/index.ts:7990 (the waitUntil shadow chain — recording only, never changes acting behaviour), and gateway/src/index.ts:14977 (the observe recorder, which never modifies the message). All three run inside the lifecycle of the request that carried the tool results.Phase 1 — Quota enforcement
Standard token and request quota checks run here. In enforce mode, this phase is only reached by messages that passed Safe House screening, so quota is not consumed by quarantined or blocked attempts.Phase 2 — Policy evaluation
The three-layer policy merge (org → agent → transaction) runs here. Safe House operates independently of the policy engine — a message can pass Safe House and fail policy, or vice versa.Phase 3 — Forward to AI provider
The message is forwarded to the configured AI provider (Anthropic, OpenAI, Gemini, etc.). In enforce mode, only messages with a Safe Housepass or warn verdict reach this stage — and what is forwarded is the body as rewritten by Phase 0.5, with withheld tool results already replaced by their quarantine notices and warned tool results already decorated.
Phase 4 — AIP conscience analysis
The streaming response is teed through the AIP analysis pipeline. If Safe House scored the inbound message with a non-zero threat score (even if the verdict waspass), that score and the specific threat categories detected are injected into the conscience prompt. This gives AIP additional signal to scrutinize the resulting reasoning.
What Phase 4 does with the AIP verdict depends on the agent’s integrity mode. In enforce mode the response is gated the same turn — it is evaluated before it is delivered, so a violating response is blocked rather than returned (on streaming this adds latency). In observe and nudge modes the response is returned without being gated this turn; the verdict is recorded (and, for nudge, carried into the agent’s next turn).
The enrichment looks like:
protected_surface (forbidden operations, sealed assets) happens in Phase 0.5, not Phase 4. The same is true of tool-result screening — it is a Phase 0.5 front-door check on the inbound body, not something Phase 4 picks up afterwards. By the time Phase 4 runs, the org’s hard policy floor has already been evaluated and every screened tool result has already been withheld, decorated, or passed. Phase 4 AIP enrichment adds behavioral context from the alignment card; it does not re-derive the org’s protected_surface and it is not the tool-result screen.
KV caching
Safe House configuration and session state are cached in theBILLING_CACHE KV binding (the same binding used for quota state). Cache TTLs:
The
BILLING_CACHE binding must be present in wrangler.toml for Safe House to operate. If the binding is absent and SAFE_HOUSE_ENABLED=true, the gateway logs a warning and skips Safe House analysis for all requests.
Pre-emptive nudge injection
This is the one Safe House mechanism that genuinely carries to a later request — and it is an advisory, not a screen. When a message passes Safe House screening but its L2 score is ≥ 0.6, Safe House writes a record to theenforcement_nudges table. On the agent’s next request, the gateway’s standard nudge injection logic picks this up and prepends a notice to the system prompt:
Attestation
Safe House scores are included in the attestationinputCommitment hash. When proof generation runs for a checkpoint, the hash commits to:
- The message content
- The Safe House L1 score, L2 score, and verdict
- The session risk level at time of message
- Whether any canary patterns were matched
Hardened-default Safe House configuration
For agents operating in high-trust, high-risk environments (financial automation, infrastructure management, regulated data handling), set a hardened protection card viaPUT /v1/protection/agent/{agent_id}. A reasonable starting baseline against the canonical UnifiedProtectionCard:
enforce mode is on (instead of observe); thresholds are tighter than defaults; and all four surfaces are screened — incoming (user/principal prompts), outgoing (the agent’s response), tool_calls (arguments going to tools), and tool_responses (values coming back from tools, screened in Phase 0.5 of the request that carries them, before the model sees them). Trust nothing implicitly: trusted_sources starts empty and is widened only with explicit, audited entries.
Canary credentials (sh.canary.triggered) and session-escalation policy are configured separately from the protection card; see Canary credentials and the webhook event catalog for the canonical surfaces.
Environment requirements
Safe House requires the following to be present in the gateway environment:
No additional API keys or service bindings are required — L2 analysis runs through the existing Anthropic API key configured for the gateway.
See also
- Safe House concept — What Safe House is and how the threat categories work
- Safe House Quickstart — Enable and test Safe House in 5 minutes
- Enforcement Modes — How the gateway handles downstream violations
- Policy Engine — The parallel policy evaluation system