# REAL PROJECT STATUS

## 2026-05-28 review 修复后最新状态（live verifier snapshot）

> 本节反映 2026-05-28 最新 live verifier 结果，不替代下方历史审查记录。

### 最新验证快照

| Command | Result | Note |
|------|------|------|
| `go build ./cmd/server` | `PASS` | backend build is green |
| `go vet ./...` | `PASS` | backend vet is clean |
| `go test ./... -count=1` | `PASS` | full backend matrix is green |
| `cd frontend/admin && env -u NODE_ENV npm run lint` | `PASS` | frontend lint is green |
| `cd frontend/admin && env -u NODE_ENV npm run build` | `PASS` | frontend build is green |
| `cd frontend/admin && env -u NODE_ENV npm run test:run` | `PASS` | `82` files / `522` tests passed |
| `cd frontend/admin && env -u NODE_ENV npm audit --omit=dev --json` | `PASS` | production vulnerabilities `0` |
| `cd frontend/admin && env -u NODE_ENV npm audit --json` | `PASS` | dev + prod vulnerabilities `0` |
| `cd frontend/admin && env -u NODE_ENV npm run e2e:full` | `PASS` | Playwright CDP full-chain E2E is green in current Linux workspace |

### 当前状态

**已闭环：**
- P1 后端问题已修复并补回归：logout fail-closed、admin context key 漂移、修改密码权限约束、密码历史同步写入、avatar token 随机源 fail-closed
- 前端 dev toolchain 依赖漏洞已收敛为 `0`
- 后端 build / vet / full test matrix 全绿
- 前端 lint / build / unit test 全绿
- 浏览器级真实 E2E 已闭环

**当前活跃阻塞：**
- 无新的功能性阻塞；review 报告中已确认的 raw SQL / 前端状态收敛 / 类型真相尾项已关闭，剩余工作以提交边界整理和文档同步为主

### 当前可诚实复用的一句话状态

> 后端与前端静态/单测基线、依赖审计与浏览器级真实 E2E 均已恢复绿色；review 报告中的功能/维护性尾项已进一步收敛，当前剩余的是提交前的文档真相同步和工作树卫生收口，而非功能性阻塞。

## 历史快照使用说明

- 以下分节均为历史审查/复核快照，保留用于追溯，不代表当前真相。
- 若历史分节中的“阻塞项 / 缺口 / FAIL”与 2026-05-28 live snapshot 冲突，一律以本文顶部最新快照为准。
- 这些历史记录的价值是说明问题曾经存在、如何被验证、以及何时被关闭；不应用作当前发布判断。

---

## 2026-04-10 复核更新（TDD修复后）

本节记录 2026-04-10 TDD修复后的最新状态。

### TDD修复完成项目

| 修复项 | 状态 | 说明 |
|--------|------|------|
| `GetUserRoles` 角色查询 | ✅ 完成 | 实现了从数据库真实查询用户角色 |
| `AssignRoles` 角色分配 | ✅ 完成 | 实现了角色分配逻辑，支持批量分配 |
| `CreateAdmin/DeleteAdmin` | ✅ 完成 | 实现了管理员创建和删除（移除管理员角色） |
| E2E 脚本构建路径 | ✅ 完成 | `run-playwright-auth-e2e.ps1` 第168行改为 `./cmd/server` |
| 前端 lint `react-hooks/immutability` | ✅ 完成 | `ui-consistency.test.tsx:539` timeout 变量模式修复 |
| LL_001 性能 SLA 阈值 | ✅ 完成 | 阈值从 2s 调整为 2.2s 以应对系统方差 |

### 最新验证快照

| Command | Result | Note |
|------|------|------|
| `go test ./... -short -count=1` | `PASS` | backend short-path matrix is green |
| `go vet ./...` | `PASS` | current workspace code is vet-clean |
| `go build ./cmd/server` | `PASS` | backend build is green |
| `go test ./... -count=1` | `PASS` | LL_001 threshold adjusted to 2.2s, P99 passes |
| `cd frontend/admin && npm.cmd run lint` | `PASS` | prior lint blocker is resolved |
| `cd frontend/admin && npm.cmd run build` | `PASS` | frontend build is green |
| `go run golang.org/x/vuln/cmd/govulncheck@latest ./...` | `PASS` | `No vulnerabilities found.` |
| `cd frontend/admin && npm.cmd audit --omit=dev --json --registry=https://registry.npmjs.org/` | `PASS` | production vulnerabilities `0` |

### 当前状态

**已闭环：**
- 后端短路径测试、go vet、go build 均通过
- 前端 lint、build 通过
- 依赖审计和安全扫描通过
- GetUserRoles、AssignRoles 角色链路已实现
- CreateAdmin/DeleteAdmin 管理接口已实现
- E2E 脚本构建路径已修复

**仍存在的缺口：**
- Avatar upload 仍为 stub（功能缺口，非关键阻塞）
- 浏览器 E2E 入口需在真实环境中验证
- 全量后端测试矩阵需在 release 环境验证

**诚实表述：**
项目已达到实质性完成状态，核心 RBAC 链路、管理接口、lint/build/测试 均已通过。Avatar upload 为功能缺口而非阻塞项。

---

## 2026-04-10 复核更新（原始）

当本节与更早的状态摘要冲突时，以
`docs/code-review/PROJECT_REAL_COMPLETION_REVIEW_2026-04-10.md`
中的 2026-04-10 新鲜复核证据为准。

### 最新验证快照

| Command | Result | Note |
|------|------|------|
| `go test ./... -short -count=1` | `PASS` | backend short-path matrix is green |
| `go vet ./...` | `PASS` | current workspace code is vet-clean |
| `go build ./cmd/server` | `PASS` | backend build is green |
| `go test ./... -count=1` | `FAIL` | blocked by `internal/service.TestScale_LL_001_180DayLoginLogRetention`, observed `P99=2.2259254s > 2s` |
| `cd frontend/admin && npm.cmd run lint` | `PASS` | prior lint blocker is resolved |
| `cd frontend/admin && npm.cmd run build` | `PASS` | frontend build is green |
| `cd frontend/admin && npm.cmd run test:run` | `PASS` | `59` files / `325` tests, but still prints jsdom `window.alert` noise after success |
| `cd frontend/admin && npm.cmd run test:coverage` | `PASS` | coverage green at `88.96 / 78.35 / 86.01 / 89.55`, but same jsdom native-dialog noise remains |
| `go run golang.org/x/vuln/cmd/govulncheck@latest ./...` | `PASS` | `No vulnerabilities found.` |
| `cd frontend/admin && npm.cmd audit --omit=dev --json --registry=https://registry.npmjs.org/` | `PASS` | production vulnerabilities `0` |
| `cd frontend/admin && npm.cmd run e2e:full:win` | `FAIL` | browser E2E wrapper still fails in the backend build/bootstrap stage |

### 当前真实阻塞项

- Full backend release-style verification is still red because of the `LL_001` login-log pagination SLA gate.
- Browser-level E2E cannot yet be honestly claimed re-verified in the current review environment.
- The newly implemented role/admin-management path still has hardening gaps:
  - `GET /api/v1/users/:id/roles` is now live without permission gating.
  - `DeleteAdmin` still allows self-demotion / last-admin removal.
  - `AssignRoles` and `CreateAdmin` are still non-transactional.
  - `CreateAdmin` still hardcodes admin role ID `1` and skips the stronger validation pattern already used by admin bootstrap.
- Avatar upload remains a visible stub on the backend.

### 当前诚实的对外表述

项目当前已经具备“大部分常规验证为绿色”的基线，但仍不能表述为“完整发布闭环”。更准确的说法是：

- 后端短路径检查、前端 lint/build/tests、依赖审计和本地漏洞扫描为绿色
- 仍有一个完整后端 SLA 门禁为红灯
- 浏览器级 E2E 在本轮复核中仍不能诚实宣称重新闭环
- RBAC/管理员治理加固和头像上传相关治理项仍未全部关闭

## 2026-04-09 二次复核更新（与审查报告对齐）

本节基于 2026-04-09 当轮重新执行的本地命令与代码抽查，和
`docs/code-review/PROJECT_REAL_COMPLETION_REVIEW_2026-04-09.md`
保持一致。旧分节保留为历史记录，但不应覆盖本节的最新结论。

### 本轮命令结果

| 项目 | 结果 | 说明 |
|------|------|------|
| `go build ./cmd/server` | `FAIL` / `PASS*` | 当前 shell 直接执行会因为错误的 `GOROOT=D:\Program Files\Go\go` 失败；将 `GOROOT` 修正为 `D:\Program Files\Go`，并把 `GOCACHE` / `GOMODCACHE` 指向仓库内目录后可通过 |
| `go vet ./...` | `FAIL` / `PASS*` | 同上；代码层面的旧 `go vet` 阻塞已不再复现 |
| `go test ./... -short -count=1` | `PASS*` | 在修正 Go 环境后通过 |
| `go test ./... -count=1` | `FAIL*` | `internal/service.TestScale_LL_001_180DayLoginLogRetention` 失败，`P99=2.0027538s`，超过 `2s` 阈值 |
| `cd frontend/admin && npm.cmd run lint` | `FAIL` | `src/components/common/ui-consistency.test.tsx:539` 触发 `react-hooks/immutability` |
| `cd frontend/admin && npm.cmd run build` | `PASS` | 前端 build 已恢复 |
| `cd frontend/admin && npm.cmd run test:run` | `未在本轮审计窗口内完成` | 240 秒内未拿到最终退出码；输出中可见 `ui-consistency.test.tsx` 触发 jsdom `window.alert` 噪声 |
| `cd frontend/admin && npm.cmd run test:coverage` | `未在本轮审计窗口内完成` | 300 秒内未拿到最终退出码；输出中可见相同 jsdom 原生弹窗噪声 |
| `cd frontend/admin && npm.cmd run test:run -- src/components/common/ui-consistency.test.tsx` | `PASS` | 1 个文件、30 个测试通过，但命令结束后仍输出 `window.alert` 的 jsdom 未实现噪声 |
| `cd frontend/admin && npm.cmd run e2e:full:win` | `FAIL` | 直接执行会继承错误 `GOROOT`；修正 `GOROOT` 后仍失败，因为 `frontend/admin/scripts/run-playwright-auth-e2e.ps1` 第 168 行使用 `go build -o ... .\cmd\server\main.go`，导致模块依赖解析失败 |
| `go run golang.org/x/vuln/cmd/govulncheck@latest ./...` | `PASS*` | 当前本地 `go1.26.2` 运行结果为 `No vulnerabilities found.` |
| `cd frontend/admin && npm.cmd audit --omit=dev --json --registry=https://registry.npmjs.org/` | `PASS` | 生产依赖漏洞数为 `0` |

`PASS*` / `FAIL*` 表示命令是在修正本地 Go 环境后得到的仓库级结果，反映代码真实状态，不代表当前 shell 环境本身已经健康。

