80 lines
11 KiB
Markdown
80 lines
11 KiB
Markdown
# 对话与输入统一对齐:实现与验收
|
||
|
||
基线:`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。
|