Agent未读/etc/os-release就假设了glibc版本和systemd,而用主机实际文件哈希作为receipt可堵住这类未经验证的环境假设。
一位维护者提交了一个 PR,锁定了 glibc 版本、重命名了一个 systemd unit,并声明主机系统为 Ubuntu Noble。而评测环境却是一个精简的 Debian 镜像,没有 systemd,libc 路径也不同。智能体从未读取过 /etc/os-release,但 diff 看起来内部一致,可以合并。隐蔽的主机假设能够通过审查,是因为整洁的补丁掩盖了一个事实:没有人真正观察过那台机器。
Prompt 模型避免假设有助于多撑一两轮,然后在时间压力下旧习惯又会卷土重来。更顽固的控制手段是主机收据(host receipt):在真实机器上收集的一个小文件,带有哈希值,并被引用。直到这个引用存在之前,补丁中的环境声明被视为训练残留,而非证据。这个 spike 持续九十分钟,验证一个假设,最终在没有延期的情况下做出发货或终止的决定。
假设足够简单,可以在公开场合失败:一个无法附加真实主机收据的智能体,不应该描述运行时。如果智能体仍然在没有收据的情况下发出版本锁定、包名或 init 系统细节,这个 spike 就会被终止。发货意味着收据、哈希校验和补丁声明都认同同一组观察到的事实。终止意味着工作流被丢弃,不会用额外的 prompt 文本和又一个没有记录的一小时来软化处理。
这个协议需要一个真实主机而非模拟的文件系统,因为模拟树会招致它们试图捕捉的同一种捏造。MonkeyCode 是一个开源项目,提供免费的模型访问和一个用于临时评测主机的免费服务器选项。披露:本文是 MonkeyCode 产品推广的一部分。收据门本身是普通的 shell 和 Python 脚本,即使移除该产品提及,它仍然有用。
前十分钟属于 issue 跟踪器,而不是等待在另一个窗口中的模型。操作员记录假设、终止规则和一个允许的任务,然后拒绝扩大范围。一个公平的任务是要求一个三行说明,声明该机器上的 OS 标识符和 Python 次版本号。issue 存在之后,操作员登录评测主机并运行一个收集器,智能体不得修改该收集器。
下面的收集器是操作员步骤的一个建议脚本,不是已发布的基准运行。它应该在智能体收到任何指向代码树的路径之前,由操作员在真实主机上执行。文中省略了发布的数字,因为本文是一个协议,不是助手品牌的排行榜。
#!/usr/bin/env bash
# proposed operator-only collector — label: unexecuted example
set -euo pipefail
umask 077
OUT="${1:-/tmp/host-receipt.json}"
python3 - "$OUT" <<'PY'
import hashlib, json, os, platform, socket, subprocess, sys, time
from pathlib import Path
def sh(cmd):
try:
p = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=8)
return (p.stdout or "").strip()
except Exception as exc:
return f"unreadable:{type(exc).__name__}"
os_release = {}
path = Path("/etc/os-release")
if path.is_file():
for line in path.read_text(errors="replace").splitlines():
if "=" in line and not line.startswith("#"):
k, v = line.split("=", 1)
os_release[k] = v.strip().strip('"')
payload = {
"collected_at_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
"hostname": socket.gethostname(),
"uname": sh("uname -a"),
"os_id": os_release.get("ID", "unknown"),
"os_version_id": os_release.get("VERSION_ID", "unknown"),
"python_version": platform.python_version(),
"python_executable": sys.executable,
"uid": os.getuid(),
"euid": os.geteuid(),
"cwd": os.getcwd(),
"kernel": platform.release(),
}
blob = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode()
payload["sha256"] = hashlib.sha256(blob).hexdigest()
Path(sys.argv[1]).write_text(json.dumps(payload, indent=2) + "\n")
print(payload["sha256"])
PY
chmod 644 "$OUT"
重要的属性不是密码学表演,而是一个清晰的对称:谁可以观察,谁可以引用。操作员而非智能体生成文件,然后将打印的摘要粘贴到 spike issue 中作为唯一的合法哈希。文件模式保持全局可读,以便智能体可以打开它,而父目录保持由操作员所有,以防止交换。这个分离就是全部设计:观察仍然是人类的特权,引用是分配给模型的唯一工作。
第十分钟到第四十分钟用于在主机上放置收据并锁定目录以防止智能体写入。一个简短的类比有助于从未运行过智能体评测的 reviewer 理解:收据就像夜店在皮肤上盖的章。任何人都可以从电影中描述夜店,但门卫检查的是墨水,图画不是墨水。智能体是客人,操作员是门卫,第九十分钟是门在无疑义的情况下关闭的时刻。
第四十分钟到第七十分钟由操作员可以在笔记本电脑上运行的验证器完成,无需搭建流水线。脚本将缺失的声明文件视为终止,而非跳过,因为跳过会让捏造的主机重新进入。声明文件是唯一邀请智能体编写的文档,它必须逐字引用 issue 摘要。当该文件存在于磁盘上且位于补丁旁边之前,模型在聊天中输出的任何内容都被视为表演。
# proposed verifier — label: unexecuted example
from __future__ import annotations
import json
import re
import sys
from datetime import datetime, timezone
from pathlib import Path
SHA = re.compile(r"^[0-9a-f]{64}$")
def kill(reason: str) -> None:
print(f"KILL: {reason}", file=sys.stderr)
raise SystemExit(2)
def main(issue_sha: str, receipt_path: Path, claims_path: Path) -> None:
if not SHA.match(issue_sha):
kill("issue digest is not a 64-char sha256")
if not receipt_path.is_file():
kill("operator receipt is missing on disk")
receipt = json.loads(receipt_path.read_text())
if receipt.get("sha256") != issue_sha:
kill("receipt digest does not match the issue")
if not claims_path.is_file():
kill("agent claims file is missing")
claims = json.loads(claims_path.read_text())
cited = str(claims.get("receipt_sha256", ""))
if cited != issue_sha:
kill("agent did not cite the operator digest")
for key in ("os_id", "python_version"):
if claims.get(key) != receipt.get(key):
kill(f"claim {key} contradicts the live host")
collected = datetime.strptime(
receipt["collected_at_utc"], "%Y-%m-%dT%H:%M:%SZ"
).replace(tzinfo=timezone.utc)
age = (datetime.now(timezone.utc) - collected).total_seconds()
if age > 90 * 60:
kill("receipt is older than the ninety-minute spike")
print("SHIP: host receipt, issue digest, and agent claims agree")
if __name__ == "__main__":
main(sys.argv[1], Path(sys.argv[2]), Path(sys.argv[3]))
智能体允许生成的声明文档看起来像下一个片段,任何更花哨的东西都是一种气味。关于 GPU、发行版营销名称或记忆中的 Docker 基础镜像的额外字段在这里不会被记为勤奋。除非收集器在操作员运行期间在真实主机上观察到了它们,否则它们会被记为捏造。模式保持小巧,这样当智能体用自信的民间传说填充对象时,终止规则就变得显而易见。
{
"receipt_sha256": "paste-the-operator-digest-here",
"os_id": "debian",
"python_version": "3.11.2",
"task": "three-line runtime note",
"patch_paths": ["RUNTIME_NOTE.md"]
}
操作员在智能体停止后运行一条命令,那是整个 spike 的全部仪式。退出状态 2 是终止,退出状态 0 是这个 spike 认可的唯一切换信号。模型的日志、表情符号和自评分置信度被忽略,因为它们是捏造的主机看起来很忙的通道。如果智能体写了第二个收据,验证器永远不会读取它,而额外时间的请求不会移动时钟。
python3 verify_receipt.py "$ISSUE_SHA" /tmp/host-receipt.json ./claims.json
最后二十分钟是单次尝试,不是每次尴尬的 tool call 后修复 prompt 的辅导课程。操作员将编码智能体指向 issue、收据路径和声明模式,然后观察而不做中途编辑。发货需要一个引用摘要的声明文件和一个 OS 和 Python 字符串与收据匹配的小注释。当智能体跳过文件、伪造摘要或断言机器没有的运行时,就会记录终止。
干净的发货或干净的终止都算作一个完成的实验,而不是社交失败。只有模糊的 maybe 会浪费评测主机,因为它教会团队在没有证据的情况下协商。Reviewer 有时会要求智能体在 prompt 中运行 uname,然后把 transcript 当作遥测数据来信任。Transcript 是文学作品,可以引用一个命令并捏造一个退出码而不触及机器,所以它们永远不会通过这个 spike。
局限性来自于设计本身,而非出于公开场合谨慎表态的愿望。收据证明有人在某个时间观察了一台主机;它不能证明补丁是正确的、安全的或值得合并的。在评测主机上有 root 权限的智能体仍然可以替换收据,除非目录所有权保持由操作员持有。时钟偏移和虚假的容器元数据可以让诚实的智能体看起来有罪,这是这个终止偏向的 spike 有意接受的。
九十分钟的机器对于跨模型的统计比较来说太短了,这里没有提供这样的比较。不应该使用这种方法包括在共享评测服务器上放置生产密钥的团队。任何需要公开排行榜的人,或者希望收据可以替代测试和审查的人,应该选择另一种方法。受监管数据、客户转储和专有构建缓存不属于这种临时主机。
有趣的结果是一个无聊的门禁策略,使得捏造的主机通过审查变得昂贵。已经保留临时机器的操作员可以将收集器粘贴到下一个时间盒 spike 中,并保留其他工具。已经在评估编码智能体的读者可以将这个收据门挂在第一个补丁前面,而无需更改其余技术栈。使用 MonkeyCode 免费服务器的人可以在那里运行收集器,并将验证器留在笔记本电脑上。