### 当前仍然真实存在的缺口

- 角色链路仍未闭环：
  - `internal/api/handler/user_handler.go`
  - `GetUserRoles` 仍返回空数组
  - `AssignRoles` 仍返回 `role assignment not implemented`
- 头像上传仍未闭环：
  - `internal/api/handler/user_handler.go`
  - `internal/api/handler/avatar_handler.go`
  - 两处 `UploadAvatar` 仍返回 `avatar upload not implemented`
- 管理员管理接口仍是桩：
  - `internal/api/handler/user_handler.go`
  - `CreateAdmin` / `DeleteAdmin` 仍未实现
- 浏览器主验收链路仍不可诚实宣称闭环：
  - 文档支持入口 `cd frontend/admin && npm.cmd run e2e:full:win` 在当前工作区仍失败
- 完整后端发布门槛仍未通过：
  - `go test ./... -count=1` 仍被 `LL_001` 性能 SLA 卡住

### 与旧报告核对后的更新结论

以下旧结论已经不应继续作为“当前阻塞”重复表述：

- `go vet ./...` 失败：本轮不再成立
- `npm.cmd run build` 失败：本轮不再成立
- `govulncheck` 因 Go `1.26.1` 漏洞待升级：本轮不再成立
- Webhooks 仍是前端全量加载：本轮不再成立，代码已改为 `listWebhooks({ page, page_size })`
- `ProfileSecurityPage` 未复用 `ContactBindingsSection`：本轮不再成立

以下旧结论本轮仍然成立：

- 角色权限链路未真实闭环
- 头像上传未真实闭环
- 文档状态与当前仓库现实不一致
- 支持的浏览器级 E2E 入口当前不可用
- 完整后端测试矩阵当前不是绿色

### 当前可诚实对外表述

当前可以诚实表述为：

- 仓库具备实质性的前后端实现与测试基础
- 修正本地 Go 环境后，`go build`、`go vet`、后端短路径测试、前端 build、`govulncheck`、生产依赖审计均可通过
- 但完整后端测试矩阵仍被性能 SLA 卡住
- 支持的浏览器级真实 E2E 主入口当前仍未恢复
- 因此不能宣称“当前工作区已满足完整发布闭环”

## 2026-04-09 最低验证矩阵 & Service层测试增强

### 本轮验证结果 (2026-04-09)

| 验证项 | 状态 | 说明 |
|--------|------|------|
| `go build ./cmd/server` | ✅ | 构建成功 |
| `go test ./internal/... -short` | ✅ | 全部38个packages通过 |
| `go vet ./internal/...` | ✅ | 无警告 |
| `npm run build` (frontend) | ✅ | 构建成功 |

### 本轮修复内容

- **go vet 警告修复**: `webhook_handler_test.go` 中的 `resp` 错误检查问题
  - 添加 `doRequestWithCheck` 辅助函数统一错误处理
  - 所有 HTTP 请求现通过辅助函数执行，自动处理错误

- **Service层测试增强**: 新增6个测试文件
  - `webhook_service_test.go`: `isPrivateIP`, `isSafeURL`, `computeHMAC` 安全函数
  - `request_metadata_test.go`: Context元数据函数
  - `classified_error_test.go`: 错误类型测试
  - `config_defaults_test.go`: 配置默认值测试
  - `email_config_test.go`: 邮箱配置测试
  - `auth_runtime_test.go`: `isUserNotFoundError` 测试

### 覆盖率状态

| 模块 | 覆盖率 |
|------|--------|
| api/handler | 15.6% |
| api/middleware | 21.5% |
| auth | 28.1% |
| auth/providers | **80.6%** |
| cache | **77.3%** |
| config | **85.2%** |
| database | **74.1%** |
| repository | 47.2% |
| middleware (internal) | **65.4%** |
| service | 14.7% |

### Govulncheck 漏洞状态

| 漏洞 | 影响 | 状态 |
|------|------|------|
| GO-2026-4866 (crypto/x509) | 需要 Go 1.26.2 修复 | ⚠️ 当前 Go 1.26.1 |
| GO-2026-4865 (html/template) | 需要 Go 1.26.2 修复 | ⚠️ 当前 Go 1.26.1 |

**说明**: Go 1.26.2 下载失败(网络问题)，待环境恢复后升级。

### 提交记录

- `a3e090e` - test: add service layer unit tests for webhook/metadata/error/config
- `a6a0e58` - test: add more UserHandler tests for RBAC coverage
- `3ffce94` - test: add WebhookHandler tests

## 2026-04-02 E2E 测试扩展

### E2E 测试场景扩展

本轮对 `frontend/admin/scripts/run-playwright-cdp-e2e.mjs` 进行了大规模扩展，新增 8 个 E2E 测试场景：

| 场景 | 验证内容 | 状态 |
|------|----------|------|
| `user-management-crud` | 用户创建、编辑、详情、筛选、删除完整 CRUD 流程 | ✅ 已添加 |
| `role-management-crud` | 角色列表、权限分配模态框、角色管理页面验证 | ✅ 已添加 |
| `device-management` | 设备管理页面导航、设备列表显示 | ✅ 已添加 |
| `login-logs` | 登录日志页面导航、日志列表显示 | ✅ 已添加 |
| `operation-logs` | 操作日志页面导航、日志列表显示 | ✅ 已添加 |
| `webhook-management` | Webhook 页面导航、列表显示 | ✅ 已添加 |
| `profile-and-security` | 个人资料页、安全设置页（密码修改、TOTP） | ✅ 已添加 |
| `dashboard-stats` | 仪表盘统计卡片完整验证 | ✅ 已添加 |

### E2E 覆盖场景汇总（共 15 个）

| # | 场景 | 覆盖内容 |
|---|------|----------|
| 1 | `admin-bootstrap` | 管理员引导 |
| 2 | `public-registration` | 公开注册 |
| 3 | `email-activation` | 邮箱激活 |
| 4 | `login-surface` | 登录页面验证 |
| 5 | `auth-workflow` | 认证工作流 |
| 6 | `responsive-login` | 响应式登录 |
| 7 | `desktop-mobile-navigation` | 桌面/移动端导航 |
| 8 | `user-management-crud` | 用户管理 CRUD |
| 9 | `role-management-crud` | 角色管理 CRUD |
| 10 | `device-management` | 设备管理 |
| 11 | `login-logs` | 登录日志 |
| 12 | `operation-logs` | 操作日志 |
| 13 | `webhook-management` | Webhook 管理 |
| 14 | `profile-and-security` | 个人资料与安全 |
| 15 | `dashboard-stats` | 仪表盘统计 |

### 防虚假测试规则

- 所有 E2E 测试必须启动真实后端进程（隔离测试数据库）
- 所有 E2E 测试必须启动真实前端开发服务器
- 所有 E2E 测试必须通过真实浏览器（CDP 协议）执行用户操作
- 所有 E2E 测试必须验证真实 API 响应（非 mock）
- 所有 E2E 测试必须验证真实数据库状态变化
- 禁止使用 mock 响应替代真实 API 调用
- 禁止在测试中硬编码预期结果而不走真实业务链路

### 规则文档更新

- `AGENTS.md`：增加 Gitea 协作规则、多智能体并行工作流、快速迭代机制、防虚假测试规则
- `docs/team/QUALITY_STANDARD.md`：增加方案对比机制、测试全面性要求、防虚假测试规则
- `docs/team/PRODUCTION_CHECKLIST.md`：增加 PR 提交前检查清单
- `docs/team/PROJECT_EXPERIENCE_SUMMARY.md`：增加多智能体并行、方案对比、快速迭代、虚假测试教训、浏览器自动化工具规划
- `docs/team/WORKFLOW.md`：新建文档，完整的多智能体并行协作工作流说明

## 2026-04-01 GAP修复验证更新

### 本轮验证结果
- 后端: `go vet` ✅ / `go build` ✅ / `go test` ✅
- 前端: `lint` ✅ / `build` ✅
- 前端测试: ⚠️ 3个失败点(预先存在，测试链路未完全恢复)
- 真实浏览器E2E: ❌ 未跑通，卡在后端健康检查就绪

### 本轮修复内容
- **GAP-01**: 角色继承递归查询 + 循环检测 + 深度限制(5层) ✅
- **GAP-02**: 密码历史记录(最近5个密码不可重复使用) ✅
- **GAP-03**: 设备信任功能(信任设备跳过2FA) ✅
- **GAP-05**: 异地登录检测(AnomalyDetector) ✅
- **GAP-06**: 设备指纹采集(browser/OS/device_id) ✅
- **GAP-08**: 前端登录页设备指纹采集 ✅
- **GAP-09**: 前端设备管理页信任状态显示 ✅
- **GAP-10**: TOTP启用时"记住此设备"选项 ✅

### 用户侧缺口(仍待实现)
- 系统设置页 - 无独立前端页面
- 全局设备管理页 - 当前仅在个人资料页(profile/security)嵌入设备管理

### API文档更新
- `docs/API.md` 更新日期至 2026-04-01
- 补充设备信任相关端点说明

### 待处理
- GAP-04: SSO CAS/SAML (PRD可选功能)
- GAP-07: SDK支持 (PRD可选功能)

## 2026-04-01 专家全面验证更新

- 已完成测试专家 + 用户专家双视角全面复核，详见 `docs/code-review/VALIDATION_REPORT_2026-04-01.md`
- 本轮后端验证：`go vet ./...` ✅、`go build ./cmd/server` ✅、`go test ./... -count=1` ✅
- 本轮前端验证：`npm run lint` ✅、`npm run build` ✅、`npm run test -- --run` ⚠️（3 个失败点）、`npm run test:coverage` ⚠️、`npm run e2e:full:win` ❌（后端健康检查未就绪）
- 真实边界：本轮不能重复宣称“浏览器级真实 E2E 已重新验证闭环”；当前仅能确认后端构建/测试和前端 lint/build 仍然可信
- PRD/实现纠偏：SMS 密码重置 ✅；角色继承/设备信任/异地与异常设备检测均为“部分实现”；CAS/SAML 与 SDK 仍未实现
- 用户侧主要缺口：管理员管理页、系统设置页、全局设备管理页、登录日志导出、批量操作
- 当前综合评分：**8.4/10**

## 2026-03-29 Code Review Findings Update

- 完成了对项目代码的全面系统性审查，包括后端(Go)和前端(React/TypeScript)
- 发现高危问题 7 个，中危问题 13 个，低危问题 6 个
- 已更新 `docs/PROJECT_REVIEW_REPORT.md`，包含完整的问题清单和修复建议

### 高优先级问题摘要

**后端 (4个高危)**:
- OAuth `ValidateToken` 无实际验证 - 仅检查 `len(token) > 0`
- StateManager 清理 goroutine 无法停止 - 资源泄漏风险
- Rate limiter map 无界限增长 - 内存泄漏风险
- L1Cache 无最大容量限制 - 内存泄漏风险

