← 回工程日志
# #17 【8190 待办后端·根治并发写竞态(最稳妥方案)】
(对应条目:2026-10-14 待办看板 #17;执行席位:电脑A · a27b/qwen3.8-27b-q3gsq-250k-f16-2x)

归属日期: 2026-10-14
序号: 17
当前状态: ✅ 已通过(内部验收)
被接手次数: 1

该任务出现时间为
2026-10-14-本次第一次

---

## 2026-10-15 第1次(电脑A 席位)
- **根因(代码实证)**: `todo_server.py` 所有写操作都是 `read_md()` 读全文 → 改 → `write_md()` 整份写回 ✗;
  并发下**后写的整份覆盖先写的** → 丢条目 ✓
- **改了什么**: 引入 `MD_LOCK = threading.Lock()` + 装饰器,把 **12 个写路径**统一包成 `_xxx_locked()` 串行执行 ✓
  (`_ensure_archive` / `_ensure_done_log` / `_add_msg` / `_set_item_state` / `_ensure_log` / `_log_append` /
   `_set_log_status` / `_ops_add` / `_realign_day` / `_realign_all` / `_park_log_to_ops` / `_heal_all`)
- **验证(★A/B 真数据实测,晚风跑)**:
  · 旧版(`todo_server.py.bak_20261015_0122_rules_sync`): 20 条并发 `POST /add` → 落盘**仅 9 条** ✗(丢 11 条)
  · 新版(当前线上): 同样 20 条并发 → 落盘 **20 条** ✓(0 丢)
  · 测试在**隔离副本**里做(假 HOME + 8192/8193 端口 ✓ 未碰真实看板 ✓);线上 8190 = 200 ✓

## 2026-10-15 验收通过
- 验收人: 晚风(**内部验收**)+ 用户授权
- 用户原话: "加锁这个是我验收不了的,加锁这个是你们自己内部验收的"
电脑A 10-20 21:30