docs: v0.4.0 发布记录 + 功能清单 M3.5 节 + 发布 E2E 回归报告
CI / docs-build (push) Successful in 1m22s

- releases.md 新增 v0.4.0(M3.5 体验补齐):三仓 tag、门禁 8 项证据、
  首次经 PR 流程发布的操作记录与流程验证结论、期间安全事件索引
- checklist 变更登记:**回归清单由两份改为四份**(M1/M2/M3/M3.5),
  原则「每个引入对外端点的迭代都应有对应 E2E 脚本并在此后每次发布回归」
- feature-checklist 新增第 13 节(M3.5 共 13 条)
- 08 号报告:E2E 四份 42/42 场景 234 断言零失败、契约偏差 0;
  另实证零迁移在存量库升级路径(Flyway: No migration necessary)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-14 11:19:13 +08:00
parent 38d9e97174
commit 5cc6361534
4 changed files with 433 additions and 1 deletions
+60
View File
@@ -6,6 +6,66 @@
---
## v0.4.0 — M3.5 体验补齐(2026-09-14
**首次经 PR 流程发布**v0.3.0 为直推 main,分支保护启用前)。
### 三仓 tag
| 仓库 | tag | 提交 | 内容 |
| --- | --- | --- | --- |
| patbond-api | `v0.4.0` | `3cd8005` | 用户资料读写 + 宠物头像 + 社区统计;379 测试;契约 v1.4.0 快照 |
| patbond-flutter | `v0.4.0` | `fbcd734` | 中文本地化 + 日期录入收口 + 资料页/编辑页 + 头像接线;597 测试;四份 E2E 脚本 |
| patbond-doc | `v0.4.0` | 本记录所在提交 | 契约 v1.4.0 + M3.5 报告 01~08 + 安全事件复盘 + 服务器暴露面清单 |
### 版本内容(相对 v0.3.0 的增量)
- **用户资料**`GET /me``nickname`/`avatarUrl`;新增 `PATCH /me`(三态:键缺省=不改 / 显式 null=清空 / 给值=设置)
- **头像**:用户与宠物头像上传(复用 M3 的 MinIO 两步上传),`purpose` 白名单 +`user_avatar`/+`pet_avatar`
- **社区统计**`GET /me/community-stats`(获赞总数 + 作品数,读侧实时聚合,无新冗余列)
- **客户端体验**:中文本地化(此前从未配置 `flutter_localizations`,Flutter 静默回退英文)、日期录入收口共享层(7 处调用点 + 手输 + 「今天」快捷)、资料页 demo 退役、花费卡显示实际月份
- **契约**openapi.yaml **v1.4.0**32 路径/45 操作/75 schema),**对 v1.3.0 纯增量**(无字段删改/类型变更/必填收紧,已写入 `info.description`
- **零 Flyway 迁移**ADR-022):所需列 V1/V3/V5 早已存在,`purpose` 白名单为配置项
- **决策**ADR-022
### 发布门禁证据
| 门禁项 | 结果 | 证据 |
| --- | --- | --- |
| 全量测试 | ✅ | api **379** / flutter **597**,双绿 |
| **E2E 回归(四份,同环境串行)** | ✅ | M1 7/7 + M2 11/11 + M3 14/14 + **M3.5 10/10** = **42/42 场景、234 断言零失败** — [08 号报告](iterations/iteration-3.5/08-release-e2e-regression.md) |
| 契约偏差 | ✅ **0** | 逐场景对照 v1.4.0;契约计数机械复核 32/45/75 |
| 契约向后兼容 | ✅ | v1.3.0→v1.4.0 纯增量,v1.3.0 客户端无需改动 |
| 契约一致性矩阵 | ✅ | 173→**181 格**,11 格「未声明字段即漂移」的红全部转绿,mutation 三处注毒自证 |
| **零迁移在存量库上实证** | ✅ | compose 起于既有 `pgdata` volumeFlyway 日志 `Current version: 5 / No migration necessary.` |
| CIpush + **pull_request** | ✅ | api 5m31s / 6m42sflutter 3m46s / 3m44sdoc 2m58s |
| 凭证防泄漏 | ✅ | `check-secrets.sh --all` exit 0 |
### 发布操作记录
1. **首次走 PR 流程**(分支保护生效后):两仓各建 `dev → main` PR(标题 `v0.4.0 M3.5 体验补齐`),等 `pull_request` 状态检查转绿后以 **Fast-forward only** 合并 → **main == dev、零合并提交、历史保持线性**
2. **流程本身也被验证了**v0.3.0 是直推 main,「PR + 状态检查」这套机制从未真实走过。本次确认:`pull_request` 触发器会跑、分支保护确实要求该检查通过、PR 会自动跟随 dev 新提交重新检查(发布途中 E2E 脚本提交推入 dev,PR 随即重跑)。
3. **CI 从安全事件恢复后的首次完整验证**:见下方「期间事件」。
### 期间事件:Gitea gitconfig 注入(已闭环)
本迭代期间发生一次安全事件,CI 全面中断约一天。完整复盘见 [07 号报告](iterations/iteration-3.5/07-security-incident-20260911.md),纪律固化见新建的[服务器暴露面清单](server-exposure.md)。要点:攻击**未达成代码执行**、三仓代码经核对**未被篡改**、**无系统层入侵**;处置后外部验证四项通过。
### checklist 变更(下次发布适用)
- **回归清单由两份改为四份**:M1/M2/M3/M3.5。原则是「每个引入对外端点的迭代都应有对应的 E2E 脚本,并在此后每次发布回归」。
- 发布前若 dev 仍有提交推入,PR 检查会重跑——**以最终 HEAD 的检查结果为准**,不要用旧的绿色状态放行。
### 已知遗留
**真机验证**M2 两项 + M3 四项 + M3.5 新增(头像上传弱网、头像缓存)——步骤全部备齐在[真机验证清单](device-verification.md),待设备到位。
**功能遗留**:「我的收藏与草稿」列表页(后端就绪,缺 2 页面)、月份网格选择器、`SegmentedButton` 主题债、`widthPx/heightPx` 恒 null、`eventVersion` 口径未定型、uploading 超时清理任务、429 限流、话题/关注列表/作者主页(ADR-018 剪出)。
**跨迭代技术债**access token 黑名单、`/internal` 改 mTLS。
**待评估**:文档站公开可访问是否加访问控制(见服务器暴露面清单)。
## v0.3.0 — M3 社区(2026-09-10
**首次正式发布**,发布流程首次演练。