From 3a4e03a9f9d22240001fc86a2f84b26b3309d1e3 Mon Sep 17 00:00:00 2001 From: WorkBuddy Date: Fri, 18 Sep 2026 14:38:59 +0800 Subject: [PATCH] docs(status): record HTTP semantics remediation; note 3 test assertions that encoded old wrong behavior --- docs/STATUS.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/STATUS.md b/docs/STATUS.md index 351971a..dc58ea3 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -690,6 +690,31 @@ Invariant测试:10个(INV-011~020)→ **实测:原 14 个用例无任何 详见 `docs/Phase-23B-V11-E2E-Infrastructure-Completion-Report-2026-09-18.md`。 +### HTTP 语义检修 — 失败响应携带真实 HTTP 状态码(2026-09-18)✅ 已关闭 + +起因:Phase 23B 收尾时质疑「HTTP 200 + body.code 这套约定,开放第三方还守得住吗」。 +审计后确认**当时就已经是断的**,不是未来风险。 + +| 发现 | 说明 | +|---|---| +| 105 处 / 30 个 Controller | `return ApiResponse.error(...)` 不抛异常、不带 `@ResponseStatus` → HTTP 恒为 200 | +| 前后端契约已断 | 小程序 `api.js` 的 401/403/429 分支**永远走不到**;token 过期回 403 → 不触发 `onSessionExpired` → **用户卡死** | +| 未认证回 403 | `SecurityConfig` 未配 `authenticationEntryPoint`,body 连 `code` 都没有 | +| CORS 默认 `*` + `allowCredentials(true)` | 注释却写「默认只允许 localhost」——注释与代码不符 | +| 测试覆盖 | 全量测试仅 4 文件 / 15 处断言触及状态码 | + +修法:**一处定义、两处应用、业务代码零改动** —— 响应码枚举新增 `httpStatus`(单一真相源)、 +异常处理器从枚举读状态、新增 `ResponseBodyAdvice` 覆盖全部直返路径。 + +验证:E2E **37 passed**(+4 契约用例);后端回归 **662 / 0 / 0 / 3**; +活栈实测 404 / 400 / 401 正确。回归首轮 3 处失败经判定均为**测试断言了旧的错误行为**, +改断言而非改回实现。 + +遗留(第三方开放,属范围扩张,需产品决策):第三方凭据机制、限流是否真实生效、 +OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界。 + +详见 `docs/HTTP语义检修报告-2026-09-18.md`。 + ### Phase 24 — UAT增量 ✅ 已就绪(测试数据支持) | 任务 | 状态 | |------|------|