Files
boss/docs/source-material/codex_multi_machine_architecture_cn.html
2026-03-26 23:16:56 +08:00

2114 lines
94 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Codex 多机协作架构方案</title>
<style>
:root {
--bg: #f5f7fb;
--panel: #ffffff;
--panel-soft: #f0f4ff;
--text: #182230;
--muted: #516174;
--line: #d7dfeb;
--brand: #0f62fe;
--brand-soft: #e8f0ff;
--ok: #117a37;
--warn: #9a5d00;
--danger: #b42318;
--shadow: 0 10px 30px rgba(16, 24, 40, 0.08);
--radius: 18px;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
"Hiragino Sans GB", "Microsoft YaHei", sans-serif;
background:
radial-gradient(circle at top right, rgba(15, 98, 254, 0.12), transparent 28%),
linear-gradient(180deg, #f7f9fc 0%, #eef3fb 100%);
color: var(--text);
line-height: 1.65;
}
.page {
width: min(1200px, calc(100% - 32px));
margin: 0 auto;
padding: 28px 0 64px;
}
.hero {
background: linear-gradient(135deg, #0f62fe 0%, #3b82f6 55%, #7aa8ff 100%);
color: #fff;
border-radius: 28px;
padding: 38px 36px;
box-shadow: var(--shadow);
margin-bottom: 22px;
}
.hero h1 {
margin: 0 0 14px;
font-size: 34px;
line-height: 1.2;
}
.hero p {
margin: 0;
max-width: 920px;
font-size: 16px;
color: rgba(255, 255, 255, 0.9);
}
.section {
background: var(--panel);
border: 1px solid var(--line);
border-radius: var(--radius);
padding: 28px;
box-shadow: var(--shadow);
margin-top: 18px;
}
.section h2 {
margin: 0 0 14px;
font-size: 24px;
line-height: 1.25;
}
.section h3 {
margin: 22px 0 10px;
font-size: 18px;
}
.lead {
color: var(--muted);
margin: 0 0 10px;
}
.grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 16px;
}
.card {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 16px;
padding: 18px;
}
.soft {
background: var(--panel-soft);
}
.span-4 {
grid-column: span 4;
}
.span-6 {
grid-column: span 6;
}
.span-8 {
grid-column: span 8;
}
.span-12 {
grid-column: span 12;
}
.tag {
display: inline-block;
padding: 4px 10px;
border-radius: 999px;
font-size: 12px;
font-weight: 600;
background: var(--brand-soft);
color: var(--brand);
margin-bottom: 10px;
}
.status-ok {
background: #e8f7ed;
color: var(--ok);
}
.status-warn {
background: #fff3e0;
color: var(--warn);
}
.status-danger {
background: #fdecec;
color: var(--danger);
}
.diagram {
background: #0b1220;
color: #dce6ff;
border-radius: 18px;
padding: 20px;
overflow: auto;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 13px;
line-height: 1.6;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.list {
margin: 10px 0 0;
padding-left: 18px;
color: var(--muted);
}
.list li + li {
margin-top: 8px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
font-size: 14px;
}
th, td {
border: 1px solid var(--line);
padding: 12px 14px;
text-align: left;
vertical-align: top;
}
th {
background: #f8fafc;
font-weight: 700;
}
.footer-note {
color: var(--muted);
font-size: 13px;
margin-top: 12px;
}
.illustration {
width: 100%;
border-radius: 22px;
border: 1px solid var(--line);
background: #fff;
box-shadow: var(--shadow);
}
.mindmap-shell {
background:
radial-gradient(circle at top, rgba(15, 98, 254, 0.08), transparent 32%),
linear-gradient(180deg, #f8fbff 0%, #f3f7ff 100%);
border: 1px solid var(--line);
border-radius: 22px;
padding: 26px 18px 22px;
}
.mindmap-center {
width: min(360px, 100%);
margin: 0 auto 20px;
background: linear-gradient(135deg, #0f62fe 0%, #2b7cff 100%);
color: #fff;
padding: 18px 20px;
border-radius: 18px;
text-align: center;
box-shadow: var(--shadow);
}
.mindmap-center strong {
display: block;
font-size: 20px;
margin-bottom: 6px;
}
.mindmap-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
position: relative;
}
.branch {
background: #fff;
border: 1px solid var(--line);
border-radius: 18px;
padding: 18px;
box-shadow: 0 8px 24px rgba(16, 24, 40, 0.06);
}
.branch-title {
display: inline-flex;
align-items: center;
padding: 6px 12px;
border-radius: 999px;
background: var(--brand-soft);
color: var(--brand);
font-size: 13px;
font-weight: 700;
margin-bottom: 10px;
}
.branch ul {
margin: 10px 0 0;
padding-left: 18px;
color: var(--muted);
}
.branch li + li {
margin-top: 8px;
}
.tree-diagram {
background: #0b1220;
color: #dce6ff;
border-radius: 18px;
padding: 20px;
overflow: auto;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 13px;
line-height: 1.75;
border: 1px solid rgba(255, 255, 255, 0.08);
white-space: pre;
}
@media (max-width: 900px) {
.span-4, .span-6, .span-8, .span-12 {
grid-column: span 12;
}
.hero {
padding: 28px 22px;
}
.hero h1 {
font-size: 28px;
}
.mindmap-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div class="page">
<section class="hero">
<h1>Codex 多机协作控制架构</h1>
<p>
目标是让你只和一个主 Agent 对话,由主 Agent 调度多台 Mac、Windows 和云服务器上的 Codex 线程进行开发。
每个项目都可以查看聊天记录、执行进度、命令历史和补丁结果,并通过外部记忆系统解决长上下文导致的“越写越钝”问题。
</p>
</section>
<section class="section">
<h2>一、核心结论</h2>
<div class="grid">
<div class="card soft span-4">
<div class="tag">产品形态</div>
<strong>单主会话,多执行线程</strong>
<p class="lead">
手机端始终只有一个主对话入口,真正执行代码的是多个短上下文 Codex worker。
</p>
</div>
<div class="card soft span-4">
<div class="tag">技术底座</div>
<strong>LangGraph + Codex app-server / SDK</strong>
<p class="lead">
LangGraph 负责任务编排Codex 负责本地和远程代码执行,会话历史由统一事件库镜像。
</p>
</div>
<div class="card soft span-4">
<div class="tag">记忆策略</div>
<strong>系统记忆外置,不依赖单线程上下文</strong>
<p class="lead">
项目事实、设计约束、决策记录和阶段摘要统一保存在控制平面,避免单个线程长期膨胀。
</p>
</div>
</div>
</section>
<section class="section">
<h2>二、系统总览图</h2>
<div class="diagram">
[ 手机 App / Web 控制台 ]
|
v
[ API 网关 + WebSocket 实时推送 ]
|
v
[ 运维层 / 运维审计层 ]
├─ 主运维层(可接管其他项目)
├─ Ops Control Plane
├─ Ops Policy Engine
├─ Chief Ops Audit Agent
├─ Ops Ledger
├─ Ops Extension Registry / Connector Runtime
└─ 全局健康矩阵 / 修复工单 / Runbook / Rescue Mode
|
v
[ Control Plane / 云服务器 ]
├─ Master Agent Runtime (LangGraph)
├─ Project Memory (决策账本 + 向量记忆)
├─ Event Store (聊天记录 / 命令 / Patch / 审批)
├─ Scheduler / Capability Router
├─ Thread Registry
├─ Inter-Thread Broker
├─ Audit Orchestrator
├─ Rules Audit Engine
├─ Specialist Audit Agents
│ ├─ 软件审计 Agent
│ ├─ 硬件审计 Agent
│ ├─ 多模态审计 Agent
│ └─ 总审计 Agent
└─ Quota / Rate Limit Monitor
|
+--------------------+--------------------+--------------------+
| | | |
v v v v
[ Mac Worker ] [ Windows Worker ] [ Cloud Worker ] [ Standby Controller ]
├─ Codex app-server ├─ Codex app-server ├─ Codex app-server ├─ 冷/热备控制器
├─ Repo Worktrees ├─ WSL2 + Repo ├─ Repo Worktrees ├─ 接管调度
├─ MCP / 本地工具 ├─ GPU Service ├─ CI / 长任务 └─ 读取事件和状态
├─ Thread Gateway ├─ Thread Gateway ├─ Thread Gateway
├─ Local Ops Agent ├─ Local Ops Agent ├─ Local Ops Agent
├─ Local Ops Audit ├─ Local Ops Audit ├─ Local Ops Audit
├─ Camera / Mic / Speaker
└─ Test Rig Gateway ├─ Thumb Robot / USB / Relay
└─ 心跳与事件上报 └─ 心跳与事件上报 └─ 心跳与事件上报
</div>
<p class="footer-note">
说明:主 Agent 不直接持有全部项目真相,所有关键状态都会落在事件库、任务账本和项目记忆中,因此主 Agent 崩溃后可以被接管。
</p>
</section>
<section class="section">
<h2>三、整体架构思维导图(完整版)</h2>
<p class="lead">
这张是完整的总架构脑图,不是摘要版。你可以把它理解成“整个产品怎么拼起来”的树状图。
</p>
<div class="tree-diagram">Codex 多机协作系统
├─ 1. 用户入口
│ ├─ 手机 App / Web
│ ├─ 单一主对话窗口
│ ├─ 项目列表
│ ├─ 线程详情页
│ └─ 审批 / 告警 / 节点状态
├─ 2. 主控层(云服务器)
│ ├─ API 网关
│ ├─ WebSocket 实时推送
│ ├─ Master Agent Runtime
│ │ ├─ LangGraph 编排
│ │ ├─ 任务拆分
│ │ ├─ 节点选择
│ │ ├─ 上下文裁剪
│ │ └─ 人工协同
│ ├─ Scheduler / Capability Router
│ ├─ Thread Registry
│ ├─ Inter-Thread Broker
│ ├─ Quota / Rate Limit Monitor
│ └─ Standby Controller
├─ 2.5 运维层与运维审计层
│ ├─ 主运维层
│ │ ├─ 当前 Codex 协作系统
│ │ └─ 未来接入的其他项目运维域
│ ├─ Ops Control Plane
│ ├─ Ops Policy Engine
│ ├─ Chief Ops Audit Agent
│ ├─ Ops Ledger
│ ├─ Ops Extension Registry
│ ├─ Ops Connector Runtime
│ ├─ 高频模式巡检5 分钟)
│ ├─ 空闲模式巡检1 小时)
│ ├─ 主控反向抢救运维层
│ ├─ 主控在线审批修复
│ └─ 主控离线紧急接管修复
├─ 3. 记忆与数据层(云服务器)
│ ├─ Postgres
│ │ ├─ 项目
│ │ ├─ 任务
│ │ ├─ 线程镜像
│ │ ├─ 审批记录
│ │ └─ 节点心跳
│ ├─ Vector Store
│ │ ├─ 项目长期记忆
│ │ ├─ 阶段摘要
│ │ ├─ 设计约束
│ │ └─ 经验检索
│ ├─ Object Storage
│ │ ├─ 原始事件日志
│ │ ├─ 导出的报告
│ │ └─ 补丁快照
│ └─ Redis / Queue
│ ├─ 任务队列
│ └─ 事件广播
├─ 4. 执行层(多节点)
│ ├─ Mac Worker
│ │ ├─ Codex app-server / SDK
│ │ ├─ worktree / branch
│ │ ├─ MCP / 本地工具
│ │ ├─ Thread Gateway
│ │ ├─ Local Ops Agent
│ │ ├─ Local Ops Audit Agent
│ │ └─ 前端 / iOS / macOS 任务
│ ├─ Windows WorkerWSL2
│ │ ├─ Codex app-server / SDK
│ │ ├─ GPU Bridge
│ │ ├─ PowerShell / 原生工具桥
│ │ ├─ Thread Gateway
│ │ ├─ Local Ops Agent
│ │ ├─ Local Ops Audit Agent
│ │ └─ CUDA / NVIDIA / Windows 任务
│ └─ Cloud Worker
│ ├─ Codex app-server / SDK
│ ├─ CI / 测试矩阵
│ ├─ Thread Gateway
│ ├─ Local Ops Agent
│ ├─ Local Ops Audit Agent
│ ├─ 长耗时任务
│ └─ 批处理任务
├─ 5. 审计层
│ ├─ Audit Orchestrator
│ ├─ Rules Audit Engine
│ │ ├─ 超时检测
│ │ ├─ 卡死检测
│ │ ├─ 重复失败检测
│ │ ├─ 上下文压缩过多检测
│ │ ├─ 视频流 / 摄像头在线检测
│ │ └─ 额度异常检测
│ ├─ 软件审计 Agent
│ ├─ 硬件审计 Agent
│ ├─ 多模态审计 Agent
│ └─ 总审计 Agent
├─ 6. 测试硬件能力层
│ ├─ Capability Registry
│ ├─ Device Lease / Preemption
│ ├─ Camera / Mic / Speaker
│ ├─ Thumb Robot / Relay / USB 控制器
│ └─ 视频流 / 关键帧 / 传感器采样
└─ 7. 容灾层
├─ 主控故障切换
├─ 数据库备份恢复
├─ worker 重派
├─ 账号额度切换
├─ 运维紧急修复
└─ 人工接管</div>
</section>
<section class="section">
<h2>四、技术实现方案</h2>
<h3>1. 手机端</h3>
<ul class="list">
<li>建议先做 PWA 或响应式 Web 控制台,再按需要封装成 iOS / Android App。</li>
<li>页面包括:主对话页、项目列表页、项目线程页、审批中心、节点状态页、告警页。</li>
<li>所有实时状态通过 WebSocket 推送,点开项目后直接读取 thread mirror 和增量事件。</li>
<li>主对话页顶部增加一个非常轻量的“当前主控身份提示条”,只占一行小胶囊区域,显示当前主脑来源:`主 GPT`、`备用 GPT` 或 `API 容灾`。</li>
<li>这个提示条默认只显示 3 段信息:当前身份、所在线节点、最近切换时间;点击后再展开完整详情,不占据主聊天区。</li>
</ul>
<h3>2. 控制平面</h3>
<ul class="list">
<li>主控服务放在云服务器,避免主调度器依赖某一台个人电脑。</li>
<li>LangGraph 负责任务拆解、状态流转、checkpoint 恢复和人工介入。</li>
<li>Project Memory 负责保存项目目标、约束、阶段总结、未决问题、关键决策。</li>
<li>Scheduler 根据节点能力、系统负载、Codex 限额和任务类型选择执行节点。</li>
</ul>
<h3>3. Worker 节点</h3>
<ul class="list">
<li>每台 Mac、Windows、云服务器都运行一个 worker daemon。</li>
<li>worker daemon 连接本机 Codex app-server / SDK启动和恢复线程读取事件并上传到事件库。</li>
<li>每个任务使用独立 worktree / branch避免不同线程直接写同一个工作目录。</li>
<li>Windows 节点建议用 WSL2 跑 worker本地 GPU、PowerShell、原生程序通过桥接服务暴露。</li>
</ul>
<h3>4. 线程与记忆策略</h3>
<ul class="list">
<li>每个项目不是一个超长线程,而是多个短线程:功能线程、修复线程、实验线程、评审线程。</li>
<li>线程执行结束后worker 自动回传阶段摘要、关键文件、风险、测试结果和待办。</li>
<li>主控只把最小必要上下文派给下一次线程,避免长期上下文压缩导致能力下降。</li>
<li>每个 worker 必须持续上报线程上下文预算:`context_budget_remaining_pct`、`context_budget_level`、`compaction_expected_at`。</li>
<li>手机端会话列表第三层使用统一的圆环进度标记显示“背景信息窗口余量”,该标记与设备端线程页保持一致,不能由前端自行估算。</li>
<li>主 Agent 必须把“压缩前收尾”当成一等公民,在上下文预算进入危险区前优先完成关键结论固化、补丁固化、测试结论固化和线程交接。</li>
</ul>
<table>
<thead>
<tr>
<th>上下文预算等级</th>
<th>阈值</th>
<th>主 Agent 默认动作</th>
</tr>
</thead>
<tbody>
<tr>
<td>`safe`</td>
<td>`>= 60%`</td>
<td>正常推进任务,但持续刷新阶段摘要和关键证据引用。</td>
</tr>
<tr>
<td>`watch`</td>
<td>`40% ~ 59%`</td>
<td>不再向该线程追加大块背景信息,开始准备阶段摘要和下一线程交接包。</td>
</tr>
<tr>
<td>`urgent`</td>
<td>`25% ~ 39%`</td>
<td>优先完成当前原子子任务,同时预创建接力线程,确保 compaction 前完成 handoff。</td>
</tr>
<tr>
<td>`critical`</td>
<td>`< 25%`</td>
<td>禁止继续扩张上下文,立即执行“压缩前收尾”:固化 patch、命令、测试结论、关键决策、未决问题和证据链接。</td>
</tr>
</tbody>
</table>
<h3>5. 额度监控集成(直接复用 gptpluscontrol</h3>
<ul class="list">
<li>不重新发明额度监控,直接复用 `/Users/kris/code/gptpluscontrol` 已有的后端、Agent、SSE 和数据结构。</li>
<li>手机 App 和 Web 控制台从控制平面读取“主控状态”,同时从 gptpluscontrol 读取“各 Codex 节点剩余额度和当前占用状态”。</li>
<li>建议先把 gptpluscontrol 作为独立服务并行部署,再由控制平面聚合其接口;后续若要统一,可再把其接口协议并入主系统。</li>
</ul>
<h3>6. 跨节点线程对话机制</h3>
<ul class="list">
<li>允许 Mac、Windows、云节点上的任意 Codex 线程在主 Agent 监管下进行线程到线程对话,但不采用裸点对点直连。</li>
<li>系统实现采用“逻辑直连、物理经主控转发”:发送线程把消息交给本地 `Thread Gateway`,再经 `Inter-Thread Broker` 路由到目标节点。</li>
<li>默认只允许同一项目内线程互通,跨项目通信必须显式授权。</li>
<li>消息默认只传任务摘要、必要上下文、附件引用和最近结论,不直接透传完整历史,避免上下文污染和容量膨胀。</li>
</ul>
<h3>7. 开发规格:线程地址、消息协议与监管模式</h3>
<table>
<thead>
<tr>
<th>设计项</th>
<th>规格</th>
</tr>
</thead>
<tbody>
<tr>
<td>线程全局地址</td>
<td>`{node_id}:{thread_id}`,例如 `mac-01:thread-abc`、`win-gpu-02:thread-xyz`。</td>
</tr>
<tr>
<td>Thread Registry</td>
<td>保存 `project_id`、`node_id`、`thread_id`、`role`、`status`、`allowed_peers`、`access_mode`、`last_seen_at`、`context_budget`。</td>
</tr>
<tr>
<td>消息 Envelope</td>
<td>至少包含 `message_id`、`project_id`、`sender_thread_ref`、`receiver_thread_ref`、`intent`、`summary`、`attachments`、`ttl_seconds`、`approval_mode`、`created_at`。</td>
</tr>
<tr>
<td>监管模式</td>
<td>`observe`、`approve_first`、`strict` 三种。默认项目内线程采用 `approve_first`。</td>
</tr>
<tr>
<td>传输链路</td>
<td>`Sender Thread -> Local Thread Gateway -> Inter-Thread Broker -> Receiver Gateway -> Receiver Thread`。</td>
</tr>
<tr>
<td>结果回传</td>
<td>目标线程回复后,结果按原路返回并写入双方 thread mirror同时产生 broker 级事件日志。</td>
</tr>
<tr>
<td>失败处理</td>
<td>目标线程离线、超时、拒绝、权限不足时进入重试或 dead-letter 队列,并由主 Agent 决定重派、降级或人工介入。</td>
</tr>
</tbody>
</table>
<h3>8. 线程对话的权限与审计要求</h3>
<ul class="list">
<li>所有跨节点线程对话必须带 `project_id` 和 `intent`,禁止匿名消息。</li>
<li>`Inter-Thread Broker` 必须检查 ACL项目边界、角色边界、节点边界、监管模式、最大 turn 数和消息 TTL。</li>
<li>所有线程对话都必须写入 `Event Store`,手机端项目页可以查看“谁在向谁发起对话、原因是什么、结果是什么”。</li>
<li>主 Agent 对线程对话有冻结权、禁言权和强制断链权,审计层可对异常通信做告警。</li>
</ul>
<h3>9. UI 表达与产品交互</h3>
<ul class="list">
<li>项目线程页要显示“跨节点协作”时间线,突出展示 `发送线程`、`目标线程`、`intent`、`状态`、`摘要结果`。</li>
<li>节点详情页要显示该设备当前正在参与的跨节点对话数、最近交互对象和失败次数。</li>
<li>主对话页里,当主 Agent让某个线程去和其他节点线程协作时应出现一条简短系统消息例如“已让 Mac 前端线程向 Windows GPU 线程请求推理结果”。</li>
</ul>
<h3>10. 开放式审计与硬件接管</h3>
<ul class="list">
<li>审计层不只审代码,还要能在需要时接管真实测试硬件,因此必须设计成开放能力系统,而不是只读日志的观察者。</li>
<li>每台设备都可以注册自己的“测试能力”例如摄像头、麦克风、扬声器、屏幕采集、串口、USB 控制器、拇指机器人、继电器、可编程电源等。</li>
<li>控制平面维护统一的 `Capability Registry`,记录每个能力所在节点、当前占用状态、优先级和可抢占性。</li>
<li>审计 Agent 在被授权后,通过 `Device Lease / Preemption` 机制秒级接管这些能力,完成交互测试、硬件回归和多模态验证。</li>
<li>视频流不建议长期整路上传边缘节点先提取关键帧、短视频片段、OCR 和检测结果,再由多模态审计 Agent 复核。</li>
</ul>
<h3>11. 运维层与运维审计层</h3>
<ul class="list">
<li>在整个系统的最外层增加 `Ops Layer` 和 `Ops Audit Layer`它们负责监管主控、Worker、审计层、硬件层、数据层、额度层是否健康。</li>
<li>每一台接入系统的终端设备,无论是 Mac、Windows、云工作机还是独立测试台都必须常驻 `Local Ops Agent` 和 `Local Ops Audit Agent`。</li>
<li>`Local Ops Agent` 负责巡检、分类、执行修复;`Local Ops Audit Agent` 负责监督运维 Agent、判定修复权限、执行修复复验。</li>
<li>巡检频率由 `Ops Policy Engine` 动态调节:高频使用状态下每 5 分钟一次;无人使用且没有现场工作时每 1 小时一次。</li>
<li>主 Agent 每小时至少检查一次整个运维层是否健康,确认所有节点的运维 Agent / 运维审计 Agent 在线且最近一次巡检成功。</li>
<li>当主 Agent 在线且能正常响应时,运维 Agent 发起修复必须先经主 Agent 同意;当主 Agent 失联时,运维审计 Agent 才能做最终修复执行判断。</li>
</ul>
</section>
<section class="section">
<h2>五、每个服务运行在哪台机器</h2>
<table>
<thead>
<tr>
<th>服务</th>
<th>建议部署位置</th>
<th>原因</th>
</tr>
</thead>
<tbody>
<tr>
<td>手机端 Web / App</td>
<td>手机浏览器 / App</td>
<td>只作为统一入口,不承担调度和记忆。</td>
</tr>
<tr>
<td>API 网关 + WebSocket</td>
<td>云服务器</td>
<td>保证外网访问稳定,统一所有设备接入。</td>
</tr>
<tr>
<td>Master Agent Runtime</td>
<td>云服务器主节点</td>
<td>主调度器不依赖个人电脑是否开机,适合持续运行。</td>
</tr>
<tr>
<td>Thread Registry / Inter-Thread Broker</td>
<td>云服务器</td>
<td>管理跨节点线程地址、权限、消息路由、重试和审计留痕。</td>
</tr>
<tr>
<td>Project Memory / Event Store / Postgres / Redis</td>
<td>云服务器或云数据库</td>
<td>需要集中存储,便于跨设备读取和灾难恢复。</td>
</tr>
<tr>
<td>gptpluscontrol Backend</td>
<td>云服务器</td>
<td>作为现成额度监控服务提供账号、Agent、容量和 SSE 实时流。</td>
</tr>
<tr>
<td>Audit Orchestrator</td>
<td>云服务器</td>
<td>负责编排规则审计、软件审计、硬件审计、多模态审计和总审计结果汇总。</td>
</tr>
<tr>
<td>Ops Control Plane / Ops Policy Engine</td>
<td>云服务器</td>
<td>统一计算巡检模式、汇总节点健康、管理修复工单、审批策略与紧急接管规则。</td>
</tr>
<tr>
<td>Ops Extension Registry / Connector Runtime</td>
<td>云服务器</td>
<td>作为开放式主运维层的扩展入口,用来注册其他项目、其他服务、其他测试台的运维域、连接器和 Runbook Pack。</td>
</tr>
<tr>
<td>Chief Ops Audit Agent / Ops Ledger</td>
<td>云服务器</td>
<td>负责跨节点运维复核、主控离线时的最终修复判断、修复留痕与主控恢复后的同步汇报。</td>
</tr>
<tr>
<td>Rules Audit Engine</td>
<td>云服务器</td>
<td>与主控分离运行,持续监听任务和节点状态。</td>
</tr>
<tr>
<td>Specialist Audit Agents</td>
<td>云服务器</td>
<td>包含软件审计、硬件审计、多模态审计和总审计 Agent按事件或策略触发。</td>
</tr>
<tr>
<td>Mac Worker Daemon</td>
<td>每台 Mac 本机</td>
<td>负责 Xcode、前端、macOS / iOS 相关开发任务。</td>
</tr>
<tr>
<td>Thread GatewayMac</td>
<td>每台 Mac 本机</td>
<td>接收和发送本机线程消息,把跨节点对话接入 Broker。</td>
</tr>
<tr>
<td>gptpluscontrol AgentMac</td>
<td>每台 Mac 本机</td>
<td>负责上报本机 Codex 当前账号、5h/7d 剩余额度、登录切换和心跳。</td>
</tr>
<tr>
<td>Local Ops AgentMac</td>
<td>每台 Mac 本机</td>
<td>负责本机 Worker、Thread Gateway、Test Rig、gptpluscontrol Agent 等组件的巡检与修复执行。</td>
</tr>
<tr>
<td>Local Ops Audit AgentMac</td>
<td>每台 Mac 本机</td>
<td>负责监督本机运维 Agent、复验修复动作、在主控离线时参与紧急修复判断。</td>
</tr>
<tr>
<td>Windows Worker Daemon</td>
<td>Windows 本机的 WSL2</td>
<td>兼顾 Codex 兼容性和 NVIDIA / Windows 工具链调用。</td>
</tr>
<tr>
<td>Thread GatewayWindows</td>
<td>Windows 本机的 WSL2 或本机桥接层</td>
<td>负责 Windows 线程与云端 Broker 之间的消息收发和状态同步。</td>
</tr>
<tr>
<td>gptpluscontrol AgentWindows</td>
<td>Windows 本机</td>
<td>负责上报 Windows 节点的额度、当前绑定账号、Agent 在线状态和切换事件。</td>
</tr>
<tr>
<td>Local Ops AgentWindows</td>
<td>Windows 本机或 WSL2 邻近桥接层</td>
<td>负责本机 Worker、GPU Bridge、Thread Gateway、测试桥的巡检与自愈执行。</td>
</tr>
<tr>
<td>Local Ops Audit AgentWindows</td>
<td>Windows 本机或 WSL2 邻近桥接层</td>
<td>负责监督本机运维 Agent、复验修复动作、在主控离线时做本地紧急修复复核。</td>
</tr>
<tr>
<td>GPU Bridge / Windows 工具桥</td>
<td>Windows 本机</td>
<td>为 Mac 或云端 worker 暴露 GPU 推理和原生工具能力。</td>
</tr>
<tr>
<td>Test Rig Gateway / 硬件测试桥</td>
<td>挂载测试外设的 Mac / Windows / 独立测试台</td>
<td>向审计层暴露摄像头、麦克风、扬声器、拇指机器人、串口、继电器等可接管测试能力。</td>
</tr>
<tr>
<td>Cloud Worker Daemon</td>
<td>云服务器或云工作机</td>
<td>承担长耗时任务、批处理、CI、测试矩阵和后台流程。</td>
</tr>
<tr>
<td>Thread GatewayCloud</td>
<td>云 worker 同机部署</td>
<td>负责云侧线程加入跨节点协作网络并接收主控监管。</td>
</tr>
<tr>
<td>Local Ops AgentCloud</td>
<td>每台云 worker 同机部署</td>
<td>负责云 worker、线程网关、CI 进程、日志上报和修复脚本执行。</td>
</tr>
<tr>
<td>Local Ops Audit AgentCloud</td>
<td>每台云 worker 同机部署</td>
<td>负责监督本机运维 Agent、复验修复动作、保障云侧节点自愈链路可用。</td>
</tr>
<tr>
<td>Standby Controller</td>
<td>第二台云服务器或同云异可用区</td>
<td>主控故障时接管调度。</td>
</tr>
</tbody>
</table>
</section>
<section class="section">
<h2>六、主 Agent 怎么使用 ChatGPT 蓝色账号上的 Codex 额度</h2>
<div class="grid">
<div class="card span-6">
<div class="tag status-ok">推荐方案</div>
<strong>主控用 APIWorker 用 Plus 账号登录 Codex</strong>
<ul class="list">
<li>主 Agent 运行在云端,使用 API 模型做编排与决策。</li>
<li>每个 worker 节点用一个 ChatGPT Plus 账号登录本机 Codex。</li>
<li>调度器读取每个 worker 的限额和负载,把任务派给还有余量的节点。</li>
<li>这种方式最稳,因为主脑不被单个桌面账号会话绑定。</li>
</ul>
</div>
<div class="card span-6">
<div class="tag status-warn">可选方案</div>
<strong>单独放一台 Master Codex Node</strong>
<ul class="list">
<li>单独一台机器运行“主控 Codex”绑定一个蓝色账号。</li>
<li>控制平面通过 Codex app-server / SDK 调用它,视它为主脑执行器。</li>
<li>适合保留强烈的 Codex 使用体验,但稳定性低于 API 主脑方案。</li>
<li>不建议把多个 Plus 账号设计成一个透明共享额度池,而是按节点账号分别调度。</li>
</ul>
</div>
</div>
<p class="footer-note">
设计原则Plus 额度按“节点级账号”使用,不按“中央公共额度池”设计。调度器要监控每个节点账号的剩余额度和速率限制。
</p>
<div class="card soft span-12" style="margin-top:16px;">
<div class="tag status-danger">关键澄清</div>
<strong>云服务器上的纯主控服务,不能直接继承你的 ChatGPT Plus“最新模型额度”</strong>
<ul class="list">
<li>如果主 Agent 只是一个运行在云服务器上的 LangGraph / API 服务,它使用的是 API 计费和 API 限额,不会自动继承 ChatGPT Plus 的聊天或 Codex 订阅额度。</li>
<li>OpenAI 官方目前明确说明ChatGPT 中的模型可用性与 Codex 分开管理API 的可用性和价格也单独管理。</li>
<li>所以你不能把“云上的主控 API 服务”直接视作“在吃 ChatGPT Plus 最新模型额度”。</li>
</ul>
</div>
<div class="card soft span-12" style="margin-top:16px;">
<div class="tag status-warn">如果你坚持要用 Plus 额度</div>
<strong>要把主 Agent 变成一个“Master Codex Node”</strong>
<ul class="list">
<li>单独准备一台始终在线的机器,例如一台常开 Mac mini、常开 Windows WSL2 节点,或者你确认可稳定登录的云工作机。</li>
<li>这台机器上登录一个 ChatGPT Plus 账号,让本机 Codex 作为“主脑执行器”。</li>
<li>云上的控制平面不直接调用 Plus 额度,而是通过 app-server / SDK 去调用这台 Master Codex Node。</li>
<li>这时消耗的是这台主控节点绑定账号的 Codex 配额,而不是云主控服务本身的 API 配额。</li>
</ul>
</div>
<div class="card soft span-12" style="margin-top:16px;">
<div class="tag">UI 要求</div>
<strong>主控身份提示条的交互规范</strong>
<ul class="list">
<li>位置:主对话页顶部标题栏右侧,优先做成一个小胶囊标签,不占据大卡片区域。</li>
<li>状态值:`主 GPT`、`备用 GPT`、`API 容灾`。</li>
<li>展开信息:当前节点名、当前账号 display name、最近切换时间、切换原因。</li>
<li>颜色建议:主 GPT 用蓝色,备用 GPT 用橙色API 容灾用灰色或紫灰色。</li>
</ul>
</div>
</section>
<section class="section">
<h2>七、向量库存在哪里</h2>
<div class="grid">
<div class="card span-6">
<div class="tag status-ok">推荐位置</div>
<strong>向量库放在云端,作为控制平面的集中记忆层</strong>
<ul class="list">
<li>建议和 `Postgres` 一起放在云服务器或云数据库中MVP 阶段优先使用 `pgvector`,最简单也最稳。</li>
<li>它保存的不是源代码本身,而是项目摘要、设计约束、阶段结论、排障经验、已知风险和历史决策。</li>
<li>所有 worker 都只读写这一个“中心记忆库”,不要每台电脑各自维护一套主记忆。</li>
</ul>
</div>
<div class="card span-6">
<div class="tag status-warn">为什么不放本地</div>
<strong>本地只能有缓存,不能有主版本</strong>
<ul class="list">
<li>如果主记忆放在某台 Mac 或 Windows 本地,这台机器掉线时,主 Agent 就会失明。</li>
<li>你要的是手机统一查看、跨设备协作,所以 canonical memory 必须在云端。</li>
<li>本地 worker 可以保留短期缓存或索引副本,但最终真相必须回写到云端向量库和数据库。</li>
</ul>
</div>
</div>
<table>
<thead>
<tr>
<th>方案</th>
<th>建议</th>
<th>适用阶段</th>
</tr>
</thead>
<tbody>
<tr>
<td>Postgres + pgvector</td>
<td>最推荐,部署简单,备份和高可用可以与主数据库统一管理。</td>
<td>MVP 到中期产品</td>
</tr>
<tr>
<td>独立 Qdrant / Weaviate</td>
<td>当检索规模、性能、分片需求更高时再拆出。</td>
<td>中后期</td>
</tr>
<tr>
<td>每台 worker 本地向量库</td>
<td>不建议作为主记忆,只能做本地加速缓存。</td>
<td>仅优化阶段</td>
</tr>
</tbody>
</table>
</section>
<section class="section">
<h2>八、Codex 剩余额度显示与 gptpluscontrol 集成</h2>
<p class="lead">
额度监控不新做,直接复用现有 `gptpluscontrol` 项目。当前项目已经具备云端 Backend、macOS / Windows Agent、REST API 和 SSE 实时刷新能力。
</p>
<h3>1. 推荐集成方式</h3>
<ul class="list">
<li>把 `gptpluscontrol Backend` 部署在云服务器,与主控控制平面同域或同内网。</li>
<li>每台 Mac / Windows 设备同时运行 `worker daemon` 和 `gptpluscontrol agent`。</li>
<li>手机 App 和 Web 端通过控制平面 BFF 聚合两类数据:项目执行数据来自主控,额度和账号状态来自 gptpluscontrol。</li>
<li>前端只显示最终聚合后的统一视图,避免手机端同时直连多个系统。</li>
</ul>
<h3>2. 可以直接复用的数据接口</h3>
<table>
<thead>
<tr>
<th>接口</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>`GET /api/v1/agents`</td>
<td>读取每台设备的在线状态、当前 Codex 账号、5h/7d 剩余额度、最近切号和交接信息。</td>
</tr>
<tr>
<td>`GET /api/v1/accounts`</td>
<td>读取账号池列表、剩余额度、重置时间、当前使用状态、账号占用情况。</td>
</tr>
<tr>
<td>`GET /api/v1/accounts/{account_id}`</td>
<td>读取单个账号的详细历史、错误和趋势。</td>
</tr>
<tr>
<td>`GET /api/v1/dashboard/summary`</td>
<td>读取总账号数、正常数、失败数、在线 Agent 数量等总览卡片数据。</td>
</tr>
<tr>
<td>`GET /api/v1/capacity/report`</td>
<td>读取容量预警、剩余覆盖天数、预计耗尽时间和建议。</td>
</tr>
<tr>
<td>`GET /api/v1/events/stream`</td>
<td>通过 SSE 接收实时刷新事件,推动前端更新设备和额度状态。</td>
</tr>
</tbody>
</table>
<h3>3. 当前可直接利用的关键字段</h3>
<ul class="list">
<li>`codex_current_display_name`:当前设备绑定的 Codex 账号显示名。</li>
<li>`codex_current_window_5h_remaining`:当前 5 小时窗口剩余额度。</li>
<li>`codex_current_window_7d_remaining`:当前 7 天窗口剩余额度。</li>
<li>`codex_last_switch_at` / `codex_last_switch_from` / `codex_last_switch_to`:最近切号时间与来源目标。</li>
<li>`codex_last_handoff_status` / `codex_last_handoff_reason`:最近交接状态和原因。</li>
<li>`usage_state`:账号当前是否被占用、是谁在使用、角色优先级和最近动作。</li>
</ul>
<h3>4. App 里的 UI 设计要求</h3>
<div class="grid">
<div class="card span-6">
<div class="tag status-ok">轻量状态提示</div>
<strong>主会话顶部显示主控身份</strong>
<ul class="list">
<li>显示:`主 GPT` / `备用 GPT` / `API 容灾`。</li>
<li>可加一个很小的副文本:当前账号简称或当前节点名。</li>
<li>点击后展开完整状态,不默认铺满页面。</li>
</ul>
</div>
<div class="card span-6">
<div class="tag status-ok">实时额度面板</div>
<strong>项目页和节点页显示绑定 Codex 客户端剩余额度</strong>
<ul class="list">
<li>每个节点卡片显示设备名、在线状态、当前账号、5h 剩余、7d 剩余。</li>
<li>如果节点正在切号或等待人工登录,显示醒目的次级提示。</li>
<li>额度不足时以黄 / 红两级预警。</li>
</ul>
</div>
</div>
<h3>5. 开发实现建议</h3>
<ul class="list">
<li>MVP 先不把 gptpluscontrol 代码强行并入主控服务,先作为独立服务部署,降低耦合。</li>
<li>主控服务新增一个 BFF 层,把 gptpluscontrol 的 API 结果转换成手机端需要的统一字段。</li>
<li>等主系统稳定后,再考虑把 gptpluscontrol 的 schema 和事件流整合进统一数据库。</li>
</ul>
</section>
<section class="section">
<h2>九、跨节点线程对话机制</h2>
<div class="grid">
<div class="card span-4">
<div class="tag status-ok">核心原则</div>
<strong>逻辑直连,物理经主控转发</strong>
<p class="lead">
Mac、Windows、云节点上的线程可以互相对话但消息必须经过 `Inter-Thread Broker` 和主控监管。
</p>
</div>
<div class="card span-4">
<div class="tag status-warn">边界控制</div>
<strong>默认同项目互通,跨项目需授权</strong>
<p class="lead">
线程通信受项目边界、角色边界、监管模式、TTL 和 turn 预算共同限制。
</p>
</div>
<div class="card span-4">
<div class="tag status-danger">风险规避</div>
<strong>不透传完整历史,防止上下文污染</strong>
<p class="lead">
默认只传摘要、必要附件和最近结论,避免两个线程互相放大无关上下文。
</p>
</div>
</div>
<h3>可开发的消息流</h3>
<table>
<thead>
<tr>
<th>步骤</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. 发送方封装请求</td>
<td>发送线程生成 `intent + summary + attachments`,交给本地 Thread Gateway。</td>
</tr>
<tr>
<td>2. Broker 做权限与策略检查</td>
<td>检查 sender / receiver 是否允许通信,是否同项目,是否超过 turn budget是否需要主 Agent 审批。</td>
</tr>
<tr>
<td>3. 路由到目标节点</td>
<td>Broker 把消息转发到目标节点的 Thread Gateway再交给目标 Codex 线程。</td>
</tr>
<tr>
<td>4. 目标线程执行</td>
<td>目标线程基于收到的摘要完成计算、读取文件、运行命令或请求本地硬件能力。</td>
</tr>
<tr>
<td>5. 结果回传</td>
<td>目标线程将摘要结果、状态、附件引用返回给 Broker再回传给发送线程。</td>
</tr>
<tr>
<td>6. 留痕与展示</td>
<td>整段通信写入 Event Store并在项目 UI 的“跨节点协作”时间线上展示。</td>
</tr>
</tbody>
</table>
<h3>推荐的 intent 类型</h3>
<ul class="list">
<li>`ask_compute`:请求 GPU 推理、批处理或算力任务。</li>
<li>`request_artifact`:请求文件、产物、日志、截图或模型输出。</li>
<li>`request_hardware_check`:请求目标节点执行硬件检查。</li>
<li>`request_ui_validation`:请求目标节点做 UI 或交互验证。</li>
<li>`request_test_step`:请求目标节点执行测试步骤并返回结果。</li>
</ul>
</section>
<section class="section">
<h2>十、混合审计架构:规则审计 + 专项审计 Agent</h2>
<div class="grid">
<div class="card span-4">
<div class="tag status-danger">风险</div>
<strong>自我确认偏差</strong>
<p class="lead">
如果主 Agent 既派任务又自己评价自己,就容易忽略执行偏差、低效率循环和错误判断。
</p>
</div>
<div class="card span-4">
<div class="tag status-ok">更稳做法</div>
<strong>规则审计和多种审计 Agent 并存</strong>
<p class="lead">
规则引擎做硬性判断,专项审计 Agent 做语义判断,多模态和硬件场景由专门审计 Agent 接管。
</p>
</div>
<div class="card span-4">
<div class="tag status-warn">主控职责</div>
<strong>主 Agent 做调度,不独占系统真相</strong>
<p class="lead">
所有关键信息都写入事件库和项目记忆,主控只是当前执行者,而不是唯一记忆体。
</p>
</div>
</div>
<h3>建议的分工</h3>
<table>
<thead>
<tr>
<th>组件</th>
<th>职责</th>
</tr>
</thead>
<tbody>
<tr>
<td>主 Agent</td>
<td>任务拆分、节点选择、上下文裁剪、上下文预算管理、压缩前收尾调度、阶段调度、人工沟通。</td>
</tr>
<tr>
<td>Rules Audit Engine</td>
<td>检测超时、重复失败、压缩次数过多、rate limit、队列积压、worker 离线、视频流断开、测试进程缺失等硬规则异常。</td>
</tr>
<tr>
<td>软件审计 Agent</td>
<td>复核代码变更、测试覆盖、行为回归、接口契约、日志解释和发布风险。</td>
</tr>
<tr>
<td>硬件审计 Agent</td>
<td>复核固件版本、设备状态、串口日志、传感器读数、OTA 后行为和外设联动是否正确。</td>
</tr>
<tr>
<td>多模态审计 Agent</td>
<td>分析截图、关键帧、短视频、摄像头画面、音频片段,判断设备动作、屏幕状态和拟人化交互是否符合预期。</td>
</tr>
<tr>
<td>总审计 Agent</td>
<td>汇总规则审计和各专项审计的结论,给出通过、驳回、需人工复核和返工建议。</td>
</tr>
</tbody>
</table>
<h3>开放式硬件接管要求</h3>
<ul class="list">
<li>审计 Agent 必须可以接管任意在线节点上的测试硬件能力,只要该能力已在系统注册并被授权。</li>
<li>支持的能力包括但不限于摄像头、麦克风、扬声器、屏幕采集、USB 设备、串口、继电器、拇指机器人、可编程电源、机械按键器。</li>
<li>接管不是直接抢占操作系统桌面,而是通过 `Test Rig Gateway` 暴露标准能力接口,便于审计层按能力调用。</li>
<li>所有接管都要有租约、超时、占用记录和回放证据,避免多个审计线程同时争抢同一个外设。</li>
<li>如果某个项目的交互逻辑需要完整拟人化测试,审计 Agent 可以串联摄像头 + 麦克风 + 扬声器 + 机器人执行器完成闭环测试。</li>
</ul>
</section>
<section class="section">
<h2>十一、运维层与运维审计层</h2>
<div class="grid">
<div class="card span-4">
<div class="tag status-ok">角色</div>
<strong>Ops Agent 负责修Ops Audit Agent 负责判与验</strong>
<p class="lead">
运维层负责发现问题和执行修复,运维审计层负责监督运维行为、判断权限、复验结果和紧急接管。
</p>
</div>
<div class="card span-4">
<div class="tag status-warn">频率</div>
<strong>高频使用时 5 分钟,空闲时 1 小时</strong>
<p class="lead">
高频模式看活跃用户、活跃任务、能力租约、现场测试和高优先级告警;全空闲时降到每小时一次。
</p>
</div>
<div class="card span-4">
<div class="tag status-danger">兜底</div>
<strong>主控失联后,运维审计层可紧急决策修复</strong>
<p class="lead">
只要主 Agent 在线且可正常响应,运维修复必须先经它同意;主控失联后才由运维审计层做最终修复判断。
</p>
</div>
</div>
<div class="grid" style="margin-top:16px;">
<div class="card span-6 soft">
<div class="tag">主定位</div>
<strong>运维层是主运维层,不只服务当前这一套系统</strong>
<p class="lead">
它既监管当前 Codex 多机协作系统,也作为统一运维底座接管后续其他项目、其他服务、其他测试台和其他机器群的运维场景。
</p>
</div>
<div class="card span-6 soft">
<div class="tag">开放式</div>
<strong>通过 Domain / Connector / Runbook Pack 开放扩展</strong>
<p class="lead">
新项目接入时,不需要重写整套运维层;只要注册新的运维域、连接器类型、健康探针和修复剧本,就能接入主运维层统一监管。
</p>
</div>
</div>
<h3>1. 组件与职责</h3>
<table>
<thead>
<tr>
<th>组件</th>
<th>职责</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ops Control Plane</td>
<td>汇总全局健康、管理巡检模式、修复工单、Runbook、开放式运维域和紧急接管策略。</td>
</tr>
<tr>
<td>Local Ops Agent</td>
<td>在每个节点本地巡检进程、日志、队列、额度、硬件桥和网关,并执行修复动作。</td>
</tr>
<tr>
<td>Local Ops Audit Agent</td>
<td>监督本地 Ops Agent 是否健康、是否越权、修复是否成功,并在主控离线时做紧急修复判断。</td>
</tr>
<tr>
<td>Chief Ops Audit Agent</td>
<td>做跨节点复核、处理主控失联下的最终修复判定、在主控恢复后回放修复结果。</td>
</tr>
<tr>
<td>Ops Extension Registry / Connector Runtime</td>
<td>负责把其他项目、外部服务、外部测试台通过标准化 Connector 与 Runbook Pack 接入主运维层。</td>
</tr>
<tr>
<td>Ops Ledger</td>
<td>保存故障、修复动作、复验结论、主控恢复回执和 Runbook 映射。</td>
</tr>
</tbody>
</table>
<h3>2. 日志命名与低 token 定位原则</h3>
<ul class="list">
<li>所有错误键统一采用:`&lt;LAYER&gt;.&lt;DOMAIN&gt;.&lt;COMPONENT&gt;.&lt;ACTION&gt;.&lt;ERROR_CODE&gt;`。</li>
<li>示例:`MASTER.SCHEDULER.DISPATCH.NODE_UNAVAILABLE`、`WORKER.CODEX.THREAD_START.RATE_LIMIT`、`OPS_AUDIT.REPAIR.VERIFY.RESTART_FAILED`。</li>
<li>每条日志至少带:`fault_key`、`severity`、`node_id`、`service_name`、`project_id`、`thread_ref`、`trace_id`、`runbook_id`。</li>
<li>Ops Agent 汇报问题时优先输出 `fault_key`、受影响节点、首次/最近时间、建议动作和 runbook不直接把长日志贴给主控。</li>
</ul>
<h3>3. 除日志之外必须增加的救援手段</h3>
<ul class="list">
<li>心跳与存活探针主控、Worker、线程网关、审计层、硬件桥、gptpluscontrol 都要有 heartbeat。</li>
<li>合成探针:周期性模拟创建项目、启动轻量线程、读取 thread history、申请能力租约验证业务链路没有“表面存活、实际已坏”。</li>
<li>事件流与队列监控:看 Event Store 写入延迟、WebSocket/SSE 推送中断、消息积压、线程停滞。</li>
<li>资源与依赖监控CPU / 内存 / GPU / 磁盘、数据库复制延迟、对象存储写失败率、网络抖动。</li>
<li>认证与额度监控Codex 登录态、API key、Plus 剩余额度、gptpluscontrol 新鲜度、账号切换结果。</li>
<li>孤儿状态清理:孤儿 lease、孤儿 thread、孤儿 repair ticket、无人接手的审计任务。</li>
<li>现场快照抽样关键摄像头关键帧、OCR、串口短日志、设备状态采样用于发现“服务活着但现场已经坏了”的情况。</li>
<li>开放运维域探针:对其他接入项目的 SSH、HTTP API、Docker、K8s、Windows Service、局域网 RPC 做统一健康采样和修复映射。</li>
<li>跨设备运维动作:支持远程拉日志、远程重启服务、远程切换账号、远程重连桥接服务、远程执行 Runbook并统一经过主运维层审批与复验。</li>
</ul>
<h3>4. 在线与离线两种修复模式</h3>
<table>
<thead>
<tr>
<th>场景</th>
<th>决策链路</th>
</tr>
</thead>
<tbody>
<tr>
<td>主 Agent 在线且能正常返回</td>
<td>`Ops Agent` 发现问题后先提交修复建议,由主 Agent 审批;审批通过后执行修复,再由 `Ops Audit Agent` 复验并回报主 Agent。</td>
</tr>
<tr>
<td>主 Agent 失联</td>
<td>`Ops Audit Agent` 确认主控失联并升级到 `Chief Ops Audit Agent`;运维审计层做最终修复执行判断,`Ops Agent` 执行修复,运维审计层复验并写入账本,待主控恢复后同步。</td>
</tr>
</tbody>
</table>
<h3>5. 当运维层自身挂了,但主 Agent 在线</h3>
<ul class="list">
<li>如果 `Ops Control Plane`、`Ops Ledger`、`Ops Connector Runtime` 或大面积 `Local Ops Agent / Ops Audit Agent` 自身出问题,主 Agent 必须切到 `ops_rescue_mode`。</li>
<li>进入该模式后,主 Agent 通过独立的最小救援通道直连节点或备用控制器,对运维层发起反向抢救。</li>
<li>反向抢救不能依赖已经损坏的运维控制面本身,必须保留保底通道,例如紧急 RPC、备用控制器、本地 Watchdog 接口或只读健康快照通道。</li>
<li>运维层恢复后,仍然要由 `Ops Audit Agent` 做复验,再把结果回报主 Agent。</li>
</ul>
<h3>6. 主控恢复后的回放要求</h3>
<ul class="list">
<li>主 Agent 恢复后必须收到:故障摘要、影响范围、已执行修复动作、复验结论、剩余风险、是否建议人工复盘。</li>
<li>若运维修复在主控离线时发生,系统必须自动补发一条“修复回放报告”到主会话和运维中心。</li>
<li>若是主 Agent 自己发起的运维层反向抢救,也必须写入同一套运维账本,避免形成黑盒修复。</li>
</ul>
<p class="footer-note">
详细协议文档见:<a href="ops_layer_and_repair_protocol_cn.md">ops_layer_and_repair_protocol_cn.md</a>
</p>
</section>
<section class="section">
<h2>十二、容灾与故障恢复</h2>
<h3>1. 主控故障</h3>
<ul class="list">
<li>Master Agent 的任务状态和项目记忆不保存在上下文里,而是落在 Postgres、对象存储和向量记忆里。</li>
<li>启用 Standby Controller持续订阅事件库和任务账本主控故障后接管调度。</li>
<li>LangGraph 的 checkpoint 用于恢复到最近一次可执行状态。</li>
</ul>
<h3>2. 数据库故障</h3>
<ul class="list">
<li>Postgres 使用主从复制或云数据库高可用版本。</li>
<li>每天全量备份,按小时增量备份,保留至少 7 到 30 天。</li>
<li>事件日志追加写入对象存储,数据库损坏后仍可回放构建状态。</li>
</ul>
<h3>3. 单台 worker 故障</h3>
<ul class="list">
<li>worker 维持心跳,超过阈值则标记离线,并触发重新调度。</li>
<li>每个任务都绑定 branch / worktree失败后可以迁移到其他节点继续执行。</li>
<li>Windows GPU 任务失败时,可降级转移到云 GPU 或改为排队等待恢复。</li>
</ul>
<h3>4. 账号或额度问题</h3>
<ul class="list">
<li>Quota Monitor 记录每个 ChatGPT / Codex 节点的可用额度与速率限制。</li>
<li>单个账号额度不足时,自动切换到其他 worker 节点执行。</li>
<li>主脑如使用 API可与 worker 层的 Plus 账号使用路径解耦。</li>
</ul>
<h3>5. 网络故障</h3>
<ul class="list">
<li>局域网内的 Mac 和 Windows 节点优先直连云控制平面。</li>
<li>如家庭宽带不稳定,可在云端部署轻量 relayworker 与 relay 保持长连接。</li>
<li>手机端通过 HTTPS + WebSocket 访问,断线重连后根据事件序号补拉缺失记录。</li>
</ul>
<h3>6. 人工接管</h3>
<ul class="list">
<li>手机端和 Web 控制台提供“暂停调度”“冻结项目”“人工审核后继续”的按钮。</li>
<li>任何时刻都可以把某个 worker thread 升级为人工接管模式。</li>
<li>系统要支持导出项目摘要、当前分支、最近命令、失败原因,便于人工介入。</li>
</ul>
</section>
<section class="section">
<h2>十三、推荐的第一阶段落地方式</h2>
<table>
<thead>
<tr>
<th>阶段</th>
<th>目标</th>
<th>部署</th>
</tr>
</thead>
<tbody>
<tr>
<td>V1</td>
<td>先跑通 1 个主控 + 2 台 Mac + 1 台 Windows + 1 台云 worker 的项目调度、线程查看,以及每节点最小运维 Agent / 运维审计 Agent 心跳与修复工单。</td>
<td>主控和数据库在云端worker 在各自本机;所有节点同步部署 Local Ops Agent 与 Local Ops Audit Agent。</td>
</tr>
<tr>
<td>V2</td>
<td>加入项目记忆、自动摘要、跨节点线程对话、规则审计、专项审计 Agent、限额调度、异常重派以及主控离线下的运维紧急修复判定与复验。</td>
<td>新增向量库、线程 Broker、审计编排服务、Ops Control Plane、Chief Ops Audit Agent、备用控制器。</td>
</tr>
<tr>
<td>V3</td>
<td>加入开放式硬件接管、跨项目调度、GPU 任务编排、拇指机器人和多模态完整测试链路,以及多节点联动自愈和策略化运维。</td>
<td>扩展云 worker、Windows GPU 服务、硬件测试台、合成探针与更细粒度 Runbook 策略。</td>
</tr>
</tbody>
</table>
</section>
<section class="section">
<h2>十四、中文思维导图</h2>
<p class="lead">
下面这块是压缩后的方案总览,适合快速过一遍全局逻辑,也方便你后面拿去继续讨论产品边界和开发排期。
</p>
<div class="mindmap-shell">
<div class="mindmap-center">
<strong>Codex 多机协作产品</strong>
<span>一个主 Agent对接多台电脑上的 Codex 线程</span>
</div>
<div class="mindmap-grid">
<div class="branch">
<div class="branch-title">产品目标</div>
<ul>
<li>手机端只保留一个主对话入口。</li>
<li>同时调度 Mac、Windows、云服务器上的 Codex。</li>
<li>每个项目可查看聊天记录、命令、补丁和状态。</li>
<li>通过多短线程和外部记忆解决长上下文退化。</li>
</ul>
</div>
<div class="branch">
<div class="branch-title">核心技术</div>
<ul>
<li>LangGraph 作为主控编排引擎。</li>
<li>Codex app-server / SDK 作为 worker 接入层。</li>
<li>Project Memory 保存项目目标、约束、摘要和决策。</li>
<li>Event Store 镜像 thread、命令、patch、审批和告警。</li>
<li>Inter-Thread Broker 让 Mac / Windows / 云线程在监管下互相协作。</li>
<li>混合审计层可接管摄像头、音频和机器人外设做硬件测试。</li>
<li>运维层和运维审计层负责动态巡检、修复审批、复验和主控失联兜底。</li>
</ul>
</div>
<div class="branch">
<div class="branch-title">部署位置</div>
<ul>
<li>云服务器运行主控、数据库、审计、实时推送。</li>
<li>每台 Mac 本机运行 Mac Worker Daemon。</li>
<li>Windows 通过 WSL2 运行 Worker并桥接 GPU 能力。</li>
<li>云 worker 负责 CI、长任务、批处理和后台执行。</li>
<li>所有接入节点都必须常驻 Local Ops Agent 和 Local Ops Audit Agent。</li>
</ul>
</div>
<div class="branch">
<div class="branch-title">容灾策略</div>
<ul>
<li>主控状态外置Standby Controller 可接管。</li>
<li>Postgres 高可用,事件日志回写对象存储。</li>
<li>worker 心跳检测,故障后自动重派任务。</li>
<li>按节点监控 Codex 额度,账号异常时自动切换。</li>
<li>主控失联时由运维审计层做紧急修复判断,恢复后自动回放修复报告。</li>
</ul>
</div>
</div>
</div>
</section>
<section class="section">
<h2>十五、开发规格文档入口</h2>
<p class="lead">
下面这份文档已经单独整理成可直接开发的协议规格建议后续数据库、API、消息总线、前端联调都以它为准不再从正文里反复抽取定义。
</p>
<div class="grid">
<div class="card span-8 soft">
<div class="tag status-ok">主规格</div>
<strong>Capability Registry 与审计 Agent 协议开发规格</strong>
<ul class="list">
<li>定义能力提供方、能力实例、租约、会话、证据的核心实体。</li>
<li>定义摄像头、麦克风、扬声器、串口、拇指机器人、继电器、电源、屏幕采集等能力类型。</li>
<li>定义注册、心跳、租约、续租、释放、抢占和事件流。</li>
<li>定义软件审计、硬件审计、多模态审计、总审计的输入输出协议。</li>
<li>包含最小数据库表建议和 MVP 演进路径。</li>
</ul>
</div>
<div class="card span-8 soft">
<div class="tag status-ok">开发拆解</div>
<strong>开发子任务与交付计划</strong>
<ul class="list">
<li>把余下设计工作拆成 `A ~ H` 共 8 个工作包。</li>
<li>覆盖数据库、API、状态机、设备端预部署、前端字段、安全边界、演练与验收。</li>
<li>每个子任务都带目标、输出、依赖、优先级和验收标准。</li>
<li>明确哪些内容必须先冻结,哪些内容可以并行开发。</li>
<li>适合作为接下来正式开工的总任务入口。</li>
</ul>
</div>
<div class="card span-8 soft">
<div class="tag status-ok">UI 参考</div>
<strong>中国区产品 UI 参考库</strong>
<ul class="list">
<li>按“单入口、项目页、设备页、运维页、硬件页、AI 助手页”拆分参考对象。</li>
<li>覆盖飞书、钉钉、企业微信、向日葵、ToDesk、腾讯云助手、阿里云 App、观测云、PingCode、TAPD、米家、腾讯元宝等。</li>
<li>每个参考对象都标出:为什么适合参考、最值得借的 UI 点、官方来源。</li>
<li>适合直接作为后续产品原型和设计稿的输入清单。</li>
</ul>
</div>
<div class="card span-8 soft">
<div class="tag status-ok">首页冻结</div>
<strong>微信式项目会话首页映射规格</strong>
<ul class="list">
<li>把第一屏冻结成“主 Agent 置顶 + 项目会话列表”的微信式结构。</li>
<li>定义项目会话如何和设备端 GUI 项目文件夹一一对应。</li>
<li>定义单设备头像、群聊式组合头像、最近消息排序和手动置顶规则。</li>
<li>定义首页最小字段、建议新增的数据对象和前端展示边界。</li>
<li>适合作为首页和会话列表开发的直接规格。</li>
</ul>
</div>
<div class="card span-8 soft">
<div class="tag status-ok">上下文预算</div>
<strong>线程上下文预算与压缩前接力协议</strong>
<ul class="list">
<li>冻结设备端线程上下文预算的上报字段、阈值、事件和 handoff 包。</li>
<li>定义首页圆环进度标记、项目详情页展开和 BFF 返回结构。</li>
<li>明确主 Agent 在 `safe / watch / urgent / critical` 四个等级下的默认动作。</li>
<li>把“压缩前收尾”提升成正式调度规则,而不是临时经验。</li>
</ul>
</div>
<div class="card span-4">
<div class="tag">文档路径</div>
<p class="lead">
Markdown 规格文档:
<br />
<a href="capability_registry_and_audit_protocol_cn.md">capability_registry_and_audit_protocol_cn.md</a>
</p>
<p class="lead">
运维规格文档:
<br />
<a href="ops_layer_and_repair_protocol_cn.md">ops_layer_and_repair_protocol_cn.md</a>
</p>
<p class="lead">
技术选型文档:
<br />
<a href="detailed_technical_stack_cn.md">detailed_technical_stack_cn.md</a>
</p>
<p class="lead">
开发子任务文档:
<br />
<a href="development_subtasks_and_delivery_plan_cn.md">development_subtasks_and_delivery_plan_cn.md</a>
</p>
<p class="lead">
中国区 UI 参考库:
<br />
<a href="china_ui_reference_apps_cn.md">china_ui_reference_apps_cn.md</a>
</p>
<p class="lead">
微信式会话首页规格:
<br />
<a href="wechat_project_conversation_mapping_cn.md">wechat_project_conversation_mapping_cn.md</a>
</p>
<p class="lead">
上下文预算规格:
<br />
<a href="thread_context_budget_and_handoff_protocol_cn.md">thread_context_budget_and_handoff_protocol_cn.md</a>
</p>
<p class="lead">
本机绝对路径:
<br />
<code>/Users/kris/code/Talking/capability_registry_and_audit_protocol_cn.md</code>
</p>
<p class="lead">
<code>/Users/kris/code/Talking/ops_layer_and_repair_protocol_cn.md</code>
</p>
<p class="lead">
<code>/Users/kris/code/Talking/thread_context_budget_and_handoff_protocol_cn.md</code>
</p>
<p class="lead">
<code>/Users/kris/code/Talking/detailed_technical_stack_cn.md</code>
</p>
<p class="lead">
<code>/Users/kris/code/Talking/development_subtasks_and_delivery_plan_cn.md</code>
</p>
<p class="lead">
<code>/Users/kris/code/Talking/china_ui_reference_apps_cn.md</code>
</p>
<p class="lead">
<code>/Users/kris/code/Talking/wechat_project_conversation_mapping_cn.md</code>
</p>
</div>
</div>
<h3>建议的直接开发顺序</h3>
<table>
<thead>
<tr>
<th>顺序</th>
<th>先做什么</th>
<th>原因</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>建 `capability_providers` / `capabilities` / `capability_leases` / `audit_requests` 等基础表</td>
<td>先把注册、租约、任务账本落库,后续协议才有稳定主键和状态流。</td>
</tr>
<tr>
<td>2</td>
<td>做 Capability Gateway 的注册、心跳、租约接口</td>
<td>这是摄像头、串口、机器人接入和后续抢占的最小闭环。</td>
</tr>
<tr>
<td>3</td>
<td>做 Audit Orchestrator 和三类专项审计任务协议</td>
<td>先打通任务下发和结构化结果回收,后面再接真实模型与硬件。</td>
</tr>
<tr>
<td>4</td>
<td>接 Evidence Collector 和对象存储</td>
<td>没有证据归档,多模态和硬件审计无法复盘。</td>
</tr>
<tr>
<td>5</td>
<td>接前端项目页的能力占用、审计结果、抢占事件展示</td>
<td>这样手机端和 Web 控制台才能真正看到系统状态,不只是跑后台逻辑。</td>
</tr>
</tbody>
</table>
</section>
<section class="section">
<h2>十六、当前流程思维导图图片版</h2>
<p class="lead">
这张图把当前已经确定下来的主流程、执行层、审计层、能力层和容灾层压成一张图,适合直接对着讨论开发边界和服务拆分。
</p>
<img class="illustration" src="current_flow_mindmap_cn.svg" alt="Codex 多机协作当前流程思维导图" />
<p class="footer-note">
图片文件:
<a href="current_flow_mindmap_cn.svg">current_flow_mindmap_cn.svg</a>
</p>
</section>
<section class="section">
<h2>十七、业务流程思维导图图片版</h2>
<p class="lead">
这张图专门从业务推进角度整理,从你发起项目、主控拆任务、多机开发、审计复核、硬件测试到结果交付和异常恢复,每个环节都标了使用的关键技术。
</p>
<img class="illustration" src="business_flow_mindmap_cn.svg" alt="Codex 多机协作业务流程思维导图" />
<p class="footer-note">
图片文件:
<a href="business_flow_mindmap_cn.svg">business_flow_mindmap_cn.svg</a>
</p>
</section>
<section class="section">
<h2>十八、业务流程泳道图图片版</h2>
<p class="lead">
如果你想更直观看“谁在什么时候做什么”,就看这张泳道图。它现在把用户、主 Agent、Worker、审计层、硬件能力层、运维层 / 运维审计层、数据与容灾层拆成 7 条泳道,并标出了关键技术、开放式运维接入和反向抢救切换点。
</p>
<img class="illustration" src="business_flow_swimlane_cn.svg" alt="Codex 多机协作业务流程泳道图" />
<p class="footer-note">
图片文件:
<a href="business_flow_swimlane_cn.svg">business_flow_swimlane_cn.svg</a>
</p>
</section>
<section class="section">
<h2>十九、运维与抢修泳道图图片版</h2>
<p class="lead">
这张图专门把运维层和运维审计层拆开,展示动态巡检、日志命名、主控在线审批、主控离线紧急接管、修复复验和主控恢复回放的完整闭环。
</p>
<img class="illustration" src="ops_repair_swimlane_cn.svg" alt="运维层与运维审计层抢修流程泳道图" />
<p class="footer-note">
图片文件:
<a href="ops_repair_swimlane_cn.svg">ops_repair_swimlane_cn.svg</a>
</p>
</section>
<section class="section">
<h2>二十、详细技术栈建议</h2>
<p class="lead">
下面这版是“可以直接开工”的技术选型,不再停留在抽象架构层,重点回答:用什么语言、什么数据库、什么消息总线、什么向量库、什么对象存储、什么观测体系。
</p>
<div class="grid">
<div class="card span-4">
<div class="tag status-ok">前端</div>
<strong>TypeScript + Next.js 15 + React 19</strong>
<p class="lead">
先做 PWA / Web 控制台,再视情况封装原生 App。这样手机端和管理后台可以共用一套组件和状态流。
</p>
</div>
<div class="card span-4">
<div class="tag status-ok">云端控制平面</div>
<strong>Python 3.12 + FastAPI + LangGraph</strong>
<p class="lead">
主控编排、审计编排、运维编排、Capability Registry、Thread Registry 都建议统一到 Python 栈。
</p>
</div>
<div class="card span-4">
<div class="tag status-ok">Worker / Agent / Gateway</div>
<strong>Python 3.12</strong>
<p class="lead">
因为需要深度对接 Codex app-server / SDK、串口、音视频、硬件测试和多模态审计Python 最顺手。
</p>
</div>
</div>
<table>
<thead>
<tr>
<th></th>
<th>推荐选型</th>
<th>理由</th>
</tr>
</thead>
<tbody>
<tr>
<td>主数据库</td>
<td>`PostgreSQL 16`</td>
<td>项目、任务、线程、审计、Capability、运维工单都能统一管理事务和 JSONB 足够稳。</td>
</tr>
<tr>
<td>向量库</td>
<td>`pgvector` 起步,后期再考虑 `Qdrant`</td>
<td>MVP 阶段最简单,和主库同备份;规模上来后再拆独立向量库。</td>
</tr>
<tr>
<td>缓存 / 锁</td>
<td>极轻云默认先不用,后续按需补 `Redis 7`</td>
<td>MVP 先用 Postgres 行锁和应用内 TTL cache 顶住,放大后再补 Redis。</td>
</tr>
<tr>
<td>事件总线</td>
<td>极轻云默认 `Postgres job table + LISTEN/NOTIFY`,后续可升级 `NATS JetStream`</td>
<td>先保住功能,不先引入额外常驻服务;等并发和消息量上来再升级。</td>
</tr>
<tr>
<td>对象存储</td>
<td>极轻云默认本机短期缓存 + 异步备份,后续可接 `S3 / MinIO`</td>
<td>云端不常驻对象存储服务,原始大证据尽量留在边缘节点。</td>
</tr>
<tr>
<td>监控指标</td>
<td>极轻云默认健康探针 + 结构化指标表,后续可接 `Prometheus + Grafana`</td>
<td>先保住健康检查和关键指标,不先上重型观测栈。</td>
</tr>
<tr>
<td>日志检索</td>
<td>MVP 用 `Postgres + JSON 日志`,中期补 `ClickHouse`</td>
<td>先快落地,后面再把高吞吐 fault_key 检索单独拆出。</td>
</tr>
</tbody>
</table>
<h3>跨设备运维的具体落地</h3>
<ul class="list">
<li>极轻云默认建议统一走:`Ops Control Plane -> Postgres job queue + LISTEN/NOTIFY -> target Local Ops Agent -> Ops Audit Agent -> Ops Ledger`。</li>
<li>首批支持的远程运维动作:`remote_exec`、`remote_restart_service`、`remote_fetch_logs`、`remote_collect_snapshot`、`remote_push_config`、`remote_switch_account`、`remote_run_runbook`。</li>
<li>首批连接器类型:`ssh`、`http_api`、`windows_service`、`docker`、`lan_rpc`。</li>
</ul>
<p class="footer-note">
详细选型文档见:<a href="detailed_technical_stack_cn.md">detailed_technical_stack_cn.md</a>
</p>
</section>
<section class="section">
<h2>二十一、极限轻云方案(同时考虑容灾)</h2>
<p class="lead">
这里不是因为服务器小才降配,而是无论云服务器配置如何,都主动把云端压缩到最轻;同时保留双云容灾,但让备云只承担接管准备,不承担常态重负载。
</p>
<div class="grid">
<div class="card span-4">
<div class="tag status-ok">保留</div>
<strong>云端只保留控制面核心</strong>
<p class="lead">
建议保留 `FastAPI BFF + Master Agent + Audit Orchestrator + Ops Control Plane + PostgreSQL + pgvector`,其余尽量不常驻。
</p>
</div>
<div class="card span-4">
<div class="tag status-warn">降配</div>
<strong>去掉额外常驻中间件</strong>
<p class="lead">
默认先不单独上 `Redis`、`NATS`、`Qdrant`、`ClickHouse`、`MinIO`,优先用单体服务 + Postgres 顶住。
</p>
</div>
<div class="card span-4">
<div class="tag status-danger">下沉</div>
<strong>把重活前移到终端</strong>
<p class="lead">
视频流、音频流、OCR、检测、串口长采集都放到 Mac / Windows / Test Rig 节点先做边缘处理,只上传摘要、关键帧和异常片段。
</p>
</div>
</div>
<h3>最值得做的减法</h3>
<ul class="list">
<li>把控制平面做成 Python 单体,而不是多微服务。</li>
<li>把事件总线从 `NATS JetStream` 降到 `Postgres job table + LISTEN/NOTIFY`。</li>
<li>先不用 `Redis`,用 Postgres 行锁和应用内 TTL cache 替代。</li>
<li>先不用独立向量库,只保留 `pgvector`。</li>
<li>聊天发送走 HTTP状态更新优先 `SSE`,不要一开始把所有实时能力都堆到 WebSocket 上。</li>
<li>审计 Agent 改成按需触发,不常驻。</li>
<li>运维层做成“轻控制面 + 重边缘执行”,跨设备运维动作由目标节点本地 Ops Agent 执行。</li>
</ul>
<h3>双云容灾下怎么做轻量化</h3>
<ul class="list">
<li>`Cloud A`:主用,只跑控制面单体和 PostgreSQL 主库。</li>
<li>`Cloud B`:热备 / 温备只跑备用控制面单体、PostgreSQL 备库、关键快照和接管脚本。</li>
<li>目标不是让两台云都跑得很重,而是“主云承担业务,备云保持可接管”。</li>
</ul>
<h3>不建议放在云端长期常驻的</h3>
<ul class="list">
<li>持续视频流接入与转码</li>
<li>长时间音频流处理</li>
<li>大规模日志全文索引</li>
<li>独立向量数据库集群</li>
<li>全套 Prometheus + Grafana + Loki + ClickHouse 观测平台</li>
</ul>
<h3>这套极轻云方案能保住什么</h3>
<ul class="list">
<li>单主 Agent 入口</li>
<li>多机 Worker 调度</li>
<li>线程镜像和聊天记录查看</li>
<li>基础跨节点线程对话</li>
<li>按需审计</li>
<li>基础运维修复与主控失联应急链路</li>
</ul>
<p class="footer-note">
详细极轻云方案见:<a href="detailed_technical_stack_cn.md">detailed_technical_stack_cn.md</a>
</p>
</section>
<section class="section">
<h2>二十二、矛盾点与取舍矩阵</h2>
<p class="lead">
这里不是继续堆技术,而是明确说明:在“云端尽可能轻”和“原有业务能力不能砍”之间,哪些可以换实现位置,哪些是唯一真正的硬矛盾。
</p>
<table>
<thead>
<tr>
<th>矛盾点</th>
<th>推荐取舍</th>
</tr>
</thead>
<tbody>
<tr>
<td>手机端要随时看项目进度,但云端又要极轻</td>
<td>保留文本线程、状态、摘要、故障、修复结果实时上云;原始视频、音频、大日志改为按需回传,不持续上传。</td>
</tr>
<tr>
<td>要多机实时协作,但不想跑重消息系统</td>
<td>保留跨节点协作能力,把 `NATS` 降成 `Postgres job queue + LISTEN/NOTIFY`;功能不砍,但吞吐上限降低。</td>
</tr>
<tr>
<td>要主控层、审计层、运维层都在,但云内存很小</td>
<td>保留逻辑角色,不保留多常驻进程;改成单体服务里的模块 + 按需执行器。</td>
</tr>
<tr>
<td>要跨设备运维,还要开放式主运维层</td>
<td>云端只做编排和审批,具体修复动作下沉到目标节点的 `Local Ops Agent` 本地执行。</td>
</tr>
<tr>
<td>要多模态、硬件测试,但云带宽和云成本都要压低</td>
<td>保留测试闭环,放弃原始流持续上云;边缘先做裁剪、摘要、关键帧、短片段。</td>
</tr>
<tr>
<td>既要云端尽可能轻,又要云端容灾</td>
<td>保留双云,但让 `Cloud B` 只做热备 / 温备,不承担常态重负载。主云承担业务,备云承担接管准备。</td>
</tr>
</tbody>
</table>
<h3>最终建议</h3>
<ul class="list">
<li>不砍功能边界,只改变物理部署位置。</li>
<li>云端只保留“系统真相”和“调度真相”。</li>
<li>重执行、重媒体、重测试、重运维动作全部边缘化。</li>
<li>证据上传分冷热两层:热数据立即上云,冷数据按需回传。</li>
</ul>
<p class="footer-note">
更完整的分析见:<a href="detailed_technical_stack_cn.md">detailed_technical_stack_cn.md</a>
</p>
</section>
<section class="section">
<h2>二十三、极限轻云双云部署拓扑图图片版</h2>
<p class="lead">
这张图把最终确定下来的部署原则画成了可落地的拓扑:`Cloud A` 只承担主用控制面和主库,`Cloud B`
只承担热备 / 温备和接管准备,所有重执行、重媒体、重测试、重运维动作全部下沉到设备端。
</p>
<img class="illustration" src="ultra_light_dual_cloud_topology_cn.svg" alt="极限轻云双云部署拓扑图" />
<ul class="list">
<li>`Cloud A`:控制面单体、主 Agent 编排逻辑、PostgreSQL 主库、pgvector、HTTP + SSE。</li>
<li>`Cloud B`备用控制面单体、PostgreSQL 备库、接管脚本、快照和恢复钩子。</li>
<li>设备端Codex Worker、审计执行器、Test Rig、跨设备运维动作、本地证据缓存。</li>
<li>默认不在云端常驻:`Redis`、`NATS`、独立对象存储、重媒体处理、重审计池。</li>
</ul>
</section>
<section class="section">
<h2>二十四、双云最低配置速览</h2>
<p class="lead">
在“云端尽可能轻”且“不能明显降低稳定性和业务保障能力”的前提下,我建议按下面这个下限准备两台云服务器。
</p>
<table>
<thead>
<tr>
<th>角色</th>
<th>硬最低可跑</th>
<th>推荐最低要求</th>
</tr>
</thead>
<tbody>
<tr>
<td>`Cloud A`(主用)</td>
<td>`2 vCPU / 4 GB / 80 GB SSD`</td>
<td>`2 vCPU / 8 GB / 100 GB SSD`</td>
</tr>
<tr>
<td>`Cloud B`(备用)</td>
<td>`2 vCPU / 4 GB / 80 GB SSD`</td>
<td>`2 vCPU / 8 GB / 100 GB SSD`</td>
</tr>
</tbody>
</table>
<ul class="list">
<li>“硬最低可跑”更适合 PoC 或超低并发试运行,不建议拿它做业务保障下限。</li>
<li>真正推荐的最低要求是:`Cloud A = 2C8G / 100GB SSD``Cloud B = 2C8G / 100GB SSD`。</li>
<li>如果你们保留较多审计截图、短视频片段、修复证据和数据库 WAL磁盘建议直接上到 `150 GB`。</li>
<li>带宽重点看稳定性,最低建议 `5 Mbps`,更稳建议 `10 Mbps` 以上。</li>
</ul>
<p class="footer-note">
更完整的最小配置解释见:<a href="detailed_technical_stack_cn.md">detailed_technical_stack_cn.md</a>
</p>
</section>
<section class="section">
<h2>二十五、两种保活模式</h2>
<p class="lead">
系统从设计上同时支持两种备用接管路径:`单云 + 单 Mac 备用控制器`,以及 `双云热备 / 温备`。部署时可以二选一,也可以同时启用。
</p>
<img class="illustration" src="ha_modes_cn.svg" alt="两种保活模式对比图" />
<table>
<thead>
<tr>
<th>模式</th>
<th>组成</th>
<th>优点</th>
<th>边界</th>
</tr>
</thead>
<tbody>
<tr>
<td>`单云 + 单 Mac 备用控制器`</td>
<td>`Cloud A` + 一台常开 `Standby Mac`</td>
<td>更省云成本,本地接管更快,适合已有常开 Mac mini 的环境。</td>
<td>如果主云和现场 Mac 同时断电或断网,这条链路也会失效。</td>
</tr>
<tr>
<td>`双云热备 / 温备`</td>
<td>`Cloud A` + `Cloud B`</td>
<td>公网可达性更稳,不依赖现场某一台设备,接管路径更标准化。</td>
<td>成本更高;最后一跳的硬件接管仍要依赖现场设备在线。</td>
</tr>
</tbody>
</table>
<h3>模式 A单云 + 设备端备用池(首选单 Mac</h3>
<ul class="list">
<li>`Cloud A` 跑控制面单体和 PostgreSQL 主库。</li>
<li>默认首选一台 `Standby Mac`,但系统同时维护 `standby_device_pool`,允许其他接入设备自动成为后备容灾设备。</li>
<li>当前活动备用设备运行备用控制面轻实例、`Standby Controller`、`Ops Rescue Gateway`,以及备库或快照恢复实例。</li>
<li>手机 App 必须支持主 / 备 endpoint 列表切换。</li>
<li>必须准备一条不依赖主云的可达路径,例如同局域网、`Tailscale / WireGuard` 或长期反向隧道。</li>
<li>`Standby Mac` 最低建议:`M1` 或同级 4 核、`8 GB RAM`、`50 GB` 可用 SSD更稳建议 `16 GB RAM / 100 GB SSD`。</li>
</ul>
<h3>模式 B双云热备 / 温备</h3>
<ul class="list">
<li>`Cloud A` 跑主用控制面和 PostgreSQL 主库。</li>
<li>`Cloud B` 只跑备用控制面、PostgreSQL 备库、接管脚本和恢复钩子。</li>
<li>推荐最低要求:`Cloud A = 2C8G / 100GB SSD``Cloud B = 2C8G / 100GB SSD`。</li>
<li>目标不是让两台云都很重,而是“主云承载业务,备云保持可接管”。</li>
</ul>
<h3>统一抽象</h3>
<ul class="list">
<li>开发时统一抽象成 `standby_provider`。</li>
<li>部署时可选:`standby_mac`、`cloud_b`、`both`。</li>
<li>这意味着同一套代码可以跑成:`Cloud A + Standby Mac`、`Cloud A + Cloud B`、或 `Cloud A + Cloud B + Standby Mac`。</li>
</ul>
</section>
<section class="section">
<h2>二十六、还能不能继续压缩云服务器</h2>
<p class="lead">
可以,但要分清楚“功能还能跑”和“稳定性与业务保障能力不明显下降”不是一回事。这里把可继续压缩的边界和不能继续下沉的系统真相拆开。
</p>
<h3>先给结论</h3>
<ul class="list">
<li>`2C8G / 100GB` 不是系统绝对最小,而是“双云容灾下,不明显降低稳定性和业务保障能力”的最低要求。</li>
<li>如果切到 `单云 + 设备端备用池`,并把更多执行、审计、媒体处理下沉到本地,云端可以继续压到 `2C4G / 80GB`。</li>
<li>`1C2G ~ 1C4G` 只适合实验性极限压缩,不建议作为正式业务下限。</li>
</ul>
<h3>哪些能力还能继续下沉到设备端</h3>
<table>
<thead>
<tr>
<th>能力</th>
<th>继续压云的做法</th>
<th>云端仍需保留的真相</th>
</tr>
</thead>
<tbody>
<tr>
<td>Embedding 生成</td>
<td>在 worker / audit 节点本地生成 embedding再写回云端。</td>
<td>向量、chunk 元数据、项目记忆索引。</td>
</tr>
<tr>
<td>长日志处理</td>
<td>本地先裁剪、归类 fault_key、保留最后 N 行再上传。</td>
<td>fault ledger、工单、修复记录。</td>
</tr>
<tr>
<td>视频 / 音频处理</td>
<td>本地做关键帧、短片段、OCR、检测只传证据摘要。</td>
<td>证据索引、审计结论、回放引用。</td>
</tr>
<tr>
<td>审计执行</td>
<td>尽量在拥有能力的节点本地跑专项审计。</td>
<td>审计工单、复验结论、风险等级。</td>
</tr>
<tr>
<td>Test Rig 控制</td>
<td>摄像头、串口、机器人、麦克风、扬声器一律本地网关执行。</td>
<td>租约、抢占真相、任务结论。</td>
</tr>
<tr>
<td>运维修复动作</td>
<td>重启、拉日志、切账号、跑 runbook 都在目标节点本地执行。</td>
<td>审批、修复工单、复验结果。</td>
</tr>
<tr>
<td>额度轮询</td>
<td>每台机器本地采集 Codex 额度,再定时回报精简状态。</td>
<td>统一额度看板、切换历史。</td>
</tr>
</tbody>
</table>
<h3>哪些东西不能继续往本地下沉</h3>
<ul class="list">
<li>项目 / 任务 / 线程账本。</li>
<li>审计结论与修复结论。</li>
<li>`standby_provider` 和 `standby_device_pool` 状态。</li>
<li>主备 endpoint 注册表。</li>
<li>审批结果与权限真相。</li>
</ul>
<h3>单服务器 + 设备端保活时,设备端掉线怎么办</h3>
<ul class="list">
<li>不能只做一个固定 `Standby Mac`,必须做成 `standby_device_pool`。</li>
<li>每台设备声明自己是否可作为容灾设备,并上报常开状态、内存、磁盘、网络可达性和 `takeover package` 版本。</li>
<li>控制面为前 `N` 个候选设备同步最小接管包。</li>
<li>当前活动备用设备心跳丢失后,系统自动提升下一台候选设备为新的 `active_standby_device`。</li>
<li>手机 App、Worker、运维层都读取最新的主 / 备 endpoint 清单。</li>
</ul>
<h3>这个切换会不会很慢</h3>
<ul class="list">
<li>如果备用设备是“冷备”,也就是平时没预部署接管组件,那你的理解是对的:切换会慢,而且容易出问题,因为它等于要临时重新部署一套设备端业务代码。</li>
<li>所以自动切换不能基于冷备,必须基于 `warm standby` 或 `hot standby`。</li>
<li>`warm standby`:设备已预部署 `Standby Controller / Local Ops Agent / Local Ops Audit Agent / Ops Rescue Gateway`,并已同步最近的 `takeover package`。</li>
<li>`hot standby`:在温备基础上做更高频状态同步,切换更快,但会多占一点本地资源。</li>
<li>目标时间建议:冷备 `3~10 分钟`,温备 `15~60 秒`,热备 `5~15 秒`。</li>
</ul>
</section>
<section class="section">
<h2>二十七、API-first / Local-first 极限压缩模式</h2>
<p class="lead">
可以把云端进一步压轻。思路不是把业务砍掉,而是把“云端常驻重服务”改成“外部 API 调用 + 设备端本地执行”,让云端只做最小控制面和最小系统真相。
</p>
<h3>这套模式的核心原则</h3>
<ul class="list">
<li>能通过外部 API 调的,不在你的云端常驻算力。</li>
<li>能在本地设备完成的,不回云端执行。</li>
<li>云端只保留:`API Gateway / BFF`、`Master Agent Runtime`、`PostgreSQL`、最小 `pgvector`、endpoint 注册表、`standby_device_pool`、审批/审计/修复账本。</li>
</ul>
<h3>哪些业务适合 API 化</h3>
<ul class="list">
<li>模型推理:直接调用 OpenAI 或其他模型 API不在你的云端常驻推理服务。</li>
<li>OCR / 检测:优先本地执行,不够时再走外部 API。</li>
<li>文件 / 对象存储:优先本地或 NAS云端只保留 manifest 和索引。</li>
</ul>
<h3>哪些业务更适合本地化</h3>
<ul class="list">
<li>embedding 生成</li>
<li>长日志裁剪</li>
<li>视频 / 音频预处理</li>
<li>专项审计执行</li>
<li>Test Rig 控制</li>
<li>运维修复动作</li>
<li>gptpluscontrol 本地额度采集</li>
</ul>
<h3>这条线下的起步配置</h3>
<ul class="list">
<li>如果并发设备 `<= 3`,而且采用 `单云 + standby_device_pool + API-first + local-first`,起步云配置可以认真尝试 `2C4G / 80GB SSD`。</li>
<li>`1C2G ~ 1C4G` 只建议当实验环境,不建议直接作为正式起步线。</li>
</ul>
<h3>按设备数和任务数弹性升级</h3>
<ul class="list">
<li>起步档:`1 个 Cloud A + standby_device_pool`,并发设备 `<= 3`,建议 `2C4G / 80GB SSD`。</li>
<li>如果同时接入设备数 `> 3`、活跃线程数 `> 10`、专项审计 / 硬件测试并发 `> 2`,就建议升到 `2C8G / 100GB` 或补上 `Cloud B`。</li>
<li>只有在再往上走时,才考虑依次增加 `Redis`、`NATS JetStream`、独立对象存储、独立向量库。</li>
</ul>
</section>
</div>
</body>
</html>