mcpField
I
integrity-forensics

integrity-forensics

github.com/wanshuiyin测试与质量18.2k284 次安装4 天前更新
代码仓库

关于 integrity-forensics

integrity-forensics 是启动固定版本 Anti-Autoresearch 论文审计的轻量技能。它验证上游版本、原样委托审计,并将发现映射到 ARIS 策略门槛;审计无标记不等于论文获认可。

主要功能

  1. 01固定并验证上游提交版本
  2. 02原样委托上游审计流程
  3. 03将审计结论映射为策略门槛
  4. 04以带类型的义务跟踪发现
  5. 05核验报告、论文文件和凭据

适用场景

  1. 01对论文运行完整性取证审计
  2. 02存在关键标记或审查未完成时阻止提交
  3. 03跟踪审计发现的修复或人工豁免
  4. 04论文或台账变更后重新验证门槛

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill integrity-forensics

安装后在 Claude Code 中输入/integrity-forensics确认已加载。

详细介绍

Integrity Forensics — Anti-Autoresearch 的轻量启动器

审计目标:$ARGUMENTS

这是什么。 ARIS 用于生成论文;Anti-Autoresearch 则是面向外部的互补工具,用于审稿方的诚信取证(涵盖 8 个类别中的 46 种模式, 核心采用确定性的 GRIM/GRIMMER/statcheck,声明锚定到具体文本片段, 仅基于规则的报告器负责总结而非裁决)。此技能是一个 轻量启动器:固定上游提交,通过上游评估门禁验证固定版本,原样委派执行, 并将判定后处理为 ARIS 的策略用语。不 vendoring,也不 fork。

🔁 执行频率约束(shared-references/external-cadence.md):此技能用于支持带有判定结果的决策。不要将它包装在 /loop / /schedule 中 — 绝不能用于“反复修改,直到不再触发标记”(见下文的唯一禁止循环)。

常量

  • ANTI_AR_REPO = https://github.com/wanshuiyin/Anti-Autoresearch.git
  • ANTI_AR_COMMIT = b47af6f983b38347b6d2110379e266400597cf66 — SHA 固定值。 启动器绝不跟踪上游 HEAD;修改此常量必须经过评审 (见固定版本更新检查清单)。
  • CLONE_DIR = ~/.aris/anti-autoresearch — 固定版本的工作副本。刻意采用与主机无关的路径: ARIS 也运行在 DeepSeek Harness、Codex CLI、Cursor、Trae、 Antigravity 和 Copilot CLI 上,在这些环境中,~/.claude/ 指向用户并未安装的产品。 ~/.claude/anti-autoresearch 下的旧克隆不会使用; 只有为了让离线确定性模式运行,才需将其及其 .aris_eval_ok_* 回执移至新位置, 否则可随时删除。
  • NO REVIEWER KNOBS. 此启动器不提供审稿模型/工作量参数,也绝不将 ARIS 的 — effort: 映射到上游设置。 固定版本的上游会严格按其固定配置运行(gpt-6-astra + xhigh,这是上游自身的设计决策)。 通过启动器覆盖上游审稿策略,会形成第二个无法审计的配置入口。
  • GATE_HELPER = forensics_gate.py — 通过规范链解析 (shared-references/integration-contract.md §2):.aris/tools/ → tools/ → $ARIS_REPO/tools/ → 通过 ~/.aris/repo 指向的 $ARIS_REPO/tools/。 失败策略 A(必需):若在 assurance: submission 时无法解析此文件,立即停止 — 绝不临时拼凑门禁。

步骤 0 — 初始化固定版本(幂等)

CLONE_DIR="$HOME/.aris/anti-autoresearch"
ANTI_AR_COMMIT="b47af6f983b38347b6d2110379e266400597cf66"

mkdir -p "$HOME/.aris"
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)"

步骤 1 — 委派:原样运行上游扫描

在目标上从头到尾打开并遵循 $CLONE_DIR/workflows/anti-autoresearch/SKILL.md。启动器只额外添加以下两条封装规则:

  1. 工作目录。 上游技能通过 git rev-parse --show-toplevel 定位自身。 运行每个上游 bash 代码块前,都先执行 cd "$CLONE_DIR" — 必须执行 cd, 不能只导出 ROOT(上游代码块会自行重新推导 ROOT,并覆盖该值)— 并使用论文的绝对路径, 否则上游会将 ARIS 仓库解析为 ROOT,并找到错误的 Python 主干。
  2. Codex 调用必须带上 approval-policy: never + sandbox: read-only (会话卫生要求;上游已指定每个维度使用新线程、串行执行及自身的模型固定配置 — 不要更改)。

其他所有内容 — 证据账本、coverage.json 状态机、九个审计维度、反驳环节、确定性摘要 — 都属于上游契约。绝不重写、弱化或重新映射其输出 (report.json + REPORT.md,判定结果 ∈ CLEAN_GIVEN_EVIDENCE / SOFT_FLAGS / HARD_FLAGS / REVIEW_UNAVAILABLE)。可观测级别(L0/L1/L2)由上游根据现有产物推导 — 不要承诺一定达到 L2。

