Files
user-system/docs/status/REAL_PROJECT_STATUS.md

1440 lines
85 KiB
Markdown
Raw Normal View History

# REAL PROJECT STATUS
## 2026-04-10 Review Update (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 Review Update (原始)
This section supersedes older status summaries when they conflict with the
fresh 2026-04-10 review evidence in
`docs/code-review/PROJECT_REAL_COMPLETION_REVIEW_2026-04-10.md`.
### Fresh verification snapshot
| 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 |
### Current real blockers
- 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.
### Current honest external statement
The project now has a mostly green routine verification baseline, but it still
cannot be presented as fully release-closed. The correct statement is:
- backend short-path checks, frontend lint/build/tests, dependency audit, and local vuln scan are green
- one full backend SLA gate is still red
- browser-level E2E is still not freshly closed in this review
- RBAC/admin-management hardening and avatar upload remain open items
## 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)
## 当前运行时真实能力
- 密码登录:启用
- 邮箱验证码登录:仅在 SMTP 配置完整时启用
- 短信验证码登录:仅在阿里云或腾讯云短信配置完整时启用
- 账号绑定与解绑:邮箱 / 手机号 / 社交账号产品闭环已完成;邮箱与短信绑定分别依赖对应验证码通道配置
- 密码重置:仅在 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)