🎮 游戏工作台 ↔ 游戏工作房
Jeff 2026-08-14 派题:「游戏的工作台,到如何连接到这个游戏的工作坊,我们做一个设计、系统设计,详细写在一份,做成网页,你给我链接我进去读。」
这份是设计图纸(不是 as-built)。凡是已经落地的都标 已落地,没落地的标 待做,要你拍板的标 待拍板
Vega5 · 游戏基地2026-08-14配套 as-built:docs/GAME_STAGING.md

「游戏工作房 和 普通工作房,到底差在哪?」

普通工作房 = 一个容器。里面有人、有分身、有消息、有任务卡。它不知道你们在做什么 —— 换个话题它照样能用,这正是它的优点。

游戏工作房 = 这个容器有了主语。它绑定一个具体的游戏,于是房里发生的每件事都带上了同一个上下文:第几版、谁部署的、在测的是哪一版、谁在玩、谁提的意见改进了哪一版。

一句话判据:普通工作房回答「谁在干活」;游戏工作房还要回答「这个游戏现在什么样、下一步谁按哪颗按钮」。
所以它不该是"普通房 + 多一条按钮",而应该是这个游戏的现场:状态看得见 · 动作按得到 · 事件自动落进聊天流。

为什么"多一条按钮"不够

你 08-14 早上看到的就是那个不够的版本:房里只有工作台卡,和普通房一模一样。当时还叠了一个硬 bug(见「② 现状」最后一节),但就算没那个 bug,你看到的也只是一条孤零零的按钮栏 —— 没有"这个游戏现在什么样"

差别落到具体的:

问题普通工作房游戏工作房(该有的样子)
我在哪房名 + 成员房名 + 这个游戏(图标/名字/上架状态)
现在什么状态分身在忙/闲线上第几版 · 在测第几版 · 最近部署多久前 · 今天多少人玩
我能干嘛说话、派活玩正式版 · 玩测试版 · 发给朋友 · 上线 · 退回上一版
刚发生了什么聊天记录聊天记录里混着部署/上线/回退的事件条(谁、什么时候、第几版)
意见去哪了沉进聊天一句反馈 → 一张卡 → 挂在某一版上 → 修完那条事件回到房里
我先认一件事:上面这张表的右列,现在只做到了第 1、2、3 行的一部分。第 4、5 行(事件流、反馈闭环)一行代码都没有。这份文档就是把它们补齐的图纸。

现状:两边各自是什么(as-built)

A. 游戏工作台(开发者中心)

入口:App → 我的 → 开发者中心。它是全局视角:我名下所有游戏、数据、收入、审核。

能力接口状态
我的游戏列表(含线上/在测版本、两条现成地址)GET /v1/dev/games已落地
上传新包(只动 staging,不碰线上)POST /v1/dev/games/{id}/upload已落地
上线(把在测那版推成线上)POST /v1/dev/games/{id}/promote已落地
退回上一版POST /v1/dev/games/{id}/rollback已落地
部署历史(最近 5 版)GET /v1/dev/games/{id}/deploys已落地
数据(零埋点:打开/时长/留存)GET /v1/dev/games/{id}/analytics已落地
把游戏挂到一间工作房上POST /v1/dev/games/{id}/workroom已落地

B. 工作房

入口:聊天列表里的一间房(conversations.type = 'workroom')。它是现场视角:谁在干活、干到哪、卡有没有交。

能力接口 / 位置状态
工作台(房里所有分身此刻在干嘛)GET /v1/workrooms/{cid}/board已落地
任务卡(落卡/交活/认栽/子卡)/v1/workrooms/{cid}/tasks…已落地
这房挂着哪个游戏GET /v1/workrooms/{cid}/game已落地
房里那张游戏卡(图标/状态/两版/最近部署/两个门/分享/进工作台)app/lib/widgets/workroom_game_bar.dart已落地(要 build ≥ 下一班 TF)

C. 绑定是怎么表达的