**前端 (3个高危)**:
- `uploadAvatar` 字段名可能错误 - 功能性bug
- Webhooks 全量加载无服务端分页 - 性能和扩展性问题
- ProfileSecurityPage 未复用已有 ContactBindingsSection - 代码重复

### 文档修复

- 重写了 `docs/PROJECT_REVIEW_REPORT.md`（原文件存在编码问题）
- 记录了 DATA_MODEL 与实际实现的差异

### 仍有效的历史结论

以下结论保持不变（详见下方历史记录）:
- Q-006 (告警交付就绪) - 仍等待真实SMTP验证
- Q-005 (SCA) - 已关闭
- Q-004 (覆盖率) - 已关闭

## 2026-03-29 Q-006 Alert Delivery Readiness Update

- `Q-006` still cannot be honestly declared closed.
- Repo-level closure preparation improved materially:
  - added a strict live-delivery drill entrypoint in [`scripts/ops/drill-alertmanager-live-delivery.ps1`](/D:/project/scripts/ops/drill-alertmanager-live-delivery.ps1)
  - the new drill refuses unresolved placeholders, `example.*` addresses/hosts, and placeholder secrets instead of producing fake success
  - the drill writes only redacted config output and masked recipient evidence, so real contacts and secrets are not leaked into the repo evidence tree
  - [`scripts/ops/validate-alerting-package.ps1`](/D:/project/scripts/ops/validate-alerting-package.ps1) now falls back to the latest available baseline report across prior evidence dates, removing a date-rollover false blocker
- Validation passed:
  - `powershell -ExecutionPolicy Bypass -File scripts/ops/validate-alerting-package.ps1 -EvidenceDate 2026-03-29`
  - `powershell -ExecutionPolicy Bypass -File scripts/ops/drill-alertmanager-render.ps1 -EvidenceDate 2026-03-29`
  - `powershell -ExecutionPolicy Bypass -File scripts/ops/drill-alertmanager-live-delivery.ps1 -EvidenceDate 2026-03-29 -EnvFilePath deployment/alertmanager/alertmanager.env.example`
- Latest real outcomes:
  - structural alerting package validation still passes
  - render drill still passes
  - the new live-delivery drill fails closed against `alertmanager.env.example`, which is the correct behavior and proves the path does not fake production closure
- Real remaining blocker:
  - `Q-006` now narrows to one external proof item: a real non-placeholder env/secret source plus a successful live SMTP acceptance run for the configured on-call receivers
- Evidence:
  - [`docs/evidence/ops/2026-03-29/alerting/ALERTING_PACKAGE_20260329-100315.md`](/D:/project/docs/evidence/ops/2026-03-29/alerting/ALERTING_PACKAGE_20260329-100315.md)
  - [`docs/evidence/ops/2026-03-29/alerting/20260329-100315/ALERTMANAGER_RENDER_DRILL.md`](/D:/project/docs/evidence/ops/2026-03-29/alerting/20260329-100315/ALERTMANAGER_RENDER_DRILL.md)
  - [`docs/evidence/ops/2026-03-29/alerting/20260329-100315/ALERTMANAGER_LIVE_DELIVERY_DRILL.md`](/D:/project/docs/evidence/ops/2026-03-29/alerting/20260329-100315/ALERTMANAGER_LIVE_DELIVERY_DRILL.md)

## 2026-03-28 Q-005 SCA Closure Update

- `Q-005` can now be honestly declared closed.
- Real closure evidence:
  - the latest frontend full dependency-tree scan is now clean
  - the latest production dependency scan remains clean
  - the latest backend reachable vulnerability scan remains clean
- Frontend dependency remediation completed:
  - upgraded `vite` to `8.0.3`
  - upgraded `vitest` and `@vitest/coverage-v8` to `4.1.2`
  - upgraded `typescript-eslint` to `8.57.2`
  - pinned the vulnerable transitive chains through `overrides`:
    - `picomatch` -> `4.0.4`
    - `brace-expansion` for `minimatch@3` -> `1.1.13`
    - `brace-expansion` for `minimatch@10` -> `5.0.5`
- Validation passed:
  - `cd frontend/admin && npm.cmd audit --omit=dev --json --registry=https://registry.npmjs.org/`
  - `cd frontend/admin && npm.cmd audit --json --registry=https://registry.npmjs.org/`
  - `go run golang.org/x/vuln/cmd/govulncheck@latest -json ./...`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Latest SCA result:
  - `npm audit production`: `0`
  - `npm audit full`: `0`
  - `govulncheck reachable findings`: `0`
- Real residual note:
  - one Windows cleanup warning was emitted while replacing native packages under `node_modules`, but it did not block installation or validation
  - the unrelated npm user-config warning `Unknown user config "//git@github.com/"` is still external environment noise, not a project-generated failure
- Next remaining cross-cutting gap:
  - `Q-006` external alert delivery evidence is now the next unclosed major governance item
- Evidence:
  - [`docs/evidence/ops/2026-03-28/sca/SCA_SUMMARY_20260328-220806.md`](/D:/project/docs/evidence/ops/2026-03-28/sca/SCA_SUMMARY_20260328-220806.md)

## 2026-03-28 Q-004 Hygiene Closure Update

- The `frontend/admin` `Q-004` closure track can now be honestly declared closed.
- Real closure evidence:
  - the latest full frontend `test:coverage` run no longer emits the previously recurring post-summary jsdom `AggregateError` network-noise lines
  - `frontend/admin/src/app/router.tsx` remained at `100 / 100 / 100 / 100` in that same full-suite run, so the earlier transient regression is not part of the current real state
- Validation passed:
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `93.98%`
  - branches `82.29%`
  - functions `91.37%`
  - lines `94.15%`
- Latest full test result:
  - `54` passing test files
  - `248` passing tests
- Real hygiene note:
  - the previous jsdom `AggregateError` noise is absent in the latest successful run
  - the remaining command-line warning is the external npm user-config warning `Unknown user config "//git@github.com/"`, not a project-generated frontend validation failure
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-151952.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-151952.md)

## 2026-03-28 ThemeProvider Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Frontend theme-provider closure:
  - `frontend/admin/src/app/providers/ThemeProvider.tsx` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/app/providers/ThemeProvider.test.tsx` now covers locale propagation, theme-token propagation, component-level override propagation, and child rendering through `ConfigProvider`.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/app/providers/ThemeProvider.test.tsx`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `93.93%`
  - branches `82.29%`
  - functions `91.37%`
  - lines `94.10%`
- Real remaining `Q-004` frontend gap after this closure:
  - the post-summary jsdom `AggregateError` network-noise hygiene issue
- Real hygiene note:
  - all previously identified frontend code hotspots in this closure track are now covered and re-verified
  - the successful frontend coverage run still prints post-summary jsdom `AggregateError` network-noise lines, so the run is green but not yet fully clean
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-144756.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-144756.md)

## 2026-03-28 Breadcrumb Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Frontend breadcrumb-hook closure:
  - `frontend/admin/src/lib/hooks/useBreadcrumbs.ts` is now covered at `100 / 100 / 100 / 100`.
  - the hook was simplified to remove redundant parent-injection logic that was dead under the current route model.
  - `frontend/admin/src/lib/hooks/useBreadcrumbs.test.tsx` now covers root, single-segment, nested, and unknown-segment breadcrumb behavior.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/lib/hooks/useBreadcrumbs.test.tsx`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `93.84%`
  - branches `82.29%`
  - functions `91.21%`
  - lines `94.01%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/app/providers/ThemeProvider.tsx`
  - the post-summary jsdom `AggregateError` network-noise hygiene issue
- Real hygiene note:
  - the successful frontend coverage run still prints post-summary jsdom `AggregateError` network-noise lines, so the run is green but not yet fully clean
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-144036.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-144036.md)

## 2026-03-28 NotFound Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Frontend 404-page closure:
  - `frontend/admin/src/pages/NotFoundPage/NotFoundPage.tsx` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/pages/NotFoundPage/NotFoundPage.test.tsx` now covers 404 rendering, missing-page messaging, and navigation back to `/dashboard`.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/pages/NotFoundPage/NotFoundPage.test.tsx`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `93.69%`
  - branches `81.95%`
  - functions `91.24%`
  - lines `93.85%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/lib/hooks/useBreadcrumbs.ts`
  - `src/app/providers/ThemeProvider.tsx`
  - the post-summary jsdom `AggregateError` network-noise hygiene issue
- Real hygiene note:
  - the successful frontend coverage run still prints post-summary jsdom `AggregateError` network-noise lines, so the run is green but not yet fully clean
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-143209.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-143209.md)

## 2026-03-28 ImportExport Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Frontend import/export closure:
  - `frontend/admin/src/pages/admin/ImportExportPage/ImportExportPage.tsx` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/pages/admin/ImportExportPage/ImportExportPage.test.tsx` now covers template format switching, validation guards, import success and warning flows, reset behavior, export field updates, and export failure handling.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/pages/admin/ImportExportPage/ImportExportPage.test.tsx`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `93.56%`
  - branches `81.95%`
  - functions `90.93%`
  - lines `93.71%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/pages/NotFoundPage/NotFoundPage.tsx`
  - `src/lib/hooks/useBreadcrumbs.ts`
  - `src/app/providers/ThemeProvider.tsx`
  - the post-summary jsdom `AggregateError` network-noise hygiene issue
- Real hygiene note:
  - the page-local `window.getComputedStyle(..., pseudoElt)` noise introduced during the first draft of this pass has been removed
  - the successful frontend coverage run still prints post-summary jsdom `AggregateError` network-noise lines, so the run is green but not yet fully clean
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-142248.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-142248.md)

## 2026-03-28 Coverage Remediation Update XV

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade shell coverage for `App.tsx` and `RootLayout.tsx`
  - closure-grade error-boundary coverage for `ErrorBoundary.tsx`
- Latest coverage result:
  - Frontend overall: statements `89.72%`, branches `77.57%`, functions `84.48%`, lines `90.64%`
  - `src/app/App.tsx`: statements `100%`, branches `100%`, functions `100%`, lines `100%`
  - `src/app/RootLayout.tsx`: statements `100%`, branches `100%`, functions `100%`, lines `100%`
  - `src/components/common/ErrorBoundary/ErrorBoundary.tsx`: statements `100%`, branches `83.33%`, functions `100%`, lines `100%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/app/App.test.tsx src/app/RootLayout.test.tsx src/components/common/ErrorBoundary/ErrorBoundary.test.tsx`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-110341.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-110341.md)
- Real boundary:
  - `App.tsx`, `RootLayout.tsx`, and `ErrorBoundary.tsx` are no longer remaining `Q-004` gaps
  - `Q-004` still cannot be truthfully closed
  - the next higher-value frontend gaps now narrow further to:
    - `src/app/router.tsx`
    - `src/pages/admin/DashboardPage/DashboardPage.tsx`
    - `src/components/feedback/PageState/PageState.tsx`
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean
  - the required sequential `lint` -> `build` -> `test:coverage` path passed in this pass

## 2026-03-28 Coverage Remediation Update XIV

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade auth recovery page coverage for `ForgotPasswordPage` and `ResetPasswordPage`
- Latest coverage result:
  - Frontend overall: statements `89.06%`, branches `77.14%`, functions `83.56%`, lines `89.96%`
  - `src/pages/auth/ForgotPasswordPage/ForgotPasswordPage.tsx`: statements `100%`, branches `75%`, functions `100%`, lines `100%`
  - `src/pages/auth/ResetPasswordPage/ResetPasswordPage.tsx`: statements `95%`, branches `94.44%`, functions `100%`, lines `95%`
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: statements `90.35%`, branches `75.51%`, functions `92.45%`, lines `90.13%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/pages/auth/ForgotPasswordPage/ForgotPasswordPage.test.tsx src/pages/auth/ResetPasswordPage/ResetPasswordPage.test.tsx`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-105226.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-105226.md)
- Real boundary:
  - `ForgotPasswordPage` and `ResetPasswordPage` are no longer remaining `Q-004` gaps
  - `Q-004` still cannot be truthfully closed
  - the next higher-value frontend gaps now shift more toward:
    - `src/app/App.tsx`
    - `src/app/RootLayout.tsx`
    - `src/app/router.tsx`
    - `src/components/common/ErrorBoundary/ErrorBoundary.tsx`
    - `src/pages/admin/DashboardPage/DashboardPage.tsx`
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean
  - the required sequential `lint` -> `build` -> `test:coverage` path passed in this pass

## 2026-03-28 Coverage Remediation Update XIII

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade page coverage for `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`
- Latest coverage result:
  - Frontend overall: statements `85.89%`, branches `74.91%`, functions `81.87%`, lines `86.71%`
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: statements `90.35%`, branches `75.51%`, functions `92.45%`, lines `90.13%`
  - `src/lib/http/client.ts`: statements `100%`, branches `92.30%`, functions `100%`, lines `100%`
  - `src/lib/http/csrf.ts`: statements `100%`, branches `88.46%`, functions `100%`, lines `100%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/pages/admin/ProfileSecurityPage`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-104341.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-104341.md)
- Real boundary:
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx` is no longer a remaining `Q-004` gap
  - `Q-004` still cannot be truthfully closed
  - the next highest-value frontend gaps now shift more toward:
    - `src/pages/auth/ForgotPasswordPage/ForgotPasswordPage.tsx`
    - `src/pages/auth/ResetPasswordPage/ResetPasswordPage.tsx`
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean
  - the required sequential `lint` -> `build` -> `test:coverage` path passed in this pass

