# 分工与验收规程（基于本会话实证）

> 目的：把"谁做什么"定下来，避免两个 AI 互相重复、互相猜测。
> 依据：2026-10-16~17 这轮实际发生的事，不是泛泛而谈。

---

## 一、优势对比（每条都有证据）

| 维度 | Trae CN | 我（DeepSeek Harness） | 证据 |
|---|---|---|---|
| **写代码产量** | ★★★★★ 一天交了 12 张卡：`flywheel.py` 54KB、`backend.py` 28KB、测试 13KB、文档 12KB | ★★★ 单次改动小，主要写工具与门禁 | 会话记录：16 张→28 张完成 |
| **按规格施工** | ★★★★★ 严格照卡执行；读了台账，发现"卡片写 `memory\feedback.py` 但 `core\feedback.py` 已被门禁 import"，主动按冲突规则处理 | ★★★ 也会照做，但容易顺手改动 | P1-07 的 done.json notes 原话 |
| **自测覆盖** | ★★★★ 交的卡基本都带自测：55/55、28/28、14/14 | ★★★★ 我建的两道门禁它守着 | 我亲自复跑过 |
| **真机验证** | ✗ **做不到** | ★★★★★ 我在 NX2212/NX2412 上真跑批处理、反射 API、反算孔径 | 92vs2 实体数、`edge.GetLength()÷π`、7 个不存在的 API |
| **远程/网络运维** | ✗ 没有网络出口 | ★★★★★ SSH 进服务器、读源码、测 API 往返、查进程关系 | 找到 Agent OS 记忆 = Hermes MEMORY.md；Postgres 实际没跑 |
| **缺陷定位** | ★★ 能做静态推理 | ★★★★★ 靠"跑一遍"定位：丝锥 Fz 被降额改错对象、精加工 Ap 6.4mm、NxLauncher 5 连缺陷、starlette 漂移 | 7 个真缺陷，全部有可复现证据 |
| **交付可信度** | ⚠️ **写出来的不等于能跑**：`NxLauncher.py` 10KB 从未执行过，5 个缺陷全潜伏；P2-02 投喂 45 分钟零产出 | ★★★★ 但也会犯错：我杀了耦合的 uvicorn 对，服务挂 2~4 分钟（watchdog 自愈） | 两次都写进了台账 |
| **成本** | 你的积分（已预付，不用浪费） | 会话上下文 + 时间 | — |

### 一句话结论

> **Trae 能把"规格"变成"看起来完成的代码"；只有"跑一遍"才能证明它真的完成。**
> 所以正确的分工不是"谁更强"，而是：**Trae 生产 → 我验收**。

这是这次最贵的一课：`NxLauncher.py` 是产品入口，10KB、语法像模像样，但**从未被执行过**，
里面藏着 5 个连锁缺陷（语法错、参数传错、读错数据源、字段名不匹配、缺 import）。
如果当时有个"能跑的人"验一次，就不用到第 8 轮才发现。

---

## 二、分工原则（按"能否被验证"切）

| 判据 | 派给 Trae | 派给我 |
|---|---|---|
| 是否需要**真实执行**才能确认（NX、服务器、外部 API） | ✗ | ✓ |
| 是否需要**网络/远程** | ✗ | ✓ |
| 是否**生产环境**高风险操作 | ✗ | ✓ |
| 是否是"大量重复的代码/测试/文档" | ✓ | ✗（成本高） |
| 是否只需要**静态可判定**（单测、lint、重构、格式） | ✓ | ✗ |
| 是否需要**判定真伪 / 验收** | ✗ | ✓ |

---

## 三、任务归属表

### 给 Trae（纯代码 + 测试 + 文档，不需要真机/网络）

| 任务 | 内容 | 为什么是它 |
|---|---|---|
| **P2-02** | 控制台编码统一（不许用 PYTHONIOENCODING 绕过）+ `verify_refs.ps1` 的 `-Version all` | 纯本地、可自测 |
| **P2-06** | 金标集 20~50 条 + `--from-file` + `correct.bat` + `conflicts` | 纯代码 + 数据 |
| **P3-01（新）** | 给验收方新写的 3 个模块补单元测试：`relay_server_v2.py` / `cloud_backup.py` / `agent_memory.py` | 纯 Python，可离线测（见下方卡片） |
| **P3-02（新）** | 补齐文档：FIX-01/FIX-02/FIX-04 根因文档、云端融合架构图、分工与验收规程索引 | 写作，不需要执行 |

### 给我（真机 / 网络 / 生产风险 / 验收）

| 任务 | 内容 |
|---|---|
| **P1-06B** | 服务器整理与优化（relay 上线、依赖锁定、服务化、磁盘回收、防火墙）——**Trae 没有网络，做不了** |
| **中继加固上线** | 部署 `relay_server_v2.py`（127.0.0.1 + 新令牌 + 审计日志），停掉公网暴露的 v1 |
| **NX 真机验证** | 任何涉及 NX 的结论 |
| **门禁维护** | `run_eval.py` / `check_py_syntax.py` 的新增断言 |
| **验收** | 每一张 Trae 交付的卡 |
| **事故处置** | 线上任何异常 |

### 已由我完成、不需要再派

- 云端融合（Agent 记忆双向同步）· 云端备份工具 · 地址可改配置 · P1-08 代为登记 · NX Open 兼容矩阵

---

## 四、验收规程（我这边怎么做验收）

