- iteration-3 报告 01-08(PM 拆解/后端/Flutter/RC 首个 CERTIFIED/UI/埋点/证据基线/Git) - ADR-016 自托管 MinIO 起步预留迁云(用户确认现无云存储)、ADR-017 patbond-community :8084 + media 归 user + 作者信息跨 schema 只读、ADR-018 范围裁剪(话题剪出/单层评论)、 ADR-019 幂等按域(PUT/DELETE + request_hash)、ADR-020 聚合 feed_viewed/字典 v3/ 北极星不变/队列三项升第一波、ADR-021 Git 修订(main 更正/PR 情形触发/首发布重建 main/ 防泄漏 grep 先行) - mkdocs 挂「第三迭代」导航,build --strict 通过 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
9.2 KiB
04 · M3 开工前现实核查(Reality Check)
- 核查人:Reality Checker(TestingRealityChecker)
- 日期:2026-09-08
- 方法:延续 iteration-2/04 的标准——不采信任何书面转述。所有结论分档标注:【亲验】命令自己跑、输出自己看;【UNVERIFIED】本地无法复现、明确不采信
- 约束遵守:只读核查 + 运行测试/构建/API 查询/E2E 脚本;零代码改动、零 commit/push、未改 mkdocs.yml;compose 用后已 down
0. 裁定(先说结论)
M3 开工 readiness:CERTIFIED(无条件放行)。
这是本核查人首次给出 CERTIFIED,理由是证据构成与 M2 开工时有质的不同:M2 收官声称的每一个关键数字都由本人在 2026-09-08 当天重新实跑并逐一命中——后端 191/191、前端 272/272 + analyze 零问题、mkdocs strict 通过、契约快照 sha256 字节级一致、三仓 HEAD CI 经 Gitea API 亲查全 success、E2E 烟囱 11/11 本人从冷启动完整复跑一遍通过(这同时证明 M3 开工时后端 compose 通道是活的,不是「2026-09-08 时点的历史记录」)。七项核查零实质偏差;上一轮(iteration-2/04)的 5 条放行条件全部消解。
M2 的已知挂起项(真机两项、auth 域契约测试缺口等)均已在文档中诚实标注为 🟡/另立工单,不构成对 M3(社区域)开工的阻塞,列为第 §5 节「随行观察项」而非放行条件。
1. 三仓 Git 状态与远端同步 —【亲验,全部通过】
git status --short --branch + git fetch + git rev-parse HEAD origin/<branch> 逐仓实测(2026-09-08):
| 仓库 | 分支 | 工作树 | 本地 HEAD | 远端 HEAD | 一致 |
|---|---|---|---|---|---|
| patbond-api | dev | 干净 | 64c9b72 |
64c9b72 |
✓ |
| patbond-flutter | dev | 干净 | 720865b |
720865b |
✓ |
| patbond-doc | main | 干净 | e68b655 |
e68b655 |
✓ |
与收官声称的 api dev@64c9b72、flutter dev@720865b 完全一致。上一轮放行条件 1(doc 仓不干净、报告长期不 commit)已消解:本次 doc 仓干净且与远端同步,iteration-2 全部 30 份报告 + 索引已入库。
环境事实:工作区存在 patbond-doc 的两个克隆(patbond-doc 主克隆与本核查所在的 referral 克隆,origin 均指向 zhaoyuxi/patbond-doc.git),两者均干净、HEAD 同为 e68b655,不构成风险,但建议后续收敛为单一工作副本以免改错目录。
核查结束时复查:四个工作树(含 referral)git status --porcelain 均为 0 处未提交——本核查自身未污染任何仓库(mvn target/、site/ 均被 gitignore 覆盖)。
2. 双端测试基线实跑 —【亲验,数字逐一命中】
2.1 后端 191/191
命令:JAVA_HOME=/usr/lib/jvm/java-17-openjdk ./mvnw clean test(patbond-api,本人实跑,BUILD SUCCESS,1 分 37 秒)。
surefire 报告逐文件解析汇总(不抄 Maven 控制台,直接数 XML):
| 模块 | tests | failures | errors | skipped |
|---|---|---|---|---|
| patbond-common | 3 | 0 | 0 | 0 |
| patbond-user | 68 | 0 | 0 | 0 |
| patbond-auth | 31 | 0 | 0 | 0 |
| patbond-pet | 89 | 0 | 0 | 0 |
| 合计 | 191 | 0 | 0 | 0 |
与声称的 191 精确一致。Testcontainers 正常(postgres:18 容器起落、4 个 Flyway 迁移在干净实例全量执行成功)。
小观察(非缺陷):Flyway 提示 PostgreSQL 18.6 is newer than this version of Flyway... latest supported is 17——当前仅为警告且全部迁移执行成功,M3 若升级 Flyway 版本可顺手消除。
2.2 前端 272/272 + analyze 零问题
命令:flutter test(patbond-flutter,本人实跑):00:32 +272: All tests passed!。
命令:flutter analyze:No issues found! (ran in 1.9s)。均与声称一致。
3. 文档门禁与契约快照 —【亲验,字节级一致】
mkdocs build --strict:通过(3.51s,EXIT=0)。- 契约快照 sha256 比对:
243fe6487bfa19018bddbfdb2cece16d9f81bc9718d3404501574677a4cd689d patbond-api/patbond-pet/src/test/resources/contract/openapi-v1.2.0.yaml
243fe6487bfa19018bddbfdb2cece16d9f81bc9718d3404501574677a4cd689d patbond-doc/docs/api/openapi.yaml
字节级一致属实。正典 info.version: 1.2.0、路径数 grep 实数 18,与声称一致。上一轮的 D-1 缺口(events 端点游离于契约外)已不复存在——v1.2.0 含 /api/v1/events。
4. 三仓 HEAD 的 CI 状态 —【亲验,Gitea API 亲查】
curl https://git.patbond.cn/api/v1/repos/zhaoyuxi/<repo>/commits/<sha>/status(2026-09-08):
| 仓库 | commit | state | 检查项 |
|---|---|---|---|
| patbond-api | 64c9b72f… |
success | CI / backend-test |
| patbond-flutter | 720865bc… |
success | CI / flutter-gates |
| patbond-doc | e68b6553… |
success | CI / docs-build |
29 号报告写 flutter 侧「待本提交 CI」——该悬置项现已落定为 success。
5. E2E 烟囱复跑 —【亲验,11/11 全过,通道确认存活】
完整冷启动复跑(非采信 2026-09-08 收官记录):
./mvnw -DskipTests package(EXIT=0)→docker compose up -d --build→ 四容器 Up、postgres healthy;dart run test_e2e_m2_manual.dart(patbond-flutter 仓根):=== M2 E2E 烟囱测试全部通过 ✓(11/11 场景)===,EXIT=0;docker compose down已执行,栈已清理。
11 场景全部真实走通,抽样摘录(本人输出):场景 8 防枚举四路响应体完全一致(40401);场景 9 第二设备新会话五类数据全量读回;场景 10 v2 事件 4/4 accepted(202,含 platform=android);场景 11 乐观锁 409/40902 且先写者数据保留。
这条同时回答了 M3 开工的关键问题:后端 compose 通道今天是活的。 上一轮放行条件 3(E2E 通道 UNVERIFIED)消解。
6. 收官声称抽查(3+ 条高影响项)
6.1 契约测试确实会抓漂移 —【亲验(结构审读 + 实跑)】
审读 patbond-pet/src/test/java/.../contract/ContractConformanceTest.java(735 行),结构真实严格,不是摆设:
- 对 pets 域 18 操作真实起服务发请求(MockMvc + Testcontainers),响应体经 ContractValidator 对冻结快照严格校验(字段名/类型/必填/nullable/枚举/信封/错误码值);
- Order(98) 快照守卫:断言版本=1.2.0、18 路径、24 操作、45 schema——doc 仓升版而忘同步快照会立即变红;
- Order(99) 全响应矩阵门禁:契约声明的每个 (操作, 状态码) 单元格都必须被真实响应覆盖,唯一豁免 care-reminders PATCH 409(并发守卫,单线程无法确定性触发,已注释说明);
- 本次实跑中该测试类 11/11 通过(含在 191 内)。
诚实标注的已知边界:auth 域 6 个 M1 操作无契约测试(注释明言「另立工单」),见 §7 观察项。
6.2 pet_health schema 表数 —【亲验,8 表属实】
V3__pet_health_baseline.sql grep 实数 8 个 CREATE TABLE:breeds、pets、pet_owners、pet_weight_records、vaccine_catalog、pet_vaccinations、health_events、care_reminders——与 29 号报告「pet_health 8 表」一致(其「六表 psql 证据」指业务数据六表,不含 breeds/vaccine_catalog 字典表,无矛盾)。
6.3 feature-checklist 与实际相符 —【亲验】
docs/development/feature-checklist.md 实有 M2 三节(§7 宠物域后端 / §8 宠物域客户端 / §9 埋点体系)。关键的是它没有虚报:真机落库验证 + SessionTracker 手测标 🟡 挂起、integration_test 自动化标 🟡 留第四波、三项交互细节标 🟡 待拍板——与 30 号真机补验清单相互印证,状态标注诚实。
6.4 报告与 ADR 入档 —【亲验】
iteration-2/ 实有 01~30 共 30 份编号报告 + index.md + openapi-pets-draft.yaml,mkdocs strict 通过即导航无死链;docs/architecture/decisions.md 实有 ADR-001 至 ADR-015。与声称一致。
7. 随行观察项(非放行条件,不阻塞 M3 开工)
- 真机两项挂起(Android 真机落库验证 + SessionTracker 30min 手测,30 号清单)——按方案 A 挂起属既定决策,设备到位后 0.5 天补验;M3 若涉及移动端埋点新事件,建议合并补验。
- auth 域 6 操作无契约测试——M1 遗留、已声明另立工单;M3 新增社区域端点时应从第一天就纳入契约测试矩阵,勿再累积。
- Flyway 对 PostgreSQL 18.6 的版本警告(§2.1)——顺手升级可消除。
- doc 仓双克隆(§1)——建议收敛为单一工作副本。
8. 与上一轮(iteration-2/04)放行条件的对账
| 上轮放行条件 | 本次状态 |
|---|---|
| 1. doc 仓报告未提交/工作树不干净 | ✓ 消解:30 份报告入库,三仓干净同步 |
| 2. D-1 契约缺口(events 游离) | ✓ 消解:v1.2.0 含 events,18 路径,字节级快照锁 CI |
| 3. E2E 通道 UNVERIFIED | ✓ 消解:本人冷启动复跑 11/11 |
| 4/5.(埋点空转与相关接线) | ✓ 消解:E2E 场景 10 实证 4/4 accepted;v2 白名单已入 191 测试基线 |
结论:M2 收官声称经全量独立复验零实质偏差,M3(社区域)可以开工。 本报告全部数字均为核查人 2026-09-08 亲跑所得。