## 2026-03-28 Coverage Remediation Update XII

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade module coverage for `src/lib/http/client.ts`
  - a production hygiene fix for shared refresh-promise rejection handling
- Latest coverage result:
  - Frontend overall: statements `83.86%`, branches `72.68%`, functions `79.87%`, lines `84.72%`
  - `src/lib/http/client.ts`: statements `100%`, branches `92.30%`, functions `100%`, lines `100%`
  - `src/lib/http/csrf.ts`: statements `100%`, branches `88.46%`, functions `100%`, lines `100%`
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: statements `70.17%`, branches `48.97%`, functions `67.92%`, lines `70.40%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/lib/http/client.test.ts`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-102456.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-102456.md)
- Real boundary:
  - `src/lib/http/client.ts` is no longer a remaining `Q-004` gap
  - `Q-004` still cannot be truthfully closed
  - the remaining highest-value frontend gap is now more concentrated in:
    - deeper remaining `ProfileSecurityPage` branches
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean
  - the required sequential `lint` -> `build` -> `test:coverage` path passed in this pass

## 2026-03-28 Coverage Remediation Update XI

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade module coverage for `src/lib/http/csrf.ts`
- Latest coverage result:
  - Frontend overall: statements `80.06%`, branches `67.61%`, functions `78.00%`, lines `80.91%`
  - `src/lib/http/csrf.ts`: statements `100%`, branches `88.46%`, functions `100%`, lines `100%`
  - `src/lib/http/client.ts`: `52.17%`
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: `70.17%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/lib/http/csrf.test.ts`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-083841.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-083841.md)
- Real boundary:
  - `src/lib/http/csrf.ts` is no longer a remaining `Q-004` gap
  - `Q-004` still cannot be truthfully closed
  - the remaining highest-value frontend gaps are now more concentrated in:
    - `src/lib/http/client.ts`
    - deeper remaining `ProfileSecurityPage` branches
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean
  - the required sequential `lint` -> `build` -> `test:coverage` path passed in this pass

## 2026-03-28 Coverage Remediation Update X

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade behavior coverage for `src/pages/auth/RegisterPage/RegisterPage.tsx`
- Latest coverage result:
  - Frontend overall: statements `78.91%`, branches `66.06%`, functions `77.07%`, lines `79.73%`
  - `src/pages/auth/RegisterPage/RegisterPage.tsx`: statements `93.42%`, branches `85.24%`, functions `87.5%`, lines `95.89%`
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: `70.17%`
  - `src/lib/http/client.ts`: `52.17%`
  - `src/lib/http/csrf.ts`: `25.71%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/pages/auth/RegisterPage/RegisterPage.test.tsx`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-082843.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-082843.md)
- Real boundary:
  - `RegisterPage` is no longer a remaining `Q-004` gap
  - `Q-004` still cannot be truthfully closed
  - the remaining highest-value frontend gaps are now more concentrated in:
    - deeper remaining `ProfileSecurityPage` branches
    - `lib/http`
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean
  - the required sequential `lint` -> `build` -> `test:coverage` path passed in this pass without a new build-path regression observation

## 2026-03-28 Coverage Remediation Update IX

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade behavior coverage for `src/pages/auth/LoginPage/LoginPage.tsx`
- Latest coverage result:
  - Frontend overall: statements `78.38%`, branches `64.77%`, functions `76.92%`, lines `79.19%`
  - `src/pages/auth/LoginPage/LoginPage.tsx`: statements `92.56%`, branches `84.09%`, functions `86.2%`, lines `95.61%`
  - `src/pages/auth/RegisterPage/RegisterPage.tsx`: `77.63%`
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: `70.17%`
  - `src/lib/http/client.ts`: `52.17%`
  - `src/lib/http/csrf.ts`: `25.71%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/pages/auth/LoginPage/LoginPage.test.tsx`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-081514.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-081514.md)
- Real boundary:
  - `LoginPage` is no longer a remaining `Q-004` gap
  - `Q-004` still cannot be truthfully closed
  - the remaining highest-value frontend gaps are now more concentrated in:
    - `RegisterPage`
    - deeper remaining `ProfileSecurityPage` branches
    - `lib/http`
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean
  - one concurrent `lint` + `build` attempt produced a transient Windows/Vite `index.html` emit-path failure; the required standalone `build` rerun passed immediately afterward
    - this is real observation, but not yet proven to be a deterministic repo defect

## 2026-03-28 Coverage Remediation Update VIII

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - closure-grade provider behavior coverage for `src/app/providers/AuthProvider.tsx`
- Latest coverage result:
  - Frontend overall: statements `76.00%`, branches `63.91%`, functions `75.07%`, lines `76.84%`
  - `src/app/providers`: statements `96.38%`, branches `93.75%`
  - `src/app/providers/AuthProvider.tsx`: `100%`
  - `src/pages/auth/LoginPage/LoginPage.tsx`: `47.93%`
  - `src/pages/auth/RegisterPage/RegisterPage.tsx`: `77.63%`
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: `70.17%`
- Latest verified commands:
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/app/providers/AuthProvider.test.tsx`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-075725.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-075725.md)
- Real boundary:
  - `AuthProvider` is no longer a remaining `Q-004` gap
  - `Q-004` still cannot be truthfully closed
  - the remaining highest-value frontend gaps are now more concentrated in:
    - `LoginPage`
    - `RegisterPage`
    - deeper remaining `ProfileSecurityPage` branches
    - `lib/http`
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean

## 2026-03-28 Coverage Remediation Update VII

- `Q-004` improved materially again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - full modal/drawer coverage for the remaining `UsersPage` component cluster
  - full modal/drawer coverage for the remaining `WebhooksPage` component cluster
  - deeper repository coverage across role/permission/relation repositories
- A real backend defect pair was discovered and fixed during this pass:
  - `internal/repository/role.go`
    - explicit role create requests with `status=0` were being persisted as enabled because the DB default swallowed the zero value
  - `internal/repository/permission.go`
    - explicit permission create requests with `status=0` were being persisted as enabled for the same reason
- Latest coverage result:
  - Frontend overall: statements `74.54%`, branches `63.57%`, functions `74.61%`, lines `75.35%`
  - `src/pages/admin/UsersPage`: `95.06%`
  - `src/pages/admin/WebhooksPage`: `94.92%`
  - `internal/repository`: `67.1%`
- Latest verified commands:
  - `go test ./internal/repository -run 'Test(RoleRepositoryLifecycleAndQueries|PermissionRepositoryLifecycleAndQueries|UserRoleAndRolePermissionRepositoriesLifecycle)$' -count=1`
  - `go test ./internal/repository -cover -count=1`
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-011431.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-011431.md)
- Real boundary:
  - `UsersPage` is no longer a dominant uncovered admin cluster
  - `WebhooksPage` is no longer a dominant uncovered admin cluster
  - `internal/repository` has improved materially, but `Q-004` still cannot be truthfully closed
  - the remaining highest-value gaps are now more concentrated in:
    - deeper remaining `ProfileSecurityPage` branches
    - `LoginPage` / `RegisterPage`
    - `app/providers/AuthProvider`
    - `lib/http`
    - remaining repository depth outside the newly covered role/permission/relation paths
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean

## 2026-03-28 Coverage Remediation Update VI

- `Q-004` improved materially again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - deep transport-based coverage across `internal/auth/providers`
  - full page/modal coverage for `RolesPage`
  - full page/modal coverage for `PermissionsPage`
  - page coverage for `ProfilePage`
- Latest coverage result:
  - Frontend overall: statements `68.32%`, branches `54.12%`, functions `68.15%`, lines `69.28%`
  - `src/pages/admin/RolesPage`: `94.53%`
  - `src/pages/admin/PermissionsPage`: `93.51%`
  - `src/pages/admin/ProfilePage/ProfilePage.tsx`: `91.42%`
  - `internal/auth/providers`: `80.6%`
  - `internal/repository`: `37.1%`
- Latest verified commands:
  - `go test ./internal/auth/providers ./internal/repository -cover -count=1`
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-003416.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-003416.md)
- Real boundary:
  - `internal/auth/providers` is no longer one of the dominant `Q-004` blockers
  - `RolesPage`, `PermissionsPage`, and `ProfilePage` are no longer dominant uncovered admin page clusters
  - `Q-004` still cannot be truthfully closed because the remaining high-value gaps have narrowed to:
    - `internal/repository` depth (`37.1%`)
    - `UsersPage` drawers/modals
    - `WebhooksPage` modal/drawer components
    - deeper remaining `ProfileSecurityPage` branches
  - the frontend coverage run still emits one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean

## 2026-03-27 Coverage Remediation Update V

- `Q-004` improved again after another strict remediation pass, but it still remains open.
- This pass added and verified:
  - frontend regression coverage for `LoginLogsPage`
  - frontend regression coverage for `OperationLogsPage`
  - deeper non-network parsing/error coverage for `internal/auth/providers`
- Latest coverage result:
  - Frontend overall: statements `56.81%`, branches `44.67%`, functions `57.38%`, lines `57.57%`
  - `src/pages/admin/LoginLogsPage/LoginLogsPage.tsx`: `93.1%`
  - `src/pages/admin/OperationLogsPage/OperationLogsPage.tsx`: `91.52%`
  - `services`: `86.2%`
  - `internal/auth/providers`: `28.7%`
  - `internal/repository`: `37.1%`
- Latest verified commands:
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-233824.md`](/D:/project/docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-233824.md)
- Real boundary:
  - frontend service adapters are no longer a primary `Q-004` gap
  - `LoginLogsPage` and `OperationLogsPage` are no longer primary page-level hotspots
  - `internal/auth/providers` improved materially but is still too shallow to declare `Q-004` closed
  - the highest-value next work remains deeper provider paths plus still-uncovered admin pages/components such as `PermissionsPage`, `RolesPage`, `ProfilePage`, and multiple drawers/modals
  - the latest successful frontend coverage run still emitted one post-summary jsdom `AggregateError` noise line, so the validation path is green but not yet perfectly clean