games.workroom_id —— 一列,加一条唯一索引(迁移 000205 / 000206)。

「一房一游戏、一游戏一房」不是靠规矩,是靠结构。一列只能存一个房 → 一个游戏不可能挂两间房;唯一索引 → 一间房不可能被两个游戏抢。
所以你问的「我不可能开四个房间做一个游戏,对不对」——对,而且数据库层面就做不到

D. 是不是同一种房、同一套代码?

Jeff 2026-08-14 问:「我们这游戏工作房与普通工作房是不是一样的房间?还是两个不一样的房间?是用同一套代码吗?」
答:同一个房间、同一套代码。「游戏工作房」不是第二种房型,它是普通工作房 + 一条绑定

生产库实况(2026-08-15 查的):conversations.type 只有六个值 —— direct 50 · workroom 23 · group 15 · music 13 · werewolf 13 · channel 10,没有 game 这一类。 那间 🎮 2048 房的 type 就是 workroom。差别只有 games.workroom_id 指着它。

App 侧同理:同一个聊天页、同一条工作台,只是多挂一个 WorkroomGameBar,没绑游戏时它整条不画。

为什么故意不做成新房型:已经有六种房,每加一种,发消息/成员/通知/未读/搜索每条路都要多一个分支,漏一个就是静默出错
判据:「这房在做什么」是一条数据,不该变成一种类型。
但这有代价,摆出来给你判断:同一套代码 = 游戏房能长出来的东西,受限于"工作房这套壳能挂多少"。
如果你要的是整屏都为游戏重做(进房默认看到游戏面板而不是聊天),那不是加卡片能解决的,得开一种新房型。这件事待你拍板(已加进「⑨ 待你拍板」)。
🩹 08-13→14 那个真 bug(已修,v0.464):我把后端路由从 /v1/games/by-workroom/{cid} 改名成 /v1/workrooms/{cid}/game(旧的和 /v1/games/{id}/friends 冲突,注册时 panic),却没改 App 那行地址。App 每次都拿 404,而那层的规则是「拿不到就整条不画」→ 房里什么都没有,且不报任何错
证据:新地址回 404 {"error":{"code":"not_found"}}(路由活着);旧地址回 Go 的裸 404 page not found(压根没这条路)。
教训已写进代码注释和 L2 记忆:「代码里有」≠「屏幕上走得到」,更不等于「两边说的是同一条路」。现在有一条跨语言测试盯着这件事。

分工:哪件事归工作台,哪件事归工作房

判据一句话:工作台管"所有游戏的账",工作房管"这一个游戏的现场"。
凡是要横着比(哪个游戏赚钱、哪个该下架)→ 工作台。凡是"我们几个正在把这一版弄好"→ 工作房。

事情工作台工作房为什么这么分
看所有游戏✅ 唯一入口房是单游戏的,天然没有"所有"
建游戏 / 改名 / 改图标低频、全局、要审核
上传新包🔜 待做房里 AI 分身改完就该能直接传,不用绕出去
玩正式版 / 玩测试版✅ 两颗按钮✅ 两个门入口决定版本:哪扇门进,拿哪一版
上线 / 退回上一版🔜 待做(只给主人)决定的人常常正在房里聊,让他跳出去=断线
把某一版发给朋友两处同一张单子(一个组件)
数据(DAU/时长/留存)✅ 完整🔜 待做:只显三个数房里要的是"今天有没有人玩",不是报表
收入 / 提现✗ 永不钱的事不进群 —— 房里可能有外人
派活给分身、任务卡工作台没有"人"的概念
反馈 → 变成一张卡🔜 待做意见天然发生在聊天里
一条红线:钱和审核状态永远不进房。房里可以有外部测试的朋友,收入/分成/审核意见属于开发者本人。

连接:三条线,缺一条就断

"连接"不是一个跳转按钮。工作台和工作房之间要通三样东西:状态、动作、事件

线 1 · 状态(房里看得见)已落地

