🏗️ 开发者中心 ↔ App 工作室 · v2
Jeff 2026-08-16 读完 v1 后连开六刀,并把四个待拍板全拍了。这一版是照他的刀改完的。
他的话:「不用推翻这份设计,它的骨架对。现在最值得改的是版本审核、数据分层、Staging 隔离、Permissions、Secrets/Logs 这五处。 改完以后,这份就可以直接成为 App Studio v1 的正式施工蓝图。」
所以这一版的身份变了:不再是提案,是施工蓝图。 已落地 = 生产在跑,我核过代码 待做 有洞 = 我查出来的、开工前必须补
Navi3 · 核心代码线v2 · 2026-08-16Jeff 六刀已落四板已拍

① 灵魂:五个概念,一条闭环

Jeff 定的。这五个词一旦写死,后面接手的人就不会越做越歪。

概念是什么一句话判据
APP一个永久存在的产品容器它不会因为改版而变成另一个东西
VERSION永远不能修改的代码快照存进去就封死;要改是发新的,不是改旧的
ENVIRONMENTStaging / Live不只是两份代码 —— 数据也各是各的
WORKROOM围绕这个 app 干活的人 + AI + 上下文它是这个 app 的大脑和记忆,不是一个项目阶段
EVENTapp 在工作室留下的生产记录房里的人不用问"到底传了没"

闭环

人在 Workroom 说一句话 ↓ AI 动手改 ↓ 产生一个 VERSION(永不可改) ↓ 放进 STAGING(代码和数据都是 staging 的) ↓ 人在房里 Test ↓ Owner 按 Promote → LIVE ↓ EVENT 自动回到 Workroom
Jeff:「这条闭环一旦跑通,你做的就已经不是普通的开发者中心了。」
判据:这条链上每一步都要能在房里看见。看不见的那一步,就是将来有人要来问"现在到底怎么样了"的那一步。
一条要一直守着的纪律(Jeff 点名我的老毛病): 「功能是对的,但是所有正确功能同时摆出来,就会变乱。」
所以这份蓝图里凡是"要不要摆出来"的地方,一律按轻的在外面、重的点进去排。

② 造一个 app 的全程

他做什么平台做什么现在
1申请成为开发者审一次身份已落地
2开一个 app,填名字/图标/一句话
+ 申报要用哪些能力
发 id、开辟空间、状态 draft建项目 已落地
能力申报 待做
3传图片进图像库存 R2、记账已落地
4传代码(单 HTML 或 zip)每一版都过安检 → 存成永不改的快照已落地
5自己先试发一小时门票 + 接到 staging 数据门票 已落地
数据隔离 有洞
6按上线首次要人审;之后自己按,除非新增了能力首审 已落地
能力触发复审 待做
7坏了按退回指针拨回上一版已落地
8按「Open Studio」第一次按 = 建房并绑上;以后按 = 进去待做
不用报网址:代码传给我们,地址我们生成。建项目那个接口只收名字、图标、一句话 —— entry_url 建的时候是空字符串,这是我读 createApp 确认的。

③ 开发者中心 = 控制中心

Jeff 定的分界:中心管「这个 app 的资产和账户」,工作室管「这个 app 正在发生什么」。

┌ Food Guide ────────────────────────────────┐ │ 🗂 版本 Live v3 │ Staging v4 │ │ [ 试 v4 ] [ 上线 v4 ] [ 退回 v3 ] │ │ 版本历史:v4 v3 v2 v1(谁·几点·多大) │ │ │ │ 📤 代码 拖一个 zip 进来,或选单个 html │ │ │ │ 🔑 能力 位置 ✅ · 通知 ✅ · 相机 ✗ · 支付 ✗ │ │ [ 申请新能力 ](会触发重新审核) │ │ │ │ 🔐 密钥 3 个(第三方 Token / API Key) │ │ [ 加 ] —— 值只能写不能读 │ │ │ │ 🧾 日志 最近错误 12 条 · 启动失败 0 │ │ [ 看 ] │ │ │ │ 🖼 图像库 12 / 200 张 · 8.4MB / 400MB │ │ 🗄 数据 公共数据 6 条 [编辑] · 用户数据 41 人│ │ 🏗 工作室 [ Open Studio ] │ └──────────────────────────────────────────────┘

Jeff 第 6 刀:补上 Secrets 和 Logs