第 2 步 — 类型化门控 + 义务(ARIS 侧后处理)

# 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

门控会将判定结果转换为策略,但不会重新标注判定结果:

上游判定结果策略
HARD_FLAGS阻止 — 审计员提出了某项关键问题,供你审阅;绝不能说成“机器发现了欺诈”
REVIEW_UNAVAILABLE阻止 — 不完整的审查不能让文件蒙混过关
SOFT_FLAGS警告 — 由人工处置。也要查看未运行列表:只有在本应判定为无问题时,上游判定结果才会将不完整性纳入考量,因此即使判定为警告,也可能有包含决定判定结果的维度未运行。evaluate 和 fresh 都会打印这些维度
CLEAN_GIVEN_EVIDENCE没有新增阻止项 — 绝不称为通过或已接受:它表示“现有证据中未发现标记”,并非无罪判定
任何其他结果阻止(默认拒绝)

此外:任何未解决的关键义务 → 阻止;任何未解决的义务 → 至少警告;没有回执却已关闭的账本条目或状态未知的条目 → 阻止(手动编辑 "status": "RESOLVED" 并不能打开门控)。

gate.json 还会记录 paper_fingerprint(对论文的编译输入和交付物计算的 sha,包括 .tex/.bib/.sty/.cls/图表/PDF)。下游预检只需运行一条命令: python3 "$GATE_HELPER" fresh --paper-dir "$PAPER_DIR" --anti-ar-commit "$ANTI_AR_COMMIT" — 退出码为 0 ⟺ 门控是在当前固定版本下生成的 ∧ 门控存在 ∧ 论文此后未更改 ∧ 门控与当前义务账本一致 ∧ 判定结果 — 根据已通过 sha 验证的归档报告(last_report.json)和实时账本重新计算,绝不读取门控中存储的令牌 — 具备通过条件(WARN / NO_NEW_BLOCKER)。其他任何情况 — 缺少门控、门控生成后有编辑或重新编译、账本或归档未绑定、重新计算结果不匹配、BLOCK、令牌未知 — 均会以 1 退出:重新运行审查和 evaluate。每次修改账本(update/resolve/waive)都会删除现存的 gate.json,因此中断的运行绝不会留下过期的通过结果;而且 evaluate 会拒绝比任何论文文件更旧的报告(过期报告不能用于审阅其从未审计过的文本)。审查完成后立即运行 evaluate,然后再修改任何论文文件。

门控产物还会记录真实的来源信息:上游审计员使用 GPT 系列模型,因此对于 Claude 执行器,这些发现带有 cross-family 提案来源;对于 Codex 执行器,则带有 same-family 提案来源。无论哪种情况,此门控都只会标记问题 — 它无权授予接受,因此这种区别仅供参考,并非漏洞。

步骤 3 — 修复发现的问题(履行义务,而不是反复润色)

每项 OPEN 义务都必须处理——修复,或明确豁免。上游现在会报告审计员提出的每项建议,而不再自行判断哪些不算数,因此,与 2026-08 之前开展的审查相比,预计会出现更多义务,其中有些建议你可能并不同意。waive 是正式且预期会出现的处理结果——“这是模型提出的建议,而我这个人认为它不对”在这里是正常的处理方式,并非最后手段。请结合报告中的各列权衡每项建议:Anchored、Observability、FP-risk、Surface、Ext-check。

对于确实存在的问题,请使用合适的处理方式:

发现类别修复路径
A — 数值自洽性根据 RESULT FILES(/paper-claim-audit 证据链)重新计算;修正数字,而不是句子
D — 实验完整性返回 /experiment-audit / 重新运行
E — 引用使用 /citation-audit 的 KEEP/FIX/REPLACE 机制
G — 证明与推导使用 /proof-checker 的修复循环
B / C / H — 范围、基线、评估设计科学层面:将发现作为审稿人输入提供给 /auto-review-loop,或交由人工处理
AIS / advisory(权重为零)可作为 /auto-paper-improvement-loop 的可选背景信息;绝不作为门槛

明确关闭每项义务——回执有类型且经过哈希:

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>"