房一打开就问一次 GET /v1/workrooms/{cid}/game,拿到:图标 · 名字 · 上架状态 · 线上第几版 · 在测第几版 · 最近部署时间 · 我是不是主人。

为什么由后端算、App 不自己拼:版本号怎么进地址(/2048/v9/)只有一个出处。App 自己拼的话,后端哪天改了拼法,发出去的就是一条打不开的链接。

线 2 · 动作(房里按得到)部分

已经能按的:玩正式版 · 玩测试版 · 发给朋友 · 进工作台(只给主人)。

还要补的 待做:上线 · 退回上一版 · 上传新包 · 把某条反馈转成卡。

每颗按钮都必须回答两个问题:① 我按了会影响谁(只影响我 / 影响房里 / 影响全世界)② 我按错了怎么退回去。
影响全世界的那两颗(上线、回退)一律先弹确认,而且成功后回读再刷新 —— 接口说 200 不算数。

线 3 · 事件(房里自动看得到刚发生了什么)全部待做

这是现在完全没有的一条,也是"房里像没关系的东西"的真正原因:游戏那边发生了事,房里一个字都没有。

要落进房的事件(以系统消息形式,和 sys_* 那类同款):

事件房里长什么样触发点
部署了新版🧪 v10 部署好了 · 谁 · 几点 · [玩玩看]deployReady 成功后
上线🚀 v10 上线了(原来是 v1)· 谁按的 · [玩正式版]promote 成功后
退回↩️ 退回 v1(从 v10)· 谁按的 · 原因(可选)rollback 成功后
审核结果✅/❌ 审核通过 / 被打回 + 理由管理员审核
玩到崩💥 有人在 v10 上报了一个错(前 3 条聚合成一条)/v1/errlog 命中这个游戏
防打扰:同一分钟内的同类事件合并成一条;错误上报按"每版每小时最多一条"聚合。
判据:房里的事件条要像同事说话,不像监控告警 —— 一天刷屏三十条,人就会把房静音,那这条线就白做了。

房里长什么样:三层

第 1 层 · 顶部游戏卡(一眼)已落地

┌────────────────────────────────────────┐ │ 🔢 2048 [已上架] │ │ 最近部署 3 小时前 │ │ │ │ ▶ 正式版 v1 🖥 测试版 v9 ⤴分享 │ │ ⏱ 进开发者中心(只有主人看得到) │ └────────────────────────────────────────┘

规则:没绑游戏的房整张卡不画;没有在测版本时那颗写「无测试版」并且按不动(不写 v0 —— 不存在的版本写出来只会让人以为点不开)。

第 2 层 · 工作台里的第 5 页「Game」已落地 v0.474

位置是 Jeff 2026-08-14 定的:「既然绑定了游戏,你是不是应该有一页,展示游戏所有信息与对应操作,在 work pulse、work task… 里加一页?」
我原来写的是「点开顶上那张卡 → 弹一个面板」——他这条更对:弹面板等于又造一个地方,放进已有的那排页签 = 同一个抽屉里多一格,人不用学新地方。图纸按他改了。

页签变成 5 个:💓 Pulse · 📋 Tasks · ⚙️ Setup · ℹ️ Info · 🎮 Game(只有绑了游戏的房才有第 5 格)。

实现上最容易踩的坑:枚举加一个值、条还按 DeskTab.values 画 → 所有工作房都多出一格空页签
所以「这间房该显示哪几页」抽成一个函数 deskTabsFor(hasGame:) 当唯一出处,条和页体都问它;game 排最后,前四页下标不变(不然老状态会串页)。

页里四块,从上到下:

  1. 版本:线上 vN · 在测 vM · 最近 5 版列表(谁传的、几点、多大),每版右边一颗 [玩]
  2. 动作:玩正式版 / 玩测试版 / 发给朋友(人人可用)· 上线 vM · 退回上一版 · 进开发者中心(后三样只有游戏主人才画,不是画成灰的)已落地;上传新包 待做
  3. 今天:打开次数 · 玩的人数 · 平均时长(三个数,点一下才去工作台看全的)
  4. 这一版的意见:房里被标成反馈的那几条,挂在版本号上

