
独立解题评测中执行侧应取得题目、公开交付规则和任务允许的输入私有参考答案由评分侧读取评分反馈何时返回必须写入测试约定。判断成绩能说明什么要核对实际提供的信息拿到本题私有答案后的正确输出可以证明交付满足检查却不能直接证明独立解题能力。允许查手册、运行已有测试的任务则按这些条件评价。先用一张表确定谁能读什么以下是本文建议的评测输入契约。公开规则帮助 Agent 知道要交付什么私有答案用于验收两者应分开。材料执行侧评分侧核对重点题目、字段、格式、允许工具可读可读两侧使用同一任务约定原始输入、允许的文档或已有测试按约定可读按验收需要可读列明具体文件与工具范围本题参考答案、私有验收样本提交前不提供可读是否进了消息、文件或工具返回评分报告、逐题纠正按约定的时机返回可读下一次会话是否带入这些反馈SWE-bench原论文以问题描述与代码库作为模型输入再测试模型补丁。本文借用的是输入和验收各有角色的思路不把所有测试文件都归为秘密。SWE-bench原论文允许清单从组装输入时就开始下面是构造示例不是商业Agent实测。任务给出三条时长[12,0,8]要求记录数和时长合计零值也计一条评分参考为count3、total20。执行输入采用三个字段{taskFields:[task,inputFiles,outputRules],files:[task.json,input/metrics.json]}这是清单结构示意实际检查器的files是文件路径到SHA-256摘要的映射。先审定题目和允许输入再冻结摘要私有grading不随完整题目对象一并转发。导出后逐项检查文件是否齐全、有无额外文件、字段是否符合契约、内容是否变化。摘要的作用是确认字节与已审定输入一致它本身不能判断内容里有没有答案。建议执行包只包含task.json和input/产物写入另外约定的output/。评分材料、报告和输入契约清单保管在准备/评分侧清单无需提供给被测Agent。权限、检索索引和工具账号仍按任务范围设置。我们把这套检查做成了可复制的离线工具。它拒绝缺失/额外文件、字段越界、摘要变化和软链接并补充扫描合成参考标记。九个夹具中干净输入通过额外参考文件、嵌入参考标记、文件软链接、缺失输入、多出评分字段、输入变化、上次反馈混入、目录软链接八类输入均被拒绝。它检查打包契约不替代真实权限或网络审计。完整离线检查器与复做命令将下面代码保存为isolation_demo.py执行python3 isolation_demo.py。它在临时目录构造九个夹具并生成示例运行结果.json与输入允许清单.json可用python3 isolation_demo.py --check ./agent-input --manifest ./输入允许清单.json检查按该示例契约准备的输入接受时退出码0拒绝时退出码2。换任务时应先审定允许字段与文件再生成该任务的摘要不能沿用示例摘要。EvalDock team: offline synthetic input-contract demo, no Agent or API calls.frompathlibimportPathimporthashlibimportargparseimportjsonimportosimportplatformimportstatimporttempfile ALLOWED_FIELDS{task,inputFiles,outputRules}MARKERbREF_ONLY_SAMPLE_7c29# synthetic reference marker, not a credentialdefsha(data):returnhashlib.sha256(data).hexdigest()defproject_case(case):Build the execution message explicitly; private grading is not copied.return{key:case[key]forkeyinsorted(ALLOWED_FIELDS)}definspect_payload(root:Path,expected_hashes:dict):Static pre-run package check, not a permissions sandbox.findings,seen[],set()forparent,dirs,filesinos.walk(root,followlinksFalse):fornameinsorted(dirsfiles):pPath(parent)/name relp.relative_to(root).as_posix()modep.lstat().st_modeifstat.S_ISLNK(mode):findings.append([rel,symlink_rejected])elifstat.S_ISREG(mode):seen.add(rel)datap.read_bytes()ifrelnotinexpected_hashes:findings.append([rel,unexpected_file])elifsha(data)!expected_hashes[rel]:findings.append([rel,digest_mismatch])ifMARKERindata:findings.append([rel,private_marker_found])elifnotstat.S_ISDIR(mode):findings.append([rel,special_file_rejected])forrelinsorted(set(expected_hashes)-seen):findings.append([rel,missing_file])task_pathroot/task.jsoniftask.jsoninseen:try:fieldsset(json.loads(task_path.read_text()))iffields!ALLOWED_FIELDS:findings.append([task.json,field_contract_mismatch])except(ValueError,TypeError):findings.append([task.json,invalid_task_json])returnsorted(findings)defencode(value):return(json.dumps(value,ensure_asciiFalse,sort_keysTrue)\n).encode()defrun_demo():taskCount all durations and sum them. Zero counts as a record.full_case{task:task,inputFiles:[input/metrics.json],outputRules:{summary.json:[count,total]},grading:{count:3,total:20,marker:MARKER.decode()},}payloadproject_case(full_case)assertset(payload)ALLOWED_FIELDSandgradingnotinpayload task_bytes,input_bytesencode(payload),encode([12,0,8])valuesjson.loads(input_bytes)assert{count:len(values),total:sum(values)}{count:3,total:20}hashes{task.json:sha(task_bytes),input/metrics.json:sha(input_bytes)}records[]withtempfile.TemporaryDirectory(prefixevaldock-input-)astmp:basePath(tmp)privatebase/grader-privateprivate.mkdir()referenceprivate/reference.jsonreference.write_bytes(encode(full_case[grading]))reference.chmod(0o444)read_only_readableMARKERinreference.read_bytes()assertread_only_readable cases[clean,extra-reference,inline-reference,external-link,missing-input,unexpected-field,changed-input,previous-feedback,directory-link]fornameincases:rootbase/name(root/input).mkdir(parentsTrue)(root/task.json).write_bytes(task_bytes)(root/input/metrics.json).write_bytes(input_bytes)ifnameextra-reference:(root/reference.json).write_bytes(reference.read_bytes())ifnameinline-reference:changeddict(payload,tasktask MARKER.decode())(root/task.json).write_bytes(encode(changed))ifnameexternal-link:(root/input/ref-link.json).symlink_to(reference)ifnamemissing-input:(root/input/metrics.json).unlink()ifnameunexpected-field:(root/task.json).write_bytes(encode(dict(payload,gradingfull_case[grading])))ifnamechanged-input:(root/input/metrics.json).write_bytes(encode([12,0,9]))ifnameprevious-feedback:(root/task.json).write_bytes(encode(dict(payload,feedbackfull_case[grading])))ifnamedirectory-link:(root/history).symlink_to(private,target_is_directoryTrue)findingsinspect_payload(root,hashes)assert(notfindings)(nameclean),(name,findings)records.append({case:name,accepted:notfindings,findings:findings})# Synthetic chronology: scoring after frozen A does not alter A;# putting that report into Bs next input changes Bs information boundary.run_aencode({count:3,total:20})frozen_hashsha(run_a)report_a{expected_count:3,expected_total:20,marker:MARKER.decode()}run_bencode(dict(payload,feedbackreport_a))feedback_result{runAHashUnchangedAfterReport:sha(run_a)frozen_hash,runAFeedbackVisibleBeforeSubmission:False,runBFeedbackInInput:feedbackinjson.loads(run_b),runBContainsPrivateMarker:MARKERinrun_b,identity:synthetic message construction; not Agent execution}assertall(feedback_result[k]forkin[runAHashUnchangedAfterReport,runBFeedbackInInput,runBContainsPrivateMarker])return{status:passed,identity:synthetic offline checks; no Agent/model/API run,python:platform.python_version(),fixtureCount:len(records),cases:records,fieldProjection:{kept:sorted(payload),privateGradingCopied:False},referenceArithmetic:{count:3,total:20},readonlyProbe:{mode:0444,readSucceeded:read_only_readable,scope:local same-user file read; not Docker test},feedbackChronology:feedback_result,exampleManifest:{files:hashes,taskFields:sorted(ALLOWED_FIELDS)},limits:[Does not enforce filesystem, network, tool or conversation permissions,Hashes describe frozen bytes, not absence of answer content,No race resistance or model training contamination audit],scriptSha256:sha(Path(__file__).read_bytes())}if__name____main__:parserargparse.ArgumentParser(description__doc__)parser.add_argument(--check,typePath,helpStatic check of an execution-input directory)parser.add_argument(--manifest,typePath,helpTrusted JSON contract with files and taskFields)argsparser.parse_args()ifargs.checkisnotNone:ifargs.manifestisNone:parser.error(--check requires --manifest)manifestjson.loads(args.manifest.read_text())ifset(manifest[taskFields])!ALLOWED_FIELDS:parser.error(unsupported task field contract)forrelinmanifest[files]:ifPath(rel).is_absolute()or..inPath(rel).parts:parser.error(unsafe manifest path)ifnotargs.check.is_dir()orargs.check.is_symlink():parser.error(root must be a real directory)findingsinspect_payload(args.check,manifest[files])print(json.dumps({accepted:notfindings,findings:findings},ensure_asciiFalse,indent2))raiseSystemExit(0ifnotfindingselse2)ifargs.manifestisnotNone:parser.error(--manifest requires --check)resultrun_demo()targetPath(__file__).parent/示例运行结果.jsontarget.write_text(json.dumps(result,ensure_asciiFalse,indent2)\n)(target.parent/输入允许清单.json).write_text(json.dumps(result[exampleManifest],ensure_asciiFalse,indent2)\n)print(json.dumps(result,ensure_asciiFalse,indent2))只读仍可读答案目录不能靠readonly隐藏Docker的bind mount会把宿主机内容提供给容器readonly限制写入仍允许读取。因此整个题包只读挂载后其中的参考答案仍可能进入Agent可见范围。Docker官方挂载文档本篇还运行了一个本地文件探针将合成参考文件设为0444同一用户仍能读出参考标记。这次检查没有启动Docker只演示文件只读权限与可读性的区别。实际配置时可只挂载允许的输入给产物目录写权限评分目录不挂载随后从执行身份核对路径、工具返回和检索索引。目录改名为private或禁止修改参考文件都不能单独证明答案不可读。执行输入按允许清单提供评分侧在提交后读取参考与产物。报告若进入下一次输入就改变下一次运行的测试条件。EvalDock团队整理方法示意。报告在提交后生成为何还会污染下一次运行关键是把两次运行分开看。运行A先提交产物并冻结评分侧随后生成报告。若提交前没有提供报告后来出现的报告不会倒过来影响A的已冻结产物。运行B续接会话时若带入“正确记录数是3、合计应为20”B就已经取得本题反馈即使B的输入文件夹没有reference.json。离线时序例子固定了A的提交字节再构造报告A的摘要保持不变。随后把报告放入B的feedback字段字段契约检查和参考标记扫描都检出这次变化。这是消息组装反例不是Agent行为或能力成绩。若任务允许多次试做并接收评分反馈应把反馈内容、次数与重试额度一起写进条件评价这种迭代方式。若目标是检验未参与优化的新任务表现就使用没有用来改提示、选工具或调整策略的保留任务。把测试数据用于模型选择会影响独立估计把该原则应用到Agent提示与工具优化是本文的方法建议。scikit-learn数据泄漏说明为什么这项检查与EvalDock评测有关EvalDock是面向各类Agent的跨生态评测与选型平台。当前公开源码的执行输入组装题目、输入种子和路径规则评分输入另读取题目评分材料、维度标准及任务证据。运行条件与评分依据承担不同角色因此解释成绩时需要回查执行侧实际获得了什么。执行输入源码、评分输入源码本文由EvalDock团队整理允许清单工具和反馈反例是读者可采用的方法资产。上述源码核对确认了两类输入的组装关系完整运行环境的防泄漏效果需要另行审计。相关公开资源见EvalDock工具与评测集。