Files
gaokao-volunteer-system/reports/COMPLETION_SUMMARY_2026-06-15.md
Hermes Agent c03ed7a4ba
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
feat(web): tighten portal privacy and cleanup flows
2026-06-15 21:24:55 +08:00

237 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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.
# 本轮完成项摘要报告2026-06-15
## 1. 目标
本轮工作围绕 2026-06-15 系统复审报告中的 P1 / P2 整改项展开,目标是优先收口仓库内可以真实落地并可验证的风险,而不是继续停留在“文档承诺”或“计划状态”。
本轮特别聚焦四类问题:
1. portal 公开面敏感信息暴露
2. 删除 / 匿名化链路中的文件残留
3. 支付与通知域中的残留死语义
4. 隐私 / 删除入口与目标机恢复验收准备不足
## 2. 已完成项
### 2.1 Portal 通知审计页不再暴露原始 payload
已修改:
- `admin/routes/web_public.py`
- `admin/tests/test_notification_audit_page.py`
结果:
- portal 通知页不再直出 `payload_json`
- 不再向持 token 用户暴露邮箱、报告绝对路径、PDF 路径
- 页面仅保留通知摘要字段
### 2.2 删除 / 匿名化链路补齐 portal 上传附件清理
已修改:
- `data/orders/deletion_service.py`
- `admin/tests/test_order_deletion.py`
结果:
- `delete` 会删除 portal 上传附件
- `anonymize` 也会清理 portal 上传附件
- 空附件目录会一起删除
- 数据库 payload 仍会被清空
### 2.3 通知域移除 `sent` 旧语义
已修改:
- `data/notifications/email_service.py`
- `tests/test_delivery_notification.py`
结果:
- `DELIVERY_EVENT_STATUSES` 已移除 `sent`
- `mark_sent()` 已删除
- 测试切换为 `validated / delivered / failed`
### 2.4 支付域移除 `refund_pending` 死状态
已修改:
- `data/payments/dao.py`
- `data/payments/service.py`
- `admin/routes/web_public.py`
- `data/payments/tests/test_refund_flow.py`
结果:
- payment schema 不再包含 `refund_pending`
- portal 状态推导不再依赖 `refund_pending`
- 退款路径统一为真实可达的 `refunded`
### 2.5 支付回调补齐仓库内可落地的商户维度校验
已修改:
- `admin/config.py`
- `data/payments/provider_requirements.py`
- `data/payments/service.py`
- `data/payments/providers/alipay.py`
- `admin/routes/web_public.py`
- `admin/tests/test_payment_alipay_notify.py`
- `data/payments/tests/test_provider_requirements.py`
- `data/payments/tests/test_provider_alipay.py`
- `data/payments/tests/test_webhook.py`
结果:
- 新增 `GAOKAO_PAYMENT_MERCHANT_ID`
- readiness 检查要求 merchant 维度
- webhook 归一化 payload 新增 `merchant_id`
- webhook 处理新增 merchant missing / mismatch 校验
说明:
- 这只完成仓库内能力补齐
- 真实公网 acceptance 仍需外部商户凭据、notify 域名和目标环境
### 2.6 测试子进程调用改为 hermetic
已修改:
- `tests/test_retention_cleanup.py`
- `tests/test_delivery_dispatcher.py`
- `tests/test_t5_performance.py`
结果:
- 子进程 `python3` 调用改为 `sys.executable`
- Locust 调用改为 `python -m locust`
- 直接 `./.venv/bin/python -m pytest ...` 不再因 PATH 分裂失败
### 2.7 隐私 / 删除前台入口与后台审计页已补齐
已修改:
- `admin/routes/web_public.py`
- `admin/routes/notifications.py`
- `admin/config.py`
- `admin/tests/conftest.py`
- `admin/tests/test_web_public.py`
- `admin/tests/test_order_info_form.py`
- `admin/tests/test_notifications_admin.py`
结果:
新增公开页面:
- `/privacy`
- `/service-terms`
- `/deletion-policy`
新增 portal 删除申请最小闭环:
- `GET /portal/{token}/deletion-request`
- `POST /portal/{token}/deletion-request`
新增留痕与后台审计:
- `GAOKAO_DELETION_REQUEST_LOG`
- `GET /api/admin/notifications/deletion-requests`
- `GET /admin/deletion-requests`
### 2.8 目标机恢复验收准备已落成可执行模板
已修改:
- `reports/DR_DRILL_TEMPLATE.md`
- `tests/test_backup_workflow.py`
- `docs/BACKUP_AND_RECOVERY_PLAN.md`
结果:
- 新增 DR drill 模板,可记录目标主机 / 异机恢复结果
- 测试锁定模板必须引用 `backup_verify.sh --from-backup`
- 文档已明确真实演练记录归档位置
### 2.9 文档边界同步收口
已修改:
- `docs/CURRENT_STATE.md`
- `docs/DELIVERY_RETENTION_OPS_RUNBOOK.md`
- `docs/BACKUP_AND_RECOVERY_PLAN.md`
- `docker-compose.yml`
结果:
- codecov 改为“同值展示口径”,不再误写成执行单源
- `sent` / `refund_pending` 旧口径已移除或修正
- Compose 文件头已明确其仅是开发 / 本地 smoke 模板
- backup 文档不再伪装目标机告警已经完成
## 3. 验证结果
### 3.1 针对性测试
执行过的关键针对性回归包括:
- `admin/tests/test_notification_audit_page.py`
- `admin/tests/test_order_deletion.py`
- `tests/test_delivery_notification.py`
- `data/payments/tests/test_provider_requirements.py`
- `data/payments/tests/test_provider_alipay.py`
- `data/payments/tests/test_webhook.py`
- `admin/tests/test_payment_alipay_notify.py`
- `data/payments/tests/test_refund_flow.py`
- `data/payments/tests/test_service.py`
- `tests/test_retention_cleanup.py`
- `tests/test_delivery_dispatcher.py`
- `tests/test_t5_performance.py`
- `tests/test_backup_workflow.py`
- `admin/tests/test_web_public.py`
- `admin/tests/test_order_info_form.py`
- `admin/tests/test_notifications_admin.py`
其中最后一次定向回归结果:
- `23 passed`
### 3.2 标准验证入口
执行:
```bash
bash scripts/dev-verify.sh --skip-install
```
结果:
- `730 passed`
- `coverage overall = 92.70%`
- `coverage core = 100.00%`
- `ruff` 通过
- `mypy` 无错误
## 4. 本轮未在仓库内伪完成的外部阻塞
以下事项仍依赖仓库外条件,本轮没有伪装为“已完成”:
1. 真实支付宝公网 acceptance
- 仍需真实商户凭据、公网 `notify_url`、真实域名和线上演练记录
2. 目标机真实 backup / restore 演练
- 当前只完成模板与准备,不代表目标机已跑过
3. 目标机真实 SMTP / webhook 告警联调
- 当前仓库只保留真实边界说明,没有伪造不存在的 backup alert service
4. 正式法务文本最终签发
- 当前仓库已补入口与流程,但不等于外部法务审批流程已经结束
## 5. 结论
本轮工作已经把“可在仓库内真实完成并验证”的整改项全部落地。系统状态从“复审指出的问题已确认存在”推进到“主风险项已逐步切成两类”:
- **仓库内已修复并可回归验证的工程问题**
- **必须依赖外部环境、目标主机或正式业务输入才能闭环的上线前阻塞**
因此,当前仓库可以更准确地表述为:
> 已完成一轮真实工程收敛,仓库内可验证整改项已落地并通过标准验证入口;剩余阻塞集中在真实支付 acceptance、目标机 DR 演练、真实告警联调和正式外部文本签发。