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.

MOCK_LLM=1 · ZERO NETWORK · CAPTURED IN CI · 2026-07-22

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.

demo-transcript.txt unedited · GitHub Actions
$ 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.