🏭 AI 游戏工人 · 终局架构
Jeff 2026-08-15 一天之内逐条拍板、当天落地、当晚全程跑通第一单。 这一页是唯一出处 —— 以后所有「执行器放哪 / 谁有什么钥匙 / 要不要上云」的问题,指这页答。 仓库版正本:docs/GAME_WORKERS.md(两份由同一天的事实生成;冲突以仓库版为准)。
✅ 首单已零人手跑通:g2048 v17 📦 七个 App 版本 v0.474~0.481 待 TF 🔑 零静态钥匙工人

① 四个角色(永不变形)

① App = 遥控器          按钮:派活 / 📥取码 / 📤交活 / Promote / 回退
② 生产机 = 闸门+账房     身份·额度·安检·版本指针·留痕 —— 永远不给模型"手"
③ 工人池 = 执行器+沙盒   模型的"手"只长在这儿;节点可加可烧
     节点1:Mac mini hoopai(订阅价,自己人的活)     ← 已在跑
     节点2..N:云工人机(API 计费,外部开发者)       ← 量到了再加
④ 正本 = git + R2/CF     不可变版本快照;谁也不许就地改(对人对 AI 一视同仁)

有手/无手判据:模型只进出文字(AI 造单文件游戏)→ 管线可以住后端; 模型要读写文件/跑命令 → 执行器必须在独立工人机(铁律:执行器绝不与生产同机同身份)。

模型永远在 Anthropic 家里:模型↔执行器之间跑的是文字(可以远); 执行器↔文件是千百次碎操作(必须同机)。工人机和生产机,一辈子分居。

② 工人的一生:一进一出,同一把"钥匙" = 它在哪个房

取活  房间身份 → GET /v1/workrooms/{cid}/game → files_list → 下载 ~/games/<gid>/
      (fetch_game.py;不在的房 403 —— 范围长在房间上,实测)
干活  自己沙盒里改;游戏自己的 CHANGELOG.md 顶部必须追加一条(不写=交件被拒)
交活  POST /v1/workrooms/{cid}/game/submit(submit_game.py)—— 工人零钥匙
      平台三道机器闸(全是代码,不是提示词):
        ① 范围闸  只收这间房绑的游戏;路径干净;扩展名白名单;≤300文件/20MB
        ② 账本闸  CHANGELOG.md 的 blob sha 必须变(没记账=活没交完)
        ③ 验身闸  图片必须真是图片(魔数);内容与扩展名对不上当场拒
      → 平台机器人 commit+push git(提交语=账本最新条,署工人名)
      → CI 自动 deploy.sh:从云上取回受保护版本 → 版本化发布 → 全站验证 → staging
上线  只有 Jeff 按 Promote;回退一颗按钮;全程留痕(git + game_promotions)

双触发,一条闸:📥📤 两颗按钮 = 替人往房里发一句标准指令,工人执行; 人手打同一句话完全等效。闸门只认内容,不认触发方式 —— 不存在"手动可以绕闸"。

③ Jeff 当天亲手砍掉的三块冗余(记下防复活)

砍掉的为什么替代
工人的 GitHub 只读钥匙「我只要它拉 2048」—— 整仓钥匙比需要的宽 按房取活:在哪个房=拿哪个游戏(钥匙留作后备,跑稳后网页撤销)
工人的部署令牌「都有按钮推上去了,还什么部署令牌?」 交活也凭房间身份 —— 一进一出同一把"钥匙",零静态凭据
必经 Vega5 人肉审推「我不希望它交给 Vega5」—— 几千游戏时人是瓶颈 三道机器闸 + bot 署名留痕;Vega5 转抽查审计(diff 全在,随时回溯)

另:每游戏一把部署令牌 →(「每个游戏这样加我会死!」)→ 平台主令牌 DEPLOY_MASTER_TOKEN,新游戏零配置;老令牌保留兼容。

④ 钥匙表(谁有什么 —— 这张表变了要回来改本页)

没有
工人(hoopai / LivaMini01)自己的 HOOP 账号 · 房间成员身份 git 钥匙 · 部署令牌 · 生产机 · 主仓 · Jeff 的任何文件(内核 Permission denied,实测)
生产机后端GITHUB_PUSH_TOKEN(仅 games 仓 Contents 写权)· R2 · DEPLOY_MASTER_TOKEN 模型的"手"
CI(GitHub Actions)CLOUDFLARE_API_TOKEN · CLOUDFLARE_ACCOUNT_ID · GAMES_DEPLOY_ENV(主令牌) 生产机 SSH
JeffPromote / 回退 / 建号 / 配钥匙——

⑤ 首单实录(2026-08-15 深夜,全程零人手)

LivaMini01 沙盒记账(2048/CHANGELOG.md 加 v17 条)
 → submit → 三闸全过
 → git 提交 f089c26a(只动账本 6 行,署名 LivaMini01)
 → CI 第 7 跑:从云取回 v1/v16 → 部署 → staging = v17
 → 版本说明自动 = 账本最新条;v1/v16/v17 全 200;live 全程未动

首验当场抓出并根治的四条真虫(每条都真红过才算修好)

症状根治
拼 URL 没斩 ?v=44files_list 每个文件都打到 index.html, 垃圾一度进正本(revert 救回,live 无恙)先斩 query 再去 index.html
Pages 无 404.html 的「200+主页」兜底缺文件返回 200,机器把主页当任何文件收下 仓库根加 404.html;取活/交件两侧加魔数验身闸
CI 干净机器没有历史版本快照护栏正确拒绝部署(不然线上版会被抹成 404) deploys/live 附受保护版本清单,部署前从云上取回 —— 历史不靠任何人的硬盘
Pages 308 重定向 + py3.9 urllib 不跟 308index.html 下载失败/probe 漏记 请求目录 URL;curl 一律带 -L 与浏览器 UA
这一节的存在意义:「先跑通一单再放量」的价值不在跑通,在这四条虫 —— 每一条放到几千游戏的规模上都是灾难,今天都用一单的代价买断了。

⑥ 配套标准(同日立的)

每游戏一份 CHANGELOG.md:游戏文件夹里的正经账本,每版必追加、最新在最上; deploy.sh 发版自动取最上条当版本说明;不写=交件被拒。按 game_id 存,结构上混不了别家。 样板:2048/CHANGELOG.md

记忆卡:哨兵把「每次叫醒真正注入给分身的小抄」上报平台(固定码打码), Work Info 页按分身展示 ——「AI 知道什么」从口头保证变成随时可查(迁移 000233)。

Game 页(工作房第 5 页):信息 · 玩家数 · 体量(几个文件·多大)· 版本 · 玩两个门 · 文件浏览(图片进照片浏览器/其它进阅读器)· Activity 留痕+每版账 · 📥取码 📤交活 · 上线/回退(主人)。

⑦ 排期(不是过桥,是产能)

待建hosted 线(AI 托管游戏)的 submit —— 骨架已立(501 明说),下一刀补 R2 直写版

待建云工人节点 —— 量到了,把 hoopai 这套原样铺进一台小 VPS 即节点 2;加节点不改架构

已通CI 推云(Secrets 已配)· 平台代推 git 线 · 按房取活/交活 · 主令牌 · 记忆卡 · Game 页全家桶

出处:HOOP 仓 docs/GAME_WORKERS.md(正本)· 本页 2026-08-15 深夜生成。 拍板过程在当天终端对话与 CHANGELOG v0.474~0.481 各条。