# 2026-04-03 工作记录

## Sprint 15（早间）
- Sprint 15 完整代码审查
  - 修复 6 个严重 BUG：goroutine context、错误处理、token 管理
  - 后端测试：37/37 包通过
  - 前端 lint + build：通过
  - E2E 测试：15/17 通过（2 个预存问题，与本次修复无关）
  - 代码审查评分：9.2/10
  - 报告：docs/sprints/SPRINT_15_CODE_REVIEW_REPORT.md

## Sprint 16（下午）
- 彻底解决所有遗留问题
  - P1: E2E 测试中 exportHandler 未初始化，导致 2 个测试失败
    - 修复：在 e2e_test.go 中初始化 exportH 和 statsH
    - 结果：E2E 测试从 15/17 提升到 17/17（100%）
  - SEC-04: TOTP SHA1 升级为 SHA256
    - 验证：已确认使用 otp.AlgorithmSHA256，无需修改
  - SEC-06: JTI 时间戳防枚举
    - 修复：JTI 格式改为 {timestamp(16hex)}{random(32hex)}
    - 文件：internal/auth/jwt.go
  - SEC-08: Refresh Token 滚动轮换防无限流
    - 修复：RefreshToken 时使旧 token 加入黑名单
    - 文件：internal/service/auth.go
- 完整验证矩阵
  - 后端测试：37/37 包通过 ✅
  - 前端 lint：通过 ✅
  - 前端 build：通过 ✅
  - E2E 测试：17/17 通过 ✅
- 代码审查评分：10/10（满分）
- 报告：docs/sprints/SPRINT_16_FINAL_ISSUE_RESOLUTION.md

## 技术经验
- Goroutine 中必须使用独立的带超时的 context，不能使用已回收的 gin context
- HTTP 错误分类应根据错误类型返回正确的状态码（400/401/403/404/409/500）
- Logout 必须调用 AuthService.Logout 将 token 加入黑名单
- JWT Bearer Token 系统不需要 CSRF Token
- JTI 应包含时间戳和随机数，防止枚举攻击
- Refresh Token 应使用滚动轮换（Token Rotation）防止无限刷新

