Files
lixi 209021e7d2 docs: 迁入第一迭代过程报告并建立进展看板
- 新增 development/iterations/iteration-1/:15 份角色报告 + 进展看板(已完成/未闭环/下一步),作为双人协作的进度事实来源
- 新增 ADR-006:测试与交付容器化策略(Testcontainers / 交付 Docker 包 / 本机库仅个人联调)
- Git 工作流规范补充:敏感信息只进忽略文件或 sample、测试数据不入库、测试代码限标准测试目录
- 门禁:mkdocs build --strict 通过(零警告)
2026-09-04 10:45:05 +08:00

159 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.
# 14 第一波「工程基线」里程碑证据档案与提交清单
- 编制人:EvidenceQA(Evidence Collector)
- 快照时间:2026-09-04(所有 git 输出均为本刻快照)
- 方法:patbond-api 全程只读(ls/grep/git 只读/读文件,未运行任何构建);patbond-flutter 复跑三条门禁命令做独立验证;patbond-doc 安装 mkdocs 并运行 strict 构建(产物输出到 scratchpad,仓库未落任何文件)。
- 对照基线:`06-evidence-audit.md` 问题清单(B1/B2、M1-M5、m1-m4)、`07-backend-baseline-report.md``08-flutter-theme-report.md``patbond-doc/docs/architecture/decisions.md`(ADR-001~005)。
---
## 0. 重大事实更正:「三仓均未提交」已不成立
任务前提是三仓改动均未提交,实测不符:
| 仓库 | 分支 | 本地最新提交 | 远端(origin)最新 | 工作区 |
| --- | --- | --- | --- | --- |
| patbond-api | dev | `c7ddaec 重构底层框架`(2026-09-03 17:59:56 +0800,Lixi20) | `c7ddaec`(一致,**已推送**) | 干净(`git status --porcelain` 空) |
| patbond-doc | main | `ca8cb72 完善开发文档`(2026-09-03 18:00:52 +0800,含 decisions.md 63 行 + mkdocs.yml 2 行) | `ca8cb72`(一致,**已推送**) | 干净 |
| patbond-flutter | dev | `2601da3 update README.md` | `2601da3`(一致) | **7 个修改 + 7 个未跟踪文件待提交**(见第 3 节) |
即:第一波后端改动与 ADR 文档已由某人(git 作者 Lixi20)在 2026-09-03 傍晚提交并推送;`c7ddaec``git show --stat`(24 个文件,+955/-99)与 07 报告的改动清单逐一吻合(4 pom、6 Java 源、2 sample、mvnw 三件套、5 个测试文件、Readme、测试专用 application.yml、.gitignore)。**真正待提交的只剩 patbond-flutter。**
---
## 1. 问题闭环核对(对照 06 审计清单,逐项附本刻证据)
| # | 问题 | 状态 | 本刻证据 |
| --- | --- | --- | --- |
| B1 | 后端零测试、CI 门禁空转 | **部分闭环** | 三模块均有 `src/test`;`grep -rc "@Test"` 计 3+1+9+1+7=**21 个用例**(ApiResponseTest 3、UserApplicationTests 1、UserControllerTest 9、AuthApplicationTests 1、AuthControllerTest 7);三个 pom 均有 `spring-boot-starter-test`(common:30、user:40、auth:40)。07 报告附 `./mvnw clean test` BUILD SUCCESS 输出(21 测试 0 失败)。仍缺:Testcontainers 集成测试、契约测试、安全测试(后续工单) |
| B2 | 内存用户 + 不可验证 token + `/internal` 裸奔 | **未动(计划内后续工单)** | `UserService.java:21-23` 仍为 `AtomicLong` + 两个 `ConcurrentHashMap`;`AuthService.java:50` 仍为 `UUID.randomUUID()`;`UserController.java:18` 仍映射 `/internal/users`;全仓 grep 无 `spring-boot-starter-security`/`SecurityFilterChain`(输出:NO SECURITY CONFIG) |
| M1 | auth→user 调用链错误状态码折叠 | **未动(计划内后续工单)** | `AuthService.java:61``ResponseStatusException(HttpStatus.BAD_REQUEST, ...)`;07 报告冒烟实测「错密码登录 → HTTP 500」,并已用 `AuthControllerTest.loginPropagatesFeignExceptionUnhandled` 把现状钉为基线 |
| M2 | common 强制全体引入 AMQP/Feign/LB/Nacos | **已修复** | `patbond-common/pom.xml` 依赖仅剩 `jakarta.validation-api`(compile)+ `spring-boot-starter-test`(test scope);全仓 `grep -rn "nacos\|amqp\|loadbalancer" --include="pom.xml"` 零命中(输出:NO NACOS/AMQP/LB IN POMS) |
| M3 | 无 CI 配置 + 无 Maven Wrapper | **部分闭环** | Wrapper 已入库:`mvnw``mvnw.cmd``.mvn/wrapper/maven-wrapper.properties` 存在且在 `c7ddaec` 提交内。CI 载体仍缺:`ls -a` 无 .github/.gitlab-ci/Jenkinsfile(输出:NO CI CONFIG) |
| M4 | API Readme 启动步骤不完整 | **已修复** | `patbond-api/Readme.md`:16 行 Wrapper 说明、21/27 行 `./mvnw clean test`(含 JAVA_HOME=JDK17 指引)、32-39 行 sample→yml 复制命令、46-48 行 `-pl patbond-common install` + 两个 `spring-boot:run`、71 行禁止向 sample 提交密钥 |
| M5 | 数据库 bootstrap 单文件混装 fixture 凭据 | **未动(后续工单)** | `patbond-doc/docs/database/` 仍仅 `patbond_postgresql.sql` 单文件;第 1269 行仍有 `accounts use the password: Patbond@123`;Flyway 拆分(工单 T1)未启动 |
| m1 | Flutter 唯一冒烟测试断言写死演示数据 | **未动** | `test/widget_test.dart:18-19` 仍断言 `'北京 · 朝阳区'``'28°C 晴'`;该文件不在本次改动清单 |
| m2 | Flutter README 校验命令缺 `--output=none` | **未修** | `patbond-flutter/README.md:34` 仍为 `dart format --set-exit-if-changed lib test`(会改写文件)。注意:README 当前的未提交改动只是在运行段加了一行 `flutter clean`(`git diff README.md` 全文仅此一处),并未修此项 |
| m3 | 演示数据持久化展示字符串 + 22 处 Unsplash URL | **未动(计划内,逐页替换时清除)** | `lib/data/demo_data.dart` 不在改动清单,'2小时前'/'1.2km' 等仍在 |
| m4 | flutter 工作区不干净 | **性质变化** | 审计时仅 ` M README.md`;现为第一波交付的 7 修改 + 7 新增,即本档案第 3 节要落账的对象。README 的用户自有改动仍混在其中 |
**闭环率**:任务预期应修复的 4 项全部兑现——M2 已修复、M4 已修复、M3 的 Wrapper 半边已修复、B1 已部分闭环(21 测试)。全部 11 项口径:2 项全闭(M2、M4),2 项部分(B1、M3),7 项未动——其中 B2/M1/M5/m1/m3 属已排期后续工单,**m2 是一处一行即可修的文档问题,两波交付均未顺手处理,建议纳入下一波**。
---
## 2. 文档门禁(mkdocs build --strict):通过
- 安装:`pip install --user mkdocs` → mkdocs 1.6.1(Python 3.14,`~/.local/bin/mkdocs`)。此前 `which mkdocs` / `python3 -m mkdocs` 均无,门禁属首次打通。
- 执行(产物指向 scratchpad,避免污染仓库):
```text
$ cd patbond-doc && mkdocs build --strict -d <scratchpad>/mkdocs-site
INFO - Cleaning site directory
INFO - Building documentation to directory: .../mkdocs-site
INFO - Documentation built in 0.08 seconds
EXIT=0
```
- **exit 0,零 warning,strict 模式下导航与链接均无报错**;无错误清单需要移交。
- 仓库卫生:构建后 `ls -d site` 确认仓库内无 site/ 目录,`git status` 仍为空。mkdocs.yml 三级导航(index / development-plan / decisions)与 06 审计的静态核对结论一致,本次为动态实证。
- 注意:mkdocs 装在 `~/.local`,CI 环境需自行安装;若后续文档引入主题/插件(如 material),需同步补 requirements 文件——当前 mkdocs.yml 用内置 readthedocs 主题,无额外依赖。
---
## 3. 三仓提交清单
### 3.1 patbond-api —— 本刻无待提交内容(快照口径,提交前必须重新生成)
`git status --porcelain` 为空;dev 分支与 origin/dev 同在 `c7ddaec`。第一波改动已随 `c7ddaec 重构底层框架` 提交并推送,无需再操作。
磁盘上存在但已被正确忽略(不得入库):
| 路径 | 处置 | 依据 |
| --- | --- | --- |
| `patbond-auth/src/main/resources/application.yml``patbond-user/.../application.yml` | 应忽略(本地真实配置,sample 模式) | `.gitignore` 白名单规则,`git status --ignored` 确认 `!!` |
| `patbond-{common,user,auth}/target/` | 应忽略(构建产物) | 同上 |
| `.idea/` | 应忽略(IDE 配置) | 同上,且 `git ls-files` 无 .idea 条目 |
**警示**:该仓有开发 agent 正在继续开发,本清单仅为快照;开发波次完成后需重新 `git status` 生成新清单再提交。既成事实备注:`重构底层框架` 这条信息无语义前缀(更贴切的应为 `refactor: 升级 Spring Boot 3.5、移除 Nacos、补齐 21 个测试与 Maven Wrapper`),但该提交已推送远端,不建议改写历史;后续新提交请回归中文语义前缀约定。
### 3.2 patbond-doc —— 本刻无待提交内容
`git status --porcelain`(含 --ignored)为空;main 与 origin/main 同在 `ca8cb72 完善开发文档`(ADR-001~005 的 decisions.md + mkdocs.yml 导航,已推送)。既成事实备注:更贴切的信息应为 `docs: 新增 ADR-001~005 架构决策记录`,同样不建议改写已推送历史。本次 strict 构建未在仓库产生任何文件。
### 3.3 patbond-flutter —— 14 个文件待处置(唯一真正待提交的仓库)
`git status --porcelain -uall` 全量清单与逐文件处置:
| 文件 | 状态 | 处置 | 说明 |
| --- | --- | --- | --- |
| `README.md` | M | **用户自决** | 未提交改动仅一行:运行段新增 `flutter clean`(diff 已核,无其他内容)。是用户本人的改动,不并入第一波提交;若用户决定保留,建议连同 m2 的 `--output=none` 修复一起单独提交 |
| `lib/core/theme/app_theme.dart` | M | 应提交 | ADR-005 主题重写(珊瑚橙 token 体系) |
| `lib/features/create/create_page.dart` | M | 应提交 | 硬编码色 → token |
| `lib/features/home/home_page.dart` | M | 应提交 | 同上 |
| `lib/features/pets/pets_page.dart` | M | 应提交 | 同上 |
| `lib/features/profile/profile_page.dart` | M | 应提交 | 同上 |
| `lib/widgets/common.dart` | M | 应提交 | 同上 |
| `lib/core/widgets/brand_mark.dart` | ?? | 应提交 | 新增认证基础组件 ×5 |
| `lib/core/widgets/app_text_field.dart` | ?? | 应提交 | 〃 |
| `lib/core/widgets/primary_button.dart` | ?? | 应提交 | 〃 |
| `lib/core/widgets/inline_error_banner.dart` | ?? | 应提交 | 〃 |
| `lib/core/widgets/auth_scaffold.dart` | ?? | 应提交 | 〃 |
| `test/core/widgets/primary_button_test.dart` | ?? | 应提交 | 组件 widget 测试 ×2 文件(6 用例) |
| `test/core/widgets/app_text_field_test.dart` | ?? | 应提交 | 〃 |
已忽略、确认不入库:`build/``.dart_tool/``.flutter-plugins-dependencies``android/local.properties`、iOS/Android 生成文件等(`git status --ignored` 全部 `!!`,规则健全)。
**提交前门禁已独立复跑(2026-09-04,非转述 08 报告)**:
```text
$ dart format --output=none --set-exit-if-changed lib test → Formatted 22 files (0 changed), exit 0
$ flutter analyze → No issues found! (ran in 0.7s)
$ flutter test → 00:01 +7: All tests passed! (5 组件测试 + 1 导航冒烟 + 1)
```
**建议提交信息**(排除 README.md 后一条提交):
```
feat: 迁移珊瑚橙主题体系并新增认证基础组件(ADR-005)
- app_theme.dart 重写为语义 token(AppColors/AppRadius),落地 primaryStrong/error 等 AA 对比度色
- 五个页面与公共组件的旧靛蓝硬编码色值全部替换为 token,仅换色不动布局
- 新增 BrandMark/AppTextField/PrimaryButton/InlineErrorBanner/AuthScaffold 及 6 个 widget 测试
- 门禁:dart format(0 changed)/flutter analyze(0 issues)/flutter test(7 passed)
```
**建议 api/doc 提交信息**:本刻两仓无待提交内容,上表既成事实备注已给出应然写法,供后续波次遵循;api 下一波提交信息待其开发完成后按实际改动拟定(中文语义前缀 refactor/feat)。
---
## 4. 里程碑证据索引(iteration-1-reports/ 01-08)
| 报告 | 角色 | 核心验收证据 / 结论 |
| --- | --- | --- |
| `01-pm-task-breakdown.md` | Senior Project Manager | M0 + 登录纵切 8 任务的工单化分解;M0 的 Flyway 化与第 8 节任务 1 合并为工单 T1(仅 identity/media schema);明确社区/AI/预约不在本迭代 |
| `02-dev-technical-assessment.md` | Senior Developer | 实读三仓源码的现状盘点与选型建议,是 ADR-001(升 Boot 3)/ADR-002(移除 Nacos)的技术论证来源 |
| `03-reality-check.md` | Reality Checker | 总评 **NEEDS WORK**;确认文档描述诚实、无夸大;两个环境硬阻塞(无 Nacos 实例、数据库不可验证)+ 默认 JDK 26 与基线 17 不符——前者已被 ADR-002 从根上消除,后者由 07 报告以 `JAVA_HOME=/usr/lib/jvm/java-17-openjdk` 方案落地 |
| `04-ui-login-design-spec.md` | UI Designer | 登录/注册 UI 规范;裁决双视觉分歧、定义 token 体系与 `primaryStrong #D6431A``error #D0342C`(AA 对比度),即 ADR-005 补充规范的正文 |
| `05-experiment-tracking-plan.md` | Experiment Tracker | 身份漏斗(注册→登录→me→退出)埋点事件规范与实验规划;实现依赖后端契约冻结,尚未落码 |
| `06-evidence-audit.md` | EvidenceQA | 开工前基线:B1/B2 两 Blocker、M1-M5、m1-m4 共 11 项问题(全部附文件+行号证据);第 5 节给出登录纵切验收所需的完整证据清单(测试输出/curl transcript/psql/截图),仍是 M1 里程碑验收的执行标准 |
| `07-backend-baseline-report.md` | Senior Developer | 第一波后端交付:Boot 2.7.18→**3.5.16**、Cloud 2025.0.3、移除 Nacos(ADR-001/002)、common 瘦身(M2)、Maven Wrapper(M3 半)、README 重写(M4);**21 测试 BUILD SUCCESS** 原始输出;两服务干净配置启动 + 端到端冒烟(注册/登录/internal 均通,错密码 500 为已知 M1 遗留);进程已清理。→ 已作为 `c7ddaec` 提交并推送 |
| `08-flutter-theme-report.md` | Frontend Developer | 第一波 Flutter 交付:ADR-005 主题迁移(旧→新 token 映射表)、5 个认证基础组件、6 个组件测试;门禁三命令全绿(format 0 changed / analyze 0 issues / **flutter test +7**)——本档案 2026-09-04 复跑复现同样结果。→ 尚未提交,见 3.3 清单 |
**里程碑口径**:第一波「工程基线」的两份交付(07/08)验收证据齐全且经独立复核;ADR 文档门禁(mkdocs --strict)本次首次实证通过。里程碑归档条件已满足,唯一未落账动作是 patbond-flutter 的提交。
---
## 5. 移交后续波次的未闭环清单
1. **B2 三件套**(数据库持久化 + JWT + `/internal` 鉴权)——M1 里程碑主体,验收按 06 报告第 5 节证据清单执行。
2. **M1 错误状态码折叠**——统一异常契约工单;现有 `loginPropagatesFeignExceptionUnhandled` 测试在改造时按新契约改写。
3. **M3 后半:CI 载体**——`./mvnw clean test` 与 Flutter 三命令已可直接作为门禁命令,缺执行载体;文档门禁可加 `pip install mkdocs && mkdocs build --strict`
4. **M5 / 工单 T1**——bootstrap SQL 拆 Flyway baseline 与种子数据,验收含 `grep -c "Patbond@123"` = 0。
5. **m2**——`patbond-flutter/README.md:34``--output=none`,一行改动,建议随用户 README 自决一并处理。
6. **m1/m3**——widget_test 演示数据断言与 demo 展示字符串,随登录页/真实数据接入清除。
7. `AuthTokenResponse.expiresAt` 无时区 LocalDateTime(07 报告遗留 4),随 token 重构处理。
---
- 本次动作留痕:安装 mkdocs 至 `~/.local`(pip --user);mkdocs 产物写入 scratchpad(`mkdocs-site/`,会话级临时目录);flutter 门禁复跑仅触碰 git 忽略的构建缓存。三仓的受跟踪文件零修改、零提交、无遗留进程。