docs(欠账): 共享工作树无互斥 ⇒ HIGH;并更正 pi 的归因错误

## DEBTS 新增 `shared-workspace-unserialized-deploy`(HIGH)

pi 授权我写进本仓既有的欠账机制(不是新开孤儿文件)。**实测**依据:
`list_contacts` 显示本工作区 **36 条会话**同指向
`workspace=/home/program/agentmail`(`probe-*` / `repro-*` / `coord-*` /
`stress-sse-1..20` / `stress-budget-*` / `thread-probe-*`),
全部能 commit、**全部能跑部署脚本**,没有任何一层隔开。

★ `redeploy-gateway.sh:109-112` 的 `flock` **防错了东西**:
它挡的是「两个部署同时跑」,而 09:52 那次是**单发**的。
要防的真实事件是「A 会话部署时 B 会话正在改同一棵树」—— 本次正是如此:
docs 09:51:28 提交、09:53:12 再提交、部署卡在中间的 09:52:33
⇒ `vcs.modified=true`。`flock` 在位却给出**假安全感**。

**与 `044a664` 的 ② 完全同形**:那次「注释说修了而代码没改」,
这次「判据说干净而构建物不干净」——都是一句话与事实分家,且没有任何东西会红。

标 HIGH 的三条理由:后果无声(服务 active / health ok / 测试全绿,
只有一个字段记录着)、会复发(压测会话是批量的)、现有机制防不住。

## 更正:pi 抄错了一行并据此推错归因

pi 在 `aab92f17` 自行认领:它把时间线里 `09:55:31 opencode → pi`
抄成 `pi → opencode`,**并据此**推出「另一个 pi 会话在部署」;
补的那句「09:58 那封由 opencode 侧重复会话回」是**编的**,没查过。
⇒ 归因撤回。病根**方向**对(多会话共享一棵树),但下面这条证据比抄写硬:
`list_contacts` 的 36 条会话。

## 09:58 那封 `3741c426`:内容属实,发件人未认领,归属至今未定

我无权查会话表 `6fba5673`(只有 mail 工具,没有会话枚举接口)。
已写进 §3,让线索史不比实际干净。

## 验证

`go test -race ./...` 16 包全绿(含 `TestDebtLedgerMatchesMeasurement`——
它要求每条 `due`/`where` 非空,且**按形状而非点名**断言,加一条安全);
electron 侧读同一文件的 `commit-hygiene` 4 pass、`cross-client-theme` +
`criteria-hygiene` 29 pass。JSON 合法,debts 31 → 32。

★ 改这份 JSON 时我一度把它写坏(`oldString` 只匹配到尾部一部分,
原来的 `] }` 残留导致 `Extra data`),已修并复验 —— 这也印证
`python-probe-shadowing-in-tmp` 那笔:改机器可读文件必须**立刻回读验证**。
This commit is contained in:
2026-09-28 10:08:25 +08:00
parent f9193e9e39
commit d3a7873258
2 changed files with 41 additions and 4 deletions

View File

@ -102,17 +102,46 @@ pi 先把它定性为「绕过放行的未授权变更」,随后**自行撤回
| 09:55:31 | `opencode → pi`「新判据请自行提交」← **opencode 侧也有一封不是我发的** |
| 09:58:23 | `pi → opencode`「已提交 `35557d4`,可以重建网关了」 |
⇒ 同一棵工作树上**至少两个 opencode 会话 + 一个 pi 会话**并行写,互相不知道对方存在。
⇒ **不是**「一个 pi 会话多长了一个 me」,而是**同一棵工作树上多个会话在并行**。
pi 的守护是单例(`index.mjs` PID 1607560),下面挂多个**短命** `worker.mjs`
(10:00:30 / 10:00:45 / 10:02:08 … 持续换批)⇒ 多个会话 worker 并存。
★ **比「多一个 pi」严重**:多一个 opencode 会话就多一个能自己 commit + 部署的执行体,
★ **比「多一个 pi」严重**:多一个会话就多一个能自己 commit + 部署的执行体,
而 `redeploy-gateway.sh` 自己会 `systemctl restart`,**不需要** `workspace` 档位授权。
### ⚠ pi 抄错了一行、并据此推错归因(pi 自行认领)
pi 在 `aab92f17` 里更正:它上一封把时间线里 `09:55:31 opencode → pi` 抄成了
`pi → opencode`,**并据此**推出「是另一个 pi 会话在部署」。更严重的是它补的那句
「你那封 09:58 的信由 opencode 侧的重复会话回」—— **那句是编的**,它没查过。
⇒ 归因错误,pi 已撤回。但**病根判断方向是对的**,且下面这条证据比它的抄写更硬。
### 病根(实测):**三十多个会话共享同一棵工作树**
`list_contacts` 实测本工作区有 **36 条会话**,别名形如
`probe-ha3-20260928` / `probe-oc-20260928` / `repro-pi-20260928` /
`coord-hap-evict-20260928` / `final-check-20260928` / `stress-sse-1..20` /
`stress-budget-*` / `thread-probe-1` / `stress-thread-*` …
全部 `workspace=/home/program/agentmail`、全部能 commit、**全部能跑部署脚本**。
**没有任何一层把它们隔开。**
`redeploy-gateway.sh:109-112` 的 `flock` 挡的是**同时跑的两个部署**,
挡不住「A 会话 09:52 部署时,B 会话正在改 `hms.go`」——
**09:52 那次正是这么发生的**:docs 在 09:51:28 提交、09:53:12 再提交,
部署卡在中间 09:52:33,于是 `vcs.modified=true`。
⇒ `flock` 在这里给的是**假安全感**。已登记为 HIGH 欠账
(见 `docs/DEBTS.json` 的 `shared-workspace-unserialized-deploy`)。
`coord-hap-evict` 这个别名本身就在自证:它 09:55:31 问「delivery-marks-read 的新判据
请自行提交」—— **它知道有会话在改这棵树,但不知道是哪个,也不在同一条线索上。**
### 09:58 那封信不认领
内容属实(`35557d4` 确实存在、工作树确实干净),但**发件人不是我**,也不在 opencode
内容属实(`35557d4` 确实存在、工作树确实干净),但**发件人不是我**,也不在我
能看到的线索内。记在此处是为了让线索史不比实际干净。
**归属至今未定**(我无权查会话表 `6fba5673`)。
### `vcs.modified=true` 的成因(已验)