注释:说明失败说明身份在无身份无时间时会撞成一条

directTurnFailure.ts:原来那句"身份不可证明时退化成与事件时间绑定的固定形状……不会让两轮失败互相覆盖"漏了 `at` 也拿不到的那一档——常量 direct-thread-turn-failure 会让两条这样的失败按同一个 itemId 合并。补上这一档的真实行为与取舍(唯一性与重放不变不可兼得,这里选重放不变),代码不动。
This commit is contained in:
2026-09-24 13:04:11 +08:00
parent b0e870e7e2
commit db11bae2d8
@@ -20,8 +20,13 @@ const DIRECT_TURN_FAILURE_FALLBACK_ITEM_ID = 'direct-thread-turn-failure';
*
* 它是派生身份,不是原生条目身份——宿主只在 `turn.completed.failure` 里给原因,不额外造条目。
* 用本轮身份派生可以保证"同一轮只有一条说明、跨轮不会合并",也不会和原生 itemId 撞车。
* 身份不可证明(本轮没有落盘用户条目)时退化成与事件时间绑定的固定形状:它随事件固定、
* 重放不变,又不会让两轮失败互相覆盖。
* 身份不可证明(本轮没有落盘用户条目)时退化成与事件时间绑定的固定形状:它随事件固定、重放不变,
* 同一条事件重放多少次都算同一条说明,两轮失败也不会互相覆盖——前提是事件带 `at`。
*
* 身份与 `at` **都**拿不到时只能退到常量 `direct-thread-turn-failure`:这一档无法既"重放不变"
* 又"两条不撞",它们会被 `mergeDirectChatEntry` 按同一个 itemId 合并成一条。当前所有宿主事件
* 都带 `at`(`at` 缺失只可能来自更早版本的事件),所以这是防御路径;真要给这一档唯一性,得先
* 接受"重放会产生第二条说明"。
*/
export function directTurnFailureItemId(
userItemId: string | null | undefined,