Lint before lore hardens.
Regex catches broken syntax. jev-lint adds a narrow semantic pass for claims that disagree or age badly, using TypeSafe Jev as a second opinion—not a hidden editor.
$ jev-lint ~/vault 99 pages · 1,267 Jev questions possible contradiction wiki/decisions/agent-routing.md:18 possibly stale claim wiki/decisions/network-guard.md:14 113.9s · 16 findings · $0.0243
Four checks.
Two kinds of evidence.
Possible contradictions
Compares exact claim pairs from linked or strongly overlapping pages.
Possibly stale claims
Scores dated statements that may need a current source.
Unresolved markers
Finds TODO, FIXME, [?], and explicit unresolved comments.
Missing pages
Resolves Obsidian wikilinks against scanned paths, titles, and aliases.
Evidence, not vibes.
Every semantic flag is tied to the quote Jev actually scored. The report keeps rule checks separate from model probabilities and makes its sampling limits explicit.
“The Atlas platform serves every API request from Amsterdam.”
“The Atlas platform serves every API request from Frankfurt.”
Verify scope and dates before changing either note.
A real vault, one bounded pass.
Measured on a personal Markdown knowledge base on 17 September 2026. See the README for scope and limitations.
Run it where your notes live.
Python 3.11+. Your vault remains local; only selected claim text is sent for semantic scoring.
pipx install git+https://github.com/vayungodara/jev-lint jev-lint ~/path/to/vault --dry-run jev-lint ~/path/to/vault --open