比较提交

...
3 次代码提交
作者 SHA1 备注 提交日期
API Changelog Bot和Claude Opus 5 00ae9ffbca fix(gate): #8064 not_required 条目清空 verified_at——该字段仅在前端动作时使用
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:04:51 +08:00
API Changelog Bot和Claude Opus 5 25ee4c716f docs: 纠正 #7988 FAILED 态测试环境无法构造的成因——异步消费窗口过短,非灰度开关
原文错误引用了灰度开关,实际原因是 PENDING 在途窗口小于 2.6 秒、异步消费方
(GroupDispatchPlanRefreshOutboxListener,@Async + AFTER_COMMIT)在窗口内即完成,
导致测试环境构造不出停滞态;但生产环境可达。前端必须实现该分支。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:04:15 +08:00
API Changelog Bot d86979fbac fix(#8064): 订正存量收敛已完成——从 7 条孤儿关系收敛到 10 行摘除+4 条释放+2 条保持 ACTIVE
AC-8 验收项:摘除成员 10 行(AUTO_OCCUPANCY_RELEASE),释放关系 4 条(AUTO_SINGLE_MEMBER),保持 ACTIVE 2 条(设计如此,各剩 2 个成员),收敛时刻 2026-09-21 22:27:47 UTC。本轮点名执行,名单外同类数据可能仍存在,前端展示逻辑需自行兜底。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:03:36 +08:00
共修改 2 个文件,包含 8 行新增和 3 行删除
@@ -271,7 +271,7 @@ Authorization: Bearer <token>
| **前端是否必须同步** | 是。新字段是告警判据的唯一来源,不同步则无法正确判停滞;`planRefreshStalled` 与 `planRefreshStalledReason` 必须实现 |
| **路径 / HTTP 方法** | 不变 |
| **入参 / 出参结构** | 只新增 7 个字段,不删不改既有字段 |
| **FAILED 态生产可达** | 是。生产环境灰度开关尚未开启(属独立运维动作),但 FAILED 态的业务逻辑已就绪;前端**必须**把 `planRefreshStalled=true + planRefreshStalledReason=STATE_FAILED` 这条分支实现出来,不要因为测试环境造不出来就跳过 |
| **FAILED 态生产可达** | 是。`FAILED` 态在测试环境中无法构造(刷新在途窗口过短,异步消费方在窗口内即完成),但**生产环境可达**。前端**必须**实现 `planRefreshStalled=true` + `planRefreshStalledReason=STATE_FAILED` 这条分支 |
| **性能影响** | 极小。七个字段由既有表直读或实时计算,无新 JOIN、无新子查询 |
| **下游兼容** | 安全。字段全是观测投影,无外发依赖 |
@@ -11,7 +11,7 @@ frontend_status: "not_required"
frontend_owner: ""
frontend_ref: ""
target_release: ""
verified_at: "2026-09-21"
verified_at: ""
status_note: "本条无任何接口出入参或错误码变化,变的是同一请求的副作用:共用关系现在会在成员失去占用时自动收缩、剩余不足 2 人时自动解除。gateway_status=verified 的依据是 2026-09-21 经网关 https://api.test.1814.love:9443 的真实调用(建关系 + 两次 soft-clear-assignment),调用流水与库内终态逐条对照一致,不是只看部署登记。frontend_status 取 pending 而非 not_required:本条会让共用关系『自己消失』,前端是否需要改代码取决于它有没有缓存 activeShareGroupId 或假设关系只能人工解除——那是我无法从后端查证的事实,所以不替前端下 not_required 的结论;mmg 评估后若确认零改动,再由前端侧改为 not_required。⚠️ 存量数据尚未收敛(工单 #8064 AC-5 未完成,成文时实测孤儿关系 7 条),本次修复只对修复上线后发生的释放动作生效。前端实证 not_required(mmg 2026-09-21):按「四、前端要做什么」逐项自查——activeShareGroupId/shareGroup/share-groups/shareEligible 前端 src 全仓零命中(共用关系属 #7444 未接入挂起域,同 #8051/#8061 实证口径),前端无任何共用关系状态缓存、无「关系只能人工解除」的假设;未来接入时均为操作后实时拉取,自动收缩不产生前端脏读。"
updated_at: "2026-09-21"
base: "dev-v3"
@@ -127,7 +127,12 @@ if (!context.dualWrite()) {
- **取消派单**对在途行的行为(仍落 `exception`、仍保留占用,#6152 定案不变)。
- **整团解除**的审计原因(PR #8077 专门保证它不被夺走)。
- 占用账本(`fleet_resource_occupancy_*`)的灰度形态——**仍维持 `LEGACY`,本次修复没有切换它**,这正是本次修复的设计目标:不靠切形态也能让收缩跑起来。
- **存量数据**:⚠️ **未收敛**。工单 #8064 AC-5 的存量收敛尚未执行(成文时实测孤儿关系 **7** 条,判据为"有 alive 成员但该成员已不占用本资源的 ACTIVE 关系")。本次修复**只对修复上线之后发生的释放动作生效**,历史遗留的不一致关系仍需单独收敛,完成后本文件会追加说明。
- **存量数据**:已通过 internal 端点执行收敛(2026-09-21 22:27:47 UTC,不是 SQL 直改)。结果:
- 摘除成员 **10 行**:`left_at = 2026-09-21 22:27:47`、`leave_reason = AUTO_OCCUPANCY_RELEASE`
- 整体释放关系 **4 条**:`status = RELEASED`、`release_reason = AUTO_SINGLE_MEMBER`、`released_at = 2026-09-21 22:27:47`
- 摘除成员后仍保持 ACTIVE 的关系 **2 条**(**非残留**:它们各有 3 个成员,摘掉 1 个后剩 2 个,按收缩规则"剩余 < 2 时解除"不触发)
⚠️ 本轮收敛是**点名执行**(传入显式 ID 名单),不是全库扫。若名单外仍有同类历史数据,前端在界面上仍可能遇到"有成员、但该成员已不占用该资源"的关系——**展示逻辑该兜的还得兜**,别假设这类数据在库里已绝迹。
## 七、相关历史 PR