第 3 层 · 聊天流里的事件条 待做

见「⑥ 事件流」。要点:事件条可点 —— 点「v10 上线了」直接开 v10。

为什么不做成"房里再开一个 tab":房的主体永远是聊天。做成 tab 就等于逼人切换,而这间房存在的意义正是边聊边改。卡在顶上、事件在流里、面板点开才有 —— 三层深度递增,轻的永远在最外面。

事件流:一次改动的完整走法

房里(人 + AI 分身) 后端 房里看到的 1. Jeff:「这版数字太小了」 2. 分身落卡 ────────────────▶ tasks/start ─────▶ 🎫 卡:改数字大小(工作中) 3. 分身改代码 + 部署 4. deploys(要号) ────▶ 发 v10 ────────── 5. deploys/v10/ready ─▶ staging=10 ─────▶ 🧪 v10 部署好了 · [玩玩看] 6. Jeff 点「测试版 v10」 ────▶ launch/staging ─▶ (开的是 v10) 7. Jeff:「可以了」 8. Jeff 按「上线 v10」 ──────▶ promote ────────▶ 🚀 v10 上线了(原 v1)· Jeff 9. 分身交活 ────────────────▶ tasks/done ──────▶ 🎫 卡消失 + 交活消息 10.(万一不对)按「退回」────▶ rollback ───────▶ ↩️ 退回 v1 · Jeff

这条流里有三处"不许省"

① 第 5 步必须两段式。先要号、文件真传上去了再确认 —— 一步式的话,"号发了但文件没传成"会让在测版本指向一个 404。已落地
② 第 8 步只改一个整数。上线 = live_version 从 1 改成 10,零文件搬运,所以天然原子、秒级生效、可回退。已落地
③ 第 10 步只退到"记录还在"的版本。清理旧版会连记录带文件一起删,记录还在 = 文件还在。已落地
现在断在哪:第 5、8、10 步的右列(房里看到什么)全是空的 —— 后端做了事,房里毫无反应。这就是「线 3 · 事件」那条线。

权限:谁看得到什么、谁按得动什么

游戏主人房里的人房外的人
看到房里那张游戏卡—(进不了房)
玩正式版✅(游戏页)
玩测试版❌ 静默回落正式版
把某一版发给朋友
上线 / 退回 / 上传❌ 连按钮都不给
进开发者中心❌ 连入口都不给
看收入✅(只在工作台)
两条判据:
能看到测试版的人 = 房里的人,而不是另建一张"内测名单"。名单和房间成员必然会漂(有人退房了名单还留着),而"谁在房里"本来就有唯一出处 —— 直接问它。
按不动的按钮就别给。不是主人的人看到「上线」是灰的,他会一直试;干脆不画。(后端为此专门回一个 is_owner。)
房外的人走测试版入口 → 静默回落正式版,不报错。对没权限的人,"这里有个测试版"本身就是不该泄露的信息。

分阶段落地

P1 · 看得见(已经做完)已落地

  • 绑定:games.workroom_id 一列 + 唯一索引
  • 房里那张卡:图标/名字/状态/两版/最近部署/两个门/分享/进工作台
  • 入口决定版本:游戏页永远正式版,房里那扇门才给测试版
  • 工作台:上线 · 退回上一版 · 试玩正式/测试(两颗排在一起)

P2 · 事件通到房里(下一步,建议先做这个)待做

  • 部署好 / 上线 / 退回 → 房里三种系统事件条(可点,点了就开那一版)
  • 合并与限流:同分钟同类合并;错误上报每版每小时最多一条
  • 后端:事件写进会话(和 sys_* 同一条路),不新建通道

P3 · 房里能动手 待做

  • 点开卡 = 游戏面板(版本列表 + 动作 + 今天三个数 + 这版的意见)
  • 上线 / 退回 / 上传新包(只给主人,先弹确认,成功后回读)
  • 把一条消息标成「这一版的意见」→ 自动成卡,挂在版本号上

