3.9 KB · updated 2026-07-31 · md

v0.28.2.md

docs/release-notes/v0.28.2.md

Tesserae v0.28.2 — verify_claim from the shell, and a doc that was lying about it

<!-- translations:start -->

한국어 · 中文 · 日本語 · Русский · Español · Français · Deutsch

<!-- translations:end -->

Released 2026-07-27 · PyPI · GitHub release · pip install --upgrade tesserae==0.28.2

Both items came from a team building against verify_claim from another codebase. Both are the kind of thing you only find by being a consumer.

tesserae verify-claim

verify_claim was an MCP tool and nothing else. That makes it unreachable for anyone who talks to Tesserae by subprocess rather than importing it — and importing it is not free: it pulls the whole tree into your virtualenv and version-couples your project to ours.

Same gap graph-map closed in v0.25, same fix.

tesserae verify-claim -s 'Flash Attention' -p uses -o 'Tiling'
# -> {verdict, reason, triple, citation, provenance, advisory}

Endpoints resolve by exact node id, unique casefolded name, or unique alias. There is no natural-language input, by design — anything else is NOT_RESOLVABLE rather than a guess.

Exit code is 0 for every verdict that is an answer, including ABSENT ("this graph does not assert it" is a real answer, not an error), and 2 for NOT_RESOLVABLE so a script can tell could not check from checked, and here is the result. Branch on verdict together with provenance.class; never on reason.

Re-grounding decides verdicts. The docs said it never could.

The reground parameter's documentation promised it was "advisory only" and "can never change the verdict". The implementation has disagreed since it was written: document_backed requires regrounded is not False.

The implementation was right. SUPPORTED asserts that a claim's evidence is a verbatim span of a real document, and on the real 15,284-edge graph 198 of 2,088 SUPPORTED verdicts cited text the file provably does not contain — fragments the extractor had stitched across headings. Class alone cannot see that, because class comes from metadata and only re-grounding reads the disk.

So the doc was corrected rather than the gate:

  • regrounded: false — we read the file and the span was absent. Disproven evidence cannot be SUPPORTED; the verdict is demoted to PRESENT_UNEVIDENCED.
  • regrounded: null — unchecked (--no-reground, or no readable source_path). Demotes nothing. Disprove, don't assume.

The verdict remains a pure function of the graph bytes for a fixed reground. Re-grounding is the one axis on which the same graph can answer differently, because it is the one that reads a file the graph does not own — and it can only ever move a verdict down.

If you consume verify_claim, this changes what you should read. Keying on verdict was always right. Treating regrounded as ignorable colour was not: it is an input to verdict, not a decoration on it.

Also

The CLI verb now loads its graph through the same path the MCP tool uses, so the connection-discovery overlay is applied on both. verify_claim is pair-local, so a discovered edge between exactly the two endpoints under test would otherwise land in the edge set on one surface and not the other — the same triple answering differently depending on how you called it.

tesserae --help listed verify-claim twice.

Upgrading from v0.28.1

Drop-in. No API change; verify_claim's seven-verdict contract and payload keys are unchanged from v0.27.0.