diff --git a/.workbuddy/memory/2026-10-29.md b/.workbuddy/memory/2026-10-29.md index 87a4873..482b64e 100644 --- a/.workbuddy/memory/2026-10-29.md +++ b/.workbuddy/memory/2026-10-29.md @@ -60,7 +60,50 @@ gzip 实现质量高、后台移动端短标签方案做得细。 - Python 的 **bytes 字面量不支持 `\uXXXX`**(只有 str 支持),写字面量 `b'...\uff08'` 会原样写入 `\uff08` 六个字符。CRLF 文件的字节级替换要用 `\xef\xbc\x88` 或 `.encode()`。 +### 第二批(P2 + 高价值 P3,Docker 按用户要求跳过) + +| # | 改动 | 验证 | +|---|---|---| +| 7 | ReadTimeout 30s→120s(8MB 图需 ≥68KB/s;ReadHeaderTimeout 仍 10s 防 slowloris) | 参数修正 | +| 8 | 投票结果改 stale-while-revalidate:过期先返旧值 + 后台按投票去重重算;Submit 从「删缓存」改「标记过期」(新增 `cache.Expire` / `GetWithExpiry`) | 2 万条:冷启 0.211s → 过期首读 0.023s(9.2x) | +| 9 | 三处幂等:`MarkDeletedByOwner` 条件更新+RowsAffected、`SetPinnedIfCurrent`、追问「上一条已回复」移进事务 | DB 测试 3 项全过 | +| 10 | 私聊首条三写入合并为一个事务(`CreateWithFirstMessage`) | message_count 与实际消息数一致 | +| 11 | `/healthz` + `/readyz`(DB ping 失败 503) | 停 PG 后 healthz 200 / readyz 503 | +| 12 | 验证码失败改同请求渲染,不再丢正文 | 200 + 正文回填 + 不建提问 | +| 13 | `tbBeginSubmit()` 抽出,reCAPTCHA 回调补防重复 | 静态验证(7 个模板受益) | +| 14 | waline 按页加载、`loading="lazy"`、safe-area、三处硬编码接字典(+4 key×4 语言) | /login 无 waline;en 页面零中文残留 | +| 15 | 5 处裸类型断言改带 ok | 编译 + 单测 | + +新增 `verify_round3.py`(6 项)。第二批回归:6/6、4/4、19/19、6/6、3/3,全量单测 + build 通过。 + +**判据随实现更新**:`verify_p1_fixes.py` 的 p1-2b 原来用「是否 302」判断验证码先于密码, +第 12 项改成 200 后判据失效 → 改为「200 且页面报『验证码错误』」。语义不变,判据跟着渲染方式走。 + +### 这次踩的第三个坑(重要,我自己造成的) + +**Windows 上 `Path.write_text()` 默认把 `\n` 转成 `\r\n`**,用它改 LF 文件会让整个文件行尾翻车。 +- 症状:`gofmt -l` 突然把整文件标为未格式化。 +- 后果:`git diff --stat` 会显示整文件重写。 +- 正确写法:`path.write_text(s, encoding="utf-8", newline="\n")`,或用 bytes。 +- **排查手段**:`git diff --stat` 是判断行尾污染最快的信号 —— 真实改动应该只有几十行, + 整文件重写一定是行尾变了。恢复方式:`git show HEAD:` 取其行尾,再统一替换回来。 + +另:本项目 `core.autocrlf=true`,仓库里存 LF、工作区 checkout 成 CRLF, +所以「工作区看到 CRLF」不等于「仓库里是 CRLF」,判断基准要看 `git show`。 + ### 待办 -六项改动仍未 commit;P2/P3 清单在 `outputs/review-2026-10-29.md` 第四、五节。 -建议下一批:投票结果聚合 O(N²)、三处幂等缺陷、ReadTimeout 30s 与 8MB 上传冲突、Dockerfile 构建不出来。 +本批改动已 commit。剩余清单在 `outputs/review-2026-10-29.md` 第四、五节,尚未做的: +- 删除投票的级联 4 步无事务(`route/user/vote.go:1048-1076`) +- 配额递增失败只 Warn → `quota_count` 与真实行数永久漂移(3 处调用点) +- 改写追问回答会重复发「您的提问有回复」邮件 +- `isQuestioner` 用裸 `==` 比 token(与中间件口径不一致) +- CSV 导出选项内容未做公式注入转义 +- `FeatureStateOf` 查询异常时 fail-open +- AutoMigrate 无版本化(改列名会静默丢数据) +- 无备份脚本(用户图片全在对象存储,只备份 DB 恢复后全是裂图) +- 32 个 `