内部狗粮运行保障

本目录把 Wave0/Wave1 的开波和收口条件落实为默认拒绝的本地证据门。工具只读取本地 JSON、TSV 和附件并重算结论,不连接 staging不发告警不执行停服、删档或回滚也不包含 Playwright/Puppeteer。浏览器采样、真玩和截图只能由 mini-desktop 上的项目统一入口 /gstack 产生。

1. 固定波次

波次 创作者 玩家 连续值班覆盖
wave0 3 5 至少 24 小时
wave1 10 30 至少 72 小时

初始化只接受这两个名称。重复初始化会校验既有 manifest.json 后返回,不覆盖任何已填写证据。

deploy/dogfood-ops/init-wave.sh --root /受控证据根 --wave wave0

生成目录中的 JSON 带 _template: true,表示它还不是证据。填写完成后删除该字段。附件统一放在波次目录内的 attachments/JSON/TSV 只写相对路径。绝对路径、.. 路径、符号链接和不存在的附件都会被拒绝。

2. 执行顺序

开波前按以下顺序执行,任一步非零都保持发布冻结:

# 1. 初始化并填写同一波次的全部结构化证据。
deploy/dogfood-ops/init-wave.sh --root /受控证据根 --wave wave0

# 2. 先跑开波门;模板、缺字段、阈值不达标都返回非零。
deploy/dogfood-ops/check-readiness.sh --wave-dir /受控证据根/wave0

# 3. 每日证据采集结束后冻结。当日清单已存在且内容变化时拒绝覆盖。
deploy/dogfood-ops/freeze-evidence.sh \
  --wave-dir /受控证据根/wave0 \
  --date 2026-07-22

# 4. 收口门除全部开波条件外,还会重算最近冻结清单。
deploy/dogfood-ops/check-close.sh --wave-dir /受控证据根/wave0

GATE_PASS 只表示本地证据在当前规则下可对账,不替代人工判断,不代表 staging 已部署、告警已送达或波次已完成。真实结论必须回到原始截图、网络记录、日志和数据库 ID 核验。

3. 证据清单