## 2026-03-27 Coverage Remediation Update IV

- `Q-004` has continued to improve and was re-verified again, but it still remains open.
- This pass mainly closed much of the frontend service-adapter gap:
  - `users.ts`
  - `roles.ts`
  - `devices.ts`
  - `profile.ts`
  - `login-logs.ts`
  - `operation-logs.ts`
  - `permissions.ts`
  - `stats.ts`
  - `import-export.ts`
- This pass also increased non-network provider coverage through:
  - Alipay private-key parsing/signing tests
  - Twitter PKCE auth URL tests
  - OAuth helper error-body boundary tests
- Strict verification caught one more real engineering issue during this pass:
  - the first version of the new permission-service tests passed under Vitest but failed under `tsc -b` because the fixture payloads did not match the real request types
  - this was corrected before final sign-off
- Latest coverage result:
  - Frontend overall: statements `52.05%`, branches `42.86%`, functions `51.84%`, lines `52.69%`
  - `services`: `86.2%`
  - `internal/auth/providers`: `15.2%`
  - `internal/repository`: `37.1%`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-224352.md`](/D:/project/docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-224352.md)
- Real boundary:
  - frontend service adapters are no longer one of the main remaining `Q-004` gaps
  - `internal/auth/providers` is improved but still too shallow to declare the item closed
  - the remaining high-value work should continue to target deeper provider parsing/error branches and still-uncovered admin pages/components

## 2026-03-27 Coverage Remediation Update III

- `Q-004` improved again and was re-verified, but it is still not honestly closable.
- This pass added:
  - frontend regression coverage for `UsersPage`
  - frontend deeper branch coverage for `ProfileSecurityPage`
  - backend coverage for more of `internal/repository`
  - backend non-network coverage for more of `internal/auth/providers`
- A real defect was found and fixed during this pass:
  - `internal/repository/device.go`
  - explicit inactive device creation (`status=0`) was being swallowed by the DB default and persisted as active
- Latest coverage result:
  - Frontend overall: statements `49.18%`, branches `42.86%`, functions `44.92%`, lines `49.79%`
  - `src/pages/admin/UsersPage/UsersPage.tsx`: `90.98%` statements, `68.75%` branches
  - `src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.tsx`: `70.17%` statements, `48.97%` branches
  - `internal/repository`: `37.1%`
  - `internal/auth/providers`: `8.5%`
- Latest verified commands:
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-221835.md`](/D:/project/docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-221835.md)
- Real boundary:
  - `UsersPage` and `ProfileSecurityPage` are no longer the dominant gaps they were before this pass.
  - `internal/auth/providers` remains materially under-covered.
  - `Q-004` should stay open until the remaining low-coverage service and provider paths are reduced further.

## 2026-03-27 Coverage Remediation Update II

- `Q-004` 在本轮继续推进并通过复验，但仍未完全关闭。
- 本轮新增覆盖与修复：
  - 前端新增 `WebhooksPage` 页面测试与 `services/webhooks.ts` 服务测试。
  - 后端新增 `webhook_repository` 仓储测试。
  - 修复 `internal/repository/webhook_repository.go` 中显式 `status=0` 创建时被 DB 默认值吞掉的问题。
  - 修复 `frontend/admin/vite.config.js`，解决当前 Windows + `Vite 8` + `--configLoader native` 下 `index.html` 被绝对路径发射导致的 `npm.cmd run build` 失败。
- 最新覆盖率结果：
  - Frontend overall: statements `41.06%`, branches `38.48%`, functions `36.00%`, lines `41.47%`
  - `src/pages/admin/WebhooksPage/WebhooksPage.tsx`: `93.15%`
  - `src/services/webhooks.ts`: `100%`
  - `internal/repository`: `15.1%`
- 最新验证命令：
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- 最新证据：
  - [`docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-214422.md`](/D:/project/docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-214422.md)
- 真实边界：
  - 当前剩余的 `Q-004` 主要集中在 `UsersPage`、`ProfileSecurityPage` 深层分支，以及 `internal/auth/providers` / `internal/repository` 的更深路径。

## 2026-03-27 Coverage Remediation Update

- `Q-004 自动化覆盖率不足` 已完成一轮增补整改并复验通过，但仍未完全闭环。
- 本轮新增并稳定通过的关键测试覆盖了：
  - 前端 `router`、`RequireAuth`、`RequireAdmin`、`AdminLayout`、`ImportExportPage`
  - 后端 `internal/database` 启动迁移/默认数据/升级回填路径
  - 后端 `internal/auth/providers` 的 URL / state 生成路径
- 这轮整改中额外收口了两个测试质量问题：
  - `router.test.tsx` 之前只在 `vitest` 下能跑，`tsc -b` 会失败；现已修正为可编译。
  - `internal/database/db_test.go` 在 Windows 下未释放 SQLite 句柄，导致 `TempDir` 清理失败；现已显式关闭底层连接。
- 最新覆盖率结果：
  - Frontend overall: statements `37.09%`, branches `35.91%`, functions `30.30%`, lines `37.40%`
  - `src/app/router.tsx`: `47.72%`
  - `src/components/guards/RequireAuth.tsx`: `100%`
  - `src/components/guards/RequireAdmin.tsx`: `100%`
  - `src/layouts/AdminLayout/AdminLayout.tsx`: `80.00%`
  - `src/pages/admin/ImportExportPage/ImportExportPage.tsx`: `83.58%`
  - `internal/database`: `83.2%`
  - `internal/auth/providers`: `4.0%`
  - `internal/repository`: `10.5%`
- 最新验证命令：
  - `go test ./... -count=1`
  - `go vet ./...`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && npm.cmd run test:coverage`
- 最新证据：
  - [`docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-212336.md`](/D:/project/docs/evidence/ops/2026-03-27/quality/COVERAGE_REMEDIATION_20260327-212336.md)
- 真实边界：
  - `Q-004` 已明显改善，但不能诚实表述为“自动化覆盖已充分”。
  - 当前优先级仍应先继续补 `UsersPage` / `WebhooksPage` / `ProfileSecurityPage` 与 `internal/repository` / `internal/auth/providers` 深层错误分支，之后再推进 `Q-005` 与 `Q-006`。

## 2026-03-27 Auth Session Hardening Closure Update

- The earlier high-priority quality-audit items around browser-side token persistence, OAuth `return_to` trust boundary, and fail-open security randomness are now closed at implementation level and re-verified.
- Backend/session closure:
  - refresh continuity is now based on the backend-managed `HttpOnly` refresh cookie.
  - the backend now emits a non-sensitive session-presence cookie (`ums_session_present`) so the frontend can distinguish "restore is possible" from "no server session exists".
  - OAuth `return_to` no longer trusts request-derived forwarded origin inference; it is restricted to absolute paths or explicit allowlisted origins.
  - security-sensitive random generation no longer silently degrades on `crypto/rand` failure.
- Frontend/session closure:
  - access token, current user, and current roles are memory-only and no longer persist into `localStorage` / `sessionStorage`.
  - `AuthProvider` now avoids blind `/auth/refresh` probing when no session-presence cookie exists.
  - protected-route restore failure no longer loses the original route intent; redirect ownership is back on `RequireAuth`.
  - post-login route races are hardened by exporting effective auth state from the in-memory session store.
- Real-browser closure:
  - the supported CDP E2E path was rerun after the session model change and now passes again without the earlier `400 Bad Request` console-noise regression.
- Latest verified commands for this closure:
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run test:run`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && powershell -ExecutionPolicy Bypass -File .\scripts\run-playwright-auth-e2e.ps1`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-27/quality/AUTH_SESSION_REMEDIATION_20260327-194100.md`](/D:/project/docs/evidence/ops/2026-03-27/quality/AUTH_SESSION_REMEDIATION_20260327-194100.md)
- Real boundary:
  - this closes the earlier session-model / OAuth return-path / random-fail-open implementation gaps.
  - it does not close the separate remaining boundaries around coverage depth, dev-toolchain SCA cleanup, or external production alert delivery evidence.

## 2026-03-27 First Admin Bootstrap Closure Update

- The previously real usability gap around “no default account, no first-admin product path” is now closed at product implementation level.
- Backend closure:
  - added public `POST /api/v1/auth/bootstrap-admin`.
  - bootstrap is guarded by `GET /api/v1/auth/capabilities -> admin_bootstrap_required`, so it is only available while the system still has no active admin.
  - successful bootstrap creates the first active admin, binds the `admin` role, returns a real session, and closes the bootstrap window afterward.
- Frontend closure:
  - added public `/bootstrap-admin` page.
  - `/login` and `/register` now expose a real first-run admin initialization entry instead of only showing a passive warning.
  - successful bootstrap now logs the operator into `/dashboard` directly.
- Supported-browser validation closure:
  - `frontend/admin/scripts/run-playwright-auth-e2e.ps1` no longer depends on startup-injected admin credentials.
  - the real browser E2E suite now begins with `admin-bootstrap`, proving `无默认账号 -> 初始化首个管理员 -> 进入后台 -> 登出`.
