docs(progress): log the zero-touch enrollment + control-panel session
Some checks failed
relay-tripwire / cross-tenant-tripwire (push) Has been cancelled

Host track live+verified (h7fd8, auto-renew), phone track server-verified + iOS/
Android code-complete, control-panel deployed (panel.terminal.yaojia.wang),
Android app run on emulator. ~14 real-deploy bugs fixed. Branch merged to develop.
This commit is contained in:
Yaojia Wang
2026-07-23 06:28:59 +02:00
parent 675de771c7
commit 1dbed54581

View File

@@ -24,6 +24,29 @@
> 新会话读到的第一块。保持准确,只描述"此刻"。
### 🔐 零接触隧道 Enrollment 产品化 + Control Panel(2026-07-18~23,当前活跃)
- **需求**: 用户要"本机 app 一跑就自动连服务器、自动管证书;手机连接时自动搞定证书"——即**产品级零接触**(引导时一次动作,之后自动签发+续期,永不再管)。诚实边界:第一次签发无法零人类动作(否则谁碰端点谁拿证书),所以"引导一次,之后免管"。
- **产物**: [docs/PLAN_ZERO_TOUCH_ROLLOUT.md](./PLAN_ZERO_TOUCH_ROLLOUT.md)(执行计划,含预检/两轨/风险)。分支 `feat/zero-touch-enrollment`(13 提交)→ **已合并 `develop`**(merge `7c1d433`)+ control-panel(`675de77`)。**未 push origin**。记忆见 `mac-tunnel-autoconnect`
- **[x] 主机轨 Track A — 上线 + 实机验证**: `web-terminal-agent pair <码> --install` → CP 原生 enroll(真 frp-client 证书) → 装 base-app+agent launchd 单元 → frpc 自动连 frps → **公网 `h7fd8.terminal.yaojia.wang` 实测 200**。**自动续期实测成功**:证书 Jul19 13:41→Jul20 05:55 前移、frpc 无缝切、隧道不断。旧手动 mac1 已退役。桌面 GUI 骑 :3000(S1 `10688b0`)。
- CP 代码:B1 登录/device:enroll bearer(`fff011b`**A2-prep 生产 native-CA 接线**(磁盘 P-256 CA,`af63014`)· renew 接受 escaped-PEM(`55d177e`)。
- agent 代码:A5 native 自动续期(`9a5909f`)+ 实机 shakedown 修复(`9f7f5c0`/`1e398c7`/`c98f5e6`):hostContentSecret 可选、caChain 数组+DER→PEM、launchd 绝对 node+PATH、agent 单元缺 env、renew 用**系统根**验 LE 服务器(原错钉私有 CA)、launchd 单元加日志 sink。
- **[x] 手机轨 Track B — 服务端实机验证 + 两端 code-complete(真机 QA 待做)**:
- **服务端**:curl 全程实测 `login → enrollToken(PASETO) → device/enroll(P-256 CSR) → 设备证书(device-CA,SAN 绑定子域名) → 用它 mTLS 访问 h7fd8 → 200`
- **iOS**(`07bcbf0` + review):契约 6 点全对、已接 UI(主机菜单「自动获取证书」→ SE keygen→CSR→enroll→SecIdentity→静默续期),可直接真机 QA。
- **Android**(`5e427dc` + `0b35dc0`):enroll 库建好但原**没接 UI**——已补(EnrollmentScreen+VM+Hilt,照搬 iOS)+ 修 renew(改 mTLS-only 无 bearer)+ 缓存刷新。gradle assembleDebug/单测/kover 绿。
- **VPS 部署(8.138.1.192)**: 新 CP = systemd `cp-zte.service`(loopback :8080,从 worktree `/root/wt-zte` 跑 tsx,env `/etc/relay/control-plane-zte.env` 含 NATIVE_*/OPERATOR_*)· nginx enroll vhost(`/enroll`·`/device/enroll`·`/auth/login` 免证书,`/renew`·`/device/:id/renew` mTLS + CA bundle)· **frps-ctrl 用 frp-client-CA 重签**(让 agent enroll caChain 验得了控制通道服务器证书)。
- **[x] Control Panel — 新建 + 上线**: 新包 `control-panel/`(Fastify auth-broker + esbuild SPA,55 测试 + 对抗安全审查修了 1 HIGHrate-limit trustProxy+3 项)。**在线 `https://panel.terminal.yaojia.wang`**(operator 口令登录 → 看主机/状态/证书到期、铸配对码QR+pair 命令〕、吊销主机);面板每调用现铸 60s manage token 打 CP loopback admin API。systemd `panel-zte.service` + nginx `panel.conf`(:8091,X-Forwarded-For $remote_addr 配 trustProxy)。已用面板清掉 5 个失败 pair 的孤儿主机(留 h7fd8)。
- **[x] Android 本机运行验证**: 装 emulator + android-35 arm64 镜像 → build APK(67MB)→ 装 + 启动 → **截图确认 UI 正常渲染**(「配对主机」界面)、无崩溃。(StrongBox 硬件密钥模拟器验不了,回落软件密钥;真机 QA 仍待做。)
- **验证**: CP 281 测试、agent 281 测试、android assembleDebug+单测+kover、panel 55 测试——全绿,每块 orchestrator 独立复验。主机隧道 + 手机服务端 + 面板均**真实 HTTP 200 端到端实测**。
- **决策/偏离**: R1(生产 native-CA)从"配置"重判为"真代码任务"(env.ts 无 NATIVE_*、server.ts 未接线),已建 file-backed KmsResolver 用磁盘 CA;现网无 njs 故 renew 证书头归一化放 CP 侧;manage token off-band 铸(capability 私钥)。
- **遗留/待办**: ① iOS/Android **真机 QA**(StrongBox + 手点 UI); ② push origin / 未做; ③ 面板"实时在线状态"(查 frps 已注册 proxy)小增强; ④ native-enroll 容忍 + agent-unit env + renew 头归一化 缺专门单测; ⑤ CP 跑在 worktree,别删 /root/wt-zte。
- **commit / 分支**: `feat/zero-touch-enrollment`(13) → merge `develop` `7c1d433` + `675de77`;VPS bare repo 有 develop。
### 🗺️ ROADMAP 落地 — Wave 1-4 八个功能(2026-07-12,当前活跃;多 agent 并行计划 + 逐个 builder 实施)
- **产物**: [docs/ROADMAP.md](./ROADMAP.md)(分层 backlog)+ [docs/plans/](./plans/)(8 份可直接照写的实施计划,并行生成)。全在 `develop`
- **编排**: 主线洞察"产品把一切都**采集**了却**没拿去行动**",两个原语(PTY-inject、审批预览)解锁一片。流程 = **并行生成 8 份计划**(1 个 workflow / 8 agent)→ **逐个功能派 builder 在主工作树实现**(一次一个,避免踩 server.ts 等共享文件)→ **orchestrator 独立复验**(typecheck 两 config + full suite + build:web + 安全审)→ 提交 → 下一个。