GitHub check · CLI · MCP

Stale docs never fail a test.MergeGate fails the pull request.

The default in your README, the refund window in your PRD, the setting in CLAUDE.md. MergeGate pins the values your docs state to the code. When a pull request changes one, the check run points at the doc line it just made false.

  • No LLM in the verdict — same input, same result
  • Your code never stays on our servers
  • Free for public repos · one private repo free
1Docspecs/features/F-014-refund.md

A purchase can be refunded within 7 days.

2PR #128src/refund.ts
- export const REFUND_WINDOW_DAYS = 7;+ export const REFUND_WINDOW_DAYS = 14;
3Check runmergegate/spec-drift
🔴 1 · 🟡 0 · ✅ 2
New drift 1
ClaimExpectedActualWhere
Refunds are allowed for 7 days after purchase714src/refund.ts:2
Open update PRIf the code is right, one click opens a PR that rewrites the spec to match it.

“But the docs say…”

Scenes from public issue trackers, every week. Nobody noticed in the pull request that moved the value; someone opened an issue later.

5s → 60s

The documented default, the real default

A test run over 4,000 schemas slowed to a crawl. The search went everywhere else first; the documented timeout default did not match the code.

json-schema-ref-parser #373 · 2025 ↗
0 → 1

The default changed, the docs did not

The fix changed the default instance count. "Defaults to 0" stayed in the docs until a user opened an issue.

pulumi-awsx #941 · 2022 ↗
3000 ≠ 4321

One value, three docs

CLAUDE.md and the README were right; AGENTS.md still named the old port. An agent never asks which one is true.

agentstate #303 · 2026 ↗
7-day auto-confirm

The design moved, the spec stayed

Auto-confirm window, fee rate, retry policy. While the settlement design changed, the planning doc fell behind and had to be corrected all at once.

Programmers devcourse TRSS #162 · 2026 ↗
93%

of open source respondents see incomplete or outdated documentation as a pervasive problem

GitHub Open Source Survey 2017 ↗
60%

of contributors rarely or never contribute to documentation

GitHub Open Source Survey 2017 ↗
1,700+

doc lines stating a code value across 136 public TypeScript repositories. The next PR changes one of them

MergeGate measurement · 2026-10

Three people read the same doc

Whoever reads it, the code decides the value. The pull request finds out first when a doc line turns false.

DEV

Developers · maintainers

Defaults, limits and env tables in your README. On install you see the lines already behind the code, with the commit that moved each value; the rest are guarded from the next PR on.

PM

Product managers

Refund windows, plan limits, status sets. Declare the value a sentence depends on in one line, and any PR that changes it shows that sentence. Read it in the web viewer without opening the repository.

AGENT

AI coding agents

CLAUDE.md and AGENTS.md are docs too. Lines naming a code value are pinned by the same rules as the README, and agents read the specs over MCP before they implement.

“very confidently poison the agents moving forward” — Hacker News, 2025

Three steps

  1. Install

    Right after installation it finds the lines in your docs that state a value from the code and compares them. Lines already wrong are listed in an issue with the commit that moved the code; the rest become a draft PR that pins their values.

  2. Declare values

    In the front matter of specs/features/*.md, declare the value a sentence depends on — one line. Humans read the prose; the engine reads the values.

  3. Every PR

    The declared values are read from the code and compared. A claim that became false is 🔴, what needs a human look is 🟡, what holds is ✅.

specs/features/F-014-refund.mdassertions:
  - id: A-F014-001
    claim: "Refunds are allowed for 7 days after purchase"
    type: const.equals
    source: src/refund.ts#REFUND_WINDOW_DAYS
    expect: 7
---
# Refund policy
A purchase can be refunded within 7 days.

Why teams keep the check on

🔴

Only when a declared value is provably false

A claim turns red only when the engine actually resolved the value from the code. No guessing. Block the merge if you opt in.

🟡

Never blocks

The value could not be read, or the code a spec points at changed. A human looks. No setting can promote a 🟡 to a 🔴.

↩

Old drift is not this PR's fault

Only 🔴 that this pull request introduced can fail it. Pre-existing drift never blocks today's work.

Four surfaces

PR check run

Only 🔴 can block a merge (Team); 🟡 is report-only. Line-level annotations.

Web viewer

Non-developers read the specs and the current drift without opening the repository. Edits go through pull requests.

MCP · Claude Code plugin

Your coding agent reads the spec before implementing, sees what it broke afterwards, and updates the spec in the same commit when the code is right.

CLI

mergegate check / propose / scan / init. Any CI, your own keys only (BYOK).

# Any CI
npx mergegate-cli check            # exit 1 on new 🔴
npx mergegate-cli propose --write  # 🔴 and the code is right? rewrite the spec (BYOK)
npx mergegate-cli mcp              # stdio MCP: search_specs · get_spec · list_drift · propose_update

Pricing

Per repository, unlimited seats. Public repositories are never counted.

Free

₩0
  • Unlimited public repositories (merge blocking included)
  • One private repository, report only
  • One docs-vs-code report on install
  • CLI · BYOK
Install
Popular

Team

29,000원
private repo / month
  • Every repository · unlimited seats
  • Merge blocking (failure)
  • Update-PR button
  • Web viewer · MCP
  • 14-day card trial
Start 14-day trial

Org

99,000원
month · 10 private repos included
  • 9,900원 per extra repo
  • Everything in Team
  • Org-wide schema · audit log (soon)
Contact

KRW, VAT included (₩29,000 ≈ $21). Card payments by Toss Payments; global checkout is coming.

FAQ

Does it find docs that are already wrong?

Yes. On install it reads the last 90 days of history and opens an issue listing every doc line that still states a value the code used to have, with the commit that moved it. Lines that hold become a draft PR that pins their values.

Does my code stay on your servers?

No. A PR check fetches the commits with an installation token, judges them and deletes them. We store accounts, plans and charges only. The CLI and MCP server run entirely on your machine.

Where is the LLM used?

Not in the judgement. Only when the "Open update PR" button rewrites sentences: the values come from the code, a model rewords the prose, and the engine re-judges the patch before it becomes a PR.

How is this different from tests?

Tests check behaviour you wrote code for. This checks that the document a PM reads still describes the code, and it fails the PR, not a test suite nobody re-reads.

What can I declare?

Constants, strings, arrays, enum members, config object keys and leaf values, routes, env defaults, schema field types. TypeScript and JavaScript.

What is free?

All public repositories, and your first private repository in report-only mode. Private repositories also get one docs-vs-code report on install.

Which doc line will your next PR make false?

Install and see. Free for public repositories, and for your first private one.