🔐 Secrets(环境变量) —— 开发者一定会有第三方 Token、API Key, 不能塞进 zip(zip 是快照,快照进 R2,等于把钥匙钉在墙上)。
规矩:只能写不能读。存进去之后界面只显示"有这么一个键",值永远不再吐出来。 AI 可以让 app 在运行时用到它,但AI 自己拿不到明文 —— 这条是给"房里有别人的 AI"准备的。
🧾 Logs —— 现在 app 白屏、接口报错、起不来,开发者完全不知道哪坏了。 至少要有三样:最近错误 · 启动失败 · 运行时报错。
Jeff:「你现在规划的『今天打开次数/人数』有用,但不够解决开发问题。」他把这两块排在数字前面,我同意。
为什么这两块放中心不放工作室:密钥和日志都是"这个 app 的资产",不是"这一版的现场"。 而且房里可能有外人 —— 密钥更不能进房。

④ App 工作室 = 生产现场

一个 app 一间房,永久的。房里的人围着这一个 app 聊、改、试、上线。

怎么进去:只有一颗按钮

开发者中心 → 某个 app → [ Open Studio ] 第一次按 = 建一间房 + 当场绑上 + 把你拉进去 以后按 = 直接进去
Jeff 拍的:界面上永远不出现「绑定工作室」这个词。 用户根本不需要知道底下有一个 workroom_id。
判据:凡是我们内部的实现名词漏到界面上,用户就得学一个他不该学的概念。

房顶只回答三个问题

Jeff 把我 v1 那张信息很多的卡砍到只剩三句:

┌──────────────────────────────────────────┐ │ 🍜 Food Guide │ │ │ │ 现在是什么版本? Live v3 · Testing v4 │ │ 刚刚发生什么? v4 · 12 分钟前更新 │ │ 我现在能做什么? ▶ Live 🧪 Test v4 │ └──────────────────────────────────────────┘
Upload / Promote / Rollback / Versions / Logs 全部不在顶上, 进下面的 App 工作台。
Jeff:「这样不会把聊天房顶部做成一排 Dashboard。」房的主体永远是聊天。

底下那一页:工作台里多一格「App」

页签 4 变 5:💓 Pulse · 📋 Tasks · ⚙️ Setup · ℹ️ Info · 📱 App(只有绑了 app 的房才有)。

照抄游戏那边踩过的坑:枚举加一个值、页签条还按 values 画 → 所有工作房都多出一格空页签。「这间房显示哪几页」抽成一个函数当唯一出处,app 排最后,前四页下标不变。

⑤ 分工

Jeff 最赞成的一条决定:不要把工作室做成第二个开发者中心。
他的原话:「以后千万不要慢慢长成 —— 中心有版本,工作室又有版本管理;中心有数据库, 工作室又搞一套数据库管理;中心有发布,工作室又有另一套发布流程。这样最后一定乱。」

工作室永远是:聊 → AI 做 → 新版本出来 → 大家试 → 决定上线。这是现场。
开发者中心才是:app 资料、权限、数据、版本历史、安全、配置、正式管理。

事情开发者中心工作室
看我所有 app✅ 唯一入口
新建 / 改名 / 改图标
能力申报 · 密钥 · 日志✅ 唯一入口
版本历史(全部)只显最近几版
传新版代码✅(AI 改完直接传,不用绕出去)
试 Staging
上线 / 退回✅ 只给 Owner
公共数据✅ 编辑只看不改
用户数据按授权(见第 ⑥ 格)✗ 永不
审核状态 / 打回理由✗ 永不
派活、任务卡、反馈转卡

⑥ 数据三层(Jeff 第 2 刀)

我 v1 写错了一处,这里改掉。v1 我写的是「用户数据一个字节都不进房、开发者永远看不到」。 Jeff:「隐私思想很好,我赞成,而且这可以成为 Hoop 很强的卖点。但太绝对了 —— 不然以后订单、预约、报名、客服、地址、表单这类 app 会做不了。
不是放弃隐私,是把『谁拥有哪一种数据』定义得更漂亮。」他是对的。
是什么开发者工作室例子
① Hoop 用户私有资料真名、头像、手机、关系链永远看不到你是谁
② App 自产数据用户在这个 app 里产生的按用户授权 + app 能力✗ 不显内容订单、预约、表单
③ 公共 app 数据开发者放给所有人看的✅ 可管理只看不改餐厅表、栏目表

