# 📅 2026-05-09 日报 · lijian

## 概览

修掉一个跨 suite flaky 的 audit verify-integrity 测试（timestamptz(3) ms tie-break 破链），同时 logging 模块做了 buffer 溢出按级别丢弃 + trace API 生产屏蔽两处 P1 加固；副线沉淀 6 条 ERR（CI OOM/flock FD 继承/citext/git add-then-edit 等）。

## 一、产出（按价值排序）

### 🔴 audit verify-integrity 跨 suite flaky 修复
- **根因**：`audit_log.when` 是 `timestamptz(3)` ms 精度，`orderBy: { when: 'asc' }` 单字段排序在同毫秒多条记录上 PostgreSQL 不保证 tie-break；`cleanupAllData` 不清 `audit_log` 跨 suite 累积放大碰撞概率
- **方案**：[verifyIntegrity 改按 prevHash 拓扑遍历](backend/src/core/observability/audit/audit.service.ts) 绕开 ts 排序，新增 [order-logs-by-hash-chain.ts](backend/src/core/observability/audit/utils/order-logs-by-hash-chain.ts) 工具 + probe
- **影响**：7 文件 +274 -13（[d99fb604](#)）；CI 36 suites / 449 tests 不再 flaky

### 🟡 logging buffer 溢出按级别优先丢弃 + ERROR/WARN 兜底落文件
- **方案**：[log-writer.service.ts](backend/src/core/observability/logging/services/log-writer.service.ts) buffer 满时优先丢 DEBUG/INFO，ERROR/WARN 直接落文件不丢；新增 [dropOverflow probe](backend/scripts/probes/log-writer-overflow.ts) 验证
- **影响**：[a6b52544](#) +32 -3、[4819f12c](#) +154

### 🟡 logging trace API 生产环境屏蔽 errorStack
- 防 stack trace 经 trace API 外泄到客户端（[db81f94e](#) +3 -2）

### 🟢 logging 文档代码路径与 API 状态漂移修正
- [4b1dbe15](#) docs +6 -5

### 📝 audit PRD v1.3.0 全量重扫真实覆盖率 57.8%
- 按 docs/modules/ 目录逐个统计而不是按 schema 名匹配，修订接入清单（[b4867953](#) +237 -32）

## 二、今日合入的 PR

| PR | 标题 | 状态 | 备注 |
|---|---|---|---|
| #267 | fix(hooks): pre-commit/pre-push 改用本地 ts-node | merged | 见近期 commit 98bc6745 |
| #269 | fix(ci): 用 flock 替代失效的 Gitea concurrency block | merged | 共享测试容器真串行 |
| #270 | fix(ci): 补 PR-B 漏 commit 的 lsof 诊断 + Phase 注释 | merged | ERR-20260509-006 直接产物 |

⚠️ Gitea API token 未配置，PR 数据从近期 git log merge commit 推断。

## 三、Git 活动

6 个 commit（跨 audit / logging 两个分支）：

```
4b1dbe15 13:07 docs(logging-system): 修正代码路径与 API 状态漂移        +6 -5
a6b52544 13:33 fix(logging): buffer 溢出按级别优先丢弃                 +32 -3
db81f94e 13:35 fix(logging): trace API 生产环境屏蔽 errorStack         +3 -2
4819f12c 13:45 test(logging): dropOverflow probe                        +154
d99fb604 14:14 fix(audit): verifyIntegrity 按 prevHash 拓扑遍历         +274 -13
b4867953 17:50 docs(audit): PRD v1.3.0 真实覆盖率 57.8%（追溯昨晚）    +237 -32
```

热点目录：[backend/src/core/observability/{audit,logging}/](backend/src/core/observability/)、[backend/scripts/probes/](backend/scripts/probes/)

## 四、Claude session 摘要

5 个 session 共 44 个用户回合：

- **session 9675277f** (22 turns): logging 模块文档漂移修复 + "现在检查 log 模块还需要哪些优化" → 推动 buffer 溢出/trace 屏蔽两处加固
- **session 7f9330f8** (16 turns): audit verify-integrity flaky 排查 — "先尝试在本地复现这个失败" → 拓扑遍历方案
- **session 884d4117** (3 turns): "看看还有哪些模块没加入审计模块" + 工作流缺陷反思（"在非 dev 分支提出'先做 PR-1'是模糊指令"，要求加本地提醒）
- **session 0ee9cf9b** (2 turns): 触发 daily-report skill
- **session d90310af** (1 turn): 权限模块梳理（前后端权限设计入门）

## 五、事故 & 教训

### ⚠️ ERR-20260509-001: jest --runInBand 跑全量集成测试 V8 默认 ~2 GB heap OOM
- **现象**：32 suites 全在同一 Node 进程，heap 累积到 1879 MB 触上限，PID 始终一致
- **教训**：`--runInBand` 不分 worker，CI 跑全量必须显式抬 `--max-old-space-size` 或拆 shard
- 详见 [.learnings/ERRORS/ERR-20260509-001.md](.learnings/ERRORS/ERR-20260509-001.md)

### ⚠️ ERR-20260509-002: bash 后台 fork 默认继承 FD，flock 释放不掉
- **现象**：slot-claim 退出后，nohup 起的 heartbeat 守护仍持有 OFD 锁，下次 claim 拒锁但 slot-status 显示 free
- **教训**：fork 守护进程前必须 `exec 200>&-` 在子进程中关 FD（或 fork 时 `&` + `<&-`）
- 详见 [.learnings/ERRORS/ERR-20260509-002.md](.learnings/ERRORS/ERR-20260509-002.md)

### ⚠️ ERR-20260509-003: slot-pool 池根目录探测自指 `.pool/.pool` 嵌套
- **根因**：`sl_pool_parent` 启发式探测在 slot 自身也是 worktree 时失效
- 详见 [.learnings/ERRORS/ERR-20260509-003.md](.learnings/ERRORS/ERR-20260509-003.md)

### ⚠️ ERR-20260509-004: 新 worktree 首次 prisma db push 报 citext does not exist
- **根因**：`prisma db push` 不跑 migrations，不会执行 `CREATE EXTENSION citext`；schema 用了 `@db.Citext` 就必须先有扩展
- **修复**：在 PR #248 里
- 详见 [.learnings/ERRORS/ERR-20260509-004.md](.learnings/ERRORS/ERR-20260509-004.md)（与昨日 ERR-20260508-006 同根因，今日定位到具体 fix 路径）

### ⚠️ ERR-20260509-005: audit verify-integrity 跨 suite flaky（本日已修）
- **根因**：timestamptz(3) ms tie-break 破链 + cleanup 不清 audit_log 累积放大概率
- **方案**：拓扑遍历 prevHash 取代时间排序
- 详见 [.learnings/ERRORS/ERR-20260509-005-audit-verify-flaky-cn-default.md](.learnings/ERRORS/ERR-20260509-005-audit-verify-flaky-cn-default.md)

### ⚠️ ERR-20260509-006: `git add` 后再 Edit 文件，新改动不进 staged → commit 漏掉
- **现象**：PR #269 流程里 `/simplify` 后 4 处 Edit，3 处没进 commit；merge 后 grep 字符串才发现，靠 PR #270 补
- **教训**：`git add` 是 snapshot at that moment；任何 staged 后的 Edit 必须重新 add；commit 前用 `git diff --cached` 看实际内容而不是 stat
- 详见 [.learnings/ERRORS/ERR-20260509-006-git-add-then-edit-misses-changes.md](.learnings/ERRORS/ERR-20260509-006-git-add-then-edit-misses-changes.md)

## 六、新增 learnings

| 文件 | 类型 | 适用场景 |
|---|---|---|
| [ci-flock-shared-test-containers](.learnings/2026-05-09-ci-flock-shared-test-containers.md) | feedback | Gitea concurrency 失效，flock 互斥共享测试容器 |
| [gitea-actions-run-display-number-vs-api-id](.learnings/2026-05-09-gitea-actions-run-display-number-vs-api-id.md) | reference | Gitea Actions run 显示号 ≠ API id |
| [precommit-npx-binpath-policy](.learnings/2026-05-09-precommit-npx-binpath-policy.md) | feedback | pre-commit/pre-push 改用本地 ts-node 杜绝 npx 拉远端 |
| [ERR-20260509-001 ~ 006](.learnings/ERRORS/) | error | 见上节 |

## 七、未提交改动

```
?? daily-reports/lijian/2026-05-08.md
```

昨天的日报文件未提交（本次新生成），建议跟今日日报合并一个 chore commit 一起入。

## 八、待决策 / 明日计划

- **CI OOM 根治**（ERR-20260509-001）：`--runInBand` + 32 suites 撞 V8 2GB 上限，需选 ① 抬 `--max-old-space-size=4096` ② 拆 shard 跑 ③ 弃 runInBand
- **slot-pool fork FD 修复**（ERR-20260509-002/003）：守护进程 fork 必须显式关 FD，且 `sl_pool_parent` 探测要加自指防护；分阶段提 PR
- **audit_log cleanup 缺口**：`cleanupAllData` 应纳入 audit_log（前缀过滤），避免下个 flaky 复现
- **工作流提醒沉淀**（session 884d4117）：在非 dev 分支提"先做 PR-1"模糊指令时本地 hook 提示 — 需写到本地 settings.local.json，不入仓
- **权限模块梳理**（session d90310af）：前后端权限设计入门文档需求，待安排
