Files
ycode/docs/对话输入统一对齐实现与验收-2026-10-21.md
T

80 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 对话与输入统一对齐:实现与验收
基线:`771ca540f71b387d11865bc5c07f7d4f4d8b6ecf`。工作分支:`workbuddy/alignment-2026-10-21`。
本次为十项方案的本地代码实现及可执行回归,**不是 WorkBuddy 当前版本完整 1:1 / Windows / 像素验收**。未发布、安装覆盖用户应用,也未使用 Codex 云任务或 CLI。推送仅尝试用户指定 Gitea 的独立审核分支;实际结果以交付回执为准,不修改 master。
## 十项交付矩阵
| 范围 | 已实现 | 已验证与保留边界 |
|---|---|---|
| 会话加载 | 新任务与已有空会话分离;无缓存两组骨架、标题占位、淡出;缓存优先;失败重试;重复选择不刷新;发送 readiness 门禁 | 状态测试覆盖乱序切换、恢复、缓存、失败、重试。10,000 条历史约 748 KB 的 Node 解析/状态注入测量约数毫秒;不代表浏览器渲染或 Windows IPC 性能,无据不做性能重写 |
| 模型选择 | 展示/发送共享有效模型解析;无模型阻止发送;新增自动默认和当前任务下一请求选择;编辑保留;删除清理无效引用;模型 ID 重命名映射;异步保存绑定会话/草稿身份 | 离线模型注册表/前端状态回归;历史消息快照不改写。无 config 的新安装不再合成 deepseek;仅迁移显式旧模型配置 |
| 权限首发 | 会话创建带 permissionMode 并校验;发送直接取权威保存值;模型/权限/模式保存序列化;失败不默默按旧高权限发送 | 首发完全访问、已有会话、模式进出及等待保存测试;内核真实工具授权尚见下文 SDK 边界 |
| 模式输入栏 | plan/ask Chip、清除回 craft、插槽顺序、权限禁用且关闭浮层;plan 有效显示默认权限,保留原偏好,ask 禁改 | 状态/SSR 回归。Chip SVG 为本地几何,不谎称原版 SVG 已恢复;同版本原版图标、字体和宿主差异待 REA |
| 局部过程分组 | 至少两项连续过程各自成组,后续正文/终态触发局部折叠;尾段独立;保留特殊节点 | 同轨迹、多组、正文锚点及展开顺序回归 |
| 底部运行状态 | 共享 progress 事件、真实准备/思考/工具/等待问答/等待授权/收尾;恢复快照、序号及终态清理;reasoning-only、tips 延迟/轮换/独立悬停与焦点暂停/关闭 | 纯事件与 DOM 行为测试;无云启动/网络恢复/credit 数据源,未伪造这些分支或静默超时;原版文案优先级全状态仍待 REA |
| 提问与已答记录 | 分页、键盘/焦点、补充、多选、跳过、重复提交、失败重试、IME、旧计时器隔离;工具关联投影去重;缺失位置的历史明确标识 | 24 项 jsdom 行为与历史投影及投影/SSR;真实浏览器布局/焦点待验 |
| 完成折叠 | 默认完成/取消耗时块;外层/局部/工具/思考独立状态;展开原始记录顺序;真实终态时间,不冒用创建时间 | 完成展开/局部切换、消息 footer 回归;历史无终态时间则不伪造 |
| 工具授权及会话允许 | 输入区宽卡、真实工具/命令/目标/原因/范围、编号/快捷键、默认拒绝、失败重试;仅完整可安全重放的 SDK 建议组提供会话允许;按 YCode session 隔离、非永久设置 | 14 项授权卡 DOM + broker/宿主策略/SDK 接口 mock。**实际 SDK 应用、后续范围匹配、跨回合/重建等真实运行未验收**,不能凭 mock 或按钮成功宣称已修好所有 SDK 语义 |
| 归档/删除确认 | 240 宽任务行右侧 Popconfirm、箭头/焦点/外点吞掉/Escape、锚点消失、重复提交/失败重试;其他 Popover 默认兼容,保留全权限模态 | 28 项 jsdom 行为。原归档文案仅有“系统设置-数据管理”目的地记录,现明确说明 YCode 无此入口且可从已归档查看;全文/边缘避让/像素待验 |
## 证据范围
遵守 AGENTS 的 REA-only 约束;没有绕过 REA 直接读取原版安装包、JS/CSS、调试端口或运行界面。本次只利用计划、项目文档及已恢复到 YCode 的实现。原有证据标注维持:JS `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb` 为 **5.8.2**,CSS `ev_176b4a0369c4836f9498bd4a9c7c9dff10022defcbddaad6dd0080442de78ee9` 为 **5.8.3**。没有新增原版证据 ID,不将前端映射当成后台授权生命周期证据。跨客户端重启的会话授权不承诺持久化。
## 可复现命令
```sh
npm ci --ignore-scripts --legacy-peer-deps --cache /tmp/ycode-npm-cache --registry=https://registry.npmjs.org --no-audit --no-fund
npm run test:alignment
npm run typecheck
npm run build
```
锁文件原有 `electron-vite@5` / `vite@8` peer 冲突,安装使用 legacy-peer-deps;没有改锁文件版本或自动执行全部安装脚本。esbuild 官方平台包可直接使用。Electron 下载脚本审阅后单独运行;未运行发布/升级/旧 WorkBuddy 采集脚本。
可选 DOM 测试(jsdom 验证交互,不验证布局/像素):
```sh
npm install --prefix /tmp/ycode-popconfirm-test --cache /tmp/ycode-popconfirm-test/cache --ignore-scripts --registry=https://registry.npmjs.org jsdom@30.1.3
YCODE_TEST_DOM_MODULE=/tmp/ycode-popconfirm-test/node_modules/jsdom npm run test:alignment
```
## 被阻塞的验证及安全处理
- 安全 Electron 启动失败:无 X server / `$DISPLAY`,未提供 Xvfb。Chromium headless 正常沙箱启动也在 `socket() failed: Operation not permitted` 退出。没有使用 `--no-sandbox`、禁用安全校验或其他绕过。故无本次真实窗口截图,不能交付伪造的像素验收图。
- 实际 SDK 回环测试尝试使用既有构建器及 `timeout 120 node .tmp/claude-kernel-integration.mjs > /tmp/runtime-sdk.log 2>&1`。只观察到 `unrecognized_model` / `claude-mock` / `query_source:sdk` 日志。随后 session 27885 的正常输出轮询被 auto-review 拒绝,理由是 SDK 可能联络 `api.anthropic.com` 并传出项目数据,违反禁止外部模型调用的约束。没有重试或绕过;后续允许的进程检查无 node/claude/timeout 残留。**没有证明实际外部请求/数据传输发生,也没有测试成功证据;实际结果未知。**后续仅运行不启动 CLI/query 的宿主/接口 mock。
- SDK 会话建议支持范围被保守限定:完整组中的每项必须为有明确 ruleContent 的 addRules allow;不按工具名无条件放行、不部分接受混合组、不采用 mode/directory 扩权;重放通过 SDK 支持的接口而非自行字符串匹配。未知/不支持建议仅一次授权并明确解释。
## 明早实际环境验收
1. 在 Windows 安装依赖并启动独立测试配置,勿直接覆盖用户生产数据。
2. 同一视口、DPR、缩放、主题、字体,截图加载/plan/ask/提问中/完成收起展开/授权卡/任务 Popconfirm。
3. 用安全的本地 SDK 测试环境验证:允许一次后再问;会话允许匹配不再问;不匹配/另一会话仍问;正常切换/跨回合/内核重建;应用失败、拒绝、取消、并发、不可覆盖规则与 plan/ask。
4. REA 补取当前版本 ModeChip SVG、模式宿主行为、授权生命周期与未覆盖的运行状态证据;未完成前不能标记完整 1:1。
5. 浏览器大历史实际帧耗时/滚动阻塞、浮层边缘避让及屏幕阅读器/平台焦点实测。
## 首轮验证记录(2026-10-20 UTC)
以下 15 条命令退出码均为 0:`test:alignment`(含 58 项 jsdom 交互检查及纯状态/宿主/SDK接口 mock)、`typecheck`、`build`、`test:chat`、`test:conversation`、`test:composer-capabilities`、`test:persistence`、`test:sessions`、`test:assistant-footer`、`test:markdown`、`test:tool-approvals`、`test:references`、`test:recovered`、`test:model-metadata`、`test:font-size`(均使用 `npm run`)。完整命令、耗时、退出码及日志见交付包 `validation-results.json` 与 `logs/`。
`check:tokens` **退出码 1**:另在原始 `771ca54` 只读导出上运行,确认同样 6 个既存问题(recommended-flow、skill-detail-shell、skills-host、capability-picker、composer、prompt-queue);本次新增样式没有新增门禁违规,没有刷新/放宽基线。故不宣称 token 门禁全绿。相关旧测试 fixture 的修正:无模型时代显式提供测试模型;Markdown 引用动作测试提供 sourceId,不放宽生产 guard。
新增授权链路在 IPC 成功前等待 `applyFlagSettings` 的接口确认;失败保留同一待审批交互并显示错误,重试可恢复;取消/切换后不接受滞后结果。会话规则以 session ID + 工作目录隔离,防止相对规则随目录变化扩展。以上仅由宿主/SDK 接口 mock 验证,真正 SDK 匹配与回调内应用行为仍未验收。
## 独立复审与增量修复(2026-10-20 UTC)
在 `c7231be` 上另做状态/首发、运行时/授权、UI/集成三条审查,修复六处实际缺陷,而非只重复旧测试:
1. **待保存模型被默认值覆盖**:旧/失效模型会话选择新模型后立即发送,先前发送路径会排队写回默认模型。现先等待该会话设置收敛再解析回退,修复仍绑定原会话;新增缺失/已删除模型 × 直接发送/队列及等待中切换会话四组回归。
2. **提问跳页竞态**:单选后的 120ms 自动翻页可能在手动“下一页/跳过”后再次翻页。显式导航取消计时器,回调绑定请求代次与原页;新增两组 DOM 回归。
3. **历史问答伪造顺序/重复**:没有记录 `parts` 的旧工具回退序列不再当成真实提问位置。交互或 metadata-only 答案走明确的未知位置兼容区,抑制重复工具条目;四项投影/SSR 回归。
4. **完成展开丢失局部分组**:展开外层完成块仍保留局部摘要控件与分类上下文,而不是扁平化所有过程;继续按记录顺序展示,新增分组与顺序断言。
5. **外部点击误选任务**:指针按下在任务标题子节点、抬起在任务行时 click 可能重新定向到祖先。确认浮层现在同样吞掉这次关闭点击,但后续普通点击不受影响;新增两项 DOM 断言。
6. **拒绝/跳过后仍显示等待**:审批拒绝、问题跳过和正常回答在有效回合内回到真实思考阶段;取消后的滞后回调不发新阶段;宿主 mock 回归覆盖这些路径。
同时校正 README 中过期 OMP 启动说明和不存在的脚本入口。Windows 重编译使用 Node.js 24.x、`npm ci --legacy-peer-deps`、`npm run build`;启动前设置独立 `YCODE_USER_DATA_DIR`,勿用生产数据目录试验。`npm run dist:installer` 需在 Windows x64 环境及对应 optional SDK 依赖下另行验收,本次不以 Linux build 成功代替 Windows 安装包验证。
复审最终 15 条测试/typecheck/build 命令均退出 0;命令、退出码与日志由源码包中的 `review-validation/validation-results.json` 和 `review-validation/logs/` 提供。`test:alignment` 使用独立 jsdom 安装,包含 **66 项 DOM/投影检查**(28 任务确认、24 问答、14 授权),另含状态、分组及宿主/SDK接口 mock;它不是实际 SDK/窗口/像素验收。`check:tokens` 在重新导出的原始 `771ca54` 与复审代码上各运行一次,均为相同六个既存失败,未修改 token baseline。