Files
patbond-doc/docs/development/iterations/iteration-2/21-wave2-closure.md
T
lixi 222990e587
CI / docs-build (push) Successful in 1m19s
docs: M2 第二波收口——报告 13~21 与契约草案入档挂导航
- 13~18 后端纵切六单报告(T2-03~08,测试 95→182)
- 14 + openapi-pets-draft.yaml 契约起草档案
- 19 契约冻结报告(v1.2.0,22 项草案修正对照)
- 20 契约一致性测试(快照机制 + 1 漂移修复)
- 21 第二波收口总表(定型语义汇总,第三波接入依据)
- mkdocs build --strict 通过

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-08 10:40:27 +08:00

65 lines
4.1 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.
# M2 第二波收口报告:后端接口纵切与契约冻结
**执行日期**:2026-09-07 ~ 2026-09-08
**参与方**:Senior Developer(后端)× 4 批次 / API Platform Engineer × 2 / Frontend Developer / 主会话协调
**交付形态**:pets 域 18 操作全实现、契约冻结 v1.2.0、契约一致性测试入 CI
---
## 0. 执行概要
第二波目标:后端接口纵切(T2-03~T2-08)→ 契约冻结(T2-09)→ 为第三波 Flutter 接入放行。
**结果:全部完成。** patbond-api 测试 95 → **182** 全绿,openapi.yaml 冻结至 **v1.2.0**(18 路径/24 操作/45 schema),契约一致性测试(全响应矩阵 + mutation 自证)纳入 CI。并行完成 Flutter 埋点持久化队列(51→64 测试)。
| 工单 | 交付 | 提交(api dev) | 测试增量 |
|------|------|------|------|
| T2-03 宠物 CRUD + 权限框架 | 权限闸口三档 + 防枚举 404 | 8fbf444 | 95→118 |
| T2-04/05 体重 + 疫苗 | cursor 分页正典 + 状态机 + 幂等 | 825dde3 / 4c2653c | 118→138 |
| T2-06/07 健康事件 + 提醒 | 六类事件 + 四类提醒 + 42202 | d8303bf / 3b27f9f | 138→159 |
| T2-08 聚合摘要 | 四聚合口径定型(tz 参数) | 00f7dbd | 159→171 |
| T2-09 契约冻结 | openapi v1.2.0(doc main@511617b) | — | — |
| T2-09 契约测试 | 快照 + 严格校验器 + 1 漂移修复 | d026f2f | 171→182 |
| 埋点持久化队列 | 分段 at-least-once(flutter dev@33b993c) | — | 51→64 |
---
## 1. 定型的关键语义(第三波 Flutter 接入的依据)
- **权限**:`PetAccessService.require` 三档——READ(三角色)/WRITE(owner+caregiver)/MANAGE(仅 owner);无关系/不存在/已软删一律 404/40401 响应逐字一致(防枚举);记录级顶层短路径 404/40402
- **错误码新增 8 个**:40300/40401/40402/40902/40903(芯片号冲突)/40904(疫苗剂次冲突)/42201(疫苗规则)/42202(提醒规则)
- **分页正典**:cursor 信封 `{items, nextCursor, hasMore}`,limit 1~100 默认 20(体重、健康事件);疫苗/提醒列表不分页
- **幂等**:Idempotency-Key 可选头(weights/vaccinations/health-events/care-reminders 四个 POST),键派生确定性主键 + ON CONFLICT,零迁移
- **创建 201**;PATCH 不支持清空回 null;响应主键统一裸 `id`
- **PetSummary**:四聚合对象,无记录 null 语义,tz 参数(IANA)缺省 UTC,口径逐字入契约
## 2. 契约冻结纪律(自 v1.2.0 起生效)
- `docs/api/openapi.yaml` 为唯一事实源;冻结后任何字段变更须显著上报、两端同步
- api 侧持有字节级冻结快照(`patbond-pet/src/test/resources/contract/openapi-v1.2.0.yaml`),守卫测试锁版本号与规模(18 路径/24 操作/45 schema),契约升版须同步快照否则 CI 红
- 契约测试为全响应矩阵覆盖:契约声明的每个(操作,状态码)单元格都被真实请求触发并结构校验;「契约未声明的字段即报漂移」
## 3. 修复与发现
- **契约漂移 1 项**(已修):CreatePetRequest.sex 契约必填、实现原静默补 unknown → 按冻结契约改 @NotBlank
- **草案→冻结修正 22 项**(19 号报告 §2 对照表,均有 13/16/17/18 号定型依据)
- **收紧**:pet 服务禁用 Jackson float→int 静默截断(amountCents: 45.5 → 40000)
- Idempotency-Key 拍板措辞出入说明:拍板列三个 POST,实现与冻结按 16 号定型表收录四个(vaccinations 也支持且有测试锁定),属拍板本意内(可选头)的完整收录
## 4. 遗留(下波或后续)
1. **第三波 Flutter 接入**(T2-11 起):契约已冻结,DTO/Client 可开工
2. auth 域 6 操作无契约测试(M1 交付时无此机制,机制可直接复用,建议另立工单)
3. 埋点队列:30 秒定时冲刷、退避/429、anonymousId 持久化(15 号报告 §4)
4. 09 号报告的实现-规范 5 处出入(64KB 上限、429 限流等)仍待排期评估
5. 真机联调补验(第一波方案 A 挂起项):事件落库确认 + SessionTracker 30min 手测
6. 提醒 PATCH 409 并发守卫为契约测试唯一豁免格(单线程无法确定性构造)
## 5. 三仓状态(收口时点)
| 仓库 | HEAD | 测试 |
|------|------|------|
| patbond-api | dev@d026f2f | 182/182 |
| patbond-flutter | dev@33b993c | 64/64 |
| patbond-doc | main@511617b(契约)+ 本收口提交 | strict 通过 |