docs: M3 收官——E2E 报告与收官总结入档,验收 PASSED
CI / docs-build (push) Successful in 38s

- 28 E2E 烟囱:14/14 场景、契约偏差 0、M3 四条验收标准逐条取证
  (两次不同 limit 全量翻页有序 id 逐位相等、删除前后差集验证、psql 库层互证)
- 29 收官总结:终态对照开工基线(测试 191/272→334/502、契约 18→31 路径冻结、
  ADR 001~021、四容器→六容器 + MinIO)、遗留清单与 M4 方向输入
- iteration-3/index.md 进展看板补建;feature-checklist 新增 M3 第 10~12 节
- 另登记 2 项 E2E 观察项:widthPx/heightPx 恒 null、eventVersion 口径未定型

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-10 15:13:18 +08:00
parent f5457c2f4c
commit 3ebe562ab7
5 changed files with 945 additions and 2 deletions
+51 -2
View File
@@ -2,7 +2,7 @@
> 目的:直观呈现哪些功能**已完成且有自动化测试**、哪些**部分完成**、哪些**尚未开始**,方便针对性验证与回归。
> 维护约定:每波工单合入后由执行人更新本清单;状态以 `dev` 分支 + 门禁全绿为准。
> 最后更新:2026-09-08M2 第三波收口patbond-api `64c9b72` 191 测试、patbond-flutter `ba50332` 272 测试,均门禁全绿;三次 compose 实测无契约偏差;M2 条目见第 7~9 节)
> 最后更新:2026-09-10M3 收官patbond-api `8089c06` 334 测试、patbond-flutter `0e87413` 502 测试,均门禁全绿;E2E 烟囱 14/14 契约偏差 0M2 条目见第 7~9 节,M3 见第 10~12 节)
图例:✅ 已完成且已测试 | 🟡 部分完成/有已知限制 | ⬜ 未开始
@@ -169,5 +169,54 @@ curl -s -i http://127.0.0.1:8082/internal/users/by-username/demo_user | head -1
| 事件字典 v2 白名单(pet 域 3 + health_record 域 7 | ✅ | 后端白名单 + 边界测试(api@64c9b72);page_viewed 正稿核对零修正 |
| 客户端挂接:pet 域 3 事件 + health_record 域 6 事件 + pet_form 等页名 | ✅ | 强类型封装(pet_analytics/health_record_analytics);deleted 留待删除端点 |
| Android 真机落库验证 + SessionTracker 30min 手测 | 🟡 | 桌面端全链路已通(platform 枚举拒绝属契约内);真机验证按方案 A 挂起待设备 |
| 队列完善:30s 定时冲刷、退避/429、anonymousId 持久化 | | 报告 15 §4 遗留;429 依赖后端限流实现(报告 09 出入清单) |
| 队列完善:30s 定时冲刷、退避、anonymousId 持久化 | | **M3 第一波交付**iteration-3/10flutter@4d40c38);429 Retry-After 精细分支仍待后端限流 |
---
# M3 社区(第三迭代)
## 10. 社区域后端(patbond-community :8084 + media in user
| 功能 | 状态 | 自动化测试 | 说明 |
| --- | --- | --- | --- |
| Flyway V5 community 8 表 + pg_trgm 扩展 | ✅ | 迁移验证 8 例(干净库 V1→V5 | 剪 2 条跨 schema FK`posts.generation_job_id`M4 补回)、`posts.region_id`M5 补回),裸列与索引保留 |
| patbond-community 独立模块(ADR-017)挂 pom + compose | ✅ | 骨架 7 例(含鉴权 5) | 骨架期即接 RS256 校验(无 token/畸形/错签/过期均 401+40101);只读写 community schema |
| **media 两步上传闭环**ADR-016/017 | ✅ | 12 例(MinIO Testcontainer 全链路 + 六类失败) | 创建 upload 签预签名 PUT10min)→ confirm ready → 私有桶预签名 GET1h);post_image / jpeg·png·webp / 10 MiBObjectStorage 适配层隔离供应商 |
| 帖子生命周期 5 端点(草稿/编辑/发布/软删/详情/我的列表) | ✅ | 25 例(含真双线程并发 PATCH 恰一胜) | 发布走 PATCH draft→publishedIdempotency-Key 必带 + request_hash40905);防枚举 404/40403 逐字节一致(hidden 对作者亦不露) |
| 公共 Feed 游标分页 + FeedCard | ✅ | 分页专项 8 + 卡片定型 5 | `(published_at,id)` 游标对齐 `ix_posts_feed`contentPreview 200 码点截断;三计数走冗余列写侧同事务维护 |
| 作者公开资料链路(D3-9 方案 B) | ✅ | 内部端点 8 + 作者链路 7 + Feign 线路 3 | user 增 `/internal/users/profiles`(≤50 批量,不入公网契约)→ community Feign + 60s 缓存;**user 故障时作者退 id-only、Feed 照常 200** |
| 单层评论(列表/创建/删除) | ✅ | 11 例 | **仅评论作者可删**(用户拍板,帖主不可删他人评论);40404/40406 |
| 点赞/收藏 PUT+DELETE 幂等 + 我的收藏 | ✅ | 真并发(4 线程 PUT 恰计 1 行 1 计数)+ 对账专项 | 响应回权威终态 `{liked,likeCount}`;互动面 = 帖子公开面(作者本人草稿亦 404) |
| 关注 PUT/DELETE + follow-stats | ✅ | 3 线程并发 follow 恰 1 行 | 自关注 42204(仅 PUT);自取关 200 幂等 no-op |
| 契约冻结 v1.3.0 + 快照矩阵 173 格 | ✅ | community 64 格 + media 8 格 + mutation 自证 | 43/43 操作零漂移;四模块字节级快照,升版须同步否则 CI 红;修 `nullable+allOf` 校验盲区 |
| uploading 超时未确认 asset 清理任务 | ⬜ | — | 方案在 iteration-3/13,定时任务另排 |
| 429 限流 | ⬜ | — | 承自 iteration-2/09 出入清单;连带客户端 Retry-After 分支挂起 |
| 话题 / 关注列表 / 作者主页 | ⬜ | — | ADR-018 裁剪出 M3topics 表已建) |
## 11. 社区域客户端(patbond-flutter
| 功能 | 状态 | 说明 |
| --- | --- | --- |
| community 数据层(契约 19 操作全覆盖,T3-12) | ✅ | 9 新错误码类型化;未知枚举抛 FormatException 暴露漂移;CursorPage 上移 core 供两域复用 |
| **ToggleSync 乐观更新状态机** | ✅ | 乐观翻转 + 快照回滚 + 单飞合并最终意图 + 代次守卫 + 服务端权威终态收敛;竞态时序 controller 级单测 |
| MediaUploader 六态编排(T3-13) | ✅ | 选图→压缩→预签名直传→confirm;29 项专项(降质阶梯/凭据过期重取/多图并发保序/孤儿防护) |
| 首页 Feed 真实数据 + 四态 + 尾部三态(T3-14) | ✅ | 下拉刷新 + 触底游标翻页;PostCard 三形态/PostMediaGrid/LikeButton/FeedSkeleton 入 core**SignedNetworkImage 剥离签名参数做缓存 key** |
| 帖子详情整页替换 + 评论区(T3-15) | ✅ | 真九宫格 + InteractiveViewer 大图;仅本人评论渲染删除入口;40403 返回 Feed 并刷新;关注双态钮 |
| 互动接线 + 三层视觉抑制(T3-16) | ✅ | 240ms 弹性激活 / 失败零动画跳变 + SnackBar / 对账静默替换;Feed 与详情共享 ToggleSync 同帧一致;减弱动态降级 |
| 发布页 PostComposePageT3-17 | ✅ | 两步发布 createPost(draft)→PATCH published(「发布失败但草稿已保存」为事实);gating 双保险;失败三语义(40905/42203/网络同键重放);草稿两路径 + 进页恢复 |
| 社区 demo 数据消亡 | ✅ | `AppState.posts/publishPost/updatePost` 及持久化整体退役;create 页仅余 M4 的 AI 生成模拟 |
| 完整草稿列表 / 自动保存 | 🟡 | 最小实现(进页恢复最新一条);完整管理留待(报告 26 §7) |
| 大图「下滑关闭」手势 | 🟡 | InteractiveViewer 手势冲突,待 photo_view 复评 |
| `widthPx/heightPx` 真实宽高比 | 🟡 | 服务端恒 null(E2E 观察项 1),单图帖一律回落 4:3 |
## 12. 埋点体系(M3 演进)
| 功能 | 状态 | 说明 |
| --- | --- | --- |
| 队列三项加固(30s 定时冲刷 / 指数退避 / anonymousId 持久化) | ✅ | 13 号规范四触发点补齐;退避 30s→5min 只挡定时冲刷;anonymousId 跨冷启动稳定(A/B 前置 #4 |
| 事件字典 v3 白名单(community 域 19 + experiment_exposed | ✅ | EventDictionary 22→42**7 个被否决事件锁死 unknown**(含逐卡曝光 post_impression |
| 客户端挂接 21 事件 | ✅ | feed 2(聚合 feed_viewed:≥50% 可见 ≥500ms、段内去重、离开结算)+ 互动 8 + 媒体三段 3 + 发布漏斗 5 + page_viewed 页名增量 |
| 逐卡 Feed 曝光 | ⬜ | ADR-020 否决(量级测算 7~14 个月击穿分区阈值 + 无背压);留 backlog 待 M4+ 服务端下发日志 |
| Android 真机验证(M2 两项 + M3 四项) | 🟡 | 步骤全部备齐在[真机验证清单](device-verification.md);桌面 `platform=linux` 整批 400 属契约内,落库只能真机验 |
| `eventVersion` 口径定型 | ⬜ | 契约描述可两读、服务端不校验、客户端硬编码 1(E2E 观察项 2) |