Files
lixi d2867826d3
CI / docs-build (push) Successful in 55s
docs: M3 开工分析 8 份报告入档 + ADR-016~021 拍板决策
- 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>
2026-09-08 16:02:53 +08:00

226 lines
14 KiB
Markdown
Raw Permalink 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.
# 07 · M3 开工前证据审计与基线快照
> 角色:Evidence Collector(沿用 iteration-2/07 模式:每条声称附可复现命令与输出,拒绝空口断言)
> 审计日期:2026-09-08 · 只读审计,未改代码、未 commit、未动 mkdocs.yml
> 与 Reality Checker 分工:本报告不复跑测试套件与 E2E(运行态归他),只管证据链完整性、档案质量、静态计数与基线快照
---
## 1. M2 证据链审计
### 1.1 报告在档与导航挂载:30/30 + index,完整率 100%
```bash
ls docs/development/iterations/iteration-2/ | grep -c '^\([0-9]\|index\)' # → 3101~30 + index.md
grep -c "iteration-2/" mkdocs.yml # → 31
```
逐份核对结果:`01-pm-task-breakdown.md` ~ `30-device-verification-checklist.md` 编号连续无断号,31 个文件与 `mkdocs.yml` 第 34~64 行的 31 条导航一一对应(进展看板 + 01~30),无孤儿文件、无空挂导航。另有非报告附件 `openapi-pets-draft.yaml`(第二波契约草案存档,14 号报告引用,不要求挂导航)。
注意口径:29 号收官总结第 21 行写"29 份入档"——写作当时属实;30 号(真机补验清单)系收官后由 `e68b655` 追加入档并挂导航,时间线自洽,不算矛盾。
### 1.2 ADR 断号检查:001~015 连续,终号 015
```bash
grep -oE "ADR-[0-9]+" docs/architecture/decisions.md | sort -u
# → ADR-001 ~ ADR-01515 个,无断号
```
与 29 号总结"ADR 001~015"声称一致。
### 1.3 feature-checklist M2 三节(§7~§9)抽核 5 条状态声称
| # | 清单声称 | 实物证据(可复现) | 结论 |
| --- | --- | --- | --- |
| 1 | §7 "Flyway V3 pet_health **8 表** + V4 字典种子(**28 品种/10 疫苗**" | `grep -c "CREATE TABLE" V3__pet_health_baseline.sql`**8**breeds/pets/pet_owners/pet_weight_records/vaccine_catalog/pet_vaccinations/health_events/care_reminders);V4 两条 INSERT 值行数 **28**breeds+ **10**vaccine_catalog | ✅ 逐字吻合 |
| 2 | §7 "宠物 CRUD + breeds 目录 **23 例**(六类路径 + 三角色矩阵)" | `PetCrudIntegrationTest` 14 例 + `PetPermissionIntegrationTest` 9 例 = **23**@Test 注解计数) | ✅ 吻合 |
| 3 | §7 "契约一致性测试(v1.2.0 **字节级快照**" | api 侧快照文件在档且 sha256 与正典**逐字节一致**(见 §2.2);`ContractConformanceTest` 11 例在档 | ✅ 吻合 |
| 4 | §8 "pets 数据层……**DTO 映射 62 例测试**" | 22 号报告原文第 109 行为"本单(dev@7fb9031126**+62**,全绿)"——62 是该工单**全量新增测试数**(含 DTO 映射、repository、异常类型化等),非纯 DTO 映射例数 | ⚠️ 数字有出处,清单转述口径漂移(见 §6-G4) |
| 5 | §9 "事件字典 v2 白名单(pet 域 3 + health_record 域 7)……api@64c9b72" | `EventDictionary.java` 实数 pet 域 **3** + health_record 域 **7**,与 06 号 §1.5 键集逐条一致(24 号报告已逐条对照);提交 `64c9b72` 在 api 历史中定位到 | ✅ 吻合 |
抽核之外顺带实证:§7 各接口测试例数声称(体重 8 / 疫苗 12 / 事件 11 / 提醒 10 / 摘要 12)与对应测试类 @Test 计数**全部逐一吻合**。
---
## 2. 契约档案审计
### 2.1 openapi.yaml v1.2.0 的 18 路径(逐一列出)
```bash
grep -nE "^ /" docs/api/openapi.yaml # 18 行
python3 -c "...yaml.safe_load..." # paths: 18, operations: 24, schemas: 45
```
| # | 路径 | # | 路径 |
| --- | --- | --- | --- |
| 1 | `/api/v1/auth/register` | 10 | `/api/v1/pets/{petId}/weights` |
| 2 | `/api/v1/auth/login` | 11 | `/api/v1/vaccine-catalog` |
| 3 | `/api/v1/auth/refresh` | 12 | `/api/v1/pets/{petId}/vaccinations` |
| 4 | `/api/v1/auth/logout` | 13 | `/api/v1/vaccinations/{vaccinationId}` |
| 5 | `/api/v1/me` | 14 | `/api/v1/pets/{petId}/health-events` |
| 6 | `/api/v1/events` | 15 | `/api/v1/health-events/{eventId}` |
| 7 | `/api/v1/pets` | 16 | `/api/v1/pets/{petId}/care-reminders` |
| 8 | `/api/v1/pets/{petId}` | 17 | `/api/v1/care-reminders/{reminderId}` |
| 9 | `/api/v1/breeds` | 18 | `/api/v1/pets/{petId}/summary` |
`info.version: 1.2.0`(第 4 行)。29 号声称"18 路径/24 操作/45 schema"三个数字全部复现吻合。
### 2.2 api 侧快照 sha256 与正典一致(字节级)
```bash
sha256sum docs/api/openapi.yaml \
patbond-api/patbond-pet/src/test/resources/contract/openapi-v1.2.0.yaml
# 二者均为 243fe6487bfa19018bddbfdb2cece16d9f81bc9718d3404501574677a4cd689d
```
✅ 快照存在且与正典逐字节一致,契约测试的"字节级快照锁"有实物支撑。
### 2.3 Flyway 迁移清单:V1~V4 齐全(单链归 patbond-user
```
patbond-user/src/main/resources/db/migration/
├── V1__identity_media_baseline.sql
├── V2__create_platform_product_events.sql
├── V3__pet_health_baseline.sql # pet_health schema 8 表
└── V4__pet_health_dictionary_seed.sql # 28 品种 + 10 疫苗种子
```
无断号,pet 模块自身无迁移目录,与"迁移链仍归 patbond-user 单链"(清单 §7)一致。
---
## 3. 提交完整性
### 3.1 三仓 status:工作区全干净,与远端零偏差
```bash
git -C <repo> status -sb # 三仓均无未跟踪/未提交文件,无 ahead/behind 标记
```
| 仓库 | 分支 | 状态 |
| --- | --- | --- |
| patbond-doc | main…origin/main | 干净,已同步 |
| patbond-api | dev…origin/dev | 干净,已同步 |
| patbond-flutter | dev…origin/dev | 干净,已同步 |
### 3.2 29 号收官索引的关键提交逐一定位(`git log --oneline -25` + 逐哈希 `git log -1`
**doc 仓**10/10 定位到):`1891d9b`(开工 10 报告 + ADR-009~015)→ `2ceab6b`events 契约补录)→ `6025832`/`b04e93c`(第一波收口)→ `511617b`(契约冻结 v1.2.0)→ `222990e`(第二波收口)→ `b81c050`(第三波收口)→ `23ce404`T2-19 文档收口)→ `fcac68d`M2 收官)→ `e68b655`30 号追加,现 HEAD)。
**api 仓**11/11 定位到):`49299fb`V3/V4)→ `0eae1c9`pet 骨架)→ `58576f8`ADR-013 移除 health_record_action)→ `8fbf444`T2-03)→ `825dde3`T2-04)→ `4c2653c`T2-05)→ `d8303bf`T2-06)→ `3b27f9f`T2-07)→ `00f7dbd`T2-08)→ `d026f2f`(契约测试 T2-09)→ `64c9b72`(字典 v2,现 HEAD= 29 号声称收官 HEAD)。
**flutter 仓**8/8 定位到):`33b993c`(持久化队列)→ `7fb9031`T2-11 数据层)→ `97a1f46`T2-12)→ `5b34fa3`/`c91f18a`T2-13)→ `e186ba3`/`ba50332`T2-14)→ `720865b`E2E 脚本,现 HEAD= 29 号声称收官 HEAD)。
E2E 实物:`patbond-flutter/test_e2e_m2_manual.dart`777 行)在档,脚本内场景标号 `[1/11]`~`[11/11]` 恰 11 个,与 28 号"11/11 场景"声称的场景数吻合(复跑归 Reality Checker)。
---
## 4. 静态计数 vs 声称
### 4.1 后端 @Test**191,与声称一致**
```bash
grep -rE "@(Test|ParameterizedTest)\b" --include="*.java" patbond-api \
| grep -v target | wc -l # → 191
```
| 模块 | @Test 数 |
| --- | --- |
| patbond-common | 3 |
| patbond-user | 68 |
| patbond-auth | 31 |
| patbond-pet | 89 |
| **合计** | **191** ✅ |
pet 模块内分布:CRUD 14 / 权限矩阵 9 / 体重 8 / 疫苗 12 / 事件 11 / 提醒 10 / 摘要 12 / 契约一致性 11 / 健康探针 1 / 骨架 1。
### 4.2 前端 test/testWidgets**272,与声称一致**
```bash
grep -rE "^\s*(test|testWidgets)\(" patbond-flutter/test --include="*.dart" | wc -l # → 272
```
| 目录 | 例数 | 说明 |
| --- | --- | --- |
| test/features/pets/ | 193 | 20 个文件(models 25、repository 22、detail_page 19、health_record_display 16 为大头) |
| test/analytics/ | 34 | 队列/存储/路由观察者/服务/会话 5 文件 |
| test/core/ | 21 | token_refresher 5 + 共享 widget 16 |
| test/features/auth/ | 18 | repository 10 + 登录/注册页各 4 |
| test/widgets/ + 根 | 6 | tag_pill 5 + widget_test 1 |
| **合计** | **272** ✅ | |
> 静态注解计数与运行期用例数吻合,说明无参数化展开偏差;实际运行全绿与否归 Reality Checker 复核。
---
## 5. M3 开工基线快照(M3 收官对比基准)
### 5.1 三仓 HEAD(完整哈希)
| 仓库 | 分支 | HEAD | 末次提交 |
| --- | --- | --- | --- |
| patbond-doc | main | `e68b6553cadaccb3b29fbbca3d44df04473c506f` | docs: 真机补验独立操作清单(30 号,M2 挂起项) |
| patbond-api | dev | `64c9b72fd19cec916d964e2468330ede5fddfb81` | feat: 事件字典 v2 白名单扩充 pet/health_record 域 10 事件(T2-17 后端) |
| patbond-flutter | dev | `720865bcb93fca5fe49340b77807fb174d193b91` | test: M2 E2E 烟囱脚本(T2-18 收官) |
### 5.2 核心数字
| 维度 | 基线值(静态计数) |
| --- | --- |
| 后端 @Test | **191**common 3 / user 68 / auth 31 / pet 89 |
| 前端 test/testWidgets | **272**pets 193 / analytics 34 / core 21 / auth 18 / 其他 6 |
| openapi.yaml | **v1.2.018 路径 / 24 操作 / 45 schema**(清单见 §2.1),sha256 `243fe648…4cd689d`api 侧快照字节级一致 |
| Flyway | **V1~V4**(单链归 patbond-userpet_health 8 表 + 字典种子 28 品种/10 疫苗) |
| ADR 终号 | **ADR-015** |
| E2E 资产 | `test_e2e_manual.dart`M1+ `test_e2e_m2_manual.dart`M211 场景) |
### 5.3 模块与端口表
| 模块 | 端口 | 说明 |
| --- | --- | --- |
| patbond-auth | :8081`PATBOND_AUTH_PORT` | application.yml |
| patbond-user | :8082`PATBOND_USER_PORT` | application.yml;含 analytics 接收端与 Flyway 单链 |
| patbond-pet | :8083`PATBOND_PET_PORT` | **仅 application.yml.sample**(本地需从 sample 复制);compose 映射 8083:8083 |
| postgres | 容器内 :5432 | postgres:18**不对宿主机发布端口**(compose 注释:调试临时加 15432:5432 |
| patbond-common | — | 共享库,无端口 |
### 5.4 事件白名单基线(EventDictionary 实数:**共 22 事件**
`patbond-api/patbond-user/src/main/java/com/patbond/patbond/user/analytics/EventDictionary.java`
- **auth 域 11**`auth_register_started` / `auth_register_succeeded` / `auth_register_failed` / `auth_login_succeeded` / `auth_login_failed` / `auth_token_refresh_succeeded` / `auth_token_refresh_failed` / `auth_logout` / `auth_session_restore_started` / `auth_session_restore_succeeded` / `auth_session_restore_failed`
- **通用 1**`page_viewed`v2 正稿)
- **pet 域 3**`pet_create_started` / `pet_create_succeeded` / `pet_create_failed`
- **health_record 域 7**`health_record_create_started` / `health_record_create_succeeded` / `health_record_create_failed` / `health_record_viewed` / `health_record_edit_succeeded` / `health_record_edit_failed` / `health_record_deleted`
- 已废弃(ADR-013,测试锁定拒绝):`health_record_action`
客户端实际发射面(`grep -rhoE "'(auth_|pet_|health_record_|page_viewed)…'" lib/`):**15 个**——auth 5register/login 成败 + logout+ page_viewed + pet 3 + health_record 6。白名单侧多出的 7 个中,auth 6 个为服务端字典预置(token_refresh/session_restore/register_started 客户端未挂),`health_record_deleted` 留待删除端点(27 号已声明合理留白)。
---
## 6. 证据缺口清单
| # | 缺口 | 出处 | 定级 |
| --- | --- | --- | --- |
| G1 | **"字典 v2 13 事件"口径不可复现**:27 号 §"埋点端到端贯通"写"13 个事件(pet 域 3 + health_record 域 6 + page_viewed 正稿)"——括号内实为 **10**29 号沿用"13 事件"。从任何实数(白名单总 22 / v2 增量 10 / v2 客户端挂接 10 / 客户端发射面 15)均凑不出 13 | 27 号第 27 行、29 号第 20 行 | 低(数字笔误级,但收官总结是对外口径,M3 引用时应改写为"v2 增量 10、白名单共 22" |
| G2 | **CI 状态声称离线不可复核**29 号收官索引 api"CI success"、doc"strict 通过"无法在本机复现(需按 M2 建立的 Gitea commit status API 实查惯例取证);flutter 一栏写"**待本提交 CI**"且 30 号追加后**未回填终态结论**——三仓收官 CI 是否全绿目前档内无闭环证据 | 29 号 §5 | 中(M3 开工前建议补一次三仓 HEAD 的 commit status 实查并回填) |
| G3 | **feature-checklist 头部哈希滞后**:头部"最后更新"写 flutter `ba50332`,终态 HEAD 为 `720865b`(E2E 脚本提交)。272 计数在 HEAD 仍成立,非事实错误,但对账时会引起哈希对不上 | feature-checklist.md 第 5 行 | 低 |
| G4 | **"DTO 映射 62 例测试"转述漂移**22 号原文的 +62 是 T2-11 工单全量新增测试数,清单 §8 转述成了"DTO 映射 62 例" | feature-checklist §8 | 低 |
| G5 | **真机两项仍挂起**(非新缺口,登记延续):Android 事件落库观察、SessionTracker 30 分钟手测——方案 A 挂起,操作清单已独立成 30 号 | 29 号 §4、30 号 | 中(M3 期间设备到位即补,预计 0.5 天) |
除上述外,M2 档案的可复现声称(报告数、导航、ADR、契约三数字、快照哈希、Flyway、双端测试计数、关键提交链、E2E 场景数)**全部实证通过**:抽核与全查合计 40+ 条声称,仅 G1/G3/G4 三处口径瑕疵,无一处"声称的实物不存在"。
---
## 7. 审计结论
- **证据链完整率**30/30 报告 + index 在档且挂导航(100%);ADR-001~015 无断号;关键提交 29/29 在三仓历史定位。
- **静态计数**:后端 191、前端 272,与收官声称**逐一吻合**;契约 18/24/45 三数字与字节级快照全部复现。
- **基线快照**:已建立(§5),M3 收官时以本节为对比基准。
- **缺口**:5 项(G1~G5),无阻塞级;建议 M3 开工时顺手处理 G2(CI 实查回填)与 G1(口径改写)。
---
**审计执行**Evidence Collector · 2026-09-08
**本报告未挂导航**(不动 mkdocs.yml 为本次硬约束,待 M3 文档收口时统一挂载)