P4 · 闭环 待做

  • 意见 → 卡 → 改 → 部署 → 事件回到那条意见下面「这条在 v11 修了」
  • 房里 AI 分身直接读游戏的错误日志和玩家数据
为什么建议先做 P2:它最便宜(后端三处 hook + 一种消息类型),但把"房里像没关系的东西"这件事直接解决掉 —— 房里终于会自己说话了

待你拍板(4 件)

1. 建房的路,只留一条吗?待拍板

现在有两条:工作台里「建这个游戏的工作房」(自动绑定),和你自己新建一间房再绑。后者目前 App 里没有"绑到现有房"的按钮 —— 你 08-14 那间房就是这么来的(我在库里手动改的绑定)。
我的建议:只留"工作台一键建房"这一条,另外给一颗「把这间房绑到某个游戏」放在房设置里(要主人身份)。两条都留但都做半截,是最坏的。

0. 游戏房要不要变成"第七种房型"?待拍板

现在:同一种 workroom + 一条绑定(见「② 现状 · D」)。
我的建议:先不开新房型。先把「④ 三条连接线」里的事件线做掉 —— 如果做完你仍觉得"进房第一眼不该是聊天",那才值得开新房型,因为那时我们已经知道到底缺的是什么。
反过来说:要是你现在就确定"游戏房进去应该先看到游戏面板、聊天是第二屏",那我按新房型设计,别拿卡片凑。

2. 事件条要不要算未读?待拍板

「v10 部署好了」这种,要不要让房在聊天列表里冒红点?
我的建议:部署=不冒红点(太频繁),上线/退回/审核结果=冒(那是"影响全世界"的事)。

3. 房里的人能不能按「上线」?待拍板

现在只有游戏主人能。要不要开一个"房里的管理员也能按"?
我的建议:暂时不开。上线影响所有玩家,而房里可能有外部测试的朋友。真要开,就做成主人显式指定某个成员。

4. 一个游戏一间房,那"这个游戏的第二期"呢?待拍板

结构上一个游戏只能挂一间房。如果一间房聊完了想换新房(换一批人做第二期),需要一个「把绑定移到新房」的动作 —— 旧房会变回普通工作房(历史消息都在,只是不再有游戏卡)。
我的建议:做这个动作,并在两边各落一条系统消息说明"这游戏的现场搬到那边了"。

已知薄弱点(我自己挑的刺)

① 没有"多游戏协作房"。一房一游戏是刻意的,但如果哪天有个团队同时做三个小游戏,他们要开三间房。这条现在是特性,以后可能是限制。
② 事件流会不会太吵,只能上线后看真实数据调 —— 我给的合并规则是拍脑袋的第一版。
③ 房里那张卡目前只在进房时拉一次,别人部署了新版你得退出重进才看得到。P2 的事件通道做完后,顺手让它跟着事件刷新。

房里有了 game_id 之后,还有哪些地方该跟着变

Jeff 2026-08-14 语音:「你除了有这一页之外,也应该在想我们还需要什么…虽然都是同一个代码, 甚至因为它有游戏的 ID,我们有一些地方就要增加一些关于这个游戏的。你在逻辑思维,再去深入地思考。」

所以这一节是把 App 里每一个"房会出现的地方"过一遍,问同一个问题: 这里知道了 game_id,该不该变? 分三档:必须有 / 值得有 / 永远不该有

A. 必须有(不做就等于"绑了个寂寞")

地方知道 game_id 之后该变成什么依赖
聊天列表那一行头像换成游戏图标;副标题写「在测 v9 · 3 小时前部署」——不进房就知道这房在做什么、新不新
房设置页多一块「绑定的游戏」:看主页 · 换绑到别的房 · 解绑(解绑要问一句)
聊天流里的事件条部署 / 上线 / 退回 / 审核结果自动落进房(见「④ 三条连接线」)事件线
任务卡房里落的卡自动带「针对 v9」;交活时能自动补一句「这条在 v10 修了」事件线
通知上线/退回/审核结果 才推;部署不推(太频繁,推了人就静音这房)事件线
成员页显式写明:在这房里 = 能玩测试版。现在这是条隐藏规则,退房就没了也没人说