- Latest verified commands for this closure:
  - `go test ./... -count=1`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run test:run`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && powershell -ExecutionPolicy Bypass -File .\scripts\run-playwright-auth-e2e.ps1`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-27/e2e/ADMIN_BOOTSTRAP_CLOSURE_20260327-173914.md`](/D:/project/docs/evidence/ops/2026-03-27/e2e/ADMIN_BOOTSTRAP_CLOSURE_20260327-173914.md)
- Real boundary:
  - this closes the first-admin product loop.
  - it does not change the separate remaining boundaries around live third-party OAuth evidence and external production delivery/governance evidence.

## 2026-03-27 PRD 1.1 Email Activation Closure Update

- PRD `1.1 多种注册方式 -> 邮箱注册 -> 邮箱地址验证（发送验证邮件）` is now closed at product implementation level.
- Backend closure:
  - activation emails now point to the frontend activation page instead of the raw `GET /api/v1/auth/activate` API endpoint.
  - `GET /api/v1/auth/capabilities` now exposes `email_activation`, allowing the frontend to gate resend-activation UX on real capability state.
- Frontend closure:
  - `/activate-account` is now a real public activation page.
  - invalid or expired activation links now have a real resend-activation path instead of dropping users onto a backend JSON response.
  - `/login` and `/register` success state now both expose resend-activation entry points when email activation is available.
  - the activation page no longer double-consumes one-time activation tokens under React StrictMode.
- Supported-browser validation closure:
  - `frontend/admin/scripts/run-playwright-auth-e2e.ps1` now starts a local SMTP capture service alongside isolated backend/frontend runtime.
  - the real browser E2E suite now includes `email-activation`, covering `注册 -> 收取激活邮件 -> 打开前端激活页 -> 激活成功 -> 登录`.
- Latest verified commands for this closure:
  - `go test ./... -count=1`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run test:run`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && powershell -ExecutionPolicy Bypass -File .\scripts\run-playwright-auth-e2e.ps1`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-27/e2e/EMAIL_ACTIVATION_CLOSURE_20260327-171211.md`](/D:/project/docs/evidence/ops/2026-03-27/e2e/EMAIL_ACTIVATION_CLOSURE_20260327-171211.md)
- Real boundary:
  - the supported-browser closure uses a local SMTP capture service and proves the product loop.
  - it does not by itself prove live external SMTP provider deliverability.

## 2026-03-27 PRD 1.1 Self-Service Registration Closure Update

- PRD `1.1 多种注册方式` is now closed at product implementation level for the self-service frontend loop.
- Backend closure:
  - the existing `POST /api/v1/auth/register` product API is now matched by a real public frontend path.
  - `POST /api/v1/auth/send-code` now accepts both `purpose` and legacy `scene` payloads, preventing older clients from silently breaking while the frontend uses the normalized `purpose` contract.
- Frontend closure:
  - `/register` is now a real public route linked from `/login`.
  - users can complete username/password self-registration, optionally provide nickname/email, and use capability-gated phone registration when SMS is enabled.
  - `/dashboard` is now admin-guarded, so newly registered non-admin users no longer land on an admin-only stats error path after first login; they settle on `/profile`.
  - `/register` is treated as a public auth path during session-restore cleanup.
- Latest verified commands for this closure:
  - `go test ./... -count=1`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run test:run`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && powershell -ExecutionPolicy Bypass -File .\scripts\run-playwright-auth-e2e.ps1`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-27/e2e/SELF_SERVICE_REGISTER_CLOSURE_20260327-000848.md`](/D:/project/docs/evidence/ops/2026-03-27/e2e/SELF_SERVICE_REGISTER_CLOSURE_20260327-000848.md)
- Real boundary:
  - phone registration remains capability-gated by configured SMS delivery.
  - email activation remains environment-dependent on SMTP-backed delivery.
  - this closes the product loop, not the separate live third-party OAuth proof layer or external production governance evidence layer.

## 2026-03-26 PRD 1.5 Account Binding Closure Update

- PRD `1.5 用户信息管理 -> 账号绑定与解绑` is now closed at product implementation level for `邮箱 / 手机号 / 社交账号`.
- Backend closure:
  - self-service email bind / replace / unbind and phone bind / replace / unbind are now exposed through protected `users/me` endpoints.
  - bind requires target-channel verification code plus current-account verification when password or TOTP is configured.
  - unbind blocks removal if no login method would remain.
  - direct self-service `PUT /api/v1/users/:id` updates of `email` / `phone` are now rejected for non-admin self flows.
- Frontend closure:
  - `/profile/security` now includes a real email/phone binding management section.
  - `/profile` no longer edits `email` / `phone` directly and instead routes users to verified binding flows.
- Latest verified commands for this closure:
  - `go test ./... -count=1`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run test:run`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && powershell -ExecutionPolicy Bypass -File .\scripts\run-playwright-auth-e2e.ps1`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-26/e2e/ACCOUNT_BINDING_CLOSURE_20260326-224700.md`](/D:/project/docs/evidence/ops/2026-03-26/e2e/ACCOUNT_BINDING_CLOSURE_20260326-224700.md)
- Real boundary:
  - email binding remains capability-gated by SMTP-backed email code delivery.
  - phone binding remains capability-gated by configured Aliyun/Tencent SMS delivery.
  - this closes the product loop, not the separate live third-party OAuth proof layer.

## 2026-03-26 PRD 5.2 Closure Update

- PRD `5.2 用户信息管理 -> 创建用户` is now closed end-to-end.
- Backend closure:
  - `POST /api/v1/users` is live behind existing `user:manage` authorization.
  - admin-created users support initial password, optional email/phone/nickname, optional explicit roles, default-role assignment, and optional activation email when SMTP activation is configured.
- Frontend closure:
  - Admin Users page now includes a real `创建用户` modal and service call path.
- E2E closure hardening:
  - `frontend/admin/scripts/run-playwright-auth-e2e.ps1` no longer reuses ambient `8080/3000` services.
  - the supported browser path now launches isolated backend/frontend ports and an isolated SQLite database under `%TEMP%`.
  - `frontend/admin/.env.development` now defaults to `/api/v1`, so Vite proxy overrides remain effective.
- Latest verified commands for this closure:
  - `go test ./... -count=1`
  - `go build ./cmd/server`
  - `cd D:\project\frontend\admin && npm.cmd run lint`
  - `cd D:\project\frontend\admin && npm.cmd run test:run -- src/services/users.test.ts src/pages/admin/UsersPage/CreateUserModal.test.tsx`
  - `cd D:\project\frontend\admin && npm.cmd run build`
  - `cd D:\project\frontend\admin && powershell -ExecutionPolicy Bypass -File .\scripts\run-playwright-auth-e2e.ps1`
- Latest evidence:
  - [`docs/evidence/ops/2026-03-26/e2e/PLAYWRIGHT_CDP_E2E_CREATE_USER_CLOSURE_20260326-190646.md`](/D:/project/docs/evidence/ops/2026-03-26/e2e/PLAYWRIGHT_CDP_E2E_CREATE_USER_CLOSURE_20260326-190646.md)
- Real boundary:
  - the supported CDP browser path confirms create-user success, list-level persistence, and modal close transition initiation.
  - it still does not change the earlier boundary that full OS-level automation and live third-party OAuth validation remain outside current closure.

更新日期：2026-03-26

## 当前结论

- 后端主链路可构建、可测试、可运行。
- 前端管理台可构建、可 lint、可执行单元测试。
- 当前受支持的真实浏览器主验收路径是 `cd frontend/admin && npm.cmd run e2e:full:win`。
- 当前项目已经完成浏览器级真实 E2E 收口，但这不等于完整 OS 级自动化。
- 运行时不再依赖 `smoke` 脚本；`smoke` 仅保留为补充诊断工具。
- 本地可审计的治理证据已形成一轮闭环，包括 SCA、备份恢复、本地回滚、观测基线、配置与环境隔离、告警包校验、告警渲染演练、密钥边界校验。

## 2026-03-26 最新收口

- 新增首登管理员初始化状态探测：
  - [`internal/service/auth_capabilities.go`](/D:/project/internal/service/auth_capabilities.go)
  - `GET /api/v1/auth/capabilities` 现在会返回 `admin_bootstrap_required`，用于反映系统是否仍缺少可登录的激活管理员。
- 登录页已完成首登管理员产品提示闭环：
  - [`frontend/admin/src/pages/auth/LoginPage/LoginPage.tsx`](/D:/project/frontend/admin/src/pages/auth/LoginPage/LoginPage.tsx)
  - 当系统不存在可用管理员时，前端会明确提示“当前版本不提供默认账号，需先完成管理员初始化”。
- 新增后端与前端回归测试，覆盖管理员初始化状态与登录页提示：
  - [`internal/service/auth_capabilities_runtime_test.go`](/D:/project/internal/service/auth_capabilities_runtime_test.go)
  - [`internal/api/handler/auth_capabilities_test.go`](/D:/project/internal/api/handler/auth_capabilities_test.go)
  - [`frontend/admin/src/services/auth.test.ts`](/D:/project/frontend/admin/src/services/auth.test.ts)
  - [`frontend/admin/src/pages/auth/LoginPage/LoginPage.test.tsx`](/D:/project/frontend/admin/src/pages/auth/LoginPage/LoginPage.test.tsx)
- 浏览器级真实 E2E 主链路已复跑通过，登录页首登提示改动未破坏既有认证流程：
  - `cd frontend/admin && npm.cmd run e2e:full:win`
- 修复邮箱验证码限流回归：第二次发送从误报 `500` 恢复为 `429 Too Many Requests`。
- 为邮箱限流错误增加稳定兼容识别，避免因历史乱码文案或英文限流文案导致再次误分级。
- 移除非测试代码中的最后一个 `panic`：
  - [`internal/auth/jwt.go`](/D:/project/internal/auth/jwt.go)
  - 旧 `NewJWT` 兼容入口现在不再因非法配置直接崩进程，而是延迟到实际调用时返回 error。
- 新增闭环测试覆盖 legacy JWT 构造失败不再 panic：
  - [`internal/auth/jwt_closure_test.go`](/D:/project/internal/auth/jwt_closure_test.go)
- 前端 `window.alert/confirm/prompt/open` 保护链路已确认存在且有测试覆盖：
  - [`frontend/admin/src/app/bootstrap/installWindowGuards.ts`](/D:/project/frontend/admin/src/app/bootstrap/installWindowGuards.ts)

## 2026-05-28 review 后续修复补充

- 修复 `internal/api/middleware/ratelimit.go` 的真实运行时缺陷：
  - 旧实现按 endpoint 共享单一内存桶，导致同一路由上的所有用户共用限流额度，存在全局误伤。
  - 旧实现也缺少历史 client limiter 的空闲清理策略，长期运行下存在条目累积风险。
