diff --git a/docs/对话输入统一对齐实现与验收-2026-10-21.md b/docs/对话输入统一对齐实现与验收-2026-10-21.md new file mode 100644 index 0000000..68ff0a8 --- /dev/null +++ b/docs/对话输入统一对齐实现与验收-2026-10-21.md @@ -0,0 +1,64 @@ +# 对话与输入统一对齐:实现与验收 + +基线:`771ca540f71b387d11865bc5c07f7d4f4d8b6ecf`。工作分支:`workbuddy/alignment-2026-10-21`。 + +本次为十项方案的本地代码实现及可执行回归,**不是 WorkBuddy 当前版本完整 1:1 / Windows / 像素验收**。未推送、发布、安装覆盖用户应用,也未使用 Codex 云任务或 CLI。 + +## 十项交付矩阵 + +| 范围 | 已实现 | 已验证与保留边界 | +|---|---|---| +| 会话加载 | 新任务与已有空会话分离;无缓存两组骨架、标题占位、淡出;缓存优先;失败重试;重复选择不刷新;发送 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、旧计时器隔离;工具关联投影去重;缺失位置的历史明确标识 | 18 项 jsdom 行为及投影/SSR;真实浏览器布局/焦点待验 | +| 完成折叠 | 默认完成/取消耗时块;外层/局部/工具/思考独立状态;展开原始记录顺序;真实终态时间,不冒用创建时间 | 完成展开/局部切换、消息 footer 回归;历史无终态时间则不伪造 | +| 工具授权及会话允许 | 输入区宽卡、真实工具/命令/目标/原因/范围、编号/快捷键、默认拒绝、失败重试;仅完整可安全重放的 SDK 建议组提供会话允许;按 YCode session 隔离、非永久设置 | 14 项授权卡 DOM + broker/宿主策略/SDK 接口 mock。**实际 SDK 应用、后续范围匹配、跨回合/重建等真实运行未验收**,不能凭 mock 或按钮成功宣称已修好所有 SDK 语义 | +| 归档/删除确认 | 240 宽任务行右侧 Popconfirm、箭头/焦点/外点吞掉/Escape、锚点消失、重复提交/失败重试;其他 Popover 默认兼容,保留全权限模态 | 26 项 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 匹配与回调内应用行为仍未验收。