Files
ycode/docs/协作/Windows历史路径与问答独占-交付-01.md
T

37 lines
3.0 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.
# Windows 历史路径与问答独占输入区:交付 01
2026-10-21。源码提交:`23537aaf28ce9f743495c12c3750e8e43556c496`。
基线:`a4e77cacbeb39e000592cde16f4ff39712b921ae`。对应用户 0.0.10 发布前反馈;本提交不修改版本号、不发布安装程序。
## 历史路径 fail-closed
原缺陷:`file/history.json` 中的父路径是普通文件时,Windows 可能返回 ENOENT,POSIX 通常返回 ENOTDIR。旧代码将所有 ENOENT(包括读取阶段)视为空历史,因此 Windows 会绕过防御性断言。
- 从根路径逐级检查父目录,区分目录真实缺失和父组件非法;合法系统目录链接/junction 允许跟随,悬空链接和普通文件父组件拒绝。
- 只有确认父路径后,叶文件 lstat 的 ENOENT 可以作为新历史;readFile 的 ENOENT、EACCES、损坏 JSON 等仍失败。
- 保留叶文件软链接拒绝、大小/格式限制、私有临时文件 wx 写入、原子 rename 和串行合并;创建父目录后再次检查。
- 测试增加跨平台 Windows ENOENT 注入、读取阶段 ENOENT/EACCES、缺失嵌套目录、链接/junction、并发保存等。
- 将新测试对照旧实现运行,Windows ENOENT 模拟用例确实失败;没有放宽原失败断言。
## 问答卡独占
原缺陷:输入区组合器只让工具授权卡接管输入区,问答选择卡仍浮在普通输入框之上。
- 当前会话、当前活跃 run 的 pending/responding/error 问答沿用已有授权卡独占机制,不新增样式或第二个停止按钮。
- 普通编辑器保持挂载,但 hidden/inert/aria-hidden 且禁用;草稿、附件、引用及能力选择保留,回答/取消后恢复。
- 历史问答、其他 run/其他会话和加载中页面不触发接管。授权卡行为保持不变。
- 问答选择与自由输入仍在问答卡内部提交,未更改工具授权或消息发送/排队语义。
## 验证
- `npm run test:model-bridge`:111 项本地协议检查 + 16 组 mock SDK host 检查通过。
- 新问答 composer ReactDOM 回归:21 项通过;已有授权 DOM 49、问答交互 24、问答身份 30 项通过。
- `npm test`、严格 alignment 11 offline + 9 DOM、完整生产构建通过;独立审查通过。
- [证据](evidence/release-0010-fixes)。保留 CRLF 文件,CRLF-aware diff 检查通过。
未在真实 Windows、Electron 原生界面或真实 SDK/模型上验证。111 为本次 POSIX + 注入 Windows 错误语义的检查数;不同平台的权限/链接专项计数可能不同,不能用数量代替具体用例结果。文件检查和写入之间的并发文件系统替换风险不作为本次完整解决的安全承诺。
## 0.0.10 验收要求
拉取本交付后,在 Windows 重新运行 `npm run test:model-bridge`,不得仅跳过/放宽 invalid history path 断言;核对问答出现时只有问答卡,普通输入框不可见且不可操作,回答后草稿/附件恢复。历史问答不可劫持新任务输入区。发布前记录具体测试结果;发布流水线未包含测试不代表测试失败可忽略。