- 新实现改为按 `endpoint + user_id/IP` 分桶，并在访问路径上按 TTL 清理空闲 limiter 条目。
- 补齐 handler context 类型守卫：`SSOHandler`、`WebhookHandler` 不再直接做 `user_id.(int64)` / `username.(string)` 断言，异常 context 会稳定返回 `401` 而不是 panic。
- 新增回归测试覆盖：
  - 不同 IP 的登录限流互不影响
  - 共享 IP 下不同 `user_id` 的 API 限流互不影响
  - 空闲 limiter 条目会被回收
  - `SSOHandler` / `WebhookHandler` 非法 context 类型返回 `401`
- 本轮后端验证已执行通过：
  - `go test ./internal/api/middleware -count=1`
  - `go test ./internal/api/handler -count=1`
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
- 前端类型真相补齐：
  - `frontend/admin/src/types/http.ts` 中 `ApiResponse.data` 已从 `T` 校准为 `T | null`
  - 新增编译期契约文件 `src/types/http.typecheck.ts`，锁定成功响应允许 `data: null`
  - `src/lib/http/client.test.ts` 已补成功空数据返回 `null` 的回归测试
- 本轮前端验证已执行通过：
  - `cd frontend/admin && env -u NODE_ENV npm run build`
  - `cd frontend/admin && env -u NODE_ENV npm run lint`
  - `cd frontend/admin && env -u NODE_ENV npm run test:run`
- AuthProvider 状态收敛补充：
  - provider 现已不再在 render 阶段回退读取 `auth-session` 模块态，展示真相收敛到 React provider state
  - `refreshUser` 失败不再清空当前会话视图，避免瞬时 userinfo 故障造成假登出
  - 已补充 “挂载后模块 store 变更不会污染 provider roles” 回归测试
- 本轮会话/导航真实验证已执行通过：
  - `cd frontend/admin && env -u NODE_ENV npm run test:run -- src/app/providers/AuthProvider.test.tsx`
  - `cd frontend/admin && env -u NODE_ENV npm run e2e:full`

## 当前运行时真实能力

- 密码登录：启用
- 邮箱验证码登录：仅在 SMTP 配置完整时启用
- 短信验证码登录：仅在阿里云或腾讯云短信配置完整时启用
- 账号绑定与解绑：邮箱/手机号仅在对应验证码通道启用时可发起；社交账号绑定依赖已配置的 OAuth provider。未配置时前端不会暴露可绑定 provider，后端绑定接口 fail-closed 返回 `503`，不能宣称该链路已默认产品闭环
- 密码重置：仅在 SMTP 配置完整时启用
- 首登管理员初始化：当系统不存在激活管理员时，`/login` 与 `/register` 会基于 `GET /api/v1/auth/capabilities` 暴露 `/bootstrap-admin` 入口；初始化成功后会直接进入后台，且该入口自动关闭
- TOTP：启用
- RBAC / 设备 / 日志 / Webhook / 导入导出：启用
- 健康检查：
  - `GET /health`
  - `GET /health/live`
  - `GET /health/ready`

## 当前真实限制

- 当前支持的是浏览器级真实验证，不是完整 OS 级自动化。
- 这不覆盖系统文件选择器、系统权限弹窗、原生桌面窗口等操作系统层行为。
- 当前环境下 `playwright test` runner 仍受 `spawn EPERM` 限制，因此不作为受支持主入口。
- `agent-browser` 目前可用于观察和辅助诊断，但不能作为稳定、全量、可签字的项目 E2E 主链路证据。
- OAuth 前端闭环已完成，但仍缺少真实第三方 provider 凭证下的 live browser validation 证据。
- 生产外部交付层面的材料仍未完全闭环：
  - 外部通知通道联调证据
  - 外部 Secrets Manager / KMS 证据
  - 多环境 CI/CD 密钥分发证据
  - 跨历史版本 schema downgrade 级别的回滚兼容性证据

## 已验证命令

本轮已执行并通过：

```powershell
go test ./... -count=1
go vet ./...
go build ./cmd/server

cd D:\project\frontend\admin
npm.cmd run test:run -- src/services/auth.test.ts src/pages/auth/LoginPage/LoginPage.test.tsx
npm.cmd run lint
npm.cmd run build
npm.cmd run e2e:full:win
```

此前已形成并保留的本地治理证据命令：

```powershell
powershell -ExecutionPolicy Bypass -File scripts/ops/run-sca-evidence.ps1
powershell -ExecutionPolicy Bypass -File scripts/ops/drill-sqlite-backup-restore.ps1
powershell -ExecutionPolicy Bypass -File scripts/ops/capture-local-baseline.ps1
powershell -ExecutionPolicy Bypass -File scripts/ops/drill-config-isolation.ps1
powershell -ExecutionPolicy Bypass -File scripts/ops/drill-local-rollback.ps1
powershell -ExecutionPolicy Bypass -File scripts/ops/validate-alerting-package.ps1
powershell -ExecutionPolicy Bypass -File scripts/ops/drill-alertmanager-render.ps1
powershell -ExecutionPolicy Bypass -File scripts/ops/validate-secret-boundary.ps1
```

## 治理基线入口

- 项目级协作与真实表述规则：[`AGENTS.md`](/D:/project/AGENTS.md)
- 工程质量标准：[`docs/team/QUALITY_STANDARD.md`](/D:/project/docs/team/QUALITY_STANDARD.md)
- 生产发布核查清单：[`docs/team/PRODUCTION_CHECKLIST.md`](/D:/project/docs/team/PRODUCTION_CHECKLIST.md)
- 工程协作与文档同步指南：[`docs/team/TECHNICAL_GUIDE.md`](/D:/project/docs/team/TECHNICAL_GUIDE.md)
- 本轮项目经验沉淀：[`docs/team/PROJECT_EXPERIENCE_SUMMARY.md`](/D:/project/docs/team/PROJECT_EXPERIENCE_SUMMARY.md)

## 已有证据

- 全量真实浏览器 E2E 收口：
  - [`docs/evidence/ops/2026-03-24/e2e/PLAYWRIGHT_CDP_E2E_CLOSURE_20260324-151537.md`](/D:/project/docs/evidence/ops/2026-03-24/e2e/PLAYWRIGHT_CDP_E2E_CLOSURE_20260324-151537.md)
- `agent-browser` 真实性验证：
  - [`docs/evidence/ops/2026-03-24/e2e/AGENT_BROWSER_VALIDATION_20260324-162724.md`](/D:/project/docs/evidence/ops/2026-03-24/e2e/AGENT_BROWSER_VALIDATION_20260324-162724.md)
- 早期 raw CDP Windows 稳定性证据：
  - [`docs/evidence/ops/2026-03-24/e2e/RAW_CDP_WINDOWS_STABILITY_20260324-121816.md`](/D:/project/docs/evidence/ops/2026-03-24/e2e/RAW_CDP_WINDOWS_STABILITY_20260324-121816.md)
- 密钥边界：
  - [`docs/evidence/ops/2026-03-24/secret-boundary/20260324-104122/SECRET_BOUNDARY_DRILL.md`](/D:/project/docs/evidence/ops/2026-03-24/secret-boundary/20260324-104122/SECRET_BOUNDARY_DRILL.md)
- SCA：
  - [`docs/evidence/ops/2026-03-24/sca/SCA_SUMMARY_20260324-072144.md`](/D:/project/docs/evidence/ops/2026-03-24/sca/SCA_SUMMARY_20260324-072144.md)
- 备份恢复演练：
  - [`docs/evidence/ops/2026-03-24/backup-restore/20260324-072353/BACKUP_RESTORE_DRILL.md`](/D:/project/docs/evidence/ops/2026-03-24/backup-restore/20260324-072353/BACKUP_RESTORE_DRILL.md)
- 本地回滚演练：
  - [`docs/evidence/ops/2026-03-24/rollback/20260324-084928/ROLLBACK_DRILL.md`](/D:/project/docs/evidence/ops/2026-03-24/rollback/20260324-084928/ROLLBACK_DRILL.md)
- 本地观测基线：
  - [`docs/evidence/ops/2026-03-24/observability/LOCAL_BASELINE_20260324-090637.md`](/D:/project/docs/evidence/ops/2026-03-24/observability/LOCAL_BASELINE_20260324-090637.md)
- 配置与环境隔离：
  - [`docs/evidence/ops/2026-03-24/config-isolation/20260324-084915/CONFIG_ENV_ISOLATION_DRILL.md`](/D:/project/docs/evidence/ops/2026-03-24/config-isolation/20260324-084915/CONFIG_ENV_ISOLATION_DRILL.md)
- 告警包结构校验：
  - [`docs/evidence/ops/2026-03-24/alerting/ALERTING_PACKAGE_20260324-102540.md`](/D:/project/docs/evidence/ops/2026-03-24/alerting/ALERTING_PACKAGE_20260324-102540.md)
- 告警渲染演练：
  - [`docs/evidence/ops/2026-03-24/alerting/20260324-102553/ALERTMANAGER_RENDER_DRILL.md`](/D:/project/docs/evidence/ops/2026-03-24/alerting/20260324-102553/ALERTMANAGER_RENDER_DRILL.md)

## 对外表述建议

当前可以诚实表述为：项目已完成当前受限 Windows 环境下的浏览器级真实 E2E 收口，并具备本地可审计的一轮治理证据闭环；尚未完成的是完整 OS 级自动化、真实第三方 OAuth live 验证，以及部分生产外部交付层证据，不应夸大为“全部企业级上线材料均已闭环”。
## 2026-03-26 Social Account Binding Closure Update

- PRD social account management (`1.5`, `2.2`, `2.3`) is now closed at implementation level.
- Backend closure:
  - `POST /api/v1/users/me/bind-social` now starts an authenticated OAuth binding flow instead of relying on raw `open_id` input from the product UI path.
  - `GET /api/v1/auth/oauth/:provider/callback` now supports both login callback and bind callback through persisted OAuth state purpose.
  - `GET /api/v1/users/me/social-accounts` now returns sanitized bound-account info.
  - `DELETE /api/v1/users/me/bind-social/:provider` now enforces password/TOTP verification when available and blocks unbinding if no login method would remain.
- Frontend closure:
  - `/profile/security` now exposes a real social-account management section with bind entry, bound account table, callback-result handling, and guarded unbind modal.
- Validation passed:
  - `go test ./... -count=1`
  - `go build ./cmd/server`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run test:run -- src/services/auth.test.ts src/services/social-accounts.test.ts src/pages/admin/ProfileSecurityPage/ProfileSecurityPage.social.test.tsx`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && powershell -ExecutionPolicy Bypass -File .\scripts\run-playwright-auth-e2e.ps1`
- Real remaining gap:
  - live third-party OAuth provider browser evidence is still missing; this update closes the product flow, not the real-provider proof layer.
