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

1168 lines
72 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# REAL PROJECT STATUS
## 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)