docs: 迁入第一迭代过程报告并建立进展看板

- 新增 development/iterations/iteration-1/:15 份角色报告 + 进展看板(已完成/未闭环/下一步),作为双人协作的进度事实来源
- 新增 ADR-006:测试与交付容器化策略(Testcontainers / 交付 Docker 包 / 本机库仅个人联调)
- Git 工作流规范补充:敏感信息只进忽略文件或 sample、测试数据不入库、测试代码限标准测试目录
- 门禁:mkdocs build --strict 通过(零警告)
This commit is contained in:
2026-09-04 10:45:05 +08:00
parent 027876ae00
commit 209021e7d2
19 changed files with 3077 additions and 1 deletions
@@ -0,0 +1,149 @@
# 09 PM 任务板更新(第一迭代 · 第二轮开工)
> 作者:Senior Project Manager
> 日期:2026-09-04
> 依据:01-pm-task-breakdown.md(15 工单基线)、patbond-doc/docs/architecture/decisions.md(ADR-001~005,已 Accepted)、07-backend-baseline-report.md、08-flutter-theme-report.md
> 约定:状态口径为 Done / In Progress / Blocked / Not Started;"完成依据"必须指向具体报告章节,无证据不标 Done。
---
## 1. 15 工单状态总览
| 工单 | 名称 | 状态 | 完成依据 / 说明 |
| --- | --- | --- | --- |
| T0-1 | Maven Wrapper | **Done** | 报告 07 §2:`mvnw`/`mvnw.cmd`/wrapper 配置已生成(Maven 3.9.16),README 命令已改用 `./mvnw`;§3.1 全量 `./mvnw clean test` BUILD SUCCESS |
| T0-2 | Flutter/Dart 版本锁定 | **Not Started** | 报告 08 未涉及版本锁定文件;仍缺 FVM 或等效方案 |
| T0-3 | 默认配置与环境变量注入 | **Done(按修订口径)** | 报告 07 §2:执行中用户改令采用 **.sample 模式**(`application.yml` 保持忽略、sample 入库),原"可提交 yml"口径作废。Nacos 变量随 ADR-002 删除,新增 `PATBOND_USER_SERVICE_URL`;测试专用配置使干净检出 `clean test` 不依赖复制步骤(已实测)。残余:启动服务仍需一次 sample→yml 复制,README 已写明,接受为定稿方案 |
| T0-4 | 本地基础设施编排 | **Not Started(范围已修订)** | 见 §2 修订:Nacos 移出编排,只剩 PostgreSQL 16。本机 Docker 可用,自动化测试改走 Testcontainers,T0-4 降级为"手动联调/E2E 用编排",不再阻塞 T1/T5 |
| T0-5 | 契约规范冻结文档 | **Not Started** | 未有交付;注意 mkdocs 未安装,`mkdocs build --strict` 验收暂不可执行(见风险 R2) |
| T0-6 | CI 最低门禁 | **Blocked** | 门禁命令已具备(`./mvnw clean test``dart format`+`analyze`+`test` 均本地绿),但 **CI 载体缺失**且**三仓改动未提交**,无远端流水线可挂。解除条件:三仓完成首次提交并确定 CI 载体 |
| T1 | Flyway baseline(identity/media) | **In Progress** | 本轮第二波"后端持久化纵切"已启动(见 §3);依赖修订:验收环境由 T0-4 改为 Testcontainers |
| T2 | patbond-user 接 PostgreSQL + UUID | **In Progress** | 同上,持久化纵切范围内 |
| T3 | 统一异常响应与 DB 一致校验 | **In Progress** | 同上;描述按 ADR-004 修订(见 §2)。注意报告 07 §4.1:auth 侧错误折叠现状已被测试钉死,T3 落地时须同步改写 `loginPropagatesFeignExceptionUnhandled` |
| T4 | 可校验 access token + refresh 会话 | **Not Started** | ADR-003 已拍板参数,决策阻塞解除;ADR-001 落地后 JWT 选型无降级问题。第三波首项 |
| T5 | 认证链路集成测试 | **Not Started** | Testcontainers 路径已确认可行(Docker 可用);注册/登录持久化路径的测试可随第二波滚动补齐,完整验收仍等 T4 |
| T6a | OpenAPI 契约 | **Not Started** | D5 已由 ADR-004 拍板,登录方式字段无悬念;第三波第二项,冻结条件见 §3 |
| T6b | Flutter API Client | **Not Started** | 等 T6a 冻结 |
| T7 | Flutter 登录页 + 安全存储 + 登录态恢复 | **In Progress(前置件已交付)** | 报告 08 §1:5 个登录组件(BrandMark/AppTextField/PrimaryButton/InlineErrorBanner/AuthScaffold)+ 各 3 个 widget 测试已交付,`analyze`/`test` 全绿。**未动**:登录/注册页面、auth 状态机、flutter_secure_storage、拦截器(报告 08 §5.7,按计划等契约冻结) |
| T8 | E2E 用例 | **Not Started** | 全链路收口,等 T4/T5/T7 |
**新增工单(计划外,纳入任务板)**
| 工单 | 名称 | 状态 | 说明 |
| --- | --- | --- | --- |
| T9 | 珊瑚橙主题迁移(ADR-005) | **Done** | 原 15 工单外、ADR-005 新增范围。报告 08 §1-§4:语义 token 主题重写、五页替换、format/analyze/test 全绿。遗留取舍(sage 对比度、品牌字体后置等)已在报告 08 §5 如实记录 |
| T10 | UI 设计 QA(对照 04 号设计规范验收 T9/T7 组件) | **In Progress** | 本轮第二波启动 |
| T11 | 埋点实现规范(承接 05-experiment-tracking-plan) | **In Progress** | 本轮第二波启动 |
| T12 | 双重验证(复核 07/08 交付证据) | **In Progress** | 本轮第二波启动;其结论是第三波放行的前置之一 |
**完成率**:原 15 工单 Done 2(T0-1、T0-3)≈ **13%**;In Progress 4(T1/T2/T3/T7),Blocked 1(T0-6),Not Started 8。含新增工单口径:19 单中 Done 3 ≈ 16%,In Progress 7。第一波实际消化的还有两项不在工单编号内的大头:ADR-001 Boot 3 升级与 ADR-002 去 Nacos(报告 07 §1),它们是多个后续工单的解阻塞项,进度含金量高于百分比表象。
---
## 2. 受 ADR 影响的工单修订(以本节为准)
### T0-4 本地基础设施编排 —— 受 ADR-002
- **描述修订**:编排目标从"PostgreSQL 16 + Nacos"改为 **仅 PostgreSQL 16**。Nacos 相关的端口、健康检查、文档段落全部移出;开发计划 5.1-5.3 节涉及 Nacos 的内容以 ADR-002 为准不再执行。
- **验收标准修订**:
- 一条命令拉起 PostgreSQL 16,端口/库名/账号与 `.sample``PATBOND_DB_*` 默认值匹配(注意:配置采用 sample 模式,不再是原工单的"可提交 yml");
- 文档说明启动、停止、重置数据方式。
- **定位修订**:自动化测试(T1 迁移校验、T5 集成测试)一律走 Testcontainers,不依赖 T0-4;T0-4 只服务手动联调与 T8 E2E。它从关键路径前端移到 T7 联调之前完成即可。
### T0-3(已完成,记录口径变更)—— 受 ADR-002 + 执行中指示
- 原验收"无需手工复制 sample"作废,定稿为 sample 模式 + 测试专用配置兜底;`NACOS_SERVER_ADDR` 从环境变量表删除,新增 `PATBOND_USER_SERVICE_URL`(Feign 静态地址,ADR-002)。
### T3 统一异常响应 —— 受 ADR-004
- **描述修订**:唯一性校验范围收敛为 **用户名**(注册/登录仅用户名 + 密码)。手机号唯一性仅保留数据库约束(数据模型保留扩展能力),**不做**应用层手机号注册/登录校验流程,不做短信验证码相关错误码。
- **验收标准修订**:"重复用户名/手机号"改为"重复用户名";其余(规范错误体、并发重复注册测试、日志脱敏)不变。补充一条:改写报告 07 §4.1 钉死现状的 auth 侧测试,401/409 须正确穿透 Feign 传导(不得再折叠为 500/400)。
### T4 token/会话 —— 受 ADR-003 + ADR-001
- **描述修订**:删除"未拍板前按建议默认值"措辞。参数已定:access 15 分钟、refresh 30 天且每次刷新轮换、多设备并行、退出仅撤销当前会话;全部实现为配置项(ADR-003 原文要求)。JWT 依赖按 Boot 3.5 BOM 选型,无 2.7 降级顾虑。
- **验收标准补充**:配置项默认值与 ADR-003 数值一致并有测试锁定;`AuthTokenResponse.expiresAt``LocalDateTime` 改为带时区 ISO 8601(报告 07 §4.4 遗留,并入本单)。
### T6a OpenAPI 契约 —— 受 ADR-004 + ADR-003
- **描述修订**:删除"登录方式字段依赖决策 D5"。register/login 请求体定稿为用户名 + 密码两字段;不出现手机号登录、验证码、第三方登录端点。refresh/logout 语义按 ADR-003(轮换、仅撤销当前会话)编写。
- **验收标准补充**:若 mkdocs 仍未安装,"纳入文档站导航 + `mkdocs build --strict`"验收降级为"契约文件评审通过 + `mkdocs.yml` 导航条目已加(构建校验记入 R2 待补)",不阻塞冻结。
### T7 Flutter 登录页 —— 受 ADR-004 + ADR-005(轻微)
- **描述补充**:登录页表单仅用户名 + 密码;按 ADR-004 预留不渲染的凭证扩展区。UI 使用 T9 已交付的 5 个组件与珊瑚橙主题,以 04 号设计规范为验收基准(T10 的 QA 结论须先出)。
不受 ADR 影响、维持原文的工单:T0-1、T0-2、T0-5、T0-6、T1、T2、T5、T6b、T8(T1 仅依赖项由 T0-4 改为 Testcontainers,内容不变)。
---
## 3. 第二波执行映射与第三波启动条件
### 第二波(本轮已同时启动,四条并行线)
| 并行线 | 映射工单 | 交付物 |
| --- | --- | --- |
| 后端持久化纵切 | T1 + T2 + T3(串行纵切,一人连续负责) | Flyway baseline(identity/media)、UUID 用户持久化、统一异常契约;附 Testcontainers 下迁移一次成功 + 现有 21 测试改造后全绿 |
| UI 设计 QA | T10(验收 T9,兼查 T7 组件) | 对照 04 号规范的差异清单与放行结论 |
| 埋点实现规范 | T11 | 可实施的埋点/事件定义文档,供 T7 登录页开发时同步埋点 |
| 双重验证 | T12 | 对报告 07/08 声称结果的独立复核结论 |
第二波关键路径:**持久化纵切(T1→T2→T3)**,其余三线不占关键路径。
### 第三波(顺序:T4 JWT 会话 → T6a OpenAPI 冻结 → T6b/T7 Flutter 登录联调 → T5/T8 E2E)
各环节启动条件,满足即放行、不齐不开工:
1. **T4 JWT 会话** 启动条件:
- T1/T2 完成(identity 会话相关表已由迁移建立,用户持久化可用);
- T12 双重验证对报告 07 基线无否决性发现;
- (已满足)ADR-001 Boot 3 就位、ADR-003 参数拍板。
2. **T6a OpenAPI 冻结** 启动条件:
- T3 错误契约落地(错误体字段定型);
- T4 token 响应字段定型(含 ISO 8601 expiresAt);
- 起草可提前与 T4 并行,但**冻结**必须在上述两项之后。
3. **T6b + T7 联调** 启动条件:
- T6a 已冻结;
- T4 后端可运行且本地数据库路径打通(T0-4 编排完成,或本地 PostgreSQL 账号问题解决,二者其一);
- T10 UI QA 放行结论已出;T11 埋点规范可用(登录页开发同步埋点)。
4. **T5 收口 + T8 E2E** 启动条件:
- T4、T7 完成;
- T0-4 编排可用(E2E 必须真实编排,不能只靠 Testcontainers);
- **三仓已提交**且新增文档齐备(T8 验收含"新成员仅凭仓库文档复现",未提交的仓库谈不上复现)。
第三波前还应穿插两个小补课:T0-2(Flutter 版本锁定,S,随时可做)与 T0-6 解锁(首次提交 + CI 载体,见 R3/R4)。
---
## 4. 风险清单更新
### 已消除
| 原风险 | 消除依据 |
| --- | --- |
| Nacos 硬依赖导致干净检出无法启动/CI 无法跑 | ADR-002 + 报告 07:依赖、配置、旧 target 残留全清,grep 确认无 nacos/8848 残留 |
| Spring Boot 2.7 技术代际(原风险 8)拖累 JWT/Flyway/Testcontainers 选型 | ADR-001 + 报告 07 §1:已升 3.5.16 / Cloud 2025.0.3 |
| D3、D5 决策悬置阻塞 T4/T6a/T7 定稿 | ADR-003、ADR-004 已 Accepted |
| 零测试空转(审计 B1) | 报告 07 §3.1:21 测试全绿;报告 08:Flutter 7 测试全绿 |
| 干净检出测试不可运行 | 报告 07:测试专用配置,移走本地 yml 实测 clean test 仍绿 |
| 品牌色占位(靛蓝)与正典冲突 | ADR-005 + 报告 08 全量迁移 |
### 仍然存在 / 新增
| # | 风险 | 影响 | 缓解 / 责任 |
| --- | --- | --- | --- |
| R1 | 本地 PostgreSQL 无可用账号 | 手动联调、T7 联调、T8 E2E 无真实库可连 | 自动化侧已由 Testcontainers 兜住;联调前必须完成 T0-4 编排(Docker 可用)或申请到账号,列为 T7 启动条件 |
| R2 | mkdocs 未安装 | T0-5、T6a 的 `mkdocs build --strict` 验收无法执行,文档门禁缺一角 | 短期按 §2 降级验收;安装 mkdocs 列为文档线待办,补跑构建后风险关闭 |
| R3 | **三仓改动均未提交**(最高优先级) | 一波 + 二波两天工作量仅存在于工作区,误操作即全损;CI、协作、T8"可复现"验收全部无从谈起 | 本轮结束前完成三仓首次提交/分支提交;这是纯操作项,不需要任何新决策,建议第二波各线交付即提交 |
| R4 | CI 载体缺失 | T0-6 Blocked,门禁全靠本地人肉执行,回归防护为零 | 依赖 R3 解除;确定载体(如 GitHub Actions 或内部等价物)后按 T0-6 原验收落地 |
| R5 | auth 错误折叠现状被测试钉死(报告 07 §4.1) | 若 T3 改契约时漏改该测试,会出现"测试绿但契约错"的假象 | 已写入 T3 修订后验收标准 |
| R6 | 其他开发机 `~/.m2` 旧 common 快照(报告 07 §5) | 他人拉取后首次构建可能踩旧 nacos 依赖快照 | README 已含 `./mvnw -pl patbond-common install` 步骤;R3 解除后在提交说明中提示 |
| R7 | T0-2 Flutter 版本锁定缺失 | 多人开发时 SDK 漂移,analyze/test 结果不可比 | S 级工单,第三波前插队完成 |
---
## 5. 板面结论
- 第一波交付真实且质量可查:两份报告的验收命令输出齐全,无凭空声称。
- 第二波已把后端关键路径(T1→T2→T3)推入 In Progress,配套三条 QA/规范线并行,结构合理。
- 第三波唯一的硬闸门是 **T12 双重验证结论****持久化纵切完成**;流程性最大隐患是 **R3 三仓未提交**,应在任何新代码继续堆积前处理。