# 变更审计记录：trace 日志路径修复 + 小程序登录竞态修复

| 字段 | 值 |
|------|-----|
| 日期 | 2026-03-22 23:04:58 |
| Prompt-ID | P20260322-230035 |
| Session-ID | bc69ee78 |
| Session 路径 | docs/audit/session_logs/2026-03/22/85_77a7e7b7_223315 |

## 操作摘要

修复两个独立问题：(1) 后端 trace 日志路径因 cwd 为 `apps/backend/` 导致相对路径解析错误；(2) 小程序端 `checkAuthStatus()` 与登录操作的竞态条件。同时清理临时调试脚本。

## 本次对话文件变更

### 新增文件
- `docs/audit/prompt_logs/prompt_log_20260322_230035.md`
- `docs/audit/session_logs/2026-03/22/85_77a7e7b7_223315/main_01_bc69ee78.md`
- `docs/audit/session_logs/2026-03/22/87_e3ed0bda_224451/main_01_341f2e98.md`

### 删除文件
- `scripts/ops/_tmp_find_login2.py` — 临时调试脚本，已完成使命
- `docs/audit/session_logs/.../main_01_f8989b2e.md` — 被 bc69ee78 supersede
- `docs/audit/session_logs/.../main_01_d4907912.md` — 被 341f2e98 supersede

## 改动注解

### `apps/backend/app/trace/config.py`
- 变更类型：修改
- 原始原因：`DEV_TRACE_LOG_DIR` 默认值 `export/dev-trace-logs` 是相对路径，后端 cwd 为 `apps/backend/`，日志写到了 `apps/backend/export/dev-trace-logs/` 而非项目根
- 思路分析：`_init_from_env()` 中检测相对路径，若 `NEOZQYY_ROOT` 环境变量存在则 `os.path.join(project_root, raw_log_dir)` 转绝对路径。依赖已有环境变量约定，比 `__file__` 回溯更可靠
- 修改结果：trace 日志统一写入项目根 `export/dev-trace-logs/`，与 EXPORT-PATHS.md 一致。不影响已设绝对路径的环境

### `apps/miniprogram/miniprogram/app.ts`
- 变更类型：修改
- 原始原因：`onLaunch` 中 `checkAuthStatus()` 用旧 token 发 `/api/xcx/me`，401 后 `clearTokens()` 清掉用户刚登录获得的新 token
- 思路分析：token 快照比对——发起前记录 `tokenAtStart`，返回后若 token 已被 `onLogin` 更新则放弃路由和错误处理。最小侵入，无需锁或信号量
- 修改结果：消除 `checkAuthStatus` 与 `onLogin` 竞态窗口

### `apps/miniprogram/miniprogram/utils/request.ts`
- 变更类型：修改
- 原始原因：`tryRefreshToken()` 失败时无条件 `clearTokens()` + `redirectToLogin()`，与 app.ts 竞态联动
- 思路分析：刷新前记录 `tokenBeforeRefresh`，失败时检查 token 是否已变化，已变化则跳过清除
- 修改结果：双重竞态保护，不再盲目清除新 token

### `scripts/ops/_tmp_find_login2.py`
- 变更类型：删除
- 原始原因：临时脚本，定位登录竞态问题后已无用途

## DDL / 迁移检查
- 无新增迁移 SQL
- 无数据库 schema 变更

## 合规状态
- `code_without_docs`: 无缺失
- `api_changed`: false
- `openapi_spec_stale`: false
