lynxlangya/anchor-vet
Evidence-gated diff review for PRs, branches, commit ranges, staged code changes, and merge readiness checks. Use when an AI reviewer must review a concrete git-anchored diff, judge whether code is safe to merge, inspect a PR URL or branch, cross-examine PR or commit claims, account blast radius, or render approve/request-changes/blocked verdicts. Do not use for design-only review, whole-codebase audits, bug fixing, or code authoring without a git diff under judgment.
npx skills add https://github.com/lynxlangya/techne --skill anchor-vet
Force the skipped move in code review: prove the reviewed diff's scope, blast
radius, claims, findings, and verdict are anchored to git evidence.
Use this skill only when there is a concrete code change to judge: a PR, branch,
commit range, or staged review target.
Boundary test: can you name a base...head pair of git states whose difference
is the artifact under judgment? If yes, use anchor-vet. If no, get the branch or ref
first; do not review pasted diffs or prose descriptions.
Do not use anchor-vet for design feedback without a diff, whole-codebase audits,
feature implementation, bug fixing, formatting-only tasks, or document review.
If the user asks you to fix findings too, render the review verdict first; fixes
are a separate task, and behavioral fixes route to anchor-repro.
claims before init: for PRs, save the title/body from `gh pr view
--json title,body --jq '.title + "\n\n" + (.body // "")'` to a claims file.
Run:
python3 skills/anchor-vet/scripts/vet_gate.py init --project <root> --review <slug> --base <ref> --head <ref> --claims-file <path>
or, only when there are genuinely no external claims, --no-claims.
scope.json.If the diff is too large to read honestly, stop and propose a split.
found by the gate. Record examined refs with effect and a one-line note.
Examined means you opened/read the reference and judged how the change
affects it.
verified enclosingUnit when a named unit exists, or file-level with a
reason only for genuinely unit-less code/config/prose.
scope.json: verified, contradicted, not-verifiable-from-diff, or
non-claim. Verified/contradicted claims need citations.
blocking, concern, andnit. Cite findings. A blocking finding needs R2 cited evidence or an R3
repro probe. When a behavioral assertion is cheap to demonstrate, record a
failing anchor-repro ledger entry against the reviewed head and cite it with
entrySha256.
review.json. Run:python3 skills/anchor-vet/scripts/vet_gate.py check --project <root> --review <slug>.
Fix check failures by doing the missing review work, not by padding JSON.
python3 skills/anchor-vet/scripts/vet_gate.py close --project <root> --review <slug> --verdict approve|request-changes|blocked.
Report the verdict, cite verdict.json, and name each finding's evidence
rung.
Artifacts are written under the target project:
.techne/review/<slug>/
scope.json # computed by init
review.json # authored by the reviewer
report.json # computed by check
verdict.json # computed by close
Generated .techne/ output belongs to target projects. Do not commit it to this
repository.
Review skeleton:
{
"schema": "techne.vet/1",
"symbols": [
{
"id": "s-...",
"symbol": "changedName",
"disposition": "reviewed",
"refs": [
{
"file": "src/caller.py",
"line": 42,
"effect": "unaffected",
"note": "caller passes the same contract"
}
]
}
],
"hunks": [],
"claims": [
{
"ids": ["c-..."],
"disposition": "verified",
"citations": [{"file": "src/change.py", "line": 10}]
}
],
"findings": [],
"testsAcknowledgment": "No tests changed; the diff is docs-only or existing coverage is enough because ..."
}
Use reference.md for the full JSON schema, rubrics, exclusions, weak spots,
and probe guidance.
base...head diff is available.init refuses because of dirty worktree, missing merge base, or headmismatch; fix the setup or record blocked.
sampling silently.
approve if refs, hunks, claims, or test acknowledgment remainunaccounted.
blocked --reason ... or leave it, then start a new slug for the new head.
Take lynxlangya/anchor-vet from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.