B. 值得有(第二轮再做)

地方该变成什么
邀请进房邀请文案带游戏名:「来一起做 2048」——对方进来前就知道是干嘛的,也知道他会拿到测试版
游戏详情页反过来的那条路:主人/房成员在游戏页看到「这个游戏有工作房 →」,一键回房
房里搜索v9 能搜到和那一版有关的消息和卡
发进房的分享把某一版做成卡片发进房(带图标/版本/一颗「玩」),而不是一条秃链接
错误上报H5 崩了带 game_id → 聚合成一条落进房「有人在 v10 上报了一个错」
玩了没房里显示「今天有 3 个人玩过测试版」——测试反馈从哪来,一眼看得到
游戏下架 / 删除不跟着消失:变回普通工作房 + 一条系统消息说明。历史是人的,不是游戏的

C. 永远不该有(写下来,免得以后有人"顺手加上")

· 收入 / 分成 / 提现 —— 房里可能有外部测试的朋友。钱只在工作台。
· 审核意见原文 —— 那是平台对开发者本人说的话。
· 玩家个人数据 —— 谁玩了多久、谁充了钱,一律不进房(影子身份那条红线)。
· 别的游戏的任何东西 —— 这房只有一个主语。
判据(下次再有人问"这里要不要加"就拿这条量): 这条信息属于"这一版做得怎么样" → 进房;属于"这个开发者赚了多少 / 平台怎么看他" → 留在工作台。

AI 能改到哪儿?—— 现在有没有"只准动这个游戏"的限制

Jeff 2026-08-14 问:「我们设计里有没有限制 AI 只能改该游戏范围之内的代码?」
答:分两种 AI。一种被结构限死,一种完全没限 —— 后者是真洞。

① 平台里的「AI 造游戏」天生受限

路径:POST /v1/dev/ai/build → 模型生成单文件 H5 → 按 game_id 存成那个游戏的新版本。 代码里每一步都带 id + dev_id:不是你的游戏直接不让动;产出只能落到 hosted/{那个游戏}/v{N}/。 它碰不到别的游戏,更碰不到仓库。

② 房里的 AI 分身(我、以及那些工人)完全没限

它们跑在我们自己的机器上,拿的是整个仓库 + 生产服务器的权限。所谓"只改这个游戏"现在纯靠自觉,没有任何闸门。

活例子就是我自己:2026-08-13/14 我改后端路由,两次把生产打挂(一次路由冲突 panic、一次同名路由注册两遍)。 那两次改动都不在"某个游戏的范围"里 —— 也就是说,今天这套里,一个在游戏房干活的分身,完全有能力顺手改挂整个后端。
docs/AI_BOTS.md 里已有一条相关铁律:执行器绝不许和我们的 shell 同机器同身份。 但那条是给「外部 AI 接进群」写的,没覆盖到"房里给这个游戏干活的分身"。这是缺口,不是已解决的事。

怎么补:一个专用系统账号 Jeff 2026-08-15 说「这个方法可行」

整套就两句话:换个账号跑;云上是真源。不需要作业票、不需要每个游戏一套东西 —— 我一开始写复杂了(Jeff 当场说「你可以不可以不要写的这么复杂」),这里是收干净的版本。

1. 建一个系统账号(只建这一次)

在 Mac 上加一个标准用户 hoopai和有多少游戏无关 —— 50 个游戏也还是这一个账号。

  • Jeff 现有的窗口、终端、目录一个字都不用改:新用户有自己的家
  • macOS 家目录默认 700 → 它连读都读不到 /Users/jeffchoong/…(不是"不许读",是 open() 直接失败)
  • Jeff 不用登出、不用切换用户:AI 进程用 sudo -u hoopai … 在后台以那个身份跑

