① 四个角色(永不变形)
① 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 |
| Jeff | Promote / 回退 / 建号 / 配钥匙 | —— |
⑤ 首单实录(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=44 | files_list 每个文件都打到 index.html, 垃圾一度进正本(revert 救回,live 无恙) | 先斩 query 再去 index.html |
| Pages 无 404.html 的「200+主页」兜底 | 缺文件返回 200,机器把主页当任何文件收下 | 仓库根加 404.html;取活/交件两侧加魔数验身闸 |
| CI 干净机器没有历史版本快照 | 护栏正确拒绝部署(不然线上版会被抹成 404) | deploys/live 附受保护版本清单,部署前从云上取回 —— 历史不靠任何人的硬盘 |
| Pages 308 重定向 + py3.9 urllib 不跟 308 | index.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 各条。