第 ② 层怎么落地(这是新的一刀,现在没有)

现在 miniapp_kv 是"每人一个抽屉,开发者只看得到三个数字"。要支持订单类 app, 就得让开发者在用户点头之后看得到属于业务的那部分。

做法:把 app 自产数据从"用户私产 KV"里分出来,单独一张表, 每条带 owner_uidpurpose(下单/报名/客服)。
开发者读它要满足两条:① app 申报过对应能力并过审 ② 这条数据的主人授权过这个用途
判据:用户能在一个地方看到「这个 app 拿了我哪些东西」,并且能撤回。撤不回的授权不叫授权。
第 ① 层永不放开,这条不谈。它是我们和微信云开发的分水岭,也是隐私招牌。 放开第 ② 层不是打折 —— 是把"用户自己的东西"和"用户在这家店办的事"分清楚。

⑦ 环境隔离与回滚红线

Jeff 第 4 刀:Staging 不只是另一份代码有洞

我去核了,情况比他担心的更裸。
现在两张数据表的主键分别是 (app_id, 用户, key)(app_id, key) —— 里面根本没有 staging / live 这一维
也就是说:房里几个人试一下 v4,写的就是正式用户的数据。没有任何隔离,一个环境列都没有。
要做成:Staging Build + Staging DataLive Build + Live Data,默认隔离
落法:两张表各加一列 env,进主键;launch 时把当前环境一起注入桥, app 读写 KV 时服务端按环境路由(不信客户端报的环境,和影子 id 同一个道理)。
Promote 时 不搬数据 —— staging 数据是试出来的脏数据,不该带上线。要不要提供"复制一份 live 数据到 staging"当第二步再说。

Jeff 第 5 刀:回滚只想了代码,没想数据

现在的回滚是把指针拨回上一版,一秒完成 —— 对纯 HTML app 很漂亮。 但 v4 要是改了数据结构、写进了新格式,退回 v3 时 v3 未必看得懂。

MVP 先写死一条红线(Jeff 的原话:不要现在就做复杂,但这条先写上):
app 不允许自行做破坏性的数据结构变更。加字段可以,删字段/改语义不行。
以后再建正式的 migration 系统。
判据:回滚必须永远是安全的。只要"回滚可能弄坏数据"成立一次,这颗按钮就没人敢按了 —— 而没人敢按的回滚,等于没有回滚。

⑧ 能力清单与审核规则

Jeff 的第 1 刀和第 3 刀是同一件事的两半:没有能力清单,就没法判断"这一版要不要重新审"。

能力清单(manifest)待做

建 app 时先申报要用哪些:相机 · 位置 · 通知 · 联系人 · 网络域名 · 上传文件 · 支付 · 用户身份。

三道门(从游戏 SDK 学的,每道都是服务端的闸,不是客户端的君子协定):
① manifest 里声明 → ② 审核时人看过 → ③ 运行时用户首次触发才授权
Jeff:「这样你的 App 平台才真正有『操作系统』的感觉,而不是单纯 HTML Hosting。」

审核规则:改掉「以后永远不用审」

Jeff 认为这是 v1 最大的结构洞,他说得对: 「开发者完全可以 v1 做一个正常 app 通过审核,v2 再换掉代码。」
时机怎么办现在
每一个版本自动安检(禁外链、禁执行外来代码、zip 炸弹、路径穿越)已落地
第一次上线管理员人工审已落地
普通更新直接上线,不卡已落地
新增敏感能力 / 新域名 / 新数据能力重新进审核待做
安检扫出异常重新进审核待做
一条我核过的事实:「每版自动安检」不是待办,它已经在跑了 —— 传代码那个接口对每一版、每一个文本文件都过同一张规则表,不分第几版。
所以第 1 刀真正缺的只有最后两行:能力变化和安检异常要能把这一版推回审核队列。 而这需要先有 manifest,所以两刀一起做。

⑨ 事件与 Pulse

要落进房的事件(系统消息形态):

事件房里长什么样触发
传了新版🧪 v4 传上来了 · 谁 · [试试看]codeUpload 成功后
上线🚀 v4 上线了(原 v3)· 谁按的 · [打开]promote 成功后
退回↩️ 退回 v3(从 v4)· 谁按的rollback 成功后
审核有结果只发给 Owner,而且不抄理由进房管理员审核后

Jeff 拍的:不算未读,但要有 Pulse

