这份协议的形状
两档,各自独立。任何一档都不蕴含另一档。第一档默认开;第二档在你打开之前一直关。
- 游戏诊断默认收集,因为没有它的 bug 报告无从下手。登录后第一块有账号的屏会告诉你这件事并给出开关;在你做出选择之前默认成立,你做出的选择——包括撤回——会永久取代默认。
- 这里没有一条是游玩的前提。你的选择不改变任何玩法、任何限流、任何权限——唯一的差别是诊断流水能不能被上传。
- 同意记在账号上,因此对你登录的每台设备都生效。某台机器上的本机开关只能让它更严,不能让它更松。
- 上传落到一个与游戏分开运行的诊断服务:独立进程、独立数据库、独立凭据。
第一档——游戏诊断
两条流水:agent 留下的 trace,以及客户端自己的运行日志。这一档默认开。
- Agent trace:唤醒事件、决策摘要与 agent 给出的理由、routine 生命周期、它提交的动作与这些动作如何结清、结构化拒绝、告警,以及一份会话自证(代码版本、配置摘要、地图身份、停止原因)。
- trace 里含 agent 在世界里说出口的话,以及你下达的 goal 文本。这一条在这里点名,而不是藏在「行为数据」这种词后面。
- 客户端运行日志:错误、断线与重试、被拒绝的动作、场景切换、build id 与操控形态。对手动游玩的玩家来说,这是 bug 唯一留下的证据。
第二档——模型对话原文
harness 与语言模型之间的原始对话。这一档永远不会默认开:只有你能打开它。
- 完整的 system prompt、逐轮对话、提供出去的 tool schema 与实际发生的 tool 调用。
- 其中含 persona 的内容与模型完整的推理过程。它是判断「agent 为什么犯傻」最有用的材料,也是夕原收集的所有东西里最敏感的一份。
- 不勾这一档,它一个字节都不会离开你的机器:网关不会把它放进上传票据,诊断服务也会拒绝票据里不带它的上传。
永远不收集什么
下面这些是红线,不是开关。两档全勾也不会打开其中任何一条。
- 账号凭据:密码、邮箱验证码、access / refresh token、personal access token。
- 语言模型的 API key。它在本地流水里就被抹掉,上传离开之前再检查一遍。
- 记忆归档与 persona 文件本身。模型对话里被引用到的 persona 文字属于第二档;文件本身不被任何东西上传。
- 你的邮箱地址。诊断数据库里没有存放它的列。
- 你的 IP 地址。它回答不了任何关于 bug 的问题,所以诊断服务不接收它,网关也不转发它。
- 客户端观察到的世界状态。世界侧本来就有自己的事件日志,没有理由再抄一份到你这边。
上传物怎么标识
一次上传带的是你的 account id 与 character id 原值,不是假名。
- 为什么:同一个玩家跨会话、跨设备的证据要能串起来;一次删除请求要精确删掉你的数据、且只删你的;你来报 bug 时,我们要能找到你说的是哪一段。
- 代价明说:诊断数据库里的行是可以和你的账号对上的。让它不至于变成一份联系人名单的,是围着它的那道边界——独立的数据库、读不到账号库的凭据,以及这一侧根本不存邮箱地址。
保留多久
每条流水各有自己的到期时刻,由服务执行删除。
- 游戏诊断:最多 30 天。
- 模型对话原文:最多 7 天——永远是三条里最短的,因为它最敏感。
- 到期是硬删,不是隐藏标记。你主动要求的删除同样是硬删。
- 这个时钟由诊断服务自己跑,而不是交给存储厂商的生命周期规则,所以换存储后端也不会把这条承诺换掉。
怎么关掉
三个开关,彼此独立。
- 在账号页面撤回某一档——对默认开着的那一档同样有效。它对每台设备生效、立即生效,而且撤回从不要求你先读什么。
- 在客户端或 harness 里关掉本机开关。它只对那一台机器生效。
- 在账号页面删除你已经上传的数据。
- 撤回不是瞬时的。已经签发出去的上传票在过期之前仍然有效,所以撤回之后可能还会到达最后一批。这个残余窗口以票据寿命为上界——我们宁可这么写,也不愿印上「立即生效」然后说错。
删号的时候
删号会顺带请求诊断服务一并删除,但只是尽力而为。
- 两个服务是刻意分开的,所以删号不会因为诊断服务恰好挂了而变慢、失败或回滚。
- 如果那一次请求没送达,兜底的是上面那段保留期。
- 想让诊断数据确定消失:先删诊断数据,再删账号。
这份正文改版时
协议带版本号,同意记录的是你读过的那个版本。
- 正文一改版,按旧版本给出的同意就不再算数,你会被重新征询一次。
- 没有把旧同意沿用下来的路径。沿用等于把你当作同意了一份你没看过的文本。
- 默认是一条策略,不是你读过的文本:从未做过选择的账号在当前正文下仍持有默认档。撤回在任何版本下都仍是撤回。