关于 test-research-code
面向研究代码作者与 Artifact Evaluation 准备者的技能,用于补齐运行入口、环境记录、随机种子和端到端冒烟测试。它通过静态检查定位复现准备缺口,并生成审查清单;不负责打包或核验论文结果。
主要功能
- 01静态检查六项复现要素
- 02固定依赖版本并记录环境
- 03设置并记录随机种子
- 04添加微型输入端到端测试
- 05编写数据与结果复现说明
- 06生成审查清单并移交后续步骤
适用场景
- 01为他人整理可运行的研究代码
- 02在提交前添加冒烟测试
- 03记录环境并减少随机性
- 04定位 artifact 评审准备缺口
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ shaishavmaisuria/ research-paper-lifecycle-skills --skill test-research-code安装后在 Claude Code 中输入/test-research-code确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/artifact-standards.mdrepro-essentials.mdsmoke-tests.mdscripts/repro_check.py详细介绍
测试研究代码
将研究代码工件打磨到工件评审委员会(ACM AE、USENIX/OSDI/SOSP、SIGMOD ARI、ETAPS、NeurIPS 代码发布)所期望的状态:它能够运行,具有足够的确定性,能在容差范围内复现;其环境已记录,陌生人也能按照 README 复现论文的主要结果。这是代码侧与 PDF 的 preflight-check 相对应的步骤。
这不是通用软件 TDD。目标是打造一条可靠的端到端“能否运行并大致复现”路径,而不是穷尽式的单元测试覆盖。一个能在小型输入上运行真实流程的重点冒烟测试,胜过 100 个模拟单元测试。
适用场景
- 代码目前**“只能在我的机器上运行”**,需要让陌生人也能运行——没有固定的环境、没有随机种子、没有明显的入口点,也没有基本正确性测试。
- 作者要求添加冒烟测试/基本正确性测试、固定随机种子/确保确定性,或在打包或移交代码前记录/固定环境。
- 工件评审截止日期临近,而代码尚未达到可测试状态——先完成这项工程工作,再转交给下面的相关技能。
范围边界(避免重叠)。此技能负责的是工程步骤——测试、随机种子、环境记录。它不负责:
- 打包、徽章分类、归档 DOI、匿名化 →
prepare-artifacts。 - 生成的数值是否与论文表格一致 →
verify-results。 - 常规代码清理/重构 →
refactor-research-code。 如果请求是“让我的代码为工件评审做好准备”,就从这里着手解决可运行性问题,然后再移交;不要重复他们已完成的工作。
输入
- 研究代码目录的路径(仓库,或包含训练/评估脚本等内容的子目录)。
- 可选:评审是否为双盲(这样记录的环境/新增的测试就不会泄露作者身份)。
- 可选:用于确定定位的
.paper-memory/profile.yml(system/dataset类贡献更需要可复用、经过充分测试的工件;empirical类贡献则更需要确定性地重新运行)。
流程
-
**先阅读记忆。**阅读
.paper-memory/lessons.md(如果存在,也阅读profile.yml),避免再次指出作者已经修复的问题,并优先关注他们的recurring习惯。参见paper-memory-convention.md。 -
**确认范围。**如果未说明,请询问评审是否为双盲,确保新增内容——记录的环境、测试夹具、笔记本——不会泄露身份。如果作者的目标是特定的工件评审类别,请注意,必须根据会议当前的 Call for Artifacts 重新核实徽章选项和单独的工件截止日期,因为这些内容每年都会因会议而异;但这项确认由
prepare-artifacts负责。这里仅需让代码可测试;不要重复说明徽章分类。背景信息(徽章类别、2020 年后 Reproduced/Replicated 的调整)可参阅references/artifact-standards.md,用于了解情况,而非作为当前规则的依据。 -
**审查仓库(确定性检查)。**运行随附脚本——不要手动使用 grep:
python3 scripts/repro_check.py <code-dir> # text report python3 scripts/repro_check.py <code-dir> --json # machine-readable脚本会将六项要素——README、ENV(依赖项,是否固定?)、SEED、ENTRYPOINT、DATA、RESULTS_CMD——分别报告为 OK/WARN/MISSING,并说明是否存在测试。这是后续工作所依据的外部、可衡量信号;不要用自己对“看起来可复现”的判断取而代之。退出码:0 表示无问题,1 表示缺少必要项,2 表示用法错误。
-
按以下顺序填补缺口(每项均对应一条脚本检查结果,以及
references/repro-essentials.md中的内容):- ENV — 编写或修复依赖清单,并固定精确版本。使用
pip freeze > requirements.txt、environment.yml,或固定基础镜像的Dockerfile。未固定版本的依赖是评估人员无法重新构建的最常见原因。记录生成结果所用的操作系统、CUDA 和硬件。 - SEED — 为所有涉及的随机数生成器设置并记录种子(
random、numpy、框架——torch.manual_seed+torch.use_deterministic_algorithms(True)、PYTHONHASHSEED)。如实说明剩余的非确定性(GPU 原子操作、数据加载器工作进程),不要隐瞒。 - ENTRYPOINT — 提供一个显而易见的命令(
make reproduce、run.sh、python -m pkg、__main__守卫),从头到尾运行整个流水线。 - SMOKE/SANITY TEST — 添加一个最小测试,使用极小或合成输入运行真实流水线,并断言其运行完成且输出形状或数值合理。参见
references/smoke-tests.md中的模板。在此处,一个端到端冒烟测试胜过广泛的单元测试覆盖。 - DATA — 提供获取输入数据的精确说明(下载脚本,或“无外部数据”),并尽可能注明来源和校验和。
- RESULTS_CMD — 在 README 中加入一份简短的结果表,并为每项结果列出生成该结果的确切命令(ML Code Completeness 项)。注明预期运行时间,并说明数值应在容差范围内一致,而非逐位完全相同。
- ENV — 编写或修复依赖清单,并固定精确版本。使用
-
重新运行
repro_check.py,直到所有必要项均为 OK(或有意标记为 WARN)。设定明确的停止条件——所有必要项都不为 MISSING,或最多进行约 3 轮修复——不要无限期地反复打磨。 -
托管与匿名化(提供建议,切勿代为处理)。
- **归档托管(Zenodo/SWHID、版本 DOI 与概念 DOI、USENIX 禁止仅提供 GitHub 链接的规则)**由
prepare-artifacts负责。不要在此处处理;代码可测试后,标记“下一步:通过 prepare-artifacts 打包并存档”,然后停止。 - 双盲评审:如果仓库采用双盲评审,你添加的任何内容(环境文件、测试样例、notebook)都不得重新暴露身份。匿名化本身应交由
anonymize-paper/prepare-artifacts处理;标记此事项,不要在此处敷衍处理。
- **归档托管(Zenodo/SWHID、版本 DOI 与概念 DOI、USENIX 禁止仅提供 GitHub 链接的规则)**由
-
将报告和检查清单写入
paper-workspace/submission/artifact-repro-checklist.md,并追加到paper-workspace/INDEX.md。先说明已完成的工作,再列出按优先级排序的缺口;每项缺口都应对应一条repro_check.py检查结果和一项具体修复措施。
输出
一份便于审阅的 paper-workspace/submission/artifact-repro-checklist.md:其中包含审计表(六项必要项及其 OK/WARN/MISSING 状态)、你添加或建议的冒烟测试、运行过的环境信息采集命令、固定的随机种子,以及数据和复现说明;还应列出实际写入作者仓库的任何文件(如 tests/test_smoke.py、固定版本的 requirements.txt、Makefile/run.sh)。每项缺口都应注明其来源脚本检查结果。检查清单最后以一行说明移交给 prepare-artifacts(打包/徽章/DOI)和 verify-results(核对数值)——不得重复它们的工作。
按学科调整
本指南面向 CS 的 artifact 评审轨道(ACM/USENIX/SIGMOD/ML)。对于其他领域,请将环境信息采集替换为你所用技术栈的锁定文件(R 使用 renv.lock,Julia 使用 Manifest.toml,生物信息学使用 conda),并将随机种子和测试惯例替换为相应框架的做法。徽章与会议的对应关系由 prepare-artifacts 负责,而非本技能负责——在此处,“可测试 + 确定性 + 已采集环境信息”适用于所有领域。
防护措施
- 绝不要运行任何破坏性操作,也绝不要未经作者许可运行不受信任的实验代码来“证明”它有效。
repro_check.py按设计是静态且只读的(不会执行代码,也不会联网)。是否端到端运行该产物由作者决定,而且可能需要沙箱/GPU。 - 清单通过是必要条件,但不是充分条件。 不要告诉作者该产物“会获得徽章”或“可复现”——这些是委员会根据当前 CFA 作出的结论;文中所有“复现”都表示在不改变论文主张的容差范围内,绝非逐位精确复现。请使用“必要但不充分”的表述。
- 不要捏造结果或命令。 复现命令必须是仓库中实际存在的命令;如果无法运行,请如实说明。
- 注意匿名化:双盲评审期间,绝不要通过仓库、提交历史或 Notebook 元数据泄露作者身份。
- 它会检查、搭建脚手架并作出说明;但不会代表作者提交产物或申请 DOI。
references/文件应保持在一层目录内;此文件不得超过 500 行。
记忆
使用共享的 .paper-memory/ 约定(完整规范:paper-memory-convention.md)。
- **开始时:**阅读
lessons.md,跳过已修复的问题,并优先指出recurring习惯(例如“你经常提交未锁定版本的依赖——先检查这一点”);阅读profile.yml,了解贡献类型,以便确定正确的徽章目标。 - **结束时:**针对每个反复出现的问题,使用
reflect-and-improve的reflect_log.py,按规范格式追加一条带日期的记录:python3 ../reflect-and-improve/scripts/reflect_log.py append \ --memory .paper-memory --skill test-research-code --scope recurring \ --issue "experiment scripts ship without seed setting" \ --rec "set random/numpy/framework seeds + PYTHONHASHSEED every artifact" - 按需创建
.paper-memory/;询问是否将其加入.gitignore;仅保存在本地,绝不上传。