提交图
100 次代码提交
作者 SHA1 备注 提交日期
API Changelog Bot 5cbd1edafa docs(changelog): #8320 团期子订单未录大交通提交用车需求须显式确认不用接送机(587044)
changelog-filename-gate / validate (push) Failing after 2s
新增 v2 changelog:调整订单「车辆安排」页对团期子订单新增接送机不用声明的提交闸。

- snapshot 出参新增 transferDeclaration / transferTransportPresent
- submit 入参 updates.transferDeclaration;某方向无大交通未表态时返回新码 587044(整笔零写入)
- 车务侧接送机 readiness 随之由「待补接客/送客信息」变「无需接客/无需送客」
- 附带实测证据、契约对照表、已知约束(声明撤销条件、判据只看本次请求体)

Refs #8320
2026-09-24 12:27:35 +08:00
API Changelog Bot b865fab5b8 docs(changelog): #8311 团期分组座位数改档位下拉 + 809124 档位校验(前端座位下拉/组号只读/汇总座位兜底诊断)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-24 12:11:06 +08:00
API Changelog Bot e28c94c18b docs(changelog): #8301 车务看板带日期筛选时单条 requirement_id 为空的派车行不再清空整个日期窗
changelog-filename-gate / validate (push) Failing after 2s
2026-09-24 10:57:15 +08:00
API Changelog Bot cda5a7adea changelog(8292): 订单标签四个写端点补订单归属守卫,新增写面码 581064
changelog-filename-gate / validate (push) Failing after 2s
接口:POST /v3/admin/order/{orderId}/tag、DELETE .../tag/{tagId}、
PATCH .../tag/{tagId}、PUT .../tags
- 四个写端点补订单归属校验,与读面(#8290)同一放行集合;
- 非归属人失败新增 581064「无权修改该订单」(不复用 581008);
- 581433 文案由「非创建人且非主管」订正为「非创建人」(实现里无主管分支);
- deleteTag/patchTag 的 orderId 不存在时由 581410/581411 改为 581401;
- 测试服实测:非归属 581064 且无残留、本人与超管 200。

Refs #8292
2026-09-24 10:12:20 +08:00
API Changelog Bot fb00989545 changelog(8294): 团期配车就绪检查座位不足黄牌扣司机座,新增 passengerSeatTotal
changelog-filename-gate / validate (push) Failing after 2s
接口:GET /admin/fleet/group-dispatch/batches/{groupBatchId}/readiness
- WARN_SEAT_SHORTAGE 判据改为「可载客数合计 < 该日用车人数」(每车扣 1 个司机座);
- 新增响应字段 passengerSeatTotal;gap 改按它计算;seatTotal 语义与数值不变;
- message 改写,写明「含司机座」与「已扣司机座后可载客 N 人」;
- 会新增黄牌:座位合计 >= 用车人数 > 可载客数合计。

Refs #8294
2026-09-24 09:57:31 +08:00
API Changelog Bot和Claude Opus 5.5 bfe9bb8810 docs(changelog): 团期「查看需求」Tab 缺失清单改显团号、需求状态列漏看车侧缺失(前端缺陷,交 mmg)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 09:52:37 +08:00
API Changelog Bot 473123e2b7 docs(changelog): 前端任务——订单列表撤掉团期ID精确筛输入框(#8252 遗留入口)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-24 09:50:57 +08:00
API Changelog Bot和Claude Opus 5.5 4bfa0002ac docs(changelog): #8235 看板订单记录新增团车整段接管标记,已接管零派车行 TRAVEL 不再生成虚拟待派卡
changelog-filename-gate / validate (push) Failing after 1s
Refs wx/HL#8235

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cfipfut7pN3pLCRibrYygP
2026-09-24 03:54:16 +08:00
API Changelog Bot和Claude Opus 5.5 f82ef9a7f2 docs(changelog): #8228 HOLD 派单降级车务站内信补齐跳转链接,指向车务看板
changelog-filename-gate / validate (push) Failing after 2s
Refs #8228

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cfipfut7pN3pLCRibrYygP
2026-09-23 22:09:11 +08:00
API Changelog Bot和Claude Opus 5.5 eae70b3f8c docs(changelog): #8278 团级用车分组 809116 改为扣司机座,取代 22_8152 旧判据与文案
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cfipfut7pN3pLCRibrYygP
2026-09-23 21:35:44 +08:00
API Changelog Bot和Claude Opus 5.5 6461ab4909 docs(changelog): #8170 订单协作域三只读端点补归属守卫(581008/581045)+ 行程价格字段 / 批量打回 resourceType 契约说明
changelog-filename-gate / validate (push) Failing after 2s
Refs wx/HL#8170

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 20:54:45 +08:00
API Changelog Bot和Claude Opus 5 57d5a24686 docs(changelog-v2): 团期「查看需求」三处契约变更交接件(#8249,含报文变更)
changelog-filename-gate / validate (push) Failing after 7s
- GET /v3/admin/order/group-batch/{groupBatchId}/orders:四个需求状态字段在无 active 需求行时改为 null + 「未提交」,不再回落 PENDING
- GET /v3/admin/order/group-batch/{groupBatchId}/requirement/confirm-check:vehicleMissing[].reason 新增 HOUSEHOLD_REQUIREMENT_NOT_SUBMITTED(809122),与团级 GROUP_REQUIREMENT_NOT_FOUND 并列不短路
- 报文变更:809100 / 809107 / 809108 / 809109 / 809114 / 809115 六条渲染文本由雪花 ID 改为可读名称或直接省略标识符;码值与请求契约未变

后端 dev-v3 @ fc81fff1f 已部署测试环境并经网关实测;门禁 validate-changelog-frontmatter.mjs --files 与 changelog_workflow.py lint 均通过。

Refs #8249

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 19:20:27 +08:00
API Changelog Bot和Claude Opus 5 b8db115cda docs: #8166 交接件订正定稿——补 HOUSE NOTIFY 白名单复核项,frontmatter 保留 mmg 回写
changelog-filename-gate / validate (push) Failing after 2s
首版第一节把兜底分支写成 jumpBiz.js 的 else,实测 origin/v2.1 该文件 44 行、0 个
else,兜底在 index.vue:291-293。首版那句已经发出去过,留着会让下一个读这份交接件
的人去找一个不存在的分支,故保留订正块而不是静默改掉。

新增〇节:mmg 回写的订单白名单含 HOUSE,而 jumpBiz.js:4-5 的头部契约明写「HOUSE 域
bizId 三义不是路由键」,isHouseNotifyRow(:36-38) 是 bizType==='HOUSE' && !isChatRow
——白名单若只按 bizType 匹配就分不开 CHAT 与 NOTIFY 两类行,HOUSE NOTIFY 会按 orderId
打开另一张单且页面不报错。给出一行可自检的用例形状。

取证边界:frontend_ref 77b421f8 在 hl-ui 的 git ls-remote origin 15 个 ref 里查无此
对象(阳性对照 16c3506d 查得到),故本节判据全部取自 origin/v2.1 tip 16c3506d。

target_release 从空串补为 "v2.1":verified 状态下留空会被 E_FRONTEND_STATE 拦,取值
按全仓已填条目主流约定(73/376 用 "v2.1");不取 hl-ui@<sha>,那个 sha 不可达。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 17:26:16 +08:00
API Changelog Bot和Claude Haiku 4.5 7a31cbc816 docs: changelog for #8166 AC-8/AC-9/AC-10/AC-17 frontend delivery
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-23 17:04:54 +08:00
API Changelog Bot 07c74aafe8 docs: 交接订单列表团期关键词筛选与团单行团期展示字段 (#8252)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-23 16:38:24 +08:00
API Changelog Bot c1440208b2 changelog(8194): 订正降级态与请求示例三处(独立对抗评审复核后)
changelog-filename-gate / validate (push) Failing after 1s
1. 字典服务(hl-user-service)不可用时,靠字典才能纳入配置位的角色
   (GUIDE_ASSISTANT / STUDY_TEACHER / LIFE_TEACHER)**同样**返回 582117——
   原文「字典读挂时不会变成一律拒绝」只对内置兜底角色成立。582117 现在有两种成因,
   排查顺序改为「先确认字典服务可用性,再看字典内容」。
2. 请求示例原用了修复后必被 582117 拒的 payload,却紧跟 200 成功响应示例,已换成 GUIDE。
3. 补记两条边界:5 分钟实例缓存窗口;存量脏行会被前端回显提交并逐行校验,
   可能让整次保存(含不传 scopeRoles 的整期覆盖)被 582117 拦下。

同步订正 errorcode javadoc、resolver javadoc、单测 javadoc,并新增一条把降级态
行为钉住的用例(GroupBatchStaffRoleSlotGuardTest#dictUnavailable_dictRoleIsRejectedKnownBoundary)。
2026-09-23 16:30:05 +08:00
API Changelog Bot 40165d4e47 changelog(8194): 配置位缺失守卫 582117 触发集合扩大(管理后台)
changelog-filename-gate / validate (push) Failing after 2s
工单 #8194 / PR #8259。PUT /v3/admin/group-batch/{productBatchId}/staff:
582117 的触发角色集合由「内置兜底名单 GUIDE/LEADER/PHOTOGRAPHER」扩大为
「除 DRIVER / OTHER 以外的全部取值域角色」,字典启用过的
GUIDE_ASSISTANT / STUDY_TEACHER / LIFE_TEACHER 被删回后不再静默放行。

契约零变更(路径 / 入参 / 权限 / 成功响应结构不动),属行为变化。
测试服已实测并已还原现场。
2026-09-23 16:10:21 +08:00
API Changelog Bot和Claude Opus 5 c494ccccdd docs(changelog): #8123 #8148 团期 staff 保存新增 100503 与 582117 两个错误码
changelog-filename-gate / validate (push) Failing after 2s
端点 PUT /v3/admin/group-batch/{productBatchId}/staff 的路径、入参结构、
成功响应结构零变化,多出两个此前不会返回的业务码:

- 100503「资源被占用,请稍后重试」:#8123 给保存口加订单级 @Lock4j
  (key = batch-staff:save:{productBatchId},expire 30s,acquireTimeout 走
  lock4j 默认 3s)后,同一团期并发保存的后到者会收到它。HTTP 200 不是 5xx,
  锁维度是单个团期、跨团期不互斥。
- 582117「角色 {0} 未归属任何人员配置位」:#8148 把角色与人员类型的判据
  改读配置位字典后,必须把「DRIVER/OTHER 结构性无位」与「本该有位却被从
  字典里删掉」分开,后者不拒绝会让该角色的 582114 当场静默失效。

正文写了三件前端会撞上的事:端点名 group-batch 吃的却是 productBatchId、
成功码是 200 不是 0、5821xx 全族在 hl-ui v2.1 无专门分支而靠统一拦截器
按 code 非成功值 toast,故两个新码零改动即有基本行为,待办只有 100503
的可重试语气。100503 与 582117 在测试服活体不可构造的理由已按契约边界
点名环境(前者需临界区 >3s,后者需删全站共享的配置位字典),不是让前端等。

Refs #8123
Refs #8148

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 14:25:31 +08:00
API Changelog Bot和Claude Opus 5 0d44436def docs(changelog): #8218 行程用车需求 PENDING_REVIEW 文案按 kind 分叉
changelog-filename-gate / validate (push) Failing after 2s
两个出口同步调整中文文案:
- 行程用车(TRAVEL)的 PENDING_REVIEW 改为「待提交车务」(等团期管理员整团放行,无逐户审核)
- 接送机(TRANSFER)的 PENDING_REVIEW 仍是「待审核」(有逐户审核动作)

变更接口 2 个,均为查询端点,无新增参数。
后端已部署(dev-v3 commit 7738668b8),前端待改。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 13:49:23 +08:00
API Changelog Bot 0e8feb0b66 remove: rollback, should use 管理后台 in filename 2026-09-23 13:47:47 +08:00
API Changelog Bot和Claude Opus 5 7c56f43ca1 docs(changelog): #8218 行程用车需求 PENDING_REVIEW 文案按 kind 分叉
两个出口同步调整中文文案:
- 行程用车(TRAVEL)的 PENDING_REVIEW 改为「待提交车务」(等团期管理员整团放行,无逐户审核)
- 接送机(TRANSFER)的 PENDING_REVIEW 仍是「待审核」(有逐户审核动作)

变更接口 2 个,均为查询端点,无新增参数。
后端已部署(dev-v3 commit 7738668b8),前端待改。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 13:47:33 +08:00
API Changelog Bot d149813991 remove: rollback mmg suffix, should be admin 2026-09-23 13:46:00 +08:00
API Changelog Bot和Claude Opus 5 5bda64b18a docs(changelog): #8218 行程用车需求 PENDING_REVIEW 文案按 kind 分叉
两个出口同步调整中文文案:
- 行程用车(TRAVEL)的 PENDING_REVIEW 改为「待提交车务」(等团期管理员整团放行,无逐户审核)
- 接送机(TRANSFER)的 PENDING_REVIEW 仍是「待审核」(有逐户审核动作)

变更接口 2 个,均为查询端点,无新增参数。
后端已部署(dev-v3 commit 7738668b8),前端待改。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 13:45:49 +08:00
API Changelog Bot和Claude Opus 5 26b3f7516a docs(8202): 补点名受影响的前端组件(AC-6)
changelog-filename-gate / validate (push) Failing after 1s
原正文只写了泛指的「下拉组件」,没有具体文件名,mmg 拿到后仍要自己找落点。

实测点名(非推断):hl-ui origin/v2.1 上唯一调用 putVehicleRequirement 的 .vue 是
src/views/order-v2/detail/modals/FunItemAdjustModal.vue(:1177 import,
:2968 TRAVEL / :2970 TRANSFER 两个调用点)。阳性对照:该函数在 src/api/orderV2.js
与两个 __tests__ spec 里同样命中,证明 grep 正常工作、.vue 只有 1 个命中是真的。

顺带记一条可查证事实:src/api/orderV2.js 中 putVehicleRequirement 的 JSDoc
错误码一行写的是 582024 / 582091,不含本次新增的 582032 / 582033。

Refs #8202

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 11:14:34 +08:00
API Changelog Bot和Claude Opus 5 9a3d6a04a6 docs(changelog): 新增 #8202 车队字典校验与团期详情页3项前端待办的 changelog
changelog-filename-gate / validate (push) Failing after 2s
#8202/PR #8224 已合并 dev-v3(b439565be)并部署 TEST:用车需求提交/调整两条写路径
共用的车型大类校验新增车队活字典比对(582032/582033),存量码582022不变;
mmg v2.1(7df292624)已提前接入车型字典下拉。

另补团期详情页用车/用房面板3项纯前端待办(乘车户全选汇总/确认按钮布局/对话入口),
经核实②④两项已在 dev-v3+v2.1 端到端实现,故仅收窄为①③⑤三项。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 11:08:43 +08:00
API Changelog Bot和Claude Opus 5 5397036b98 docs(changelog): 用房·汇总首屏必失败根因——同页两组件共用 requirement-summary 被去重取消(前端缺陷)
changelog-filename-gate / validate (push) Failing after 2s
wx 反馈团期详情「查看需求」Tab 的「用房·汇总」恒显示「汇总加载失败」,
同页其余区块正常、点刷新即好。

根因在 hl-ui:RoomSummarySection 与 VehicleSummarySection 在同一 tick
各调一次 getGroupRequirementSummary(同 method+url+params+data),而
src/api/orderV2GroupBatch.js:563-568 这个封装未传 cancelDuplicate:false,
src/utils/request.js:260-275 用后发的 AbortController abort 掉先发的那条;
渲染顺序 Room 在前,被取消的恒是 Room,裸 catch{} 把 cancel 当失败吞掉。

后端与数据经测试服 nginx 访问日志(16 次全 200)、order-v3 应用日志
(全团需求汇总完成,零 ERROR)与只读 SELECT 核查,均正常,无后端改动。

建议主修 = RequirementTab 只请求一次经 props 下发;护栏 = 两个 Summary
组件的 catch 区分 ERR_CANCELED 与真实失败(路由切换 abort 同样会落进来)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 10:38:58 +08:00
API Changelog Bot和Claude Opus 5 3e1e5599cd docs(changelog): 查看需求 Tab 操作重排 + 子订单行需求详情弹窗规格(前端优化,后端零改动)
changelog-filename-gate / validate (push) Failing after 2s
wx 2026-09-23 对团期详情「查看需求」Tab 提三点:新增正式行程用车需求按钮
应在顶部操作条、该按钮独立成卡片操作不方便、要一个按钮点开看用房/用车
需求详情;并总结「这个 Tab 操作整体不方便,整理优化下」。

本条给 mmg 四项重排规格:整团级操作收进 .requirement-tab__ops、预检提示条
每条可点直达解除入口、子订单表操作列加「需求详情」弹窗(按户聚合房+车)、
刷新收敛成一个且明细卡片默认折叠。

字段清单逐项对 origin/dev-v3 源码核过(GroupHotelHouseholdsRespVO /
GroupVehicleHouseholdsRespVO / GroupBatchRoomPlanDetailRespVO),无新增端点、
无出入参变化、无网关路由变化、无 DDL。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 10:28:18 +08:00
API Changelog Bot和Claude Opus 5 35f60460b9 docs(changelog): 车务派单看板两类需求并存时接送机整行消失的修复交接件 (#8142)
changelog-filename-gate / validate (push) Failing after 2s
同一订单现按需求维度出多条记录,字段结构零变化。
frontend_status=not_required:hl-ui 看板已用 requirementId 作 row-key
(src/views/fleet/board/utils/boardSummary.js:9-14),实测不受影响。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-23 09:09:23 +08:00
API Changelog Bot和Claude Opus 5 85855fbe8a docs(changelog): 团期查看需求页五处缺口的前端交接件 (#8195)
changelog-filename-gate / validate (push) Failing after 1s
四个接口:新增「批量确认接送机需求」端点;vehicle-households 补 endDate/teamNo/
户级 status/statusName 且未提交户进列表;hotel-households 补 endDate/teamNo;
保存正式用车需求新增车型字典校验(809119)。

三条会让前端静默出错的契约变化已写在正文开头:
- orderNo 从来不是团号,团号改读新字段 teamNo(orderNo 保留不删,v-for :key 在用)
- vehicleRowCount 不再恒 >= householdCount,旧不变量作废
- 批量确认部分失败仍返 code:200/success:true,要看 data.failedCount

覆盖边界照写未回避:vehicle-households 上「从未提交户」与「被打回户」完全同形
(均 requirements:[] + status:null),本接口给不出判据,出处
GroupVehicleHouseholdsRespVO.java:169-171。

同时逐行列出 hl-ui(origin/v2.1) src/api/orderV2GroupBatch.js 两处已过期的 JSDoc:
getGroupVehicleHouseholds :600/:601-602/:607-620,getGroupHotelHouseholds :576-586。

后端已部署测试服并实测(order-v3 dev-v3/62449e550/2026-09-22 22:22:58/ok),
九条验收全部取到活体读数,原始报文落盘;正文无任何「等部署/另行通知」类前向引用。

Refs #8195

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 22:53:51 +08:00
API Changelog Bot和Claude Opus 5 4a38a8d492 docs(user): 团期房务三事件补站内信配置行,管理后台新增三类消息 (#8193)
changelog-filename-gate / validate (push) Failing after 1s
三个 GROUP_BATCH_* 事件一直在发但 notification_event_config 无配置行,
分发器因此零产出。补齐后房管角色(ROOM_MANAGER)收件箱新增三类消息,
link 落 /housekeeper/grab-pool-group,hl-ui 已有通用 link 分支可直接跳,
mmg 零改动 => frontend_status=not_required。

同时记录三处前端看不见的配置变更(删两条无发布方的询房行、换店两条
inapp 关闭、TRAVELER_INCOMPLETE_DAILY 企微关闭),以免被误读为回归。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 22:26:19 +08:00
API Changelog Bot和Claude Opus 5 1a4a16030c docs(fleet): 订正 #8159 候选清单 CROSS_BATCH 的触发条件,group_batch_id 为空的行不在清单里
changelog-filename-gate / validate (push) Failing after 2s
原正文两处(浏览态判据列表、unselectableReason 取值表)都把 group_batch_id 为空
写成会以 CROSS_BATCH 出现在清单里,与同一份第六节「4. 覆盖范围」自相矛盾。
取数条件是 eq(group_batch_id, ?),那类行结构上查不出来。

Refs #8159

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 19:38:06 +08:00
API Changelog Bot和Claude Opus 5 61bfe0f9a3 docs(order-v3): #8150 changelog 按接口类模板骨架补齐入参/响应示例/业务边界
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 19:30:44 +08:00
API Changelog Bot和Claude Opus 5 e2828a3e67 docs: 团期 staff 保存 scopeRoles 元素级非空校验交接件(#8150)
覆盖 bfc10966e(PR #8177)对 BatchStaffConfigReqVO.scopeRoles 加的元素级
@NotBlank,两条对外可见变化:

1. [null] 由「HTTP 200 静默空操作」改为 code:400。旧行为是静默失败——
   @Pattern 对 null 恒为 true 让它穿过校验层,整位守卫 touched 恒 false
   不抛,删除窗口 {null} 命中 0 行、插入集合为空,于是库里一行没动却返 200。
2. [""] / ["  "] 的 message 由一条变两条以 "; " 拼接。两条约束并列触发、
   不是后者替换前者;拼接顺序不保证,已在正文写明前端不得按顺序或按精确
   相等解析 message。

证据:网关活体实测四组(含一组阴性对照,证明 400 不是端点无差别返回),
部署三条独立判据(merge-base 祖先关系 + jar mtime + 活体行为)。

覆盖边界:本份只覆盖 scopeRoles 字段的入参校验契约。

顺带记一处已知缺口:Swagger 请求侧 staffList[].staffRole 的取值域文案只列
了 5 个角色,实际 @Pattern 放行 8 个(后 3 个由 #7079 引入),正文第六.5 节
以 STAFF_ROLE_PATTERN 常量为准写全。

Refs #8150

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 19:13:34 +08:00
API Changelog Bot和Claude Opus 5 34390d85ad docs: 订正 #8159 候选查询 changelog 的编造与漏项
changelog-filename-gate / validate (push) Failing after 2s
上一版由轻档代理生成,存在多处与源码不符的内容,逐处订正:

编造(源码无此事实)
- 服务端口 8060;五个表名 order_requirement / group_dispatch_line /
  group_batch / vehicle / driver 全部不存在
- 下游不可用返 code: 999 或 5xx
- 鉴权口径「订单顾问、财务相关角色可访」——真相是
  FleetAdminRoleGuardInterceptor 只放行 VEHICLE_MANAGER / SUPER_ADMIN,
  且权限点 fleet:group-dispatch:* 在 Java 侧零引用(本单 #8159 专门订正过)
- 出参 VO 写成 ShareMemberCandidateVO,真名 ShareMemberCandidateRespVO

写错(会让前端写错代码)
- 参数非法标成 HTTP 400:本服务业务失败恒 HTTP 200,须按 body.code 判
- 业务边界称浏览态 selectable 恒为 null:实际 ALREADY_IN_ANOTHER_GROUP
  与 CROSS_BATCH 两条判据不依赖 resourceId,浏览态照样返 false
- 四个 unselectableReason 的触发条件均不准确

漏项(数据损坏级)
- 漏掉 shareGroupId 必须由调用方比对这条契约义务。本读口会把正在编辑的
  关系的既有成员也置灰成 ALREADY_IN_ANOTHER_GROUP,前端须自行恢复;
  且 members 是全集不是增量,漏掉的既有成员会被写口静默移出关系
- 漏掉 602106 的渲染要求(提示刷新重选,不得自动重试)
- 漏掉 sourceType + sourceId 可直接透传给写口 members[]

依据:GroupDispatchShareController.java 类注释与 listMemberCandidates
的 @ApiOperation notes(origin/dev-v3)。

Refs #8159

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 18:36:37 +08:00
API Changelog Bot d609d3ec77 docs: 团级配车成员共用候选查询(#8159)
changelog-filename-gate / validate (push) Failing after 1s
2026-09-22 18:29:33 +08:00
API Changelog Bot和Claude Opus 5 12c9c6d3d6 docs(changelog): 查看需求页 5 项前端缺陷交接件(订单号改团号/接送机逐行确认/弹窗默认值与文案)
changelog-filename-gate / validate (push) Failing after 2s
2026-09-22 wx 在「团期详情 → 查看需求」页逐屏提了 8 个问题,对 origin/dev-v3(cf9dc85a4)
与 hl-ui origin/v2.1(590c1155) 逐项查证后拆两边:本件只收后端零改动、可立即动手的 5 项
(5 处团号渲染点、接送机逐户确认按钮、新建弹窗默认分组、两个日期默认值、按钮文案)。
后端有硬缺口的 3 项(另 5 处渲染点缺 teamNo、车侧未提交户不返回、无批量确认端点)
建了 wx/HL#8195,本件不含也不做前向引用。

所有「不存在/0 命中」结论均配同形状阳性对照,逐条写在对应小节。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 18:26:03 +08:00
API Changelog Bot和Claude Opus 5 a4b92733f5 docs(8182): 订正种子脚本行号引用 171/203 -> 171(ESCALATED)/202(TIMEOUT)
changelog-filename-gate / validate (push) Failing after 2s
原写 203 是行号记错一位(逐字核对为 202)。同时把「改前取值以种子脚本为准」的依据
从「读了一份文件」升级为穷举:整个 db/migration 里出现 inapp_link_template 的文件共
8 份,涉及这两个询房事件码的只有种子 V20260520_002 与本单 V20260922_210,中间没有
第三份改过它们——否则种子值就不等于改前值。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 17:49:52 +08:00
API Changelog Bot和Claude Opus 5 c356e8b564 docs(changelog): 订正 #8182 交接件里两条询房事件的「改前」取值(?id= 而非 ?inquiryId=)
changelog-filename-gate / validate (push) Failing after 2s
原文表格把 HOUSE_INQUIRY_TIMEOUT / _ESCALATED 的改前模板写成
/pages/house/inquiry?inquiryId=${inquiryId},实际种子值是 ?id=${inquiryId}
(V20260520_002__house_notification_event_config.sql:171/203,逐字核对)。

迁移脚本按 event_code 定位、SET 绝对值,行为不受影响;迁移测试的夹具种的也是
正确的 ?id= 原值,只有交接件正文这一处写错。顺带补一句说明 query key 由 id
改名为 inquiryId,以及这两个事件码当前没有发布方、改名无实际调用差异。

Refs #8182

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 17:40:37 +08:00
API Changelog Bot和Claude Opus 5 2c9b21f796 docs(changelog): #8182 HOUSE 内部员工站内信 link 由小程序路径订正为管理后台路由,并明确 bizId 不是路由键(修复-管理后台)
changelog-filename-gate / validate (push) Failing after 2s
三个内部员工事件码(HOUSE_INVENTORY_CHECKED / HOUSE_INQUIRY_TIMEOUT /
HOUSE_INQUIRY_ESCALATED)的 inapp_link_template 由 /pages/house/* 改为
/housekeeper/*;字段结构不变,变的是值。

本条 frontend_status=pending 而非 not_required:22_8155 写过「前端 jumpToBiz
从不读 row.link,无需前端改动」,那句话仅在 REQUIREMENT_REJECTED 上成立——
核房/团期事件的 bizId 根本不是订单,按 bizId 反推跳转必然打开不存在的订单。
正文已点名 22_8155 并写清适用范围。

Refs #8182

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 17:38:41 +08:00
API Changelog Bot和Claude Opus 5 000e93c6be docs(changelog): 8152 交接件补记前端侧同源残留两处(statusName 编造取值的下游落点)
changelog-filename-gate / validate (push) Failing after 2s
e011960 订正了本交接件里 statusName 的四个编造取值,但那四个字符串已被
hl-admin 抄进两处:VehicleHouseholdsSection.vue:191 的注释与该组件
spec 的夹具。两处都不影响运行(组件 :78 是纯透传、用例断言的是透传行为),
但下一个人 grep「待处理」会同时撞上它们,需要能分清哪些是错的。

同时把责任归属写明:四个取值是后端先写错在交接件里、前端照抄的。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 15:36:32 +08:00
API Changelog Bot和Claude Opus 5 e011960e45 fix(changelog): 订正 8152 交接件 vehicle-households 端点 statusName 编造取值
changelog-filename-gate / validate (push) Failing after 2s
`three` 处示例/字段说明里的 statusName 中文值("已完成"/"待处理")系凭空编造,既不是修复前的房务口径值("配房完成"/"待房务配"),也不是修复后的车务口径值。核对 GroupBatchConverter.resolveRequirementStatusName(code, true) 源码后改为实测口径:PENDING→待车队配、PROCESSING→配车中、DONE→配车完成。

同时订正 六.5 枚举表里同样错误的三个取值,并补一段说明——该端点 statusName 原实现直接取 RequirementStatus 枚举的房务侧 label,已由 45adfd7ed(PR #8173)改调 resolveRequirementStatusName(code, true) 修正,附完整取值表。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 15:16:10 +08:00
API Changelog Bot和Claude Opus 5 312ecd0f1f docs(changelog): 团期用车需求结构化 + 团期管理员只读查看子订单,两份前端交接件 (#8152 #8151 #8153 #8154)
changelog-filename-gate / validate (push) Failing after 2s
- 22_8152_…:团级用车需求补 seats/count/specialTags/remark 四个结构化字段;新增
  `GET .../requirement/vehicle-households` 子订单用车需求记录端点;requirement-summary
  补 transferSummary 聚合;confirm-check 补 transferSubmitEnabled 与接送机缺口名单。
- 22_8154_…:团期管理员(GROUP_BATCH_MANAGER)可只读打开团期子订单详情(10 个端点放行),
  13 个金额/成本/流水面端点对该角色收回(581008),写面全域拒绝。

两份均已回填测试服活体实测读数:order-v3 @ f1986f996,user-service / fleet @ c4321f961。
#8154 的前后对照含一条关键读数——改动前该角色读订单被拒、写订单却畅通,本批一并收口。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 13:20:00 +08:00
API Changelog Bot 4e3d3ba2d5 docs(changelog): #8155 需求驳回站内信 bizId 由需求行 id 改为 orderId(已部署实测)
changelog-filename-gate / validate (push) Failing after 2s
REQUIREMENT_REJECTED 事件此前 bizType 固定 ORDER 却把需求行 id 当 bizId 下发,
管理端站内信点「跳转」必然打开一个不存在的订单。后端已改为下发 orderId,
需求行 id 迁到 params(notification_send_log.params_json 实测可反查),
并把 inapp_link_template 前缀从 /order/detail/ 订正为 /order-v2/detail/。

AdminMessageRespVO / AdminMessagePageReqVO 字段结构未变,前端无需改动。
已部署测试服 6af4d93e5 双实例并端到端实测:新产生的 admin_message 行
biz_id 等于 orderId、link 为 /order-v2/detail/2102242483750756354。

覆盖边界:admin_message 是快照表,存量行 biz_id 与 link 仍是旧值、不回刷
(该事件仅在测试环境产生过,order-v3/fleet 未上生产)。

Refs #8155
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 12:00:14 +08:00
API Changelog Bot和Claude Opus 5 48e0fb4e75 docs(changelog): 团期详情页切走后重放请求 groupBatchId 塌缩为空串(前端缺陷交接件)
changelog-filename-gate / validate (push) Failing after 2s
管理后台 test.1814.love:9443/notification/my-messages 弹三条报错:
「参数 groupBatchId 格式错误」×2 + 「接口不存在: GET /v3/admin/order/group-batch/requirement/hotel-households」。

根因在 hl-ui(mmg 侧):order-v2/batch/detail/index.vue 用 computed 从 route.params.code
反应式推导团期 id,该页 keep-alive;切到消息中心后 params.code 变 undefined,id 塌缩成空串,
RoomSummarySection / RoomHouseholdsSection / GroupVehicleRequirementSection 三个 watcher
无空值守卫,各自重放一次请求。同页 DisbandBanner 有 if (!props.groupBatchId) return 守卫,
全程 200,是页面内的阳性对照。

后端契约无变化:groupBatchId 是路径段,空串导致路径少一段,因此第三条落到路由未匹配的
「接口不存在」而非参数校验。本件只交接前端修法与三个端点的真实契约,不含后端改动。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 09:52:30 +08:00
API Changelog Bot和Claude Opus 5 8876329ecb docs(changelog): #8122 订正 hl-ui orderV2GroupBatch.js:291 把缺一同位角色写成 582115
changelog-filename-gate / validate (push) Failing after 1s
前端注释称「保存导游位 scopeRoles 必须两个都传,缺一 582115」。两个方向都不成立:
改前缺一返 200 无错误码(正是本单缺陷),改后缺一是 582116。
按 582115 写的分支在该路径上从不命中。读取对象 hl-ui origin/v2.1 17eb03ec。

Refs #8122

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 09:41:16 +08:00
API Changelog Bot和Claude Opus 5 478a9c58a4 docs(changelog): #8122 团期 staff 保存 scopeRoles 必须整位覆盖(582116)
changelog-filename-gate / validate (push) Failing after 2s
PUT /v3/admin/group-batch/{productBatchId}/staff 行为收紧:
scopeRoles 触及某配置位即须覆盖该位全部成员角色,半位声明拒绝且零写入。
配置位成员由字典决定,不是代码常量。

Refs #8122, PR #8147, 后续单 #8148 / #8150

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 09:36:13 +08:00
API Changelog Bot和Claude Opus 5 5140667d28 docs(changelog): #8121 核单清单「用车安排」逐类判定,包车+接送机并存不再静默放行
changelog-filename-gate / validate (push) Failing after 2s
按 origin/dev-v3 源码逐条重建出参、ChecklistItemVO 结构、三段响应示例、
空数据降级、错误响应与业务边界六节:原稿的 orderId、PAYMENT_DONE 码值、
localhost:8033 主机头与 404/401/403 状态码均无源码依据,已按
OrderDetailService / ConfirmChecklistRespVO / GlobalExceptionHandler 的实际实现订正。

错误响应改为 HTTP 200 + body code(581007 订单不存在 / 581008 非可见角色 /
581045 房务角色),与 CODE_RULES §10「业务失败走 200」一致;
越权校验两道门(OrderController:254 assertNotHouseRole、
OrderDetailService:785 assertOrderReadable)按源码写实,并记入
「角色为空时 assertNotHouseRole 放行」这一已知缺口。

第八章换为五单真实读数,并照写「行程用车未就绪分支本轮无活体读数」这一覆盖边界。

Refs #8121

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 06:24:22 +08:00
API Changelog Bot和Claude Sonnet 5 8f866d9ceb docs(changelog): 团期 staff 保存新增可选 scopeRoles,支持按角色范围覆盖
changelog-filename-gate / validate (push) Failing after 2s
PUT /v3/admin/group-batch/{productBatchId}/staff 新增可选请求体字段
scopeRoles,不传时行为与改前逐字一致(整期全量覆盖);传了则只覆盖
声明的角色范围,修复导游位/摄影位两个弹窗各自保存时互相清空对方配置
的问题。

Refs wx/HL#8006

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 05:36:05 +08:00
API Changelog Bot和Claude Opus 5 1e1f9e86e6 docs(changelog): #8114 司机拒接/退回待派记录留痕(fleet 修改接口)
changelog-filename-gate / validate (push) Failing after 2s
新增 fleet_assignment_operation_log 的 driver_rejected 操作类型,
detail_json 以锚点行 + clearedRows[] 形状记录清空前的车与司机身份。
前端若对 operation_type 做白名单过滤需加入该取值,否则静默漏渲染。

Refs wx/HL#8114

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 05:03:26 +08:00
API Changelog Bot和Claude Opus 5 71ad3dbfcd docs(7982): 订正共用关系确认端点的契约段落——首版字段名与错误码文案有误
changelog-filename-gate / validate (push) Failing after 1s
首版(3328730)的「接口详情」章把入参 resourceType 写成了不存在的 dimension、
漏掉 serviceDate 与 costBearer 两个必填字段、引用了两个并不存在的 VO 类名
(CreateShareGroupReqVO / ShareGroupCreateRespVO)、响应示例里给出了 VO 上不存在
的 id / createdAt / admissionAt 字段,并把 605001 的提示文案写成了另一段文字
(真实文案是「派单冲突:该车日期段已派」)。照首版的请求示例构造的请求发不出去
——字段名对不上,且缺两个必填字段。

本版每一个字段、每一条错误码文案均取自 dev-v3 上的源码(VO 的 @ApiModelProperty
声明与 IErrorCode.of 定义),并逐处标注出处文件。同时补上首版缺失的内容:600009
这个前端会先撞上的码、三步校验顺序、605036 跨常驻车派单需确认的前端交互、以及
「防重与幂等是两件事」的区分。

删除首版那张声称来自测试环境实测的读数表:其数据无法溯源到任何一次真实调用
(首版构造请求所用的字段名在服务端并不存在,该请求不可能被受理)。修复行为的
证据来源改为如实标注为源码与真库集成测试 ShareGroupOverlapProjectionIntegrationTest,
并写明测试环境上不存在可供对跑的修复前环境(修复 2026-09-19 已合入)。

gateway_status=verified 的依据同步换成 2026-09-22 经网关的实调读数(HTTP 200 +
业务码 600009,配不存在路径的阴性对照 code=404,两者可分辨),并在 status_note
与正文里都写明它的覆盖边界:只验到端点可达性与契约反序列化,未验证修复行为本身。

Refs #7982

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 03:31:04 +08:00
API Changelog Bot 3328730ba9 docs(#7982): 创建共用关系同批准入多个新成员不再误报 605001
changelog-filename-gate / validate (push) Failing after 2s
工单 #7982 修复 PR #7983 与测试补强 #8096 已部署,现补发前端交接件 changelog。
修复了创建共用关系时同批请求传入多个待准入成员会从第二个开始误报冲突码 605001 的缺陷(投影缺列),修复后允许一次请求完成多成员的关系创建。

接口契约无变化;修复在测试服 fleet 已验证;frontend_status=not_required(前端无需改代码)。
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-22 03:05:40 +08:00
API Changelog Bot和Claude Opus 5 57a9e068dd docs(changelog): #8056 TRANSFER-only 订单用车数据静默丢失修复交接件
changelog-filename-gate / validate (push) Failing after 2s
行程详情 / 确认前置 Checklist 两个只读端点的字段现在反映真实数据:
修复前 TRANSFER-only 订单在这两处返回 HTTP 200、无异常、无错误码、
字段静默为空/false,与「这个订单本来就没安排车」在返回结构上完全无法区分。

backend_status=deployed(hl-order-service-v3@d30cd9561,测试环境)、
gateway_status=verified(两个只读端点已网关实测)、
frontend_status=not_required(前端侧为纯透传渲染,无需改代码)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 02:25:08 +08:00
API Changelog Bot和Claude Opus 5 798b7bcd83 docs(changelog): #8064 双维度收缩补活体实测 + 写明机制是逐维度各自收缩
changelog-filename-gate / validate (push) Failing after 2s
原文「若该派单同时参与两条共用关系,两条都会受影响」是源码推演,本次补 2026-09-22
自建班期下的双维度活体读数(两条关系同刻 RELEASED/AUTO_SINGLE_MEMBER、4 条成员行
同刻 left_at、未被软清那条派车行完全未动)。

新增一节写明机制:onClaimReleased 只接单个资源维度、方法体内无跨维度查询,
「两条同时 RELEASED」的成因是同一个动作释放了两个维度的占用,不是维度间有传导。
该区别对前端的实际后果落在手工解除关系上——是否连带另一维度取决于释放集算法,
前端别预测,操作后两个维度都重新拉取。

Refs #8064

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-22 00:47:32 +08:00
API Changelog Bot和Claude Haiku 4.5 15d390d80d docs: #8006 删掉未验证的零写入说法
changelog-filename-gate / validate (push) Failing after 2s
真库 IT(GroupBatchStaffSaveConfigBaselineMysqlTest / GroupBatchStaffSaveConfigScopedMysqlTest)
只验证成功路径,未涵盖范围校验失败(582115)后读库的用例。

verify(never()) 只证明Service没调那些方法,不证明库里没有新行。
Mockito断言无法作为「零写入」的判据——那需要真库读数。

改: staffList 超出范围拒绝(582115,零写入已验证:...)
为: staffList 超出范围拒绝(582115)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-21 23:34:30 +08:00
API Changelog Bot和Claude Haiku 4.5 1624104862 docs: #8006 订正 c141592 的错误:base 改回 dev-v3,补充零写入用例
changelog-filename-gate / validate (push) Failing after 1s
c141592 误改 base=main,理由写成「hl-api-changelog 仓无 dev-v3 分支」
但 base 指的是「后端改动合进了 HL 仓的哪个分支」,不是 changelog 仓的分支。
存量 513 份用 dev-v3,只有那一份用 main。

同时补充零写入的用例引用:
- 单测 GroupBatchStaffConfigServiceTest#requestedRoleOutOfScope_rejectedWithZeroWrites
  用 Mockito verify(..., never()) 断言范围外角色被拒时无 Feign/软删/INSERT

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-21 23:30:28 +08:00
API Changelog Bot和Claude Haiku 4.5 c141592078 docs: #8006 改 base=main(hl-api-changelog 仓无 dev-v3 分支)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-21 23:22:32 +08:00
API Changelog Bot和Claude Haiku 4.5 fa06824c83 docs: #8006 补充网关实测证据,改 gateway_status=verified,删除未验证的零写入说法
- 网关实测(2026-09-21):带 scopeRoles 触发 582115、去掉后返回 200,证实透传无拦截
- 修改 gateway_status: not_required → verified
- 删除正文中「零写入」「不产生副作用」的未验证说法
- 改为「失败时前端建议重新拉取当前配置」

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-09-21 23:22:32 +08:00
API Changelog Bot d835d912e8 fix(#8064): status_note 删除旧的 frontend_status 取值说明,保留判据,连到 mmg 的实证
旧话「frontend_status 取 pending 而非 not_required……再由前端侧改为 not_required」已被 mmg 的实证动作推翻(frontend_status 实际为 not_required)。保留两点判据(缓存 activeShareGroupId、假设关系只能人工解除),按 mmg 的实际自查结果更新说法:这两点已由前端侧自查确认。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:22:32 +08:00
API Changelog Bot和Claude Opus 5 8fa0204a43 docs: 团期 staff 保存接口新增 scopeRoles 入参与范围覆盖能力(#8006)
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:09:29 +08:00
API Changelog Bot 89811fdadc fix(#8064): 订正 frontmatter status_note 与正文同步——存量收敛已完成,10 行摘除+4 条释放+2 条保持 ACTIVE
changelog-filename-gate / validate (push) Failing after 2s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:08:41 +08:00
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
API Changelog Bot和Claude Opus 5 77e32d1654 docs: hand off API contract (团期配车需求详情响应新增观测字段 #7988 AC-6)
changelog-filename-gate / validate (push) Failing after 2s
团期配车需求详情查询接口新增七个只读观测字段,描述配车刷新状态与停滞告警。
- planRefreshState / planRefreshReplayCount / blockedStage 为库直读
- planRefreshStalled / planRefreshStalledReason / planRefreshTimeoutAt / planRefreshReplayExhausted 为动态投影

关键约束:判告警只看 planRefreshStalled 布尔值,不看 planRefreshState;FAILED 态生产可达、前端必须实现分支。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 23:00:58 +08:00
API Changelog Bot和Claude Opus 5 df60de5ffd docs(changelog): #8068 车务手动软清派车行留痕 soft_cleared 交接件(1 端点)
changelog-filename-gate / validate (push) Failing after 1s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 19:29:44 +08:00
API Changelog Bot和Claude Opus 5 0ef80d0d16 docs(changelog): #7444 团期配车就绪门禁与车辆共用关系交接件(10 端点)
changelog-filename-gate / validate (push) Failing after 1s
backend_status=deployed:fleet/order-v3 于 2026-09-21 17:14:32 / 17:16:07 部署,
服务端 git sync HEAD=bb4091074,四个实例滚动重启健康 UP,两次任务 exit_code=0。

gateway_status=verified:网关面上的 8 个 /admin/fleet/** 端点逐个经
api.test.1814.love:9443 取响应信封的 code 核对;另 2 个 internal 端点按
hl-gateway JwtAuthFilter 的设计就不在网关面上(实测 403 接口不可访问),
由服务间 Feign 触发、前端不可调,故不计入该字段分母。

本轮对 19be7f21c..bb4091074 逐提交读码,补写 7 处原稿未覆盖的契约面变更
(#8004 的 cityJunctionShareCandidate 同义化与 excludeAssignmentId、
#8061 的处置范围只到本关系成员、#8051 的不跨服务日不跨团期、
#8064 的 AUTO_SINGLE_MEMBER 补 LEGACY 挂点、#8003 的跨维度改绑回读范围、
#8013 的 COST_BEARER_CHANGED 转活、接口 5 的 602013 覆盖边界)。

Refs #7444

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 17:50:54 +08:00
API Changelog Bot和Claude Opus 5 78ca3f1ee3 feat(guard): E_WAIT_LANGUAGE 补第四类——把「什么时候上线」写成派给前端的动作项
changelog-filename-gate / validate (push) Failing after 1s
今天上午装这条守卫时只想到「等/待/另发」这一种形态,当天下午就被另一种形态绕过去了:
20_7443 正文写着「上生产前请与后端确认这个开关的状态」与「生产环境未开」,
mmg 据此来问上线时间、并要求「后端把生产开关打开」——而守卫全绿,因为这两句
一个词表词都没用上。它们把不确定性包装成了「请你去确认」,语法换了,作用一样:
读者只能停在那里等一个他查不到的状态。

判据仍是那一句:这条影响他「怎么写代码」,还是只影响他「什么时候开始写」。
上线时点属后者。前端需不需要同步上线,由 frontend_action_required 与模板里
「前端是否必须同步上线」那个结构化字段承载,正文自由文本里不该再出现。

词表先对全仓 1068 份 changelog 实跑,只留零命中且零正当用法的 12 个词。剔除两个:
  「何时开」  —— 误伤「保护何时开始生效」「窗口何时开过」
  「生产上线」—— 误伤 07_5640「生产上线需配 annual-direct-plan-id」,那是真契约边界

部署时间戳没做成规则:该形态全仓 0 命中,分辨力无从验证,而必须放行的
「带时刻实测取证句」有 690 处——判据的误伤面远大于收益时,门禁只会教人绕开它。
这一类只能靠 §2.1 的条文和复盘接住,机器接不住,如实记在注释里。

测试:新增 2 条阳性 + 1 条阴性对照,阴性那条与阳性只差一个「上生产前」,
用来钉住分界线(「收到 809009 找后端确认该环境的开关」是运维处置,必须放行)。
npm test 59 项 58 绿;唯一的红是存量的 E_ALIAS_STATE(11_7510,与本次无关)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 16:23:33 +08:00
API Changelog Bot和Claude Opus 5 4fbf5ec2c0 docs(changelog): 20_7443 删掉把前端推向「问上线时间」的两处措辞
changelog-filename-gate / validate (push) Failing after 1s
「生产环境未开」暗示生产上存在这个开关、只是关着——实际 order-v3 根本没上生产
(2026-09-21 探生产网关,/v3/** 与 /admin/fleet/** 全 404,一期 /admin/order/page
与 /admin/product/page 同时 200 做阳性对照)。前端据此来问「请后端把生产开关打开」,
是照本文档做的。

「上生产前请与后端确认这个开关的状态」是一条派给前端、他查不了、且只影响
「什么时候开始写」而非「怎么写代码」的动作项,整句删除。

一并去掉两处部署时间戳(2026-09-19 15:33)——交接件不写上线/部署时间。
改后只留环境无关的契约事实:默认 false、关闭时返 809009、测试服已开。

⚠️ E_WAIT_LANGUAGE 没能拦住这两句:它按词表匹配「等/待/另发」,而这两句一个都没用上,
靠的是把不确定性包装成「请你去确认」。词表拦不住换了语法的同一件事。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 16:16:08 +08:00
API Changelog Bot和Claude Opus 5 a45a079e9f docs(changelog): 20_7443 同步车务链路改写为实测肯定式结论 + 新增 21_7211 团期联系入口交接件
changelog-filename-gate / validate (push) Failing after 2s
20_7443(#7443 接送机用车双槽提交):
- 删掉「该缺陷已在修…修好后另发交接件」「只验到提交为止」等让前端停工的措辞——
  这正是 2026-09-21 wx 第二次点名的问题(mmg 因此整段时间没动工),新增的
  E_WAIT_LANGUAGE 门禁对旧版报 7 处、对本版 0 处。
- 换成带读数的肯定式结论:hl-fleet-service 已部署 dev-v3 @ c238f38c3
  (含 #7990 修复提交 53c2ff2d1 / bf4fba5a2,merge-base --is-ancestor 均 true),
  order_fleet_command_outbox 两行 RECONCILE(TRAVEL 2101937490971742210 /
  TRANSFER 2101937491068211201)均 SUCCEEDED、last_error_message 为 NULL,605905 未再出现。
- 保留契约自带的限定:单槽写口 kind 默认 TRAVEL、hasPickupTime=false 时 809002、
  生产开关 transfer-kind-submit-enabled 需独立运维动作、#8056 仍 open。
- verified_at 2026-09-20 → 2026-09-21。

21_7211(团期子订单联系入口改为联系团期管理员,前端缺陷,后端零改动):
- 判据字段 ItineraryVO.groupBatchId(非 OrderMainVO.groupBatchId),
  入口 POST /admin/message/chat/open-group 请求体只收 orderId。
- 补本轮测试服实测:团期单 2101935981273976833 → code=200/isNew=true;
  非团期单 9199000000000000002 → code=281015(反例,证明端点按团期与否分流)。

两份均通过 validate-changelog-frontmatter.mjs(含 E_WAIT_LANGUAGE)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 15:41:59 +08:00
API Changelog Bot和Claude Opus 5 455d9da1af fix(gate): E_WAIT_LANGUAGE 撤掉「暂不可用」族——实测几乎全是错误码表文案
changelog-filename-gate / validate (push) Failing after 2s
对全仓 1968 份 changelog 跑新规则做存量抽样,命中里「暂时不可用 / 暂不可用」这一族
几乎全部落在错误码表与响应示例的**文案**上,例如:

  | `584105` | 结算字典暂时不可用,请稍后重试 | 字典服务失败、空响应或无启用项 |
  | `584100` | 车辆费用暂时不可用 | 车辆费用来源调用失败…… |

这正是本规则必须放行的契约内容——它影响前端「怎么写代码」(要认这个错误码),
不影响他「什么时候开始写」。判据没有分辨力时,门禁只会教人绕开它,或者逼作者
为了过门禁把该写的错误码说明一起删掉。已在代码里写明不要加回来及其依据。

撤掉后存量命中从 54 份(2.7%)降到 29 份(1.5%),剩下的按措辞分布:
未部署 20、等待…后端 7、待部署 5、另行通知 3、后续订正 3、等待…上线 2、
后端部署后 1、等待…部署 1、以后续 1、暂不要对接 1 —— 都是真的在让前端等。
存量不回填(门禁只跑 push diff),谁编辑旧文件谁负责当场改掉。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 15:29:27 +08:00
API Changelog Bot和Claude Opus 5 047a4be4fd feat(gate): 新增 E_WAIT_LANGUAGE——交接件正文禁「让前端等我们」的措辞
changelog-filename-gate / validate (push) Failing after 2s
2026-09-21 wx 第二次点名:「不要在changelog里写让前端等待部署 这不是你第一回犯错了
工作流是你部署完测试环境推送changelog」。

§2.1 的 backend_status 门禁挡得住预告式推送,挡不住这一类:20_7443 的 frontmatter
已经是 deployed、CI 全绿,但正文 status_note 结尾写着「该缺陷已在修……修好后另发
交接件」。mmg 因此一直没动工,隔天才来问「这个是有啥问题吗 还是没做到呢」——门禁
只看 frontmatter,看不见自由文本里的这句话,所以「deployed + 校验绿」并不代表这份
交接件可执行。消费方也没有能力消解这种不确定性:他查不了我们的部署状态、看不到
dev-v3、不知道「另发」是哪天,读到「等」就只能等,而且是静默地等。

- scripts/validate-changelog-frontmatter.mjs:新增 validateNoWaitLanguage,对所有
  v2 文档逐行扫描(与 change_type 无关,前端条目同样适用)。三类措辞:部署状态对冲、
  未来交付承诺、直接叫停对接;「等待」做共现判定而非裸词匹配,避免把「前端需轮询
  等待支付回调」这类业务语义一起拦掉。前向引用(「以后续订正为准」「见后续订正」)
  一并封住——它和「修好后另发」是同一件事换个说法,实测被绕过一次。
- tests:4 个用例,含 1 个阴性对照(灰度开关状态、已知缺口工单号、业务流程里的等待
  必须放行),防止作者为了过门禁把该写的契约边界一起删掉。
- BACKEND_CHANGELOG_DELIVERY_GUIDE.md §2.1:写明规则、背景与那条分界线——这条影响
  他「怎么写代码」,还是只影响他「什么时候开始写」?后者一律删。

阳性对照:对已推送的 HEAD 版 20_7443 跑新规则,命中 2 处(第 308、451 行「修好后另发」),
即它能抓住真实发生过的那次。既有 changelog-path-aliases 测试对 11_7510 的 2 条
E_ALIAS_STATE 红是本次改动之前就存在的,与本提交无关,pre-push 钩子也不跑该用例。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 15:27:37 +08:00
API Changelog Bot和Claude Opus 5 043a779820 docs(changelog): #7994 受控重开窗口内无分组历史派车行可被收编
changelog-filename-gate / validate (push) Failing after 2s
团期配车重新配车接口:分组列上线前的历史派车行,此前无论被改还是被删
都判越界(602013),叠加「物资准备期不开窗口不许配车」后形成单向死路。
改后按动作分两路——被同键收编则放行,被删除仍判越界。

请求体/响应体零变化;602013 在含无分组历史行时追加自救提示,
前端需确认该文案能完整展示不截断。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 11:20:39 +08:00
API Changelog Bot和Claude Opus 5 459715bae9 docs(changelogs-v2): #7973 共用关系确认 confirmCrossResident 入参补记 + 网关取证转 verified
changelog-filename-gate / validate (push) Failing after 1s
2026-09-21 10:09:15 / 10:09:17 经网关取证:两次请求体逐字相同、唯一差异是
confirmCrossResident——不传得 605036,传 true 得 200 并建出 ACTIVE 共用关系,
取证完毕按 survivorPolicy=RELEASE 清场。据此 gateway_status 由 pending 转 verified。
状态位是取证换来的,不是为过门禁改的。

同批修正正文 7 处:
- 4 处源码行号漂移(AssignmentService / AssignmentErrorCode)
- 605036 示例改用网关原文,替换此前取自单测字面量的构造示例
- 补全 messageOf 的第 3 个分支:此前只记了 2 个,且两个都漏掉后缀
  「,继续操作将形成跨常驻车派单」
- 修正张冠李戴:driverBoundToAnotherVehicle 用例被配上了车辆侧文案
- 溯源订正为 #4936 引入、#5160 扩展(git log --follow 核实)
- 关联文档路径 19_7444 更正为 21_7444
- 第七节补明 GroupDispatchShareController 的 14 行改动全在 confirm 端点的
  接口文档注释里,GET/DELETE 契约逐字未动

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 10:25:34 +08:00
API Changelog Bot和Claude Opus 5 9798fb31f4 docs(changelog): #8002 605075 新错误码 + #8064 共用关系成员失去占用后自动收缩
changelog-filename-gate / validate (push) Failing after 1s
#8002:605008 语义收窄为「等待窗口内没抢到」专用,持锁期内复核/续租发现锁已
丢的 4 处改抛 605075(带 {0} 锁身份标签)。前端不能再把两者都按「系统繁忙,
稍后重试」处理——605075 重试无效且意味着可能已有并发写入。

#8064:接口契约零变化,变的是同一请求的副作用。共用关系的成员因真实释放路径
失去占用时会被自动移出,剩余不足 2 人时关系自动解除。这两件事在修复前于当前
部署形态(占用账本 LEGACY)下一次都没发生过——全库 release_reason=
AUTO_SINGLE_MEMBER 计数由 0 变 1 是它的硬判据。

两份都按 origin/dev-v3=c1a6e96c8 逐条复核过行号与文案;#8002 那份订正了自动
生成稿里的 5 处事实错误,订正记录连同旧值一起留在文件里。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 10:00:25 +08:00
API Changelog Bot和Claude Opus 5 ba87a9b611 docs(changelog): #7987 订正被 mmg 实证推翻的「前端必须新增渲染分支」,并清空 not_required 上的认领字段
changelog-filename-gate / validate (push) Failing after 1s
正文第 38 行说「前端必须新增这两个 event_type 的渲染分支」,而 mmg 在
frontmatter 里已用实证翻成 not_required(StatusLogsPanel 渲染
eventTypeName || eventType || '事件',后端直供中文名+原码兜底,前端无自建
映射表,零改动)。订正了状态位却没回头改正文,那句话会让下一个读的人以为
前端还有活。原句划掉保留接 grep,并注明这条结论依赖「后端继续直供
eventTypeName」——该字段哪天返 null,渲染缺口会重新成立。

frontend_owner/frontend_ref 清空:交付指南写死 not_required 条目任何人
(含前端)不得回写这 4 个认领字段,填了会被 E_FRONTEND 残留校验拦下
(2026-08-19 #6077 先例)。本文件能推上去是因为门禁只扫新增路径,
不是因为合规。mmg 的实证本身原样保留。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 09:02:10 +08:00
API Changelog Bot和Claude Opus 5 9d4b4387f0 docs(changelog): #8061 清理 status_note 里重复的 gateway_status 说明
changelog-filename-gate / validate (push) Failing after 1s
连续修订留下一段标着 frontend_status 却在讲 gateway_status 语义的残渣,
标签与内容不符会误导下一个填这个字段的人。内容并入括注,标签改回对的。

mmg 的 frontend_status=not_required 原样保留:他们在自己代码库里查实
getOrderOperationLog(api/fleet/board.js:58) 全仓零调用方、src/views/fleet
无 operationType 命中,后端担心的白名单过滤层尚不存在。那是前端负责人
带证据的判定,比后端的推断硬。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 00:15:45 +08:00
API Changelog Bot和Claude Opus 5 bc07d07f20 docs(changelog): #7980 AC-6 司机险年保台账两写口补同名锁——新增 100503(内部接口,无 C 端)
changelog-filename-gate / validate (push) Failing after 1s
PR #8072(合并提交 8bf9c520c)。三个端点都在 /v3/internal/insurance/**,只有 fleet 经
Feign 调,fleet 侧 Controller 全挂 /admin/fleet/drivers/**,无小程序 C 端路径。

🔴 本次只有两个端点新增 100503,不是三个:
- driver-annual/upsert 与 driver-annual/{driverId}/invalidate 共用 name=driver-ins:ledger,
  这两者之间新增互斥,因此新增 100503。
- driver-purchase 补的是自成一域的 name=driver-ins:purchase,锁语义与改前完全等价
  (只是 Redis 键字符串从「类全名+方法名」变成显式 name),未新增任何错误码。

唯一可能传导到 hl-ui 的路径已逐行核实:DriverInsuranceService:352-353 投保后同步作废
旧 MANUAL 台账,失败在 :226 被 catch(AnnualBindingRollbackQueuedException) 捕获并统一
包装成既有错误码 600206,前端看到的仍是既有码,无需为 100503 新增处理。

backend_status=deployed:2026-09-20 23:43 order-v3 滚到 8bf9c520c(运行版本与合并提交
精确相等),两实例 12/13 秒起监听。「八、测试环境已验证」明写了没有做任何功能调用取证、
100503 在测试服上一次都没触发过——是「没测」不是「测过不会触发」,理由是端点不经网关且
手动触发会污染真实司机台账、触发真实保游扣费。

文件名日前缀用 21 是因为提交日已跨过零点;updated_at 同步为 2026-09-21。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-21 00:00:11 +08:00
API Changelog Bot和Claude Opus 5 6ce29f1872 docs(changelog): #7980 补三份 @Lock4j 同名锁 changelog(房务7口/出行人+发票8口/产品库存2口)
changelog-filename-gate / validate (push) Failing after 1s
三份同属一个机制:@Lock4j 未写 name 时 lock4j 把方法名拼进锁键,keys 逐字相同的
多个方法各持一把锁、互不阻塞。本批给各组补同一个显式 name,互斥才真正生效。
对前端唯一可见的变化是这些端点新增一个可能返回的 100503(HTTP 200 + body code)。
路径、方法、请求/响应字段全部零变化。

- 配房工作台 7 个写口(PR #8069):全 admin,无 mp/C 端。
- 出行人删改 + 发票申请 8 个写口(PR #8049):三组全部触达小程序 C 端,
  逐端点沿 hl-mp-service 的 Feign 与公网 Controller 查证了调用链。
- 产品库存扣减/恢复 2 个 internal 口(PR #8047):当前零调用方,修复是预防性的。

三份 backend_status 均为 deployed 且附真实部署读数:product-v2 滚到 ba8aab3ab
(部署前 4cbccc26b,落后 93 个提交)、order-v3 滚到 ba8aab3ab(部署前 c35251b07),
merge-base --is-ancestor 逐个验过。其中 AC-5 的 b9738a20f 在部署前确实不在运行版本内,
是真正的「从不生效到生效」。

🔴 三份的「八、测试环境已验证」都明写了没有做功能调用取证及其原因(写口调用会真实
改动配房行/出行人行/库存,测试服数据多会话共用且撤不回来),并写明 100503 一次都
没触发过——是「没测」不是「测过不会触发」。互斥由落库级并发 IT 与按效果枚举的契约
用例覆盖,这是 name 契约类改动的恰当取证层级。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 23:26:24 +08:00
API Changelog Bot和Claude Opus 5 6ade6e1332 docs(changelog): #8061 解除共用关系只清成员占用,同槽非成员不动
changelog-filename-gate / validate (push) Failing after 1s
fleet 已部署测试服 00930f5d6,网关实测取得阳性与阴性两条对照:
阳性 releasedSourceIds 恰为两个成员且库内真变 unassigned;
阴性 非成员 C 的 assignment_status/vehicle_id/driver_id 解除前后逐一相等。

两条缺一不可——只有阳性的话,「C 没变」与「解除没跑起来」观测相同,
且阳性在修复前同样成立(旧实现一样释放成员,只是顺手把 C 也清了)。

frontend_status=pending:请求/响应字段零增删,但派车操作日志新增
operation_type 取值 share_release_cleared,前端若按白名单过滤会静默
丢掉这条记录,而那正是本次补留痕要解决的问题。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 23:21:18 +08:00
API Changelog Bot和Claude Opus 5 e813ea774d docs(changelog): #7990 候选资源槽位需求锚点按 requirementId 反查(AC-8 修复)
changelog-filename-gate / validate (push) Failing after 1s
本单名下已有一份 changelog(看板身份三元组,PR #8048),但按内容 grep 那份已推送
文件,requirementMatched / seatsEnough / requirementMismatchReasonCode / 候选 / 座位
六个关键词全部 0 命中——AC-8 的候选面行为变化一个字都没有。

这正是 #7443 被重开的形态:按单号数文件全绿,按内容查全空。所以另写一份,
而不是让那份顶数。

行为变化(POST /admin/fleet/assignments/candidates):
TRANSFER-only 订单上,seatsEnough / requirementMatched / requirementMismatchReasonCode
由「恒空/退化」变为按 TRANSFER 需求真实判定。

修复前 AssignmentCandidateService.resolveSlotRequirement 的车型/座位锚点恒取 TRAVEL
需求:两类并存时接送机槽锚到 TRAVEL 需求的第 fleetItemIndex 项;TRANSFER-only 单上
取到 null、锚点整块退空、座位判据回退到整单 headcount,于是 5 座 SUV 反而「够」,
只剩车型一条提示(少报一半)。

两种失败出口都是 SlotRequirement.empty() 这条「仅提示不限制」的正常路径——不抛错、
不打日志。车务只看到提示不对,没有任何信号能顺藤摸瓜。这条静默属性已写进正文。

网关实测(2026-09-20 22:0x,同一次请求两辆车判定截然相反):
7 座 SUV 蒙A-U1557 → seatsEnough=true / requirementMatched=true / reasonCode=null;
5 座 SUV 蒙P321A → seatsEnough=false / requirementMatched=false / reasonCode=SEATS。
修复前两车都会是 requirementMatched=null。这组阴性对照排除了「返回一堆候选但根本
没过滤」这个竞争解释。

取证前先补了部署缺口:开测时 fleet 停在 c35251b07,而 bf4fba5a2(#8062) 触及 fleet
却未部署,重新部署到 0/N 才开测,否则会测到旧字节。

请求契约完全不变:修法是按 requirementId 匹配式反查 kind,不是给请求补 kind 位。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 20:00:03 +08:00
API Changelog Bot和Claude Opus 5 ff834a4858 docs(changelog): #8051 订正 PR 字段——写的是「待建」,实际已合入 ac9efb735
changelog-filename-gate / validate (push) Failing after 1s
交接件里的「待建」会活得比它的语境久:下一个人看到它会以为代码还没合。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 19:40:10 +08:00
API Changelog Bot和Claude Opus 5 52b3f81fd0 docs(changelog): #8051 解除共用关系不再跨服务日跨团误清派车行
changelog-filename-gate / validate (push) Failing after 1s
代码 PR #8058(squash ac9efb735)已合入 dev-v3,fleet 测试服部署在 c35251b07
(2026-09-20 18:58,STATE=ok),merge-base --is-ancestor ac9efb735 c35251b07 = 真,
并用 jar 字节正负两向自证:新类 AssignmentOccupancyDayScope 部署前不在 jar 里、
部署后在(只查后一次没有分辨力)。

网关两轮独立实测 DELETE .../share-groups/{id}?survivorPolicy=RELEASE,两半边都取了:
- 阳性对照:本服务日那张确实被处理(assigned/有车 -> unassigned/NULL,且在
  releasedSourceIds 里);
- 负对照:跨日的独立派单三字段逐一不变,跨日+跨团的原受害者所在三个团七个服务日
  共 7 行 fleet_group_dispatch 释放前后逐字段完全一致。
缺任一半,「另一日没变」与「解除根本没跑起来」观测上完全一样。

frontend_status=not_required:本次不改请求/响应形状、不增删字段、不新增错误码。
但仍是给 mmg 的知会件——「解除共用关系」这个动作的影响范围变了,看板上此前莫名
变成「待派车」的那些户,原因在此。

一并订正两处事实:
- 误伤是 6 行不是 7 行(第 7 行同日同槽,RELEASE 策略下本就在处置范围,补了日期
  过滤照样会被释放);
- 修复只动了 ASSIGNMENT 侧,GROUP_DISPATCH 侧本就按 trip_date 精确过滤、从无此 bug。

仍未解决且不在本篇范围:同一资源同一服务日上的非成员在途行仍会被 RELEASE 一并
软清(releaseClaims 不引用 members),已另立工单 #8061 待产品口径。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 19:39:07 +08:00
API Changelog Bot和Claude Opus 5 91cca38c2e docs(changelog): #7987 #7988 #8013 网关实测通过,gateway_status 置 verified,并订正 #7987 一处契约偏差
changelog-filename-gate / validate (push) Failing after 2s
2026-09-20 18:22-18:46 经网关 api.test.1814.love:9443 实测(账号 cw_test_7444):

- #7988 GET .../vehicle-requirement:七个只读观测字段全部出现,字段名/类型与正文
  一字对应,逐字段对照无出入。
- #7987 GET .../status-logs:开窗(BATCH_VEHICLE_REQUIREMENT_REOPENED)与重配
  (BATCH_VEHICLE_DISPATCH_RECONFIGURED)两类事件均取到,extra 各项齐全。
- #8013 POST/GET .../share-groups:只改 costBearer 不改成员,写出的历史行是
  COST_BEARER_CHANGED 而非 MEMBER_ADDED,且按正文声明的口径用事后 GET 查证,
  没有拿 POST 响应体推断。

订正 #7987 一处契约偏差(5 个位置):重配事件的 operatorId 正文写字符串 "SYSTEM",
实测为 null,与库里其它 SYSTEM 类事件(如 BATCH_VEHICLE_REQUIREMENT_DONE)惯例一致,
判为文档写错而非实现错。前端若按原文档判空会得到相反预期,故订正与发布同一批。

backend_status 的判据是 merge-base --is-ancestor 对各自 squash 提交与测试服部署点
(fleet 311dc92ee / order-v3 e179e09bd)逐条为真,不是「已在主线」这种弱判据。

verified_at 留空:该字段归 frontend_status 用,与 gateway 的验证时刻是两码事。

同批还有 #7444 与 #7973 两份草稿未推送,gateway_status 如实保持 pending——
#7444 缺 reconfigure / restore-cancel happy path / DELETE 三处证据,
#7973 的 confirmCrossResident 入参未被真正走到(目标资源已占用,未触发 605036 分支)。
「同一个端点被调通了」不等于「本篇登记的那个入参被验过了」。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 19:00:10 +08:00
API Changelog Bot和Claude Opus 5 73e0def125 docs(changelog): #7990 车务看板订单详情按需求各返一组身份三元组,接送机确认参数有来源了
changelog-filename-gate / validate (push) Failing after 2s
GET /admin/fleet/board/orders/{orderId} 新增 requirementIdentities:
每条用车需求各一项,含 kind / requirementId / requirementVersion /
requirementSha256 / dispatchPlanGeneration。
顶层原有的那一组三字段语义不变,仍指行程用车(TRAVEL),前端不改也不炸。

为什么前端必须接:POST /admin/fleet/assignments/requirements/{id}/confirm
的三个 expected 入参(version / sha256 / planGeneration,均 @NotNull 或 @NotBlank)
唯一公开来源就是本端点,而此前它只给 TRAVEL 那一组
⇒ 接送机需求在管理后台确认不动。

同时修掉一个必 500 的场景:同一订单同时有两条已确认需求时,
本端点每一次都抛 IllegalStateException。现改为正常返回;
真出现无法判定的代际时抛新业务码 605311(HTTP 200)。

行为变化(是修复不是回归):接送机需求未定稿时,它的待派车行
现在会出现在逐日计划里——那些行归它自己的需求,先前隐藏它们才是缺陷。

gateway_status=verified 的依据是真实调用不是推断:经测试网关拿到
requirementIdentities 两项后,原样用于需求级确认返 code=200、
confirmed=true、finalPlanPublished=true ⇒ 该字段不只是返回了,
而是真的能驱动接送机确认走通。

Refs #7990

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:59:50 +08:00
API Changelog Bot和Claude Sonnet 5 24dde670d1 docs(changelog): #7443 AC-26 TRANSFER 派车行四端点网关实测收尾,gateway_status 回填 verified
changelog-filename-gate / validate (push) Failing after 2s
四个既有端点(candidates/change/confirm(assignmentId)/confirm(requirementId))经网关
逐一实测通过;此前缺失的 confirm(requirementId) 借新上线的
GET /admin/fleet/board/orders/{orderId} requirementIdentities 字段取得
expectedRequirementVersion/Sha256/expectedPlanGeneration 真值补齐验证。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 17:52:04 +08:00
API Changelog Bot和Claude Opus 5 9ee36c0b94 docs(changelog): #7980 AC-4 发票签发组三写口补同一把锁,新增可重试冲突码 100503(会触达小程序 C 端)
changelog-filename-gate / validate (push) Failing after 2s
order-v3 的 InvoiceAdminService.issueInvoice / reuploadInvoice 与 InvoiceMpService.reissueInvoice
三处 @Lock4j 写了逐字相同的 keys 却都没写 name;lock4j 的 Redis 键在 name 缺省时退化成
「类全限定名+方法名」,于是三处各持一把锁。后果是 reupload ∥ reissue 会留下一单两张有效票。
本次三处补同一个 name = "order-invoice:issue"。PR #8043 → 09b8f2323 已合 dev-v3。

接口路径、方法、请求/响应字段、既有错误码全部零增删。唯一契约变化是新增一个可能返回的错误码 100503
(RESOURCE_LOCKED「资源被占用,请稍后重试」),且它以 HTTP 200 + body code 返回——
前端只看 HTTP 状态码会把它当成功。

该码会触达小程序 C 端:reissue 经 hl-mp-service 两个入口透传
(MpV3InvoiceController:54 直接透传;MpInvoiceController:108 经 getCheckedData(),
Result:143-148 用上游 code 原样重抛)。用户点「申请重开发票」时若财务端正在同一张票上操作,
等最多 3 秒后收到该提示;反向同理。此前这几条互不阻塞。

测试服证据(backend_status 因此才从 pending 转 deployed;此前门禁 E_BACKEND_PENDING 正确拦下过一次,
没有为换绿灯改状态,而是去把部署真的做了):运行版本 5d14bc524,
merge-base --is-ancestor 09b8f2323 5d14bc524 → YES。
⚠️ 如实记:部署前 COMMIT 已是 5d14bc524(另一会话此前推上去的),本次重跑不等于「使它从不生效变生效」。

🔴 证据强度按实际收窄,没有拔高:redis-cli MONITOR 抓到键
lock4j:order-invoice:issue#order-invoice:issue:<invoiceId>、无方法名混入,
但 MONITOR 只跑了三个写口里的一个(issueInvoice);另两处由代码同源 + 反射守卫用例
InvoiceIssueLockNameGuardTest(断言三处 name 非空且相等)覆盖,未在测试服上单独抓包。
正文里 §2/§3 原本写「同第 1 节,链路一致」会被读成「也实测过」,已改成明确写「未单独抓包」。

100503 未复现:并发两个 issueInvoice,一个 code=200、另一个 code=581502(INVOICE_CANNOT_ISSUE
业务状态守卫),不是锁超时码。原因是临界区极短(与 fleet 那轮 34 并发未触发同因)。
第二个请求被业务守卫拦下说明没产生并发脏写,但这是旁证不是互斥证据。
两面都写:路径源码级真实存在(已读码确认 + IT 里实测过等 3024ms),但测试服未能触发,
不代表更长事务/生产数据量下不会触发。

取证干净:三张票全是测试夹具(客户名「核团甲/乙/丙」,apply_reason 为 #7932 造数),
改前均 REQUESTED/NULL/NULL,已按改前快照逐列 UPDATE 还原并复读一致,
Redis --scan lock4j:*order-invoice* 复扫为空。过程中发生过一次 code=401(token 被别的会话顶掉),
该次调用前无任何读数,已重登并把那段整个重做。

顺带修掉一个会挂门禁的文件名 bug:原名后缀写的是「小程序管理后台」,而 changelogs-v2/ 根目录
要求端类型字面量必须是「管理后台」,改名前文件名校验确实报 E_CLIENT。

Refs #7980

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:47:14 +08:00
API Changelog Bot和Claude Opus 5 8ff7f0761e docs(changelog): #5935 改期残留清理——前端要的能力已具备,用现有读写口即可
changelog-filename-gate / validate (push) Failing after 2s
前端 2026-09-20 待办清单第 4 项要求读侧补 residueServiceDates 日期数组,
并称写口 POST .../slots/{slotId}/clear-residue-dates 已就绪。两条都不成立:

- 那个写口在 origin/dev-v3 上零命中——「槽位(slot)」概念已随 #7067 退役,
  基于 slotId 的写口不会再有;
- 读侧能力早就有,只是不叫 residueServiceDates:candidates 响应的 cells[]
  逐日带 rescheduleResidue + serviceDate + assignmentId,
  另有 editableServiceDates 已并入残留日期。

故本件是用法说明,后端零代码改动:逐日清理走 DELETE /assignments/{id},
整批清理走 POST /batch 不提交残留项(diff 会精确取消)。
已写明真正的写侧边界——POST /batch 有「已过去日期不可改」硬门禁,
而改期后延场景的残留日多半已过去。

DELETE 路径对已过去日期是否放行未取证,如实标【需确认】;
若实测也挡住,那才需要另开工单放开残留行的过去日期取消。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:41:05 +08:00
API Changelog Bot和Claude Opus 5 41c0f752f9 docs(changelog): #7972 接送机的免车闸与结算闸改为非对称判据,809114 放宽 / 584131 新增拒绝
changelog-filename-gate / validate (push) Failing after 2s
PR #7976(572dc4037)改了两个既有错误码的抛出条件,零新增错误码:

- 809114(整团免车被派车阻塞)改为只看 TRAVEL——「只订接送机、没有团车」
  是合法的在团户,不该被上游拒绝免车,属于放宽。
- 584131(团期用车未就绪)对 TRANSFER 补独立的非对称判据:不存在放行 /
  DONE 放行 / 其余拒。原 TRAVEL 的抛出与放行结论逐字不变。
  整团免车现在只短路 TRAVEL 一支,两类互不豁免。

🔴 运维注意已写进正文:存量里停在 PENDING 的 TRANSFER 需求行,其所在户的
finalize 会从 200 变 584131——那是本次改动的预期行为,不是回归。

backend_status=deployed 依据 572dc4037 是测试服 order-v3 所在提交的祖先;
gateway_status=not_required 依据本次不涉及网关路由变更(仅后端判定条件)。
校验器 PASS,校验对象 4 个端点。

Refs #7972

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:35:19 +08:00
API Changelog Bot和Claude Opus 5 89d7e4f75d docs(changelog): 订正 01_6905 里「estimatedCost 已可用」这条错误交接(共 4 处,非 1 处)
前端会话核出 01_6905 第 446 行写着「预计毛利 = totalPrice − estimatedCost 现可直接算
(estimatedCost 已可用)」,而该字段从未有过数据。前端据此规划的「预计毛利」列在任何时点都算不出来。

本会话独立复核成立,并补上两个原 grep 会漏的口径:
- setEstimatedCost 在 main 代码 0 命中;
- getEstimatedCost 也是 0 命中——这条关键,MyBatis-Plus 的
  LambdaUpdateWrapper.set(Entity::getXxx, v) 用的是 getter 引用,只 grep setter 会整类漏掉;
- 字段名在整个 Java 侧只出现在实体 OrderInfo.java 自身的声明里,其余全是 docs 与建表 DDL
  ⇒ 没有任何别的 DTO/VO 带这个属性名,连 BeanUtil 那种反射拷贝也无从填它。
⇒ order_main.estimated_cost 全仓零写入点,estimatedCost 自 #6905(47aaff0be) 透出那天起恒 null,
不是后来才失效;已于 #7536(6182d566d) 从 003 出参删除。

⚠️ 同一条错话在正文共 4 处(字段表 :281、totalPrice 行的毛利公式 :282、
新增/派生对照表 :390、联调口径第 4 条 :446),外加在途返工表 :455 的半句。
只改被举报的那一处会让订正本身成为新的不一致来源,故五处一并改,并做了全文残留断言:
无订正标记而仍出现 estimatedCost 的行 = 0。

订正一律保留原文加删除线、不抹除,旧串仍可被 grep 接住(estimatedCost 出现 11 次)。
同时指向现行宿主:逐户毛利在核团接口 GET /v3/admin/order/group-batch/{groupBatchId}/audit 的
allocs[].grossProfit / costAmount(GroupBatchAuditRespVO:204-208 声明,
GroupBatchAuditService:742-743 真实填值,见 18_7932,亦即 14_7536:97「毛利改核单页」所指)。
顺带订正出处:estimatedCost 由 #6905(47aaff0be) 引入,不是 df8dbea0c——后者只加了 totalPrice。

发现来源:前端问题会话对 origin/dev-v3 的两轮核查(核查 + 对抗复核)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 17:30:44 +08:00
API Changelog Bot和Claude Opus 5 7bc90b0be6 docs(changelog): #7980 价格日历四个写接口补齐真实并发互斥 + 新增可重试冲突码 100503
changelog-filename-gate / validate (push) Failing after 2s
hl-fleet-service 车型价格日历四个写口(批量设价 / 多车型批量设价 / 批量改状态 / 清除价格日历)
此前虽各自写了相同的 @Lock4j keys,但都没写 name;lock4j 落 Redis 的锁键含方法名,
name 缺省时退化成「类全限定名 + 方法名」,四处因此各自持有一把互不相干的锁——
接口文档里一直写着的「四个价格写端点全互斥」此前并不成立。本次补上同一个显式 name,互斥才真正生效。

接口路径、方法、请求/响应字段、既有 4 个业务错误码(600500-600503)均零增删。
唯一的契约变化是新增一条可能返回的错误码 100503(RESOURCE_LOCKED,「资源被占用,请稍后重试」),
且它以 HTTP 200 + body code 的形式返回——前端只看 HTTP 状态码会把它当成功。

关于 100503 的触发频率,正文两面都写,缺一面都会误导前端:
- 该路径源码级真实存在(acquireTimeout 默认 3000ms + LockFailureExceptionHandler 转 100503
  + @ResponseStatus(HttpStatus.OK),三处均已读码确认);
- 但测试服用 4/8/17/34 并发 × 365 天多轮尝试均返回 200,一次未触发(推断原因:本次优化后
  单车型 366 天的 DB 往返从 732 次降到个位数,临界区极短,累计排队远小于 3 秒)。
⇒ 前端仍应防御性处理并允许重试,但不必按高频路径设计交互;
同时不能因为测试服没测到就当它不会发生——更长事务 / 更大载荷 / 生产数据量下的行为未知。

测试服证据(backend_status 因此才从 pending 转为 deployed,此前门禁 E_BACKEND_PENDING 正确拦下过一次):
部署前 53c2ff2d1 → 部署后 10efbaddf,merge-base --is-ancestor ee1937950 10efbaddf 返回 ANCESTOR_YES;
redis-cli MONITOR 实时抓包证实 12 并发只命中同一把锁键
lock4j:fleet:pricing-calendar:write#fleet:pricing-calendar:write,改前那种含方法名的坏形态一次未现,
12 组干净的 acquire→release、未观察到两个持有者同时持锁;71 次回归调用全部 code=200。
测试数据写在原本全空的未来年份(2027 部分/2028/2031/2032/2033,71 组车型×年份),
已用 71 次 DELETE 逐一还原并按年复核归零,真实业务数据(2026-09 丰田普拉多 24 条)抽查与改前一致。

gateway_status 记 not_required:四端点路径/方法零变化、hl-gateway 版本未动(4cbccc26b),
是判定不是漏验证,判据已写进 status_note。

Refs #7980

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 16:29:13 +08:00
API Changelog Bot f5596bf88e docs(changelog): 20_7443 按 CHANGELOG_TEMPLATE 重构分章节,过接口类门禁(#7443)
changelog-filename-gate / validate (push) Failing after 1s
E_API_TEMPLATE 要求接口类正文必须有 二/三/四/六/七/八/十/关联 八个章节。
内容零丢失,只重组结构并补齐模板要求的缺失章节。

三处不能丢的都逐字保留:
- 覆盖边界(本文只验到「提交」为止;TRANSFER 同步车务 outbox 恒 605905)
  在「六、边界行为」子节原样保留,文首「关键变化」只做导读不做替代
- 阳性对照注脚(两字段 fleet 恰好相同不能证明按 kind 取数生效,真正证明
  它的是全 null 对照与 id 不同)在「八」原样保留
- 809002/809009 分开处置(去补大交通 / 找后端开开关)新建对照表,两码
  各自一行,不混提示

代理顺带查实并订正三处:
- 路径参数按源码 AdjustmentAdminController 实为 {id} 而非 {orderId}
- status 枚举以 RequirementStatus 为准共 6 个;RespVO 注释里的 CLAIMED
  在源码里根本不存在,已显式点出分歧而非悄悄抹平
- 文件实际行尾是 LF 不是 CRLF,按现状保持
2026-09-20 15:35:01 +08:00
API Changelog Bot b8a079fda0 docs(changelog): 调整订单「车辆安排」页同页提交行程用车+接送机用车两类需求(#7443)
后端已合入 dev-v3(PR #8024 -> 920f29d76)并部署测试服,四条真实网关调用取证:
读口双槽(带全 null 阳性对照) / 一次 submit 同交两份落两条 active 行 /
两条 label 原文不同的调整记录 / 无大交通时 809002。
service_dates 两个 kind 分别派生成行程三天与接机送机两天,前端一个日期都不传。

覆盖边界写在正文与 status_note 里: 本文只验到「提交」为止。同一次实测观测到
TRANSFER 需求同步车务的 outbox 恒失败 605905(fleet AssignmentService:11492
取当前需求不带 kind),前端可并行开工但端到端尚未打通。
2026-09-20 15:35:01 +08:00
API Changelog Bot和Claude Opus 5 584df5a90d docs(changelog): #8016 standard_double 已修掉(PR #8025)——警告改为订正
changelog-filename-gate / validate (push) Failing after 1s
原文用一句「那是过期垃圾,不要照抄」绕过 roomCategory 入参的过期 Swagger
example。该前提今天已被 PR #8025(squash 合并 dev-v3 = 819a147a2)消除:
example 现为 DELUXE,value 文案补上取值集合与过滤语义。

按「订正要留着旧编号接住 grep」:standard_double 字面量原样保留(删除线内),
仍搜到旧值的人会落到这条订正上,而不是搜不到任何东西。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 15:05:14 +08:00
API Changelog Bot和Claude Opus 5 9df9dbb442 docs(changelog): #8016 团期候选酒店 roomCategory 入参真正参与房型过滤
changelog-filename-gate / validate (push) Failing after 2s
工单 #8016 追加范围,PR #8022 合并提交 7b713305e,测试服 order-v3 已部署并网关取证。
契约零增删字段,仅行为变化:matchedRoomTypeId 现在只落在同 roomCategory 的房型上,
matchedRoomTypeLabel 恒为房型真实中文名(不再回显入参 code),新增置灰文案「所选房型今日无房」,
todayAvailable 口径不变(全房型合计)。

前端行动项(mmg):第二个房型下拉需按第一个下拉选定的大类过滤,数据早已在
roomTypes[].roomCategory(工单 #4204),用现有字段即可实现,无需等后端。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 14:43:16 +08:00
API Changelog Bot和Claude Opus 5 e53008aef4 docs(changelog): 团期酒店候选放开池外 + 候选恒空修复(#7991 #8016)
changelog-filename-gate / validate (push) Failing after 1s
同一端点 GET /v3/admin/hotel-candidates 上 2026-09-20 先后上线的两次行为变更合写一份:
#7991 修复 GROUP 候选恒空(排序器以未接线的 batchRoomRemain 硬过滤,池内每家都被丢)、
#8016 放开池外(产品固定房池由硬门降级为加分项,池内恒排最前并带徽章)。

契约零增删,但 GROUP 的 isPoolMatch / poolMatchBadge / recommended / recommendSource
取值域由「恒真/恒非空」变为「可假/可 null」,前端若对 GROUP 写过恒为池内的假设必须改。
实测读数取自测试服 order-v3 @7d44ca268 经网关实调,候选 1→21。

Refs #7991 #8016

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 13:49:37 +08:00
API Changelog Bot和Claude Opus 5 25e77cf72e docs(7442): 修 5 处指向「从未存在过的文件名」的悬空引用,改为单号+glob
changelog-filename-gate / validate (push) Failing after 2s
#7442 的两份交接件里有 5 处引用
`19_7444_团期配车就绪门禁与同团车辆共用关系-新增接口-管理后台.md`。
该文件名在全历史零命中(阳性对照:同一条命令能找到确知已提交的
`*7442*reconfigure补登*`,所以零命中是真空不是 glob 写错)——它是起草期的
一份草稿名,该稿已并入现存的 `*_7444_*` 交接件、名字不再存在。

不改成「现存的那个文件名」,因为那会埋一次必然的再次失效:
① 那份文件还没提交(门禁按设计拦着 backend_status=pending);
② 本仓文件名带提交日前缀,它哪天被推名字就是哪天;
③ 「指向文件名」本身就是错的抽象层——文件名会变,单号不会。

改成「#7444 的交接件(按 `*_7444_*` 检索)」,这个形态不需要第二次维护。
旧名在括号里保留一句接住 grep。

Refs #7444

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 12:05:46 +08:00
API Changelog Bot和Claude Opus 5 ae069b00a9 fix: frontmatter 未转义的引号让元数据对所有消费方隐形——修 19_7443 + 给校验器补语法层
changelog-filename-gate / validate (push) Failing after 1s
现象:Gitea 上打开这份 changelog 看不到元数据表,页面表现就是「这份文件没有元数据」,
而文件里其实写着完整的 16 个键。

根因:status_note 是 YAML 双引号标量,正文里夹着未转义的 ASCII 双引号
(...请勿据此对外宣称"确认/改派已验证可用")。YAML 在第一个内部引号处截断,
整块 frontmatter 解析失败,Gitea 于是静默不渲染。

为什么一直没人发现:本仓校验器的 parseFrontmatter 是朴素行解析——按第一个冒号切开、
两端引号成对就剥掉——它对「这份 YAML 下游读不读得了」零分辨力。于是这类文件长期处于
「校验器 PASS,而 Gitea 与任何 YAML 解析器都读不到」的状态,没有任何一处报错。
校验器回答的是自己那套宽松读法,不是消费方的读法。

改动两部分:
一、修 19_7443 那两个引号。转义只改字节不改语义,验过三条:改后 yaml.safe_load 成功、
    解析出的值与作者本意逐字相同、正文一个字节没动。
二、给校验器补上它完全没有的那一层:validateFrontmatterSyntax,新错误码
    E_FRONTMATTER_SYNTAX。本仓刻意零依赖,所以不引 YAML 库,按实际出过的三类伤写
    定向判据:内部未转义双引号 / 收尾引号丢失 / 非法转义序列。语法校验排在所有按键
    取值的校验之前——frontmatter 读不了的话,后面那些校验都是在校验一份只有本脚本
    能读的东西。

自验两个方向:三种人造伤各自被拦(exit=1);全仓 1030 份逐批跑完,新增错误码
E_FRONTMATTER_SYNTAX 命中 0 次,无连带误伤;独立口径用真 YAML 解析器扫全仓,
546 份带 frontmatter 的全部可解析。

⚠️ 同一毛病另有 7 份存量文件未修(05_5530 / 08_5592 / 06_7149 / 10_7328 / 13_7625 /
15_7327 / 15_fund-account)。它们的元数据同样对 Gitea 隐形,修法已验证可行,
但每份都带着 1~3 条与本次无关的历史门禁错误(E_FRONTEND_STATE「verified 必须填写
target_release」为主,另有 E_AUTHOR / E_API_TEMPLATE / E_BACKEND_STATUS),
推不上去。补那些字段需要编造内容,不做。
🔴 值得记一笔的因果:正是门禁这个严格度让这 8 份一直坏着——谁想顺手修一下,
就会撞上一堆与自己无关的历史错误然后放弃。修复脚本留在
D:/work2/_scratch/changelog-fm-fix/,等 wx 决定是给存量文件开豁免还是补齐字段。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 11:04:32 +08:00
API Changelog Bot和Claude Opus 5 3b637393bc docs(changelog): #7443 TRANSFER 提交开关测试服已开启,订正 18_7443 里 frontend_status=not_required 的判定依据
changelog-filename-gate / validate (push) Failing after 2s
18_7443 判 not_required 的理由逐字是「上游写口 809009 开关关闭,产品上产不出 TRANSFER 需求,
4 个新错误码仅 kind=TRANSFER 触发、前端不可达」。

该前提已于 2026-09-19 15:33:32 CST 被本会话推翻:测试服 Nacos 开启
hl.order.requirement.transfer-kind-submit-enabled 并重启 order-v3 两实例
(承载类 RequirementService 无 @RefreshScope)。

⇒ 那 4 个错误码与 TRANSFER 派车路径在测试环境里现在可达,frontend_status 改判为 pending。
不替 mmg 拍 not_required:原判定的理由没了,但生产仍不可达、是否启动前端集成是排期问题。

边界写清三条:代码默认值仍 false / 生产未动 / 开关开了 ≠ TRANSFER 全链路可用。
18_7443 原文件未改动,保留接 grep。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 17:14:10 +08:00
API Changelog Bot和Claude Opus 5 fc36125695 docs(changelog): #7442 逐字段审计查出两处契约错误,修正 coverage 错误响应与 reconfigure 漏列的 5 个字段
changelog-filename-gate / validate (push) Failing after 2s
对 4 份 #7442 交接件做了逐字段契约审计(10 个端点、21 个错误码,分母从
工单正文与源码数、不从 changelog 数),端点数与错误码数均对上,查出两处:

1. coverage 端点「错误响应」节整段写错(严重)。原文写成「本团正式需求
   零分组或无需求时统一失败关闭、返 602009」,并引了一句并不存在的
   message。核 GroupDispatchService#queryCoverage 后实为三条不同路径:
   - 无活跃需求 → HTTP 200、success=true、satisfied=false,gaps 指出身份
     已变,根本不是错误
   - 有需求但零分组 → 602009,message 实为「正式用车需求未声明任何乘车
     分组(整团免车的团期不应配车)」,抛出点在 GroupDispatchCoverageCalculator
   - 基线不可达 → 600009,不是 602009
   把三条压成一条,会让调用方给一个返 200 的正常场景写错误处理分支——
   「拿不到覆盖结论」和「覆盖结论是不满足」在本端点不是同一件事。

2. reconfigure 补登漏列 5 个字段:入参 survivorPolicy(clearAll=true 且
   存在 active 共用关系时必填,缺失抛 602110)与出参 releasedShareGroupIds
   / keptSourceIds / releasedSourceIds / pendingReassignSourceIds。它们由
   #7444 追加到同一个端点,完整语义在 #7444 那份 changelog 里;本文档只补
   列字段名与出处,不重复。

   ⚠️ 这一处的机制值得记:本文档自称按端点「当前的完整契约」撰写,而
   「完整契约」这种自述会在别的工单往同一个端点加字段时静默失效——加字段
   的人写的是他自己那份 changelog,不会回头改这一份。

Refs #7442

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 14:35:25 +08:00
API Changelog Bot和Claude Opus 5 0eecbce1ab docs(changelog): #7442 订正两份交接件的部署顺序结论——按单算的"顺序无所谓"在并集里是错的
changelog-filename-gate / validate (push) Failing after 3s
两份文档各有一句部署顺序结论:
- reconfigure 补登:「万一要分批,order-v3 先滚风险更低」
- 就绪回写补登:「本单不强制要求特定先后顺序」

两句按各自那次改动算都是对的,分析段也都标了范围(reconfigure 那份甚至
明写「本单与 #7957 的『fleet 必须先滚』不同」)。错的是结论句把限定丢了,
读起来像是对这次部署的建议。

而 PR-C2(#7957)后来在同一个 GroupBatchDispatchBaselineDTO 上加了
reconfigureWindow,它强制 fleet 先于 order-v3:order-v3 先滚时旧 fleet
收到 dispatchable=true 直接放行重配,不读 reconfigureWindow、不校验令牌
与范围,「受控重开」当场退化成「不受控重开」——而两端日志都正常、
没有任何报错。今天要部署的人面对的是这些改动的并集,不是某一单。

⇒ 两份都补了订正框,并把实操答案写死:同批滚;必须分批时 fleet 先、
order-v3 后。同时立了一条规矩:写部署顺序结论一律带上「截至某日期/commit,
这个 DTO / 这批部署单位上还有哪些已合入的改动」这个限定——按单写的部署
结论会在下一次改动落到同一个对象上时变成陷阱,而它不报错,也没有人会
回来改它。

原分析段逐字保留,只给结论句补范围。

Refs #7442

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-19 14:30:07 +08:00