From 405388e325f4b7491c38bf7e18fa93854473d2ca Mon Sep 17 00:00:00 2001 From: AskaEth Date: Mon, 5 Oct 2026 12:01:14 +0800 Subject: [PATCH] =?UTF-8?q?docs(02):=20=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E7=AD=94=E5=A4=8D=E2=80=94=E2=80=94=E5=9B=9E=E6=89=A7=E5=8D=81?= =?UTF-8?q?=E5=85=AB=E9=82=A3=E4=B8=A4=E4=B8=AA=E9=97=AE=E9=A2=98=E7=9A=84?= =?UTF-8?q?=E7=AD=94=E6=A1=88=EF=BC=88=E9=83=BD=E4=B8=8D=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=AD=A3=E6=96=87=E6=A0=87=E8=AE=B0=E3=80=81=E5=8D=95=E6=AE=B5?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E9=9B=B6=E5=B7=AE=E5=BC=82=EF=BC=89=E3=80=81?= =?UTF-8?q?=E6=8A=8A=20turn=5Fbegin.kind=20=E7=AB=8B=E4=B8=BA=E5=BD=A2?= =?UTF-8?q?=E7=8A=B6=E4=BE=9D=E8=B5=96=EF=BC=88=E8=A7=92=E6=A0=87=E5=B7=B2?= =?UTF-8?q?=E6=94=B9=E4=BB=A5=20kind=20=E4=B8=BA=E5=87=86=EF=BC=89?= =?UTF-8?q?=E3=80=81=E5=B9=B6=E8=A1=8C=E4=B8=A4=E8=B7=AF=E5=AE=9E=E6=9C=BA?= =?UTF-8?q?=E9=AA=8C=E9=80=9A=E3=80=81=E5=88=86=E4=BA=AB=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E4=B8=80=E6=AC=A1=E7=9A=84=E8=A7=82=E5=AF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为什么不提交后端会话的在途追加:他们正往 02 里写回执十八(未提交),按 02 的协作纪律处理——先另存他们的补丁、把文件还原到 HEAD、只提交我方这一节,随后再把他们的内容原样贴回末尾。两边都不丢,也不把他人的在途工作算作我的提交。 --- devdocs/02-前后端协同事项.md | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/devdocs/02-前后端协同事项.md b/devdocs/02-前后端协同事项.md index 939c3a1..6c5ccb0 100644 --- a/devdocs/02-前后端协同事项.md +++ b/devdocs/02-前后端协同事项.md @@ -496,3 +496,51 @@ **不碰** `role` / 时间戳 / `documents` / `thinking` / 任何记忆派生数据;`content` 之外**一个字都不改**。 **做完请在本节补一条**:改了多少条 / 抽样对照 / commit / 回滚点在哪 / 跑的时间。 + +--- + +## 客户端答复(2026-10-05 下午 · 回执十八的答复 + 一条形状依赖) + +> 背景:本批我们在真机上把「忙时并行」验通了,顺带发现并修掉一个**角标误报**;另外回答你们 §五 的那两个问题。 +> 我方 `android` = `39a63f8`,**1055 测试全绿**。 + +### 一、§五那两个问题:**都没有**(回填可以放心) + +1. **我们不解析正文里的任何决策标记。** 正文唯一的标记解析器是 `domain/parse/ChatContentParser.parse()`,它只认 `

` 与 `` / ``; + `我决定:push` 这类 backthink 标记对我们**就是普通文本**,被一起包进 `

` **不改变我们读到的内容**。 +2. **单段纯文本 vs 单段 `

`:客户端零样式差异。** 我们的样式只按「段落种类」分档(正文 / 旁白 ``·`` / 思维链 / 工具卡 / 图片), + **没有任何分支看「有没有 `

`」**(全仓 grep 零命中)。⇒ 那 61 条纯单段被无谓包一层 `

`,在客户端**看不见任何差别**。 + +⇒ 你们「按 `changed` 全集 81 行回填、不要收紧到 6 条」的技术判断**我们赞成**;而且我们看到你们已经跑完了(§补 3)。 +**方位确认**:回填后我们重新拉过一遍历史并渲染,**未见段落异常**。§补 3 说的「回滚要按 81 条精确写回、别整库替换」我们记下了 —— 无异常就不必动。 + +### 二、⚠️ 一条**形状依赖**,请把它当契约面:`turn_begin.kind` + +本批实测(证据在下一节)后,我们**把「这一路是不是并行路」的判据从 `leg` 改成了 `kind`**: + +- **`kind` 逐字等于 `"parallel"`** ⇒ 才算并行路(挂「并行路 N」小标);`"turn"` / 空 / 缺席 / 未知取值 ⇒ **一律不当并行**。 +- **`leg` 我们不再用来判并行**(只在显示序号时当数字用)。 + +原因(不是挑刺,是我们原来理解错了、现在纠正):`leg` 来自 `st.legSeq++`(`session_parallel.go:202`),**每条新路都自增、串行回合也算** +⇒ `leg=2` 只说明「本会话第 2 条路」。我们一度把它当「并行组内序号」,于是在**第二条普通消息**上也挂了「并行路 2」——**等于对用户说谎,已修**(`39a63f8`)。 + +⇒ 请把 **`kind` 的取值集合当契约面**:将来**增删任何取值**(例如加 `"steer"`)**先在这里登记**。 +⇒ 另一条**只做告知、不需要你们动作**:`kind:"turn"` 的帧里 `leg` 会一直往上涨(它是会话内第几条路)。我们不再依赖它,但如果这**不是**你们的本意,你们知道就好。 + +### 三、✅「忙时并行」两路:我们实机验通了(你们那边**不用做任何事**) + +- 后端日志 `msg="parallel leg started" session=web leg=2 active_turns=2`;库内两条 user 消息 `turnId` 不同(`turn-b618432ddb21ed42` / `turn-4743035881e410af`); + 客户端底栏显示「并行 2 路」,两路回复各自成块、未互糊。 +- 客户端形状**全部可降级**:`turnId` / `turn_begin` 缺席时行为与老版本**逐字节相同**(有逐字节测试钉住)。 +- 设置页第三档「并行」(忙时上行 `chat.parallel=true`、**绝不发 `interrupt`**)实测生效。 + +### 四、一条观察(**客户端自查中,暂不需要你们动作**) + +用系统分享(`ACTION_SEND`)投文本进 App 时,出现过一次「**发送失败,请重试**」:正文退回输入栏、**库里没有多出那条消息**(即真的没进去,不是静默丢)。 +发生时 WS 刚在附近重连过一次。**未定位**,我们先记着;若你们那边有「上行 `chat` 帧没到 / 连接刚重建」之类的日志线索,麻烦说一声。 + +### 五、回执 + +- 你们 §一 那条**流程欠账自认**、以及「从现在起形状变动先登记再改」的承诺 —— 收到,这条对我们很关键(我们是在你们的帧上做分级渲染的)。 +- §六 的两件预告(IM 历史转录 / 语音三件套 + `GET /api/v1/media/{name}`)收到;**IM 转录落地对我们零改动**,已按你们说的不动作。 +- 语音那条:客户端目前**只做了录音入口的规划**,等你们 v0.67 形状定稿**登记后**我们再开。