dovetail
Checks whether your repository still agrees with itself
It maps your docs and code and reports where they have drifted apart: dead links, moved anchors and orphaned files from the exact checks, and contradictions and documentation describing behaviour the code no longer has from model reviewers. The exact checks need no model and no network, and by default only the findings they can prove fail a build. Then it walks you through the fixes one at a time, and edits only what you approve.
Install dovetail
Add the DBHQ marketplace, once
/plugin marketplace add dbhq-uk/marketplaceInstall the skill
/plugin install dovetail@dbhq
Both commands work in Claude Code and in Codex. The marketplace is a public repository you can read first: dbhq-uk/marketplace (external site)
What it is good at
Seventeen checks, each finding marked proven or heuristic
Links resolving to nothing, heading anchors that no longer exist, files nothing points at, duplicated and near-duplicated content, translations that have fallen behind, flags a doc claims that a script does not declare, documented calls the real signature would reject, code blocks that do not parse, manifests disagreeing about the version, conventions the repo states but does not follow, and pairs of files that changed together for months and have just stopped. A proven finding follows from the structure alone, like a link to nothing. A heuristic one is a likely problem that intent can explain: a file nothing links to may be an entry point.
Failing a build only on what it can prove
A checker that produces false positives gets switched off within a week, because the triage costs more than the drift. So only proven findings fail --fail-on, and a heuristic check gates only if your config opts it in. The exact layer makes no model calls and needs no API key, no network and no third-party packages. Measured on 25 September 2026, a 922-file repository scanned in under half a minute, so it can run on every pull request.
Keeping the model away from what Python can settle
Every reviewer rubric names the categories it must not report. A reviewer restating a check already computed exactly is offering a guess in place of a certainty, and the layers stay separate so you always know which one you are reading.
Rejecting fabricated evidence
Every quote a reviewer returns is checked against the actual line in the file. A model inventing a plausible quote at a plausible line is the most damaging failure available, because the finding reads exactly like a true one. A quote found in neither the file nor its committed version is dropped as fabricated, and the run says what it dropped.
Being adoptable on a repository that already has drift
Scoping findings to the files a change touches, including a deleted file that something still links to, means nobody has to fix everything before turning the check on. Without that, a whole-repo check turns every unrelated pull request red and gets switched off on day one.
A triage run that fits in the context window
One script drives the run and keeps its state on disk. It prints one finding at a time, with the fix the scan computed where there is one, so a large repository does not fill the agent's context before the first question. A finding you mark intentional goes into a committed ledger, so the decision holds for your colleagues and for CI.
What it does not do
It never edits without asking
The scan itself has no write path at all. Fixes happen only in the triage loop, one at a time, on your say-so - and a content hash of every file is compared before each edit, so if anything changed that dovetail did not apply, the run stops.
It does not decide which side is right
What disagrees is decidable. Which side is correct usually is not: a broken link might mean the link is wrong or the target was deleted by mistake, and nothing in the file tree tells them apart. So a contradiction ends in a question rather than an edit.
It will not recommend on every finding
Where the evidence names a winner, one option is marked as recommended and says what makes it the answer. Where it does not, nothing is marked and you get an open question. A tool that recommends every time teaches you to stop reading.
The judged layer never gates a build
Contradictions between documents, docs describing behaviour the code no longer has, diagrams that have fallen behind - those come from reviewers, and no CI job here fails on them. They run on a schedule and upsert a tracking issue instead.
It checks external URLs only when you ask
Links are resolved inside the repository. External URLs are skipped unless you pass --external-links, which runs lychee if it is installed, uses the network and never fails a build. Links are read from .md and .markdown files, so .mdx pages are not checked, and it is not a code reviewer or a security scanner.
Read it before you install it
Every line is public and MIT licensed. The README is the long version of this page, including the parts that are still rough.