台账以机械方式强制执行的规则(tests/test_forensics_gate.py):

  • 仅追加——重新运行审查可以新增义务,但绝不能关闭义务;
  • 某项发现若在后续报告中消失,仍保持 OPEN,并会标记为 UNRESOLVED_DISAPPEARANCE——改写文本片段不算修复;
  • claim-withdrawn 是诚实的修复(删除无依据的主张 是合理的解决方式——需提供删除差异作为证据);
  • 豁免不等于解决:须经人工批准并永久记录, 原始发现快照不可更改;
  • 执行者填写的 fix_type 标签只是回执,不是判定结果——要关闭 一项关键发现,必须经过类别检查器、新一轮跨类别审查或人工确认 (--verified-by 要求提供有类型的来源信息,并会被记录;填写一位 未批准此操作的人员姓名属于虚假记录,并会留下永久记录);
  • 回执会重新验证,而非仅凭记忆确认:每次后续门禁检查时, 证据文件必须仍然存在,且其哈希值仍与关闭时记录的值一致—— 关闭后编辑证据会重新触发 BLOCK;
  • resolve/waive(和 update 一样)会使现有的 gate.json 失效—— 完成步骤 3 时,须重新运行审查并执行 evaluate,确保下游预检读取的 门禁状态反映修复后的情况。
唯一禁止的循环

绝不要运行“编辑 → 重新审查 → 重复,直到 CLEAN”。 这种目标函数会教会编辑者如何绕过检测器——删除有锚定的文本片段比修正数字更快消除标记,最终得到的论文会被自己的审计洗白。修复后的重新运行旨在确认差异(DISCREPANCY)已消失(并发现新的差异);是否开放门禁由义务台账决定,而非判定结果。

信任边界(哪些内容由程序计算,哪些属于协议)

  • 程序计算(门禁会通过机制强制执行这些内容):判定结果→策略映射、 仅追加的账本生命周期、SHA 绑定(报告 ↔ 账本 ↔ 归档)、 回执重新哈希、论文指纹、固定版本/版本匹配,以及 重新计算的决策(fresh 绝不信任已存储的令牌)。
  • 协议(刻意采用指令评定):扫描是否确实针对这篇论文,在固定版本的克隆上运行。门禁提高了要求 — 结构性底线(报告必须注明裁定者并包含覆盖映射)、过期报告 mtime 防护 — 到此为止。报告与论文之间没有 加密绑定,这是刻意为之:这是研究工作流门禁,不是溯源系统;诚实的说法是, 有心的执行者可以提交一份过期报告。同样,human: / checker: / cross-family-review: 标签是 责任追踪,而非身份验证:虚假标签就是一条明确且永久的虚假记录。
  • 不在范围内:拥有 Shell 访问权限的一方若一致地改写 .aris/ 工件,就拥有所有者权限(他们甚至可以直接删除整个目录)。 门禁防范的是马虎或偷工减料的执行者,以及意外崩溃/竞态/恢复操作 — 而非机器的所有者。

固定版本升级检查清单(维护者)

  1. 设置新的 ANTI_AR_COMMIT;不要删除任何标记(评估门禁会自动针对新的 SHA 重新运行)。
  2. 将上游的 schemas/report.schema.json 和判定词汇与 门禁的策略表进行比较;如果上游有所变动,必须在升级前扩展 tools/forensics_gate.py。
  3. 旧发现/义务仍然有效(指纹基于范围/哈希,而非 ID)— 但由旧版裁定者生成的发现必须 重新审计,而非重新裁定(遵循上游自身的迁移规则)。
  4. 如果升级改变了用户必须处置的内容,请告知用户。fresh 会以 PIN_MISMATCH 拒绝所有使用旧固定版本的已存储 gate.json,因此升级本身就会强制所有人重新扫描 — 应将上游变更合并到一次升级中,而非分两次进行,否则重新扫描的成本会付两次。

2026-08 升级(98a75fc)— 预计会有更多未解决义务。 上游从裁定提案转为报告提案:过去会被其误报风险、 可观测性、表面范围和外部检查需求门禁降为 info 的发现,现在会以高于 info 的级别出现,因此会产生义务。论文本身没有变差;只是现在能看到审计人员所说内容中的更多部分。对你认为错误的提案予以豁免,是预期的处置方式;报告中每条发现对应的列(Anchored、Observability、FP-risk、Surface、Ext-check)就是你权衡时应参考的内容。上游还在同一时期删除了报告自身绑定哈希 — 这里从未使用过这些哈希。

Codex 原生说明(镜像)

上游没有提供 Codex 原生套件;其审计员技能是 Claude-Code 契约。Codex 原生会话可以运行上游的仅确定性模式(数值核心 + 裁定者,并使用全为 review_unavailable 的覆盖映射 — 诚实地限定范围:它可以标记问题,但绝不会给出 CLEAN)。完整的九维扫描需要能够原样执行上游 Claude-Code 契约的宿主 — 已知的有 Claude Code 和 DeepSeek Harness 上的 dsh-aris 套件。临时将上游审阅者调用转换为 spawn_agent,属于重写上游契约 — 禁止这样做。

审查追踪

上游会将各维度的追踪记录保存在论文的 .aris/traces/ 下。启动器只添加 .aris/forensics/ 工件: gate.json(固定 anti_ar_commit + 报告/账本哈希 + 论文文本指纹)、 obligations.json(仅追加的账本),以及 last_report.json(经 SHA 验证的折叠报告归档, fresh 会据此重新计算)。

评论

支持 Markdown