2. 一条常驻 AI,按单换目录(不是每个游戏一条)

那个账号下跑一条常驻 AI,它是「接单的」,不属于任何一个游戏:

派 2088 的活 → 它进 ~/games/2088/ 干 下一单 3000 → 它进 ~/games/3000/ 干 ↑ 同一条 AI,换目录而已

只有两个游戏要同时动工时才多开一条 —— 按「同时忙几件活」开,不是按「有几个游戏」开 (和现在 `spawn_worker` 一条常驻 + 忙时起工人是同一套)。

3. 游戏代码从哪来?——云上,不是从 Jeff 的文件夹

Jeff 问过一句关键的:「它动不到我的文件夹,那游戏代码怎么办?」答案是游戏代码的老家本来就在云上:

  • 平台自营游戏 → GitHub 的 HOOP-games 仓库;线上文件在 Cloudflare
  • AI 造的 / 托管的游戏 → 上传到云存储的那个版本包(hosted/{game}/v{N}/)

Jeff Mac 上那份 HOOP-games 只是他自己的工作副本hoopai 从云上拉自己的一份,两份互不相干。

4. 钥匙:给它自己的,而且只开一扇门

它有什么它没有什么
自己的 GitHub key(只开游戏仓)Jeff 的 key(绝不拷贝过去 —— 拷了这道墙就白建)
这个游戏的 deploy_token(发版本用)生产机 SSH key · 数据库密码
自己家目录 /Users/hoopai/主仓、别的游戏、Jeff 的桌面
令牌这层已经是真的,不是设想。2026-08-15 拿 g2048 的部署令牌去打别的游戏,生产实测:
ai-235991 → 403 bad_token · ai-26469e → 403 bad_token · 不带令牌 → 401 no_token · 打 g2048 自己 → 200

5. 这套挡得住什么、挡不住什么

挡得住吗
改别的游戏✅ 令牌 403 + 目录里根本没有别人的代码
改主仓 / 后端 / App✅ 没有那把钥匙,拉都拉不下来
碰生产服务器、数据库✅ 没有 key、没有密码
读 Jeff 的文件✅ 家目录 700,内核挡
把它自己那个游戏改坏❌ 挡不住 —— 那本来就是它的活。配套是「退回上一版」(已做好)
被 prompt injection 骗着写坏代码❌ 范围墙管不了语义,那是另一刀(AI_BOTS.md)
我们几个运维分身(Vega/NOVA…)❌ 不在这套里 —— 我们本来就是全权。要收得连我们一起收,那是 Jeff 的决定

6. 开工要谁做什么

Jeff 做一步(建用户要管理员密码):系统设置 → 用户与群组 → 添加标准用户 hoopai
剩下归我:建目录、配它自己的钥匙、把 AI 以那个身份跑起来、然后当场演示越界被拒 (让它试着改主仓和另一个游戏,把"权限不足"那一幕截图)。

外部 AI 接进来 —— 他改得到文件吗?

Jeff 2026-08-15 问:「工作房 setup 里可以把外面的 API 接进来,是不是已经完全做好了? 而且这个 API 进来之后,他是不是只是一个聊天工具?他改得到文件吗?
答:没做完;而且按现在这份图纸,他改不到文件 —— 你的直觉是对的。

为什么会有这条路(先接上上一页)

分界不是"多少人",是「这一下是谁按的」。
· 我们自己人干活 → 留在 Mac 上那个 hoopai 账号里,吃订阅,成本近乎固定(⑪ 那一页)
· 外部开发者按的 → 必须走服务器上的 API,按 token 记在他自己头上

订阅那条不能给外面用,三条理由,合规最硬:

为什么
条款订阅是给一个人用的。拿它给上千外部用户跑 = 账号共享/转售,封号就是整条线一起停。这条不能拿"能跑得动"去赌
并发一台 Mac 同时能跑的 AI 会话就几个。1000 人排队 = 等一天
隔离外面人的代码在自己家那台机器上跑,那台就变成公共设施了

