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 ↗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.
A purchase can be refunded within 7 days.
- export const REFUND_WINDOW_DAYS = 7;+ export const REFUND_WINDOW_DAYS = 14;
| Claim | Expected | Actual | Where |
|---|---|---|---|
| Refunds are allowed for 7 days after purchase | 7 | 14 | src/refund.ts:2 |
Scenes from public issue trackers, every week. Nobody noticed in the pull request that moved the value; someone opened an issue later.
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 ↗The fix changed the default instance count. "Defaults to 0" stayed in the docs until a user opened an issue.
pulumi-awsx #941 · 2022 ↗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 ↗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 ↗of open source respondents see incomplete or outdated documentation as a pervasive problem
GitHub Open Source Survey 2017 ↗doc lines stating a code value across 136 public TypeScript repositories. The next PR changes one of them
MergeGate measurement · 2026-10Whoever reads it, the code decides the value. The pull request finds out first when a doc line turns false.
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.
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.
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
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.
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.
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.
A claim turns red only when the engine actually resolved the value from the code. No guessing. Block the merge if you opt in.
The value could not be read, or the code a spec points at changed. A human looks. No setting can promote a 🟡 to a 🔴.
Only 🔴 that this pull request introduced can fail it. Pre-existing drift never blocks today's work.
Only 🔴 can block a merge (Team); 🟡 is report-only. Line-level annotations.
Non-developers read the specs and the current drift without opening the repository. Edits go through pull requests.
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.
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
Per repository, unlimited seats. Public repositories are never counted.
KRW, VAT included (₩29,000 ≈ $21). Card payments by Toss Payments; global checkout is coming.
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.
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.
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.
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.
Constants, strings, arrays, enum members, config object keys and leaf values, routes, env defaults, schema field types. TypeScript and JavaScript.
All public repositories, and your first private repository in report-only mode. Private repositories also get one docs-vs-code report on install.
Install and see. Free for public repositories, and for your first private one.