
Integrity Forensics
FreeConduct integrity audits on research papers efficiently.
Free ยท Opens the source repo
What Integrity Forensics does
Integrity Forensics is a specialized tool designed to perform integrity audits on research papers using the Anti-Autoresearch framework. This skill works as a thin launcher that facilitates the auditing process by pinning a specific commit of the Anti-Autoresearch repository, ensuring that the integrity checks are based on a verified and stable version of the auditing tools. The skill validates the integrity of the paper by running a series of checks that include span-anchored claims and a deterministic reporting mechanism, which summarizes findings without making adjudications. This makes it particularly useful for researchers and academic professionals who want to ensure the integrity of their submissions before peer review.
The workflow begins with bootstrapping the environment by cloning the Anti-Autoresearch repository and checking out a specific commit. This ensures that the auditing process is based on a consistent and validated version of the tools. Once the environment is set up, the skill delegates the execution of the audit to the upstream Anti-Autoresearch tools while maintaining strict adherence to their outputs. This means that the integrity checks are performed without any alterations, providing a reliable and transparent audit trail.
After the audit is completed, the results are processed into a typed policy gate which categorizes the findings into BLOCK, WARN, or NO_NEW_BLOCKER. This allows users to quickly understand the implications of the audit results and take appropriate actions based on the severity of the findings. The append-only obligations ledger ensures that all decisions and actions taken based on the audit are documented, providing a comprehensive record of the integrity checks performed. This skill is ideal for researchers looking to enhance their submission process by ensuring compliance with integrity standards.
When to use it
Use this skill when preparing a paper for submission to verify its integrity and compliance with academic standards.
When not to use it
This skill is not suitable for casual document checks or non-academic contexts where integrity auditing is not required.
What you can build with it
Preparing a Paper for Submission
Before submitting a research paper, use Integrity Forensics to conduct a thorough integrity audit and ensure compliance with academic standards.
Peer Review Preparation
Utilize the skill to prepare a forensic appendix when submitting papers for peer review, enhancing transparency in the review process.
Resubmission of Papers
When resubmitting a paper, run an integrity audit to address any previous concerns raised during the review process.
How to install Integrity Forensics
View source1. Install with the skills CLI
npx skills add wanshuiyin/auto-claude-code-research-in-sleep/integrity-forensics --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by wanshuiyinIntegrity Forensics โ thin launcher for Anti-Autoresearch
Audit target: $ARGUMENTS
What this is. ARIS generates papers; Anti-Autoresearch is its outward-pointed dual โ reviewer-side integrity forensics (46 patterns across 8 families, deterministic GRIM/GRIMMER/statcheck core, span-anchored claims, a rules-only reporter that summarizes rather than adjudicates). This skill is a thin launcher: it pins an upstream commit, validates the pin with the upstream eval gate, delegates execution unchanged, and post-processes the verdict into ARIS's policy vocabulary. It vendors nothing and forks nothing.
๐ Cadence fence (
shared-references/external-cadence.md): this skill is verdict-bearing decision support. Do not wrap it in/loop//scheduleโ and NEVER as "iterate edits until it stops flagging" (see The One Forbidden Loop below).
Constants
- ANTI_AR_REPO =
https://github.com/wanshuiyin/Anti-Autoresearch.git - ANTI_AR_COMMIT =
b47af6f983b38347b6d2110379e266400597cf66โ the SHA-pin. The launcher NEVER tracks upstream HEAD; bumping this constant is a reviewed change (see Pin-bump checklist). - CLONE_DIR =
~/.claude/anti-autoresearchโ the pinned working copy. - NO REVIEWER KNOBS. This launcher exposes no reviewer model/effort
parameters and never maps ARIS
โ effort:onto upstream settings. The pinned upstream runs exactly what it pins (gpt-5.6-sol+xhigh, its own design decision). Overriding upstream review policy from a launcher would create a second, unauditable configuration surface. - GATE_HELPER =
forensics_gate.pyโ resolved via the canonical chain (shared-references/integration-contract.mdยง2):.aris/tools/โtools/โ$ARIS_REPO/tools/โ$ARIS_REPO/tools/via~/.aris/repo. Failure policy A (required): if it cannot be resolved atassurance: submission, STOP โ never improvise the gate.
Step 0 โ Bootstrap the pin (idempotent)
CLONE_DIR="$HOME/.claude/anti-autoresearch"
ANTI_AR_COMMIT="b47af6f983b38347b6d2110379e266400597cf66"
if [ ! -d "$CLONE_DIR/.git" ]; then
git clone --no-checkout https://github.com/wanshuiyin/Anti-Autoresearch.git "$CLONE_DIR"
fi
# fetch ONLY if the pin isn't already present โ a cached, validated pin works offline
git -C "$CLONE_DIR" cat-file -e "$ANTI_AR_COMMIT^{commit}" 2>/dev/null \
|| git -C "$CLONE_DIR" fetch -q origin
git -C "$CLONE_DIR" checkout -qf "$ANTI_AR_COMMIT" || {
echo "FATAL: cannot checkout pinned commit $ANTI_AR_COMMIT"; exit 1; }
# Force a PRISTINE tree at the pin โ local tampering with the clone (edited
# adjudicator, injected module, even one hidden inside a NESTED git repo,
# which single-f clean skips) must not survive bootstrap and run under the
# official pin's name. Every step is checked; then the tree is verified.
git -C "$CLONE_DIR" reset --hard -q "$ANTI_AR_COMMIT" || {
echo "FATAL: reset to pin failed"; exit 1; }
git -C "$CLONE_DIR" clean -ffdxq || {
echo "FATAL: clean failed"; exit 1; }
[ -z "$(git -C "$CLONE_DIR" status --porcelain)" ] || {
echo "FATAL: clone is not pristine after reset+clean โ refusing to run"; exit 1; }
# One-time-per-pin validation: the upstream eval gate (8 injected-defect
# classes, 100% recall + zero clean false positives) must PASS before this
# pin is allowed to produce a verdict. NEVER skip; NEVER proceed on failure.
# The marker lives OUTSIDE the clone: a marker inside a tamperable tree proves
# nothing (and `git clean` above would erase it, forcing re-eval every run).
MARKER="${CLONE_DIR}.aris_eval_ok_${ANTI_AR_COMMIT}"
if [ ! -f "$MARKER" ]; then
( cd "$CLONE_DIR" && python3 eval/run_eval.py ) || {
echo "FATAL: upstream eval gate FAILED at pin $ANTI_AR_COMMIT โ refusing to"
echo " use an unvalidated forensics pin for verdicts."; exit 1; }
touch "$MARKER"
fi
echo "anti-autoresearch pinned at $ANTI_AR_COMMIT (eval gate: validated)"
Step 1 โ Delegate: run the upstream sweep, unchanged
Open and follow $CLONE_DIR/workflows/anti-autoresearch/SKILL.md end to
end on the target. Two wrapper rules โ the ONLY things this launcher adds:
- cwd. Upstream skills self-locate via
git rev-parse --show-toplevel. Run every upstream bash block withcd "$CLONE_DIR"first โ ALWAYS the cd, never just an exportedROOT(upstream blocks re-derive ROOT themselves and would overwrite it) โ and refer to the paper by absolute path, otherwise upstream resolves ROOT to the ARIS repo and finds the wrong Python spine. - Codex calls carry
approval-policy: never+sandbox: read-only(session hygiene; upstream already specifies fresh-thread-per-dimension, serial execution, and its own model pins โ do not alter them).
Everything else โ the evidence ledger, coverage.json state machine, the nine
auditor dimensions, the refutation pass, the deterministic summary โ is
upstream's contract. Never rewrite, soften, or re-map its outputs
(report.json + REPORT.md, verdict โ CLEAN_GIVEN_EVIDENCE / SOFT_FLAGS /
HARD_FLAGS / REVIEW_UNAVAILABLE). The observability level (L0/L1/L2) is
whatever upstream derives from the artifacts present โ do not promise L2.
Step 2 โ Typed gate + obligations (ARIS-side post-processing)
# Resolve $GATE_HELPER via the canonical chain (integration-contract ยง2), then
# ONE atomic call (update + gate in a single locked transaction โ the gate only
# ever speaks for the report the ledger has folded, sha-bound):
python3 "$GATE_HELPER" evaluate --report "$PAPER_DIR/report.json" --paper-dir "$PAPER_DIR" \
--anti-ar-commit "$ANTI_AR_COMMIT" --executor-model "<this pipeline's executor>"
# exit 0 = WARN / NO_NEW_BLOCKER ยท exit 1 = BLOCK
The gate translates the verdict into policy WITHOUT re-labeling it:
| upstream verdict | policy |
|---|---|
HARD_FLAGS | BLOCK โ an auditor proposed something critical and it is on the table for you to read; never "the machine found fraud" |
REVIEW_UNAVAILABLE | BLOCK โ an incomplete sweep cannot wave a paper through |
SOFT_FLAGS | WARN โ human disposition. Read the never-ran list too: the upstream verdict folds incompleteness in only when it would otherwise be clean, so a WARN can sit on top of a sweep where verdict-bearing dimensions never ran. evaluate and fresh both print those dimensions |
CLEAN_GIVEN_EVIDENCE | NO_NEW_BLOCKER โ never called PASS or accepted: it means "no flag found in the evidence at hand", not an acquittal |
| anything else | BLOCK (fail closed) |
plus: any OPEN critical obligation โ BLOCK; any OPEN obligation โ at least
WARN; a closed-without-receipt or unknown-status ledger entry โ BLOCK (a
hand-edited "status": "RESOLVED" does not open the gate).
gate.json also records a paper_fingerprint (sha over the paper's compile
inputs AND deliverables โ .tex/.bib/.sty/.cls/figures/PDF). The
downstream preflight is ONE command:
python3 "$GATE_HELPER" fresh --paper-dir "$PAPER_DIR" --anti-ar-commit "$ANTI_AR_COMMIT"
โ exit 0 โบ the gate was produced at the CURRENT pin โง a gate
exists โง nothing in the paper changed after it โง the gate matches the current
obligations ledger โง the decision โ re-computed from the sha-verified
archived report (last_report.json) + the live ledger, never read from the
gate's stored token โ is pass-capable (WARN / NO_NEW_BLOCKER). Anything
else โ missing gate, post-gate edit or recompile, unbound ledger or archive,
recompute mismatch, BLOCK, unknown token โ exits 1: re-run the sweep +
evaluate. Every ledger mutation (update/resolve/waive) deletes the
standing gate.json, so an interrupted run can never leave a stale pass; and
evaluate refuses a report OLDER than any paper file (a stale report cannot
be folded onto text it never audited). Run evaluate immediately after the
sweep, before touching any paper file.
The gate artifact also records honest provenance: upstream's auditors are
GPT-family, so for a Claude executor the findings carry cross-family
proposal provenance; for a Codex executor they are same-family. Either
way this gate only raises flags โ it has no acceptance to grant, so the
distinction is informational, not a loophole.
Step 3 โ Fix what it found (obligations, not a polish loop)
Every OPEN obligation gets DISPOSITIONED โ fixed, or explicitly waived. Upstream now
reports every proposal an auditor made rather than deciding which ones do not count, so
expect more obligations than a pre-2026-08 sweep opened, and expect some of them to be
proposals you disagree with. waive is a first-class, expected outcome โ "a model
proposed this and I, the human, judge it wrong" is a normal disposition here, not a last
resort. Weigh each one against the report's columns: Anchored, Observability,
FP-risk, Surface, Ext-check.
For the ones that are real, use the right door:
| Finding family | Repair route |
|---|---|
| A โ numeric self-consistency | recompute from the RESULT FILES (/paper-claim-audit evidence chain); fix the number, not the sentence |
| D โ experiment integrity | back to /experiment-audit / rerun |
| E โ citations | /citation-audit KEEP/FIX/REPLACE machinery |
| G โ proof & derivation | /proof-checker's fix loop |
| B / C / H โ scope, baselines, eval design | science-level: feed the finding to /auto-review-loop as reviewer INPUT, or to the human |
| AIS / advisory (zero-weight) | optional context for /auto-paper-improvement-loop; never gates |
Close each obligation explicitly โ the receipt is typed and hashed:
python3 "$GATE_HELPER" resolve --paper-dir "$PAPER_DIR" --obligation-id <id> \
--fix-type corrected-from-results|claim-narrowed|claim-withdrawn|citation-replaced \
--evidence <path-to-the-ground-truth-that-backs-the-fix> \
--verified-by "human:<name>" | "checker:<tool>" | "cross-family-review:<thread-id>"
# or, with HUMAN sign-off only:
python3 "$GATE_HELPER" waive --paper-dir "$PAPER_DIR" --obligation-id <id> \
--approver "human:<name>" --reason "<why this stands as-is>"
Rules the ledger enforces mechanically (tests/test_forensics_gate.py):
- append-only โ re-running the sweep can open obligations, never close them;
- a finding that disappears from a later report stays OPEN and gains
UNRESOLVED_DISAPPEARANCEโ rewording the span is not a fix; claim-withdrawnis an honest fix (deleting an unsupported claim is a legitimate resolution โ with the deletion diff as evidence);- a waiver is not a resolution: human-approved, permanently recorded, original finding snapshot immutable;
- the executor's
fix_typelabel is a receipt, not a verdict โ closure of a critical needs a family checker, a fresh cross-family review, or a human (--verified-byrequires TYPED provenance and is recorded; naming a human who did not approve is a false record with a permanent paper trail); - receipts are re-verified, not remembered: on every later gate the evidence file must still exist and still hash to what was recorded at closure time โ editing the evidence after closing re-opens the BLOCK;
resolve/waive(likeupdate) invalidate the standinggate.jsonโ finish Step 3 by re-running the sweep +evaluate, so the gate that downstream preflights read reflects the post-fix state.
The One Forbidden Loop
Never run "edit โ re-sweep โ repeat until CLEAN". That objective function teaches the editor to defeat the detector โ deleting an anchored span kills a flag faster than fixing the number, and the result is a paper laundered against its own audit. The re-run after fixes exists to confirm the DISCREPANCY is gone (and to catch new ones); the obligations ledger โ not the verdict โ decides whether the gate opens.
Trust boundary (what is computed vs what is protocol)
- Computed (the gate enforces these mechanically): verdictโpolicy mapping,
append-only ledger lifecycle, sha bindings (report โ ledger โ archive),
receipt re-hashing, the paper fingerprint, pin/version match, and the
recomputed decision (
freshnever trusts a stored token). - Protocol (instruction-graded, deliberately): that the sweep actually ran
at the pinned clone against this paper. The gate raises the bar โ
structural floor (a report must name its adjudicator and carry a coverage
map), stale-report mtime guard โ and that is where it stops. There is no
cryptographic binding between the report and the paper, deliberately: this is
a research-workflow gate, not a provenance system, and the honest statement is
that a determined executor can hand it a stale report. Likewise
human:/checker:/cross-family-review:labels are accountability, not authentication: a false label is an explicit, permanent false record. - Out of scope: a party rewriting the
.aris/artifacts consistently with shell access has owner power (they could delete the directory outright). The gate defends against the sloppy or corner-cutting executor and against honest crashes/races/resumes โ not against the machine's owner.
Pin-bump checklist (maintainers)
- Set the new
ANTI_AR_COMMIT; delete no markers (the eval gate re-runs automatically for the new SHA). - Diff upstream's
schemas/report.schema.json+ verdict vocabulary against the gate's policy table; extendtools/forensics_gate.pyBEFORE bumping if they moved. - Old findings/obligations stay valid (fingerprints are span/hash-based, not id-based) โ but findings produced by an older adjudicator must be re-audited, not re-adjudicated (upstream's own migration rule).
- Tell users when a bump changes how much they must disposition.
freshrejects every storedgate.jsonat the old pin withPIN_MISMATCH, so a bump already forces a re-sweep for everyone โ bundle upstream changes behind ONE bump rather than two, or the re-sweep cost is paid twice.
2026-08 bump (
98a75fc) โ expect more open obligations. Upstream moved from adjudicating proposals to reporting them: findings its FP-risk, observability, surface and needs-external-check gates used to demote toinfonow arrive above info, so they open obligations. Nothing got worse in the paper; more of what the auditors said is now visible. Waiving a proposal you judge wrong is the expected disposition, and the report's per-finding columns (Anchored,Observability,FP-risk,Surface,Ext-check) are what you weigh. Upstream also deleted its report self-binding hashes in the same window โ nothing here ever consumed them.
Codex-native note (mirror)
Upstream ships no Codex-native pack; its auditor skills are Claude-Code
contracts. A Codex-native session may run upstream's deterministic-only
mode (numeric core + adjudicator with an all-review_unavailable coverage
map โ honestly scoped: it can flag, it can never say CLEAN). The full
nine-dimension sweep requires a Claude Code session. Translating upstream's
reviewer calls into spawn_agent on the fly is REWRITING an upstream
contract โ forbidden.
Review tracing
Upstream saves its own per-dimension traces under the paper's
.aris/traces/. The launcher adds only the .aris/forensics/ artifacts:
gate.json (pins anti_ar_commit + report/ledger hashes + the paper-text
fingerprint), obligations.json (the append-only ledger), and
last_report.json (the sha-verified archive of the folded report that
fresh recomputes from).
Frequently asked questions about Integrity Forensics
Similar skills
Scientific Problem Selection
Streamline your research problem selection process.
Nextflow Development
Run nf-core bioinformatics pipelines with ease.
Nature Reviewer Assessment
Simulate peer review for scientific manuscripts.
Research Writing Pipeline
Streamline your scientific writing with structured proposal-first methodologies.
Nature Literature Downloader
Efficiently download academic literature from various sources.
Auto Research
Streamline your NeMo-RL experiments with automated workflows.
