Files
gaokao-volunteer-system/docs/ACTIVE_EXECUTION_BOARD_2026-07-05_REVIEW_REMEDIATION.md
Hermes Agent ec3c444656
Some checks failed
CI / pytest (Python 3.10) (push) Has been cancelled
CI / pytest (Python 3.11) (push) Has been cancelled
CI / pytest (Python 3.12) (push) Has been cancelled
docs(remediation): plan systemic review fixes
2026-07-05 21:34:10 +08:00

7.4 KiB
Raw Blame History

ACTIVE_EXECUTION_BOARD_2026-07-05_REVIEW_REMEDIATION

生成时间2026-07-05T21:33:52+08:00
执行原则:先定义完整修复标准,再按依赖顺序实施。每个任务必须 TDD、验证、提交、三远端同步。
配套方案:docs/plans/2026-07-05-review-remediation-systemic-fix-plan.md
配套整改清单:docs/ACTIVE_REMEDIATION_2026-07-05_REVIEW.md


阶段依赖图

Phase 0 Truth Source
  -> Phase 1 Admin Auth/Nav
  -> Phase 2 Payment/Portal/Public Security
  -> Phase 3 Upload/Webhook/Delete/Schema
  -> Phase 4 Gates/Docker/CI
  -> Phase 5 Final Regression/Evidence

Phase 0真相源收敛

T0-01 更新 CURRENT_STATE 和 README 入口

  • 文件:README.md, docs/CURRENT_STATE.md
  • 动作:把当前真相源改为 2026-07-05 Review Remediation 三件套。
  • 验证:grep -n "2026-07-05_REVIEW" README.md docs/CURRENT_STATE.md
  • 完成标准:不再引用旧 HEAD dbb8fb7 或旧“当前工作区未提交修改”。