聊天红点只代表三件事:人说话 · @你 · 有任务要你处理。
app 的动静走另一个很轻的指示:💓 3(这个 app 有 3 个新动作)。
Jeff:「不要因为 v7 uploaded / v7 staged / v7 live 搞三个聊天未读,这样会烦死人。」
防打扰再加一条:同一分钟内同类事件合并成一条。
判据:事件条要像同事说话,不像监控告警 —— 一天刷屏三十条,人就把房静音了,这条线就白做了。

⑩ 角色与权限

Jeff 拍的:MVP 只有 Owner 能上线,但数据库不要写死成 owner。 留出角色位,以后长成 Owner / Publisher / Developer / Viewer / AI Agent。 第一版 Owner = Publisher,界面上不出现这些词。
角色能做不能做
Owner全部
Publisher(先=Owner)Promote / Rollback改能力申报
Developer / AI Agent改 → Upload → Staging → Test永远不能 Promote Live
Viewer(房里其他人)打开 · 试 Staging · 分享传包 / 上线
Jeff 原话:「AI 最多:改 → Upload → Staging → Test。AI 永远不能自己 Promote Live。 这个边界非常漂亮。」
我加一句判据:AI 能把东西做出来,但"要不要让全世界看到"永远是人的决定。
有洞 现在的权限是错的,开工前必须先补。
我读代码核过:canManage 现在是「owner 或任何 is_agent 账号」—— 我此刻就能改任何人的 app,不需要谁授权。今天所有 app 都是我们自己的,没事; 工作室一拉进外人的 AI,这就是事故。要先收窄,再画那些按钮。
有洞 绑房少一道检查。 游戏那边会数「这房里除系统消息外有没有人说过话」,只让绑新房;Apps 这边没数。
bindAppWorkroom 的注释白纸黑字写着「照 games 判据:新房 + 本人建 + 唯一索引兜底」—— 图纸诚实,注释在撒谎,而改代码的人看的是注释。

⑪ 分阶段(按 Jeff 的排法)

他说:「你现在文件已经把权限漏洞列为 P0,这个判断是正确的,只是我会把上面两个安全基础一起塞进 P0。」

阶段做什么为什么在这儿
P0 · 安全地基① 收窄分身权限 ② Staging 数据隔离(加 env 列)③ 能力变化触发复审(要先有 manifest)④ 绑房补"新房"检查 ⑤ 改掉那句撒谎的注释这五件不做完,后面每一颗按钮都是给开着的门画把手
P1 · 开发者中心app 列表 + 单 app 一页(含 Secrets / Logs / 能力)七件套后端都在,缺的是让人点得到
P2 · Open Studio那一颗按钮:第一次建、以后进有了中心才有地方放它
P3 · 房顶三句话什么版本 / 刚发生什么 / 我能做什么轻的先上,别一上来就 Dashboard
P4 · 事件 + Pulse传包/上线/退回落进房 + 💓 计数这条通了房才和 app 有关系
P5 · 房内动手Upload / Test / Promote(Owner)要 P0 的权限收窄先落地才敢开
P1 到 P5 是 App 界面,要等 NOVA 出 TestFlight 包才看得到。P0 全是后端,做完即生效。

⑫ 你拍的板(四件,已落进上面)

① 建工作室只留一条路 —— YES

而且界面上不出现「绑定工作室」,只出现「Open Studio」:第一次按 = 创建,以后按 = 进入。 用户不需要知道底下有 workroom_id。已写进第 ④ 格

② 房里谁能上线 —— MVP 只有 Owner

但数据库留角色位,不写死 owner。AI 最多做到 Test,永远不能 Promote Live已写进第 ⑩ 格

③ 第二期换不换房 —— 绝对不换

你比我原来的提议更坚定:房是这个 app 的大脑和记忆,v1 到 v10、第二期第三期全在里面。 要分阶段用 Milestone / Task / Release 去区分,不是换房。已写进第 ① 格的概念表

④ 事件算不算未读 —— 不算,但加 Pulse

聊天红点只留给"人说话 / @你 / 任务要你处理";app 的动静走 💓 计数。 已写进第 ⑨ 格

这一版没有「待你拍板」这一格了。 你把四件都拍了,六刀也都落进对应的格子里。 按你说的,这份现在的身份是施工蓝图,不是提案 —— 接下来照 P0 往下做。