文件 必填内容
manifest.json 固定波次、人数和持续时间,不得修改
rc.json 完整 40 位 commit、tracked 干净标志、制品路径与实际 SHA-256
config-identity.json 同一 RC commit、配置包路径、实际 SHA-256、采集时间
snapshot.json MySQL 快照路径/哈希,以及非 staging/production 目标的隔离恢复 PASS、时间和报告
storage-audit.json 对象存储审计报告、实际哈希、采集时间
accounts.json batchId、精确创作者/玩家计数、FREE 额度wave0 至少 4wave1 至少 12
role-permissions.json 创作者本账号允许、跨账号拒绝、审核员只审、审核员改配置拒绝、只读写拒绝;每项带截图
main-chain.json 同一 project/version/artifact/game 的 create→generate→preview→submit-review→approve→feed→play→telemetry每段同时带截图、网络、日志、数据库证据
release-negatives.json DRAFT、REVIEWING、REJECTED、直调绕过、批准后产物漂移、下架后 feed/详情/深链八类拒绝证据
manual-play.json 每个发布游戏在进入 feed 前由 /gstack@mini-desktop 真玩,带测试人、时间和截图
performance.json 固定环境下至少 30 次禁用缓存的独立导航,只含 cold 样本
p0.tsv 单一 P0 账本;任一 severity=P0 行都会拒绝开波和收口
telemetry.json 期望完整事件数、完整收到数、原始证据;完整率至少 95%
alerts.json 至少一条接收时间、接收人、外部消息 id 和原始证据,不接受仅写 PASS
oncall.tsv 无空档覆盖本波次完整时长的主备值班与联系方式
feedback.tsv 唯一反馈账本;每行 id、时间、报告人、角色、分类、级别、摘要、状态、owner、证据都完整
manual-acceptance.tsv 角色权限、主链、发布负例、入 feed 前真玩四项人工签认
drills.json stop/delete/rollback 三类演练的精确 ACK、操作人、时间和目录内证据
safety-status.json 固定停止条件逐项评估,任一缺失或触发即拒绝
freezes/*.sha256.json 当日全部证据和附件的 SHA-256 清单wave0 至少 1 份、wave1 至少 3 份,按日连续并以前序清单哈希串联

所有时间使用带时区 ISO 8601例如 2026-07-22T08:00:00Z。哈希必须是小写 64 位 SHA-256并与附件内容一致。

4. 首屏 P75 口径

采样环境固定为 mini-desktop、Chrome 146、390x844@1、Tailscale staging。每次禁用缓存后独立导航从 navigation commit 计到首个可交互游戏帧;每条记录使用唯一 navigationId,并标记 cache=coldsource=/gstack@mini-desktop。热缓存另行报告,禁止写入 performance.json

算法使用 nearest-rankndurationMs 升序排列,排名为 ceil(0.75 × n),按 1 起算取值。30 个样本取第 23 个值。门槛是严格 P75 < 3000ms,所以 2999ms 通过3000ms 失败;少于 30 个样本直接失败。

5. 停止条件

出现以下任一情况,立即停止扩容;前六项同时要求全局停止:

  1. 安全事件、跨账号访问、数据丢失、真实扣款、真实广告曝光、未审内容进入 feed。
  2. 生成成功率低于 80%。
  3. 出现任一确认假阳。
  4. 同一阻断根因影响两人。
  5. 埋点缺失超过 5%。
  6. 待审超过 4 小时。
  7. 验收成本突破生成 v3 上限。

safety-status.json 必须逐项使用固定 condition 名称评估。不要删除已触发项来让闸门变绿。

6. 回滚顺序

真实操作只由批准的部署窗口人工执行。本目录不提供环境命令,固定顺序不可调整:

  1. 后端关闭新账号与提交审核。
  2. 后端 feed 总闸切为 fail-closed。
  3. 生成验收从 v3 退回 v3_shadow
  4. 下架受影响游戏。
  5. 回退到上一 commit-pinned RC。
  6. 保留全部证据,创建或关联根因工单。

首个 RC 没有上一版 commit-pinned RC 时,第 5 步不可伪造为已演练;保持 rollback 红灯,等第二个 RC 窗口补证。

7. 停服、删档和回滚演练记录

先由获批人员在隔离目标完成真实演练并保存证据,再用本工具签收。精确 ACK 只证明操作者明确选择了对应波次和动作,不会触发环境操作。

deploy/dogfood-ops/record-drill.sh \
  --wave-dir /受控证据根/wave0 \
  --action stop \
  --ack ACK-DOGFOOD-wave0-stop \
  --operator 值班人ID \
  --performed-at 2026-07-22T08:00:00Z \
  --evidence-ref attachments/stop-drill-report.json

deleterollback 分别使用 ACK-DOGFOOD-wave0-deleteACK-DOGFOOD-wave0-rollback。同一动作、同一记录重复执行幂等返回;已有不同记录时拒绝覆盖。

删档范围只能是当前 batchId 关联的账号、项目、版本、feed 和遥测业务数据。审核记录、安全日志、发布证据、根因工单至少保留 180 天,不得随业务删档删除。删档报告必须列出实际删除对象和保留对象,不能只写总数。

8. 每日冻结

每天完成采集后运行 freeze-evidence.sh。清单覆盖该波次目录下除 freezes/ 自身外的全部普通文件并记录上一日清单哈希。工具拒绝符号链接、日期空档和同日覆盖wave0 收口至少需要 1 份wave1 至少需要连续 3 份。若当天冻结后又补证,保留原清单并在下一日期重新冻结,不要修改历史清单。

9. 真实采集待办

本地测试 fixture 不可用于开波。真实执行仍需从批准窗口采集:

  • commit-pinned RC、制品和配置快照的原始文件及哈希
  • MySQL 本轮表快照、无网络隔离恢复报告、对象存储前缀审计;
  • wave0/wave1 精确账号与 FREE 额度盘点;
  • /gstack 在 mini-desktop 产生的角色权限、完整主链、八类发布负例、逐游戏入 feed 前真玩截图与网络证据;
  • 30 次独立冷导航原始计时和单列的热缓存报告;
  • P0、埋点完整率、告警接收回执、值班覆盖和反馈账本
  • 停服、限定 batchId 删档、第二个 RC 回滚的人工演练证据;
  • 每个采集日的 SHA-256 冻结清单。

10. 本地验证

python3 -m unittest discover -s deploy/dogfood-ops/tests -v
find deploy/dogfood-ops -name '*.sh' -exec bash -n {} +
python3 -m py_compile deploy/dogfood-ops/dogfood_ops.py deploy/dogfood-ops/tests/test_dogfood_ops.py
git diff --check -- deploy/dogfood-ops