See every verdict, from the real tool.
Everything on this page comes from one run of fourgate demo --pace 0 with limited beta fourgate 0.4.0b1, installed from PyPI with python -m pip install --pre "fourgate==0.4.0b1" into a fresh virtual environment. The output is split into its five scenes and otherwise unchanged, except that two local paths at the end were shortened.
Or jump to a recorded scene
S2
Fourgate enforce: broken connector
The agent is told the write did not land, before it can report success.
What the agent receives
- Agent receives, first:[FOURGATE] outcome_failed (reason: record_missing, recovery: stop)
- then the original:"Created ISSUE-001"
- isError=false
System of record
0 issues saved
Outcome log
FAIL record_missing (mode: enforce)
Raw terminal output for S2
FOURGATE DEMO - local only: no API keys, no network, nothing leaves this machine Simulated connector; a local file stands in for the system of record. An agent asks the demo-crm connector to create_issue "Q3 renewal follow-up". Each scene is a real MCP session; scenes S2-S5 run through a real `fourgate guard` process, which reads the system of record back after the connector reports success. [2/5] S2 Fourgate enforce: broken connector Same broken connector, now behind `fourgate guard --mode enforce`. Agent receives, first: [FOURGATE] outcome_failed (reason: record_missing, recovery: stop) then the original: "Created ISSUE-001" isError=false System of record: 0 issues saved Outcome log: FAIL record_missing (mode: enforce) -> The agent is told the write did not land, before it can report success.
The complete output, start to finish
FOURGATE DEMO - local only: no API keys, no network, nothing leaves this machine
Simulated connector; a local file stands in for the system of record.
An agent asks the demo-crm connector to create_issue "Q3 renewal follow-up".
Each scene is a real MCP session; scenes S2-S5 run through a real `fourgate guard` process,
which reads the system of record back after the connector reports success.
[1/5] S1 Without Fourgate: broken connector, called directly
The connector reports success but never saves the issue. No Fourgate in the path.
Agent receives: "Created ISSUE-001" (isError=false)
System of record: 0 issues saved
Outcome log: no record (Fourgate is not in the path)
-> The agent believes the issue exists. It does not.
[2/5] S2 Fourgate enforce: broken connector
Same broken connector, now behind `fourgate guard --mode enforce`.
Agent receives, first: [FOURGATE] outcome_failed (reason: record_missing, recovery: stop)
then the original: "Created ISSUE-001"
isError=false
System of record: 0 issues saved
Outcome log: FAIL record_missing (mode: enforce)
-> The agent is told the write did not land, before it can report success.
[3/5] S3 Fourgate enforce: healthy connector
A healthy connector that really saves the issue, behind `fourgate guard --mode enforce`.
Agent receives: "Created ISSUE-001" (isError=false)
The response is identical to scene S1: no [FOURGATE] verdict
System of record: 1 issue saved
Outcome log: PASS postcondition_satisfied (mode: enforce)
-> A real success passes through untouched.
[4/5] S4 Fourgate shadow: broken connector
The broken connector behind `fourgate guard --mode shadow` (the default mode).
Agent receives: "Created ISSUE-001" (isError=false)
The response is identical to scene S1: no [FOURGATE] verdict
System of record: 0 issues saved
Outcome log: FAIL record_missing (mode: shadow)
-> The agent is unaffected; you still learn the write did not land.
[5/5] S5 Fourgate enforce: broken connector, system of record unreachable
The broken connector in enforce mode, but the read-back cannot reach the system of record.
Agent receives: "Created ISSUE-001" (isError=false)
The response is identical to scene S1: no [FOURGATE] verdict
System of record: 0 issues saved
Outcome log: UNKNOWN verifier_error (mode: enforce)
-> Fourgate could not confirm either way: recorded UNKNOWN, never PASS, and the call is not blocked.
Summary
Totals (from fourgate summary): PASS 1 / FAIL 2 / UNKNOWN 1
Outcome log: ./fourgate-demo/demo-outcomes.jsonl
Summary page: ./fourgate-demo/fourgate-demo-summary.html
Self-check: every scene behaved as narrated.Paths shortened: the last block originally printed absolute paths on the machine that ran it. Captured 2026-11-14 on Linux, Python 3.12.3; exit code 0. Fourgate is tested on Python 3.10–3.13.
Run it yourself.
Three commands in a fresh virtual environment. Python 3.10–3.13, Linux or Windows. The demo itself needs no API keys and no network.
python3 -m venv fourgate-envfourgate-env/bin/python -m pip install --pre "fourgate==0.4.0b1"fourgate-env/bin/fourgate demo
If the fourgate command is not found on PATH, python -m fourgate demo works the same way. The run writes a local summary page to ./fourgate-demo/fourgate-demo-summary.html. Add --pace 2 to slow it down for a screen recording.
The real sample report
This is the fourgate-demo-summary.html page the run above produced, copied byte for byte. It has no JavaScript and makes no network requests, and contains structure only: no arguments, record values, response bodies or credentials. Its numbers come from the simulated demo, not customer traffic.
Ready to try it on a real workflow?
Start in shadow mode on a disposable account. Your agent sees nothing different.