# 2026-10-24 双入口与侧问恢复回归

本轮验证选文入口与「侧问这个回合」入口，在切换主会话、关闭重开和刷新后仍能正确选择目标、保存引用并保持新侧问焦点。结果：所列场景通过；未发现需要进一步修改产品代码的问题。

## 环境与证据

- 插件：0.2.0 开发版本；DSH `0.2.1-alpha.3`，源码基线 `01bac39c3d`，沿用已构建的 `0.2.1-alpha.3-01bac39-dirty` Web 产物。本轮未重新构建 DSH core。
- Node 24；模型 `deepseek-codebuddy / deepseek-v4.1-flash`，High。真实浏览器操作与真实模型回复均在隔离 3186 实例完成。
- 隔离环境具有独立 DSH_HOME、插件副本和临时工作区。与日常 3080 的插件源码一致；构建归一化排除绝对路径、CSS 哈希及导出对象键顺序后一致。
- 建立主会话 A、B，各有唯一来源标记 `REGRESSION-A-SOURCE` / `REGRESSION-B-SOURCE`。交替操作，并独立核对 DOM、原生草稿结构和落盘日志。

## 回归方法与结果

| 步骤 | 独立观察与结果 |
| --- | --- |
| A 有侧问时切换尚无侧问的 B，分别打开两个入口 | B 均只有两个新建项，没有把 A 算作追加目标 |
| A、B 各自通过选文和整回合入口新建、追加 | 草稿中的来源 Session ID 与消息 ID 分别属于 A、B；没有串入另一主会话 |
| 关闭最后一个侧问聊天标签，保留或关闭历史页 | 两个入口都隐藏追加项；从历史重开后恢复三个选项 |
| 从历史重开未发送草稿，再刷新 | 原子 Session ID、引用数量及来源保持一致；没有重复插入 seed |
| 同一主会话打开两个侧问，依次手动激活后追加 | 选文进入刚激活的旧侧问，随后回合进入刚激活的新侧问 |
| 两个入口分别选择独立会话和 Fork | 新输入框仅包含本次来源；独立会话无继承 transcript，Fork 显示对应主会话历史 |
| 新 Fork 发送，等待标题和回复更新，再切走、返回、刷新 | 仍打开新子 Session，没有跳回旧侧问，已发送草稿为空 |
| A 生成期间切到 B，等待 A 完成 | B 保持当前会话与侧问，没有被后台完成事件抢占 |
| B 已发送后关闭、从历史重开、刷新 | 回复和引用保留，草稿为空；入口选项仍按打开的标签计算 |
| 点击历史回合引用和选文引用 | 分别高亮 A 来源消息、精确选中 B 来源文字；B 重开并刷新后仍能跳转 |
| 只读解压原生 session log，检查 user/message | A、B 已发送的两项引用各自保持正确 parentSessionId、sourceMessageId、sourceSeq |

A 的新 Fork 收到 `REGRESSION-A-CHILD-OK`。B 首次提交仅含两项引用，后续单独提交标记问题收到 `REGRESSION-B-CHILD-OK`。自动化曾命中隐藏 DOM、未等待菜单关闭动画和输入未进入编辑器；纠正定位、等待并核对实际草稿后重跑，失败操作未计入通过证据。

## 自动化与数据保留

`pnpm test`：19 个测试文件、135 项测试通过。`pnpm check`：通过。相关测试包括 `selection-menu`、`turn-menu`、`native-surface`、`native-reference-routing`、`reference-navigation`、`fork-context` 与 Host service 测试。

本轮没有重启或重新部署日常 3080，也没有向日常会话发送测试消息。回归前后的 718 个会话保留，基线 740 个会话文件 0 缺失、0 SHA-256 变化。此前部署保留的备份未删除。

原始浏览器步骤、合成测试引用、测试输出与文件核对记录保留在本地隔离环境的 `regression-20261024/` 下，不进入 Git 或 npm 包。本文保存可复用的回归方法与结论，不包含用户会话正文、凭据或启动 token。

## 未覆盖范围

本轮不证明操作系统或浏览器进程崩溃恢复、跨设备同步、所有附件与工具审批组合、其他 sidebar 插件组合，也不证明所有旧格式日志完成迁移后可继续聊天。历史兼容与迁移样本边界见[兼容性记录](./compatibility.md)。原生持久化职责与升级检查见[原生 session log](./native-session-log.md)。
