The demo, unedited.
Below is the raw, unedited transcript of Gatekeep's offline demo — produced by a GitHub Actions runner on 2026-07-22, captured straight from stdout. No screenshots, no mockups: this is the actual pipeline reviewing a deliberately vulnerable payments PR, blocking the merge, working through the override governance, and verifying the hash-chained audit log.
What's real and what's mocked — precisely
The demo runs with MOCK_LLM=1: the five findings are canned,
pattern-based results standing in for your model, so the demo runs with zero
network. Everything else is the real product code path — the prompt assembly with
ticket context, the comment/gate thresholds, the blocking Check Run decision, the
override authorization and justification rules, and the append-only, hash-chained
audit log (including the chain verification at the end). Point
MOCK_LLM=0 at your own endpoint and the same pipeline runs against
your model.
$ MOCK_LLM=1 python -m mergegate.demo
==============================================================================
MergeGate DEMO — no GitHub, no network (mock LLM)
==============================================================================
Repo: acme/payments PR #481 head a1b2c3d4
Diff: sample_vuln.diff (640 bytes)
PR body: 573 bytes
LLM: MockLLM (canned findings)
==============================================================================
1b) PRODUCT/TICKET CONTEXT (F8) injected into the review prompt
==============================================================================
Extracted from the PR description (fenced `gatekeep:context` marker or a `## Ticket` / `Ticket:` heading), 429 chars:
JIRA FIN-1290 — Card charge endpoint
Intent:
- Charge a card via the bank API given (amount, token).
- Credentials MUST come from the secrets manager, never hardcoded.
- All outbound calls MUST verify TLS (no verify=False).
- User lookups MUST use parameterized queries (regulated data).
Acceptance criteria:
- No secret material committed to source.
- Idempotent retries on transient 5xx (not in this PR — follow-up FIN-1301).
-> labeled 'Product/ticket context' section present in the LLM user prompt: True (the model reviews the diff AGAINST this stated intent)
==============================================================================
1) PR REVIEW that would be posted to the timeline
==============================================================================
## MergeGate review
[MOCK REVIEW] Found 5 issue(s); highest severity is critical. Canned pattern-based findings — set MOCK_LLM=0 to use your real endpoint.
**Gate: BLOCKED** — 4 finding(s) at or above the gate threshold 'high' (highest: critical).
_1 finding(s) below the `medium` comment threshold were suppressed from this timeline but recorded in the audit log._
Inline comments (anchored to added lines):
- payments/gateway.py:3 [RIGHT] **[high] hardcoded-secret** — Hardcoded credential in source. Load from a secret manager / env var instead.
- payments/gateway.py:7 [RIGHT] **[high] sql-injection** — SQL query interpolates untrusted input via f-string. Use bound parameters.
- payments/gateway.py:13 [RIGHT] **[high] tls-verification-disabled** — TLS verification disabled. Never ship verify=False.
- payments/gateway.py:17 [RIGHT] **[critical] code-injection** — eval/exec on runtime input allows arbitrary code execution. Remove it.
==============================================================================
2) MERGE GATE decision -> Check Run `mergegate/review`
==============================================================================
conclusion : FAILURE
title : MergeGate: blocked — merge gate failing
reason : 4 finding(s) at or above the gate threshold 'high' (highest: critical).
suppressed : 1 finding(s) below comment threshold (still audited)
==============================================================================
3) OVERRIDE FLOW (governance core)
==============================================================================
a) unauthorized user attempts override:
-> granted=False (unauthorized actor)
b) authorized user, justification too short:
-> granted=False (justification too short)
c) authorized user, valid written justification:
-> granted=True (override granted)
Gate is now: SUCCESS — Overridden by @demo-lead — justification recorded
==============================================================================
4) APPEND-ONLY, HASH-CHAINED AUDIT LOG
==============================================================================
seq= 1 pr_reviewed actor=mergegate hash=c97cc2ffe526 prev=000000000000
seq= 2 gate_decision actor=mergegate hash=03b379d6ab5c prev=c97cc2ffe526
seq= 3 override_denied actor=random-dev hash=d4e39b813765 prev=03b379d6ab5c
seq= 4 override_denied actor=demo-lead hash=d0fa5d77ee1a prev=d4e39b813765
seq= 5 override_granted actor=demo-lead hash=d1dc99b5782b prev=d0fa5d77ee1a
chain verify: OK — unbroken
==============================================================================
Want to run it yourself, or see it against your own LLM on a real repo? Request early access — design partners get the container image and a hands-on onboarding session — or read the self-host quickstart to see exactly what deploying it takes.