← 回工程日志
# #1 待办看板:任务日志序号与待办条目100%对账(序号改由服务端算 没条目的活走运维日志 新增对账页/规矩页)

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

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

---

## 2026-10-14 第1次
- 执行者: deepseek-v4-flash(晚风 · 电脑A)
- 用户原话(问题): "待办网址的今日任务、往日任务和任务日志是不是对账对不上?它们应该是 100% 对齐的!今日任务的日志已经有四条了,但我刚加的条目还是序号一,它应该是序号五吧?"

### 一、根因(三条,都实测确认,不是猜)
1. **序号是"干活的人自己报的",不是条目的身份** —— `/ai_done` 原来收 `idx` 就直接拿它当序号命名日志 `#idx_标题.md`;电脑B 的 27B 是**手写**日志文件的,编号自己编 → 出现 `#22`/`#23` 偏移、`#21` 空号。
2. **日志的"日期"记的是干活那天(10-14),不是任务所属那天(10-13)** → `/logs` 分组跑错日期组。
3. **`#24`/`#25` 两条根本没有对应待办条目**(用户口述的活)→ 白占序号,污染对账。

### 二、定下的规矩(唯一真源 = 待办条目)
- 条目序号 = 它在「所属日期清单」里的位置(每天从 #1 起)。今日 → `~/桌面/待办.md` 行序;往日 → `archive/<日期>.md` 行序。
- **任务日志 `#N_标题.md` 只属于待办条目**,N 必须 === 条目序号;日志头必须写 `归属日期:`(任务所属日,不是干活日)+ `序号:`。
- **AI 禁止自报序号**:`/ai_done` 改成给条目身份(`title` 优先,往日加 `date`),序号由服务端从清单位置推导。
- **没有对应待办条目的活 → 运维日志**(`/ops/add`,`普通工程日志/日期_标题.md`),不占序号、不参与对账。

### 三、改了什么
**一次性数据修复** `~/手机待办/fix_seq_20261014.py`(幂等,先 tar 备份 `logs_bak_20261014_序号对账.tgz`):
```
改号: #22_待办网址输入框滑动.md -> #21_...  (归属 2026-10-13)
改号: #23_勾选后页面跳最上方.md -> #22_...  (归属 2026-10-13)
转运维: #24_往期条目展开+玻璃质感+AI备注折叠.md -> 普通工程日志/2026-10-14_往期条目可展开详情 + 当日条目玻璃质感 + AI备注折叠.md
转运维: #25_往日条目序号+与任务日志对齐.md      -> 普通工程日志/2026-10-14_往日条目序号恢复 + 与任务日志对齐.md
```
(用户给的方案1「新条目算 #5」是**错的**:会让页面序号与清单位置脱钩,勾选/编辑/删除全乱。正解是把那 4 条日志放回该在的地方。)

**代码根治** `~/手机待办/todo_server.py`(备份 `.bak_20261014_seq_align_v2`,+约 260 行):
- `log_meta()`:序号/归属日期以日志头为准,老日志回退文件名+首条出现时间(**旧日志不用改也兼容**)
- `ensure_log(n, title, who, owner_date)`:按归属日建日志,头两行写 `归属日期`/`序号`;发现序号漂移就改名对齐(`_realign_log`)
- `resolve_item()`:**序号由服务端从条目推导**,title 支持模糊+回溯最近 7 天;匹配不到 → 明确拒绝
- `/ai_done`:给 title/date 就能报完成;**没有待办条目就挡住**,并回一条 `请写运维日志 /ops/add`+规矩链接
- `/delete`:删条目后自动 `realign_day()` 对齐后续序号;被删条目自己的日志 → `park_log_to_ops()` 转运维(不留孤儿)
- `/logs`:按**归属日期**分组、组内用真序号、序号断档标 ⚠️、每条加「↗条目」
- 主页/往日折叠区/归档日页:每条待办后加 **📋 徽章**(有日志→蓝色可点;打钩却没日志→红字「缺日志」)
- **新增 `/check` 对账页**(连接键=(归属日期,序号),列出所有不一致 + 一键对齐按钮)、**新增 `/rules` 规矩页**(`/rules` 纯文本给任何 agent curl,`/rules.html` 带样式)
- 顺手修一个隐藏 bug:`ops_detail()` 引用了未定义的 `LOG_CSS` → 点运维日志详情必 500,已改 `GLASS_CSS`

### 四、证据(真命令 + 原始输出)
```
$ python3 e2e_seq_align_20261014.py     # 临时目录里真起 HTTP 服务,跑完整链路(不碰真实数据)
===== E2E 结果: 28 通过 / 0 失败 =====
(含:今日条目 → seq=1;往日任务 date=10-13 → seq=2 且归属日期=昨天;
  没条目的活被挡住且提示 /ops/add;/ops/log 200;删条目后日志转运维、无孤儿;
  /realign 可用;"/" "/logs" "/check" "/ops" "/archive" "/archive/<日>" "/ai" 全 200)

$ python3 test_seq_align_20261014.py    # 真实数据只读自检
== 1) 对账 check_alignment ==   ✅ 0 处不一致
   2026-10-13 #1..#22 全在,序号连续;#21#22 就是「输入框滑动」「勾选跳最上方」

$ curl -s --noproxy '*' http://127.0.0.1:8190/check | grep -o '✅ 0 处不一致'
✅ 0 处不一致
$ curl -s --noproxy '*' http://127.0.0.1:8190/logs | grep -o '<span class="num">#[0-9]*</span>'
# #1 #2 ... #21 #22            (10-13 组 22 条齐全,10-14 组不再有假的 4 条)
$ curl -s --noproxy '*' http://127.0.0.1:8190/ | grep -o 'class="lchip[^"]*"' | sort | uniq -c
     22 class="lchip on"     (0 条「缺日志」误报)
$ curl -s https://127.0.0.1:9445/check -k → 200
$ systemctl --user restart phone-todo-web → active;8190/9445 均 200;journal 无 error
```
新条目实测:看板第 2 条 `TITLE` → `/ai_done` 返回 `{"ok":true,"date":"2026-10-14","seq":2,"log":"#2_....md"}`
(**序号是服务端算出来的,AI 没自报** —— 这就是本次修的核心。)

### 五、结论
✅ 任务日志 ↔ 待办条目(今日任务/往日任务)现在 100% 对齐,**对账页 0 处不一致**;以后谁编号都由服务端说了算,电脑B 的 27B 也不会再自己编序号。

### 六、遗留 / 卡点
- `archive/2026-10-12.md` 是当年搬运的旧快照(同样 9 条已搬进 10-13 清单),它的 9 条**没有独立日志**属于历史事实;对账尺子统一成「只在有日志的日期上核对」,所以不误报、也不改历史数据。
- 规矩已写进三处:`/rules`(页面+纯文本)、skill `todo-board-and-worklogs`、MEMORY。**电脑B 那边干活前先 `curl http://192.168.13.176:8190/rules` 读一遍再动手。**
- 序号上限 = 当天条目数;**跨天的日志文件名可能同号**(如 10-13 的 #2 和 10-14 的 #2),靠「归属日期」分组区分,`find_log` 按标题定位,不会串。

## 2026-10-14 验收通过
- 验收人: 用户
- 备注: (无)
电脑A 10-20 21:33