Docs that stay true to your code.

Staleproof follows every pull request through a graph of your code and docs to the paragraphs it makes false, runs the examples to prove it, and writes the fix.

It also checks the files AI coding agents read: a stale command, link or env var in AGENTS.md, CLAUDE.md or your Cursor and Copilot rules is flagged like any other doc. How lint works

$npx -y staleproof check https://github.com/FalkorDB/falkordb-py/pull/262
  • Open source, MIT
  • No model key needed
  • Python · TypeScript · JavaScript · Go
FalkorDB/falkordb-py#262fix: only forward accepted kwargs from Is_Cluster
  1. changedIs_Cluster
  2. called byFalkorDB.__init__
  3. used inREADME · Asynchronous Example
beforefailsTypeError: unexpected keyword argument 'himport_registry'
afterpassesexit 0

No doc names Is_Cluster, so a search finds nothing. The call graph finds the README.

Try it

Check any pull request

Paste a pull request from any public Python, TypeScript or JavaScript repository. The first check indexes it in seconds.

Graph mode

Impact, clearance, ranking and example runs in a fixed order. No model, no key, deterministic.

Agent mode

A model reads each affected section and writes a verdict or an edit for every one.

The interactive demo needs JavaScript. These are the pull requests it opens with:

Who it's for

Anyone whose docs live apart from their code

Library and SDK maintainers

Your client, the SDK built on it and the docs site are three repositories. A change in the first surfaces the pages in the other two.

41 of 43 sections falkordb-py#276 reached were in other repositories.

GitHub App

Teams coding with AI agents

Claude Code, Cursor and Copilot read AGENTS.md and CLAUDE.md. Staleproof keeps those files true, and answers your agent over MCP before it changes a function.

docs_for_symbol, check_changes and the docs patch, in the same session as the code.

MCP server

DevRel and docs teams

Know what a release falsified, most-read page first, and ship one patch with the evidence behind every edit.

An audit lists the public API no page covers, and every example that no longer fits the code.

Audit a repository

Open-source maintainers

A docs check on every pull request: the sections it can make false, the path for each, and a button that applies the fix.

Beta rules only inform. Nothing fails a check until the Drift Hall shows it at 80% precision or better.

GitHub Action
Why it works

Three things a search can't do

Δ fncallercallerREADME§ examplegrep "fn"0 results

It follows calls, not names

Up to three call hops from the changed function, across repositories, to the docs that use it. Grep stops at the name.

$ run README#async @ base✕ TypeError: unexpected keyword argument$ run README#async @ pr✓ exit 0

It runs the example, before and after

Each affected example runs at both commits in a sandbox. "This PR broke it" is a test result, not a guess.

README · Asynchronous Examplestale · the kwargs it passes are no longer acceptedIs_Cluster → FalkorDB.__init__ → README✕ no graph path to this paragraph → no edit proposed

Every finding carries its receipt

The path from the change to the paragraph is shown on every hit. No path, no edit: the tool refuses.

How it works

From a pull request to a proven docs fix

  1. 01

    Index

    Code, docs and examples from every repository go into one FalkorDB graph, with the calls between them.

  2. 02

    Trace

    From each changed function, walk the callers to the sections that use them. The rest is cleared, with proof.

  3. 03

    Prove

    Run each affected example at the commit before the PR and at the PR, in a sandbox.

  4. 04

    Fix

    Every section gets a verdict, and a git apply-able patch with the evidence. Decisions are remembered for the next PR.

The question is a graph question

"Which paragraphs, in which repositories, can this change make false?" is reachability over call edges. One Cypher pattern answers it.

The graph model and every query
impact (excerpt)
MATCH (pr:PullRequest {url: $pr})<-[c:CHANGED_IN]-(s:Symbol)
WHERE c.kind <> 'added'
MATCH p = (s)<-[:CALLS*0..3]-(t:Symbol)<-[:MENTIONS|USES]-(d)
WHERE (d:DocSection OR d:CodeExample) AND d.status = 'live'
RETURN d.id, length(p) AS hops,
       [n IN nodes(p) | coalesce(n.qualname, n.id)] AS evidence
Install

Six ways in, one npm package

Pick the one that matches where your docs break.

Install once, every pull request is checked

No workflow file and no secrets. Each PR gets a check with annotations, suggestions, and an Apply fixes button.

GitHub App guide
github.com/apps/staleproof
1. Install the app on your repositories
2. Open a pull request
3. Read the "Staleproof" check: the docs it can make false,
   the path for each, and the fix as a suggestion
Compared

Why not grep, or a vector store?

grep / code searchVector searchStaleproof
Finds docs that reach the change through other functionsOnly the names you search forSimilar text, not reachabilityUp to 3 call hops, any repository
Proves a change broke an exampleNoNoRuns it before and after
Says why a paragraph is flaggedThe matching lineA similarity scoreThe evidence path
Noise on 4 checked pull requests227 unrelated matches—Only sections the change reaches
FAQ

Questions developers ask first

Do I need an LLM API key?

No. Graph mode runs impact, clearance, ranking and example runs with no model. Agent mode adds a model that reads each section and writes the verdicts and edits; it needs ANTHROPIC_API_KEY or any Anthropic-compatible endpoint.

Which languages does it understand?

Code: Python, TypeScript, JavaScript and Go, across repositories. Docs: Markdown, MDX and reStructuredText. Python examples are run before and after a pull request; JavaScript and TypeScript examples are checked statically.

Do I need a pull request?

No. Audit any public repository to see which examples no longer fit the code today, run lint in a pre-commit hook, or ask over MCP which docs depend on a function before you change it.

Does my code leave my machine?

With the CLI, the Action or the editor extension, indexing, the graph and example runs stay where you run them; private repositories work with a token. Graph mode sends nothing to a model. The hosted site and MCP server index public repositories only.

Will it open pull requests on its own?

No. It proposes edits as suggestions, a git apply-able patch, or one fix PR you opt into. Nothing is pushed without you.

What does it cost?

Nothing: it is MIT licensed. You run FalkorDB (locally, in Docker, or on FalkorDB Cloud's free tier) and pay your model provider only in agent mode.

More in Troubleshooting and FAQ.

Check your next pull request before your readers do.

Install once. Every pull request after that gets its docs impact, with proof.