成本算得出来(现价,每百万 token 进/出):Sonnet 5 $3/$15(2026-08-31 前 $2/$10Opus 5 $5/$25 · Haiku 4.5 $1/$5。改一个单文件小游戏一轮进出加起来几万 token 量级 → 一轮一两毛到几毛钱。所以 1000 个活跃开发者不是成本问题,是定价问题 —— 给免费额度,超了拿绿能量买。

① 现在做到哪儿了 做了一半:配好了也不会说话

状态
🔑 保险箱(存 key,加密) secretbox.go✅ 在
🏷️ provider 目录(OpenAI / DeepSeek / Anthropic / OpenRouter…) providers.go✅ 在
🗄️ 库表 room_bots / room_bot_usage(迁移 000217 + 补发 000222)✅ 生产库里在(2026-08-15 打库核过,schema_migrations = 229)
⚙️ 执行器(读 room_bots → 调外部 API → 把回复发进房)一行 Go 都没有
🔌 bots 路由(建/列/停一个 bot)一条都没有
证据:grep -rn "room_bots" --include="*.go" backend/ 只命中 providers.go 里的一句注释; mux.Handle 里没有任何 bots所以现在在房里配好一个 bot,消息进来没人接,它一句话也不会回。

② 「他改得到文件吗?」——改不到 这是结构,不是忘了给权限

  • room_bots 那一行只有:哪一家 / 用哪把 key / 哪个模型 / 人设 / 什么时候开口 / 每天上限没有一个字段是「他能碰什么」 —— 想给他文件权限,库里根本没地方写
  • 走的是别人家的 chat 接口:文字进、文字出。我们把房里的消息喂过去、把回来的字发出来 —— 中间没有工具、没有文件系统、没有 shell
  • docs/AI_BOTS.md 那条铁律「执行器绝不许和我们的 shell 同机器同身份」防的就是这件事
所以今天能改到游戏文件的只有一条路,而且不是 bot —— 是 POST /v1/dev/ai/build: 后端自己调模型、生成 HTML、部署成新版本,范围写死在 dev_id + game_id 上。 那是平台的一条管线,不是"房里那个人"。

③ 那要怎么让房里的外部 AI 真能改游戏?别给他文件,给他一颗按钮

bot(GPT / DeepSeek / 谁都行) └─ 工具:build(说明) ──► POST /v1/dev/ai/build ↑ 范围已经写死在这里:dev_id + game_id 每人每天 10 轮闸门(aiBuildDailyLimit)
判据:范围不该长在 AI 身上,该长在那颗按钮上。
换谁接进来都一样 —— 他永远碰不到文件,却改得到这一个游戏。而且那一轮花的是他自己那把 key 的钱。

这样做还顺手解决三件事:①「他怎么知道能改哪个游戏」→ 按钮自带 game_id,他不用知道,也无从选错; ②「prompt injection 骗他改别的」→ 骗到了也没用,按钮只通向这一个游戏; ③「谁付钱」→ 谁的 key 谁付,平台不垫。

④ 要动手的顺序(未开工,待 Jeff 点头)

做什么怎么算完
1bots 路由 + 执行器(只会说话,先不给按钮)房里 @ 一个 bot,它用房主自己的 key 回一句
2真实 token 用量(现在只记轮数,记不出钱)能按 bot / 按天查出花了多少钱
3给 bot 加 build(说明) 这一件工具房里叫它改游戏 → 真出新版本;叫它改别的 → 它根本没有那个动作
4免费额度用完接绿能量超额那一轮扣绿能量,扣完就停
待 Jeff 拍板两件:① 免费额度给多少(每人每天几轮)· ② 房里的 bot 该不该一上来就有 build 那颗按钮, 还是要房主单独开一次(我倾向单独开 —— 会改代码和会聊天是两种信任)。