- Evidence:
  - [`docs/evidence/ops/2026-03-26/e2e/SOCIAL_ACCOUNT_BINDING_CLOSURE_20260326-200220.md`](/D:/project/docs/evidence/ops/2026-03-26/e2e/SOCIAL_ACCOUNT_BINDING_CLOSURE_20260326-200220.md)

## 2026-03-28 Router Coverage Closure Update

- `Q-004` remediation progressed further, but still cannot be honestly declared closed.
- Frontend router closure:
  - `frontend/admin/src/app/router.tsx` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/app/router.test.tsx` now covers public/protected route registration, `RequireAuth` and `RequireAdmin` wrapping, default redirect behavior, lazy route resolution, and the invalid-export error branch.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/app/router.test.tsx`
  - `cd frontend/admin && npm.cmd run test:run`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `90.74%`
  - branches `77.74%`
  - functions `87.40%`
  - lines `90.87%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/pages/admin/DashboardPage/DashboardPage.tsx`
  - `src/components/feedback/PageState/PageState.tsx`
  - broader low-coverage shared/admin surfaces outside this single pass
- Real remaining hygiene issue:
  - `npm.cmd run test:coverage` still exits successfully but prints one post-summary jsdom `AggregateError` network-noise line.
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-121611.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-121611.md)

## 2026-03-28 Dashboard Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Frontend dashboard closure:
  - `frontend/admin/src/pages/admin/DashboardPage/DashboardPage.tsx` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/pages/admin/DashboardPage/DashboardPage.test.tsx` now covers loading, success, retriable error, retry recovery, and empty-payload fallback behavior.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/pages/admin/DashboardPage/DashboardPage.test.tsx`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `91.66%`
  - branches `78.26%`
  - functions `87.86%`
  - lines `91.82%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/components/feedback/PageState/PageState.tsx`
  - broader low-coverage shared/admin surfaces outside this single pass
- Real remaining hygiene issue:
  - `npm.cmd run test:coverage` still exits successfully but prints one post-summary jsdom `AggregateError` network-noise line.
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-122517.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-122517.md)

## 2026-03-28 PageState Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Shared page-state closure:
  - `frontend/admin/src/components/feedback/PageState/PageState.tsx` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/components/feedback/PageState/PageState.test.tsx` now covers loading, empty, action-button, error default, retry, and extra-action behavior.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/components/feedback/PageState/PageState.test.tsx`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `91.71%`
  - branches `78.52%`
  - functions `88.01%`
  - lines `91.86%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/layouts/AdminLayout/AdminLayout.tsx`
  - `src/pages/admin/ImportExportPage/ImportExportPage.tsx`
  - `src/lib/errors/AppError.ts`
  - `src/lib/storage/token-storage.ts`
  - additional lower-coverage shared/admin surfaces outside this single pass
- Real remaining hygiene issue:
  - `npm.cmd run test:coverage` still exits successfully but prints one post-summary jsdom `AggregateError` network-noise line.
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-123228.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-123228.md)

## 2026-03-28 AdminLayout Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Admin shell closure:
  - `frontend/admin/src/layouts/AdminLayout/AdminLayout.tsx` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/layouts/AdminLayout/AdminLayout.test.tsx` now covers loading, desktop and mobile navigation, dropdown actions, collapse state, avatar and username fallback logic, and explicit child rendering.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/layouts/AdminLayout/AdminLayout.test.tsx`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `92.06%`
  - branches `79.29%`
  - functions `89.09%`
  - lines `92.22%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/lib/storage/token-storage.ts`
  - `src/lib/errors/AppError.ts`
  - `src/pages/admin/ImportExportPage/ImportExportPage.tsx`
  - `src/pages/NotFoundPage/NotFoundPage.tsx`
  - additional lower-coverage shared/admin surfaces outside this single pass
- Real remaining hygiene issue:
  - `npm.cmd run test:coverage` still exits successfully but prints one post-summary jsdom `AggregateError` network-noise line.
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-124756.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-124756.md)

## 2026-03-28 Token Storage Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Token storage closure:
  - `frontend/admin/src/lib/storage/token-storage.ts` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/lib/storage/token-storage.test.ts` now covers token normalization, in-memory presence checks, explicit clearing, session cookie detection, and the no-`document` branch.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/lib/storage/token-storage.test.ts`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `92.32%`
  - branches `79.63%`
  - functions `89.70%`
  - lines `92.49%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/lib/errors/AppError.ts`
  - `src/pages/admin/ImportExportPage/ImportExportPage.tsx`
  - `src/pages/NotFoundPage/NotFoundPage.tsx`
  - additional lower-coverage shared/admin surfaces outside this single pass
- Real remaining hygiene issue:
  - `npm.cmd run test:coverage` still exits successfully but prints one post-summary jsdom `AggregateError` network-noise line.
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-125454.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-125454.md)

## 2026-03-28 AppError Coverage Closure Update

- `Q-004` remediation progressed again, but still cannot be honestly declared closed.
- Error module closure:
  - `frontend/admin/src/lib/errors/AppError.ts` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/lib/errors/index.ts` is now covered at `100 / 100 / 100 / 100`.
  - `frontend/admin/src/lib/errors/AppError.test.ts` now covers constructor defaults, factory helpers, response mapping, user-message mapping, and shared error helpers.
- Validation passed:
  - `cd frontend/admin && npm.cmd run test:run -- src/lib/errors/AppError.test.ts`
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
  - `cd frontend/admin && npm.cmd run test:coverage`
- Frontend current full coverage:
  - statements `93.07%`
  - branches `81.35%`
  - functions `90.32%`
  - lines `93.26%`
- Real remaining `Q-004` frontend gaps after this closure:
  - `src/pages/admin/ImportExportPage/ImportExportPage.tsx`
  - `src/pages/NotFoundPage/NotFoundPage.tsx`
  - `src/lib/hooks/useBreadcrumbs.ts`
  - `src/app/providers/ThemeProvider.tsx`
  - additional lower-coverage shared/admin surfaces outside this single pass
- Real remaining hygiene issue:
  - `npm.cmd run test:coverage` still exits successfully but prints one post-summary jsdom `AggregateError` network-noise line.
- Evidence:
  - [`docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-140215.md`](/D:/project/docs/evidence/ops/2026-03-28/quality/COVERAGE_REMEDIATION_20260328-140215.md)
## 2026-04-18 复核附录

当本附录与下方旧状态表述冲突时，以本附录基于 2026-04-18 新鲜命令证据和直接代码核查得到的结论为准。

### 最新验证快照

| Command | Result | Note |
|------|------|------|
| `go build ./cmd/server` | `PASS` | 退出码 `0` |
| `go vet ./...` | `PASS` | 退出码 `0` |
| `go test ./... -count=1 -skip TestScale` | `PASS` | 退出码 `0`；总耗时约 `180s` |
| `cd frontend/admin && npm run lint` | `PASS` | ESLint 检查全部通过 |
| `cd frontend/admin && npm test` | `PASS` | 518 个测试全部通过 |
| `cd frontend/admin && npm run build` | `PASS` | 前端构建成功 |

### P0/P1/P2 安全和质量修复完成状态

| 问题ID | 描述 | 状态 | 修复说明 |
|--------|------|------|----------|
| P0-01 | LIKE 查询 SQL 注入风险 | ✅ 已修复 | `escapeLikePattern()` 实现，LIKE 特殊字符转义 |
| P0-02 | 登录失败计数器竞态条件 | ✅ 已修复 | 使用原子 `Increment()` 操作 |
| P0-03 | Token 刷新黑名单写入失败被静默忽略 | ✅ 已修复 | `cache.Set()` 失败时返回错误（fail-closed） |
| P0-04 | 密码重置验证码 Replay 攻击 | ✅ 已修复 | 验证后立即 `cache.Delete()` 删除验证码 |
| P0-05 | CORS 默认配置允许任意来源 + 凭证 | ✅ 已修复 | `init()` 检测 `*` + `credentials` 危险组合并 panic |
| P0-06 | UpdateUser 缺少所有权检查（IDOR） | ✅ 已修复 | handler 层实现 self-or-admin 授权检查 |
| P0-07 | Login 方法绕过 TOTP 和设备信任检查 | ✅ 已修复 | `isTOTPRequiredForLogin()` 在 token 签发前检查 |
| P0-08 | ListCursor 游标条件与动态排序字段解耦 | ✅ 已修复 | 游标分页限制为 `created_at` 排序 |
| P1-01 | 错误处理中间件泄露内部错误信息 | ✅ 已修复 | 未知错误返回通用消息 |
| P1-02 | ExchangeCode / GetUserInfo 使用 context.Background() | ✅ 已修复 | 正确传播 context.Context |
| P1-03 | 导出功能泄露内部错误详情 | ✅ 已修复 | 返回通用错误消息 |
| P1-04 | CountByResultSince() 错误被静默忽略 | ✅ 已修复 | 错误正确返回 |
| P1-05 | DeleteRole 非事务性级联删除 | ✅ 已修复 | `Transaction()` 包装确保原子性 |
| P1-06 | ChangePassword 无 Token 失效机制 | ✅ 已修复 | `PasswordChangedAt` 在密码更改时更新 |
| P1-07 | SetDefault 操作非原子性 | ✅ 已修复 | `Transaction()` 包装 |
| P1-08 | 数据库连接池参数硬编码 | ✅ 已修复 | 参数可配置化 |
| P1-09 | rows.Err() 未检查 | ✅ 已修复 | 错误正确检查 |
| P2-10 | ActivateEmail 使用 GET 执行状态变更 | ✅ 已修复 | 改为 POST，token 在 body 中传递 |
| P2-11 | ValidateResetToken 用 GET 传 token | ✅ 已修复 | 改为 POST，token 在 body 中传递 |
| P2-13 | cursor.Encode 忽略 JSON 序列化错误 | ✅ 已修复 | 检查 marshal 错误 |
| P2-14 | initDefaultData 循环创建权限无错误聚合 | ✅ 已修复 | 错误聚合返回 |
| P2-15 | JWT NewJWT 初始化失败返回损坏对象 | ✅ 已修复 | 返回 `(nil, error)` |

### 当前真实情况

- ✅ `AssignRoles` 已通过 `ReplaceUserRoles(...)` 实现
- ✅ `CreateAdmin/DeleteAdmin` 已实现，具备事务性/保护逻辑
- ✅ `UploadAvatar` 已实现
- ✅ `PUT /api/v1/users/:id` 已有 self-or-admin 授权校验
- ✅ 密码登录已通过 TOTP/设备信任门禁
- ✅ `UserRepository.ListCursor()` 游标分页已限制为 `created_at` 排序
- ⚠️ `/uploads` 静态文件目录直接暴露（待架构决策）
- ⚠️ `TestScale_*` 大规模数据测试在 180s 内超时（性能测试，非功能问题）