**不接受"我说做完了"，只看三样东西：**

1. **`done.json` 的 `verify` 字段**必须写"命令 + 实际输出"，不是"已完成"三个字。
2. **我自己跑一遍**：能离线跑的就跑（单测、门禁）；需要真机的我上机跑。
3. **两道门禁必须绿**：
   ```powershell
   python D:\NX_AI\tools\check_py_syntax.py    # 0 错误
   python D:\NX_AI\tests\run_eval.py           # 意外退化 0
   ```

**判定标准：**
- ✅ 通过 = 我复跑的产物与它声称的一致
- ⚠️ 部分通过 = 功能对但缺测试/缺文档/有隐患 → 开修复卡
- ❌ 不通过 = 声称完成但跑不起来 → 退回重做，并记录在台账

**历史命中率（本次会话）**：Trae 交付 12 张，其中
- 实测通过：8 张（P1-07/P1-08/P2-01/P2-03/P2-04/P2-05/P2-06 前置/P0/P1 系列）
- 需返工/超时：2 张（P2-02 超时无产出、FIX-01 修了一个但漏了 4 个）
- 由我代做并登记：1 张（P1-08 已实际完成但没写 done.json）
- 未做：1 张（P1-06 云端，改由我直接对接 Agent OS）

---

## 五、给 Trae 的新卡（P3-01）

```text
【任务 P3-01】给验收方新写的三个模块补单元测试（纯离线，不需要网络/NX）

背景：验收方为"云端融合 + 备份 + 中继加固"写了三个新模块，功能已真机验证，
      但缺少单元测试。这是你能独立高质量完成的活（纯 Python + 可离线）。

三个目标文件（先读代码，不要改逻辑，只加测试；除非发现真 bug —— 那就写清证据并修）：
  1. D:\NX_AI\core\agent_memory.py   与云端 Agent OS 记忆融合（读-改-写、保真、预算）
  2. D:\NX_AI\tools\cloud_backup.py  备份工具（配置读写、地址切换、快照清理）
  3. D:\NX_AI\tools\relay_server_v2.py 中继加固版（在 D:\NX_AI\tools\ 或从服务器取；
     若本地没有，向验收方索取，不要凭记忆重写）

必测点（每点至少 1 个用例）：
  agent_memory.py
    a) upsert_ours：无标签块时"追加"，有标签块时"替换且位置不变"
    b) upsert_ours：**其它块必须逐字节保持不变**（构造 3 条外部块 + 1 条我们的块，
       断言处理后外部块列表与原来完全相等）—— 这是最关键的安全属性
    c) 预算守护：构造超预算输入，断言拒绝且不调用网络
    d) sort_order 在每个 memory_type 内重新编号且稳定
    e) 令牌/配置缺失时给出清晰错误（不静默）
  cloud_backup.py
    f) load_config：不存在时创建默认配置；存在时读取（含 utf-8-sig 容错）
    g) set_url：只改 base_url、SSH host 同步、配置文件被写回
    h) 快照清理：构造 12 个快照目录 + keep=10，断言只留最近 10 个
    i) manifest 结构：包含 cloud/ssh/parts/elapsed_sec 等键
  relay_server_v2.py
    j) _token_ok 的三条路径：Header Bearer 通过、query 通过、错误令牌 401
    k) _drop_legacy=True 时旧令牌不通过
    l) _strip：/relay/poll 与 /poll 归一化到 /poll
    m) 请求体超过 MAX_BODY 时返回 413 而不是崩溃
    n) 并发上限：占满 slots 后新 /cmd 返回 503

测试方式（必须能在**不联网、不连服务器**的情况下跑通）：
  - 用 unittest 或 pytest（项目里已有 tests\ 目录，沿用现有风格）
  - 网络相关用 monkeypatch/桩替换，禁止真实请求 43.167.209.150
  - 文件系统用 tempfile 临时目录，测完清理
  - 新增文件建议：tests\test_agent_memory.py / test_cloud_backup.py / test_relay_v2.py

硬约束：
  - **不许改三个模块的公开行为**（只加测试；要改逻辑必须先给出证据说明是 bug）
  - 不许在测试里写死密码/令牌/服务器地址
  - 不许把密钥写进任何文件
  - 跑完必须给出：每文件的用例数 + 通过数 + 实际命令与输出

验收标准（验收方会自己复跑）：
  python D:\NX_AI\tests\test_agent_memory.py  → 全绿，且 ≥5 个用例
  python D:\NX_AI\tests\test_cloud_backup.py  → 全绿，且 ≥4 个用例
  python D:\NX_AI\tests\test_relay_v2.py      → 全绿，且 ≥5 个用例
  python D:\NX_AI\tools\check_py_syntax.py    → 仍 0 错误
  python D:\NX_AI\tests\run_eval.py           → 仍"意外退化 0"
```

---

## 六、协作节奏（建议）

```
我：先做"只有我能做"的（真机/服务器）→ 产出可被静态验证的代码 + 验收标准
Trae：按卡生产代码/测试/文档 → 写 done.json
我：复跑验收 → 绿则收，红则出修复卡
```

**注意两个已踩的坑**：
1. 给 Trae 的卡必须写清"**不许重做已完成的部分**"（它已经因为没读到而过一次：把已修好的逻辑差点改回去）。
2. 投喂前先跑两道门禁确认起点干净（写进了公共约束）。
