docs/HANDOFF-2026-09-17-B.md
Rama master · réplica de lectura del repositorio original.
# 交接说明 — 2026-09-17-B
> **当前一份是 [HANDOFF-2026-10-15.md](HANDOFF-2026-10-15.md)** —— 本份已取代(2026-10-15),
> 按 append-only 惯例保留原始结论(含已被取代的部分),只把 tag 行跟到 v3.9.40。索引在 [README.md](README.md)。
**上一份**:[HANDOFF-2026-09-17.md](HANDOFF-2026-09-17.md)(它停在 v3.9.36,不是现状)。
方法论仍看 [AUDIT-LEDGER.md](AUDIT-LEDGER.md)。本份只写**现在还能接手的事实**。
---
## 0. 当前状态
```
产品 tag v3.9.40(2026-09-17 当日值;本份已被 HANDOFF-2026-10-15 取代) —— 本份随发版改。OTA 跟最新 annotated tag。
master == v3.9.40 的提交已推送到 origin
作者 dwgx。禁止 AI 署名 / Co-Authored-By
活树 D:\Project\WindsurfAPI。不要建 D:\Project\windsurf
Mac 路径 D:\Macos\workspace\Project\windsurf 只是联接
Windows Node v24.x;无 /usr/bin/git。五个真实 Git 夹具是带原因的 skip,本机套件 0 fail
```
> 本块在 v3.9.39 发布时写作:`产品 tag v3.9.39` / `master == v3.9.39 的提交已推送到 origin`——那是当时的状态;本轮随 v3.9.40 发布更新为上方所示。
开着的 issue / PR(2026-09-17 核对):#272(图片回合被丢,等上游 A/B)、#273(逐帧校准)、
#258 / #250 / #245 / #239 / #236 / #262 / #208(全部等报告者或现场数据,没有一个卡在我们这边)。
## 1. 接手三分钟内会踩的
1. **不要在 `master` 上 `git commit`**(`.githooks/pre-commit` 拒,且发生在 `git add` 之后)。分支 → ff-only。
2. **`npm test` 不是发布门**;权威是 `npm run test:release`(Linux)。突变规格不在套件里。
3. **不要打开/打印** `.env` / `accounts*` / `*session.env`。OTA 跟 annotated tag。
4. `scripts/` 是**白名单制**(`.gitignore` 里 `scripts/*` + 逐条 `!scripts/<name>`);新脚本不加白名单进不了提交。
5. `test/_research/` 被显式排除在可运行集之外(期望值过期);往里放 `.test.js` 不会被执行。
## 2. v3.9.37 改了什么(v3.9.36 的审查与修复)
**一个 P1 加四个 P2,全部由独立审查复现后修复**,细节见
[releases/RELEASE_NOTES_3.9.37.md](releases/RELEASE_NOTES_3.9.37.md) 与
`.agent/reviews/2026-09-17-main-review/`(REVIEW / REPAIR-ACCEPTANCE / VERIFY-BY-omp)。
1. **凭据锁重写(实例身份)**。锁的身份从"固定路径 + `owner.json`"改成**不可变 claim 实例**
(`claim-<hexhost>-<pid>-<token>/`),固定路径上放**永久普通文件哨兵**;回收只删被证明死亡的那一个
实例;发布前再次确认自己仍持有它。旧实现的两个缺陷:两个回收者会互删新锁(可丢凭据)、
`owner.json` 半写后永久 BUSY。
- **运维副作用**:旧版崩溃留下的**空** `.lock` 目录**不自动接管**(空目录也可能是旧写者的初始化窗口),
显示 BUSY,人工删除该空目录即恢复。这是有意保守,不是缺陷。
- **混版边界**:与未升级的旧写者并行时,存在"旧回收者删 owner + 新代码装标记失败"后残留空目录的窄
窗口,同样人工恢复;不会放大接受范围。见 `src/devin-connect-credentials.js` 中 `MIXED-VERSION BOUNDARY` 注释。
2. **CI 门禁自比较修复**:`wire-byte-identity` 现在由 `scripts/wire-base.mjs` 选**严格祖先的 annotated
release tag** 作为基线并把 SHA 记进日志;无可选基线时失败关闭(退出 3)。
3. `credentialStored` 只在实际落盘后为真;会话索引 resolve 路径登记归属,淘汰不再残留。
## 3. 该暴露 / 不该暴露
与 09-16 §3 相同,未变。公开的:`README*.md`、`docs/releases/*`、`docs/ENV-SWITCHES.md`、
`docs/DEVIN-CONNECT-CUTOVER.md`、本交接链、`docs/AUDIT-LEDGER.md`、`HISTORY-LEDGER*`、源码与测试。
**绝不进 git / 绝不贴到 issue**:`.env`、`accounts*`、`*session.env`、`.trace/`、`.wire-dump/`、
`docs-internal/`、`.agent/`、`.claude/`、`.grok/` 控制面、根 `CLAUDE.md` / `AGENTS.md`。
## 4. 仍未做(不是漏做)
- 默认开 ACU `^22`:#239 等数据;`FREE_TIER_SELECTOR` 仍是 `swe-1-6-slow`。
- **未审计面**:`tool-emulation.js` / `langserver.js` / `conversation-pool.js` / `models.js` / `auth.js` 其余部分。
- #272 / #273 需要上游 A/B 与逐帧抓包。
- `test/_research/responses-cache-hit-seq.test.js` 重定基(技术债)。
- **wire 门禁的证明边界**(2026-09-17 审查,协议 lens):`test/wire-byte-identity.test.js` 只比较 protobuf
请求体,不含 HTTP/Connect 封装与响应流;矩阵不含 #271 的 split-call+stray 形状,replay 组合也在范围外;
**既有缺陷能通过字节相等**(#272 的丢图前后字节相同)。它证明的是"默认路径没动",不是"wire 正确"。
边界已写进该文件头部注释。
- 锁的**动态突变 sweep** 在 Windows 上跑不了(需受信 POSIX git);四进程测试无同步起跑屏障,
不能单独证明发生过争用——确定性交错测试承担该证明。
- 家里云生产树:已弃用,不要 SSH、不要覆盖。
## 5. 发版口令
见 [releases/README.md](releases/README.md)。bump `package.json` 一次、`package-lock.json` **两次**;
annotated tag 在 master push 之后打;不要在 master 上直接 commit。