T0-02 标记旧 review / closeout 为历史快照

  • 文件:旧 reports/*REVIEW*, SPRINT_4_CLOSEOUT_2026-07-03_SUPERSEDED.md 等。
  • 动作:顶部加历史快照提示,指向今日报告和 active board。
  • 验证:grep -n "历史快照" <files>

T0-03 补本地前端环境 runbook

  • 文件:README.mddocs/FRONTEND_GATE_RUNBOOK_2026-07-05.md
  • 动作:明确 pnpm install --frozen-lockfile、Node 20/22、turbo 检查。
  • 验证:新文档包含 typecheck/lint/test/build 命令。

Phase 1Admin Auth / Navigation

T1-01 后端移除或收紧 JWT query fallback

  • 文件:admin/auth.py, admin/tests/test_auth.py
  • 测试先行:新增 test_query_token_is_rejected_for_admin_api
  • 实现:get_current_user() 默认只读 Bearer如需要 Web 一次性 code另建独立机制。
  • 验证:.venv/bin/python -m pytest admin/tests/test_auth.py -q

T1-02 前端真实登录接入

  • 文件:apps/web/src/pages/admin/LoginPage.tsx, apps/web/src/stores/user.ts, apps/web/src/lib/api-client.ts, apps/web/src/hooks/*admin*
  • 测试先行LoginPage mock server 返回 JWT错误登录显示错误。
  • 实现:调用 /api/auth/login,保存 token + expirylogout 清理。
  • 验证:pnpm --filter @gaokao/web test LoginPage

T1-03 apiClient Bearer 注入

  • 文件:apps/web/src/lib/api-client.ts, apps/web/src/lib/api-client.test.ts
  • 测试先行:有 token 时请求 headers 包含 Authorization无 token 时不包含。
  • 实现:注入 token provider避免每个 hook 手写 headers。
  • 验证:pnpm --filter @gaokao/web test api-client

T1-04 RequireAuth 真实校验

  • 文件:apps/web/src/components/admin/RequireAuth.tsx, apps/web/src/components/admin/RequireAuth.test.tsx
  • 测试先行token 过期/无 token/role 非 admin 分别跳转或 403。
  • 实现rehydrate 后调用 /api/auth/me 或校验 expiry。
  • 验证:pnpm --filter @gaokao/web test RequireAuth

T1-05 修 /admin/review 断链与全 nav e2e

  • 文件:apps/web/src/router.tsx, apps/web/src/layouts/AdminLayout.tsx, apps/web/e2e/admin-portal.spec.ts
  • 选择:新增 admin review page 或移除导航项。推荐新增 route复用 ReviewPage 或后台专用 Review queue。
  • 验证:pnpm --filter @gaokao/web test:e2e --project=chromium --grep admin

Phase 2Payment / Portal / Public API Security

T2-01 payment-return return_nonce

  • 文件:data/payments/dao.py, data/payments/service.py, admin/routes/web_public.py, data/payments/tests/*, admin/tests/test_payment_alipay_notify.py
  • 测试先行:已支付 payment_id 无 nonce 不能换 token正确 nonce 一次可用;重复使用失败。
  • 实现checkout 创建 return_noncepayment_return 校验并消费 nonce。
  • 验证:相关 payment/web_public tests。

T2-02 公共错误脱敏

  • 文件:admin/routes/web_public.py, admin/errors/exceptions.py, admin/tests/test_errors.py, admin/tests/test_web_public.py
  • 测试先行prod 下 provider unavailable 不返回 env/path/provider detail。
  • 实现:公共 route 抛业务错误码;内部错误仅 logger。
  • 验证:GAOKAO_ENV=prod .venv/bin/python -m pytest admin/tests/test_errors.py admin/tests/test_web_public.py -q

T2-03 公共下单限流 + 幂等

  • 文件:admin/routes/web_public.py, data/orders/*, admin/tests/test_web_public.py
  • 测试先行:同 IP/phone 高频返回 429重复 idempotency key 返回同订单。
  • 实现:轻量 SQLite/in-memory limiter + idempotency key。
  • 验证:新增限流与幂等测试。

T2-04 Portal token jti/version/revocation

  • 文件:data/customer_portal/token.py, data/orders/schema.py, data/orders/dao.py, admin/routes/web_public.py, tests。
  • 测试先行:撤销 token 后访问失败;旧 token 兼容策略明确。
  • 实现token payload 加 jti/version落库 revocation。
  • 验证Portal token tests + portal page tests。

Phase 3Upload / Webhook / Delete / Migration

T3-01 附件 magic bytes 校验

  • 文件:admin/routes/web_public.py, admin/tests/test_web_public_portal_info.py, admin/tests/test_order_info_upload.py
  • 测试先行:.png 伪装文本被拒;真实 PDF/PNG 通过。
  • 验证:附件测试通过。

T3-02 Alipay notify body limit

  • 文件:admin/routes/web_public.py, admin/tests/test_payment_alipay_notify.py
  • 测试先行Content-Length 超限返回 413。
  • 实现:读取 body 前检查 header读取后再二次检查。

T3-03 删除审计强制化

  • 文件:data/orders/dao.py, data/orders/deletion_service.py, admin/routes/orders.py, tests。
  • 测试先行:物理删除写 auditactor/reason 缺失失败。

T3-04 schema_migrations

  • 文件:data/orders/schema.py, data/payments/dao.py, data/notifications/email_service.py, tests。
  • 测试先行:旧库升级记录 migrations重复 apply 幂等;失败回滚。

Phase 4Gates / Docker / CI

T4-01 修 mypy 9 errors

  • 文件:admin/routes/sprint3_api.py, data/cli_compat_share.py, data/share/poster.py, requirements/types。
  • 验证:.venv/bin/python -m mypy .

T4-02 Poster Docker 可复现构建

  • 文件:Dockerfile.poster, .github/workflows/ci.yml, tests/test_poster_cli_docker_contract.py
  • 验证:docker build -f Dockerfile.poster -t gaokao-poster-cli:review .

T4-03 compose healthcheck 端口一致

  • 文件:docker-compose.yml, tests。
  • 验证:非默认端口 compose config / healthcheck 测试。

T4-04 LHCI / Chromatic / smoke gate 语义

  • 文件:.github/workflows/web-ci.yml, apps/web/lighthouserc.cjs, scripts/dev-verify.sh
  • 验证workflow lint + 本地 lhci dry run可行时+ smoke gate 明确状态。

Phase 5最终回归

T5-01 全量本地 gate

bash scripts/dev-verify.sh
pnpm typecheck
pnpm lint
pnpm test
pnpm build
pnpm --filter @gaokao/web test:e2e

T5-02 视觉与用户流程验收

  • 启动本地服务。
  • 浏览器走:首页 → review → pricing/checkout → portal → admin login → admin nav。
  • 关键页面截图/vision 或等价视觉基线。

T5-03 文档状态回写

  • 更新 Review 报告状态。
  • 更新 CURRENT_STATE。
  • 标记 ACTIVE_REMEDIATION 已完成/待线上 acceptance。

提交策略

  • 每个 T 任务独立 commit。
  • 每个 Phase 完成后推送 gitea/origin/tksea。
  • 任一 gate 失败不得继续后续 Phase先修复或降级并记录。