IME 回归检查清单¶
后续问题台账¶
这些报告定义了持久验收契约,而不仅仅是来自一台机器的症状。
| 问题 | 根本原因 | 所有权不变量 | 所需证据 |
|---|---|---|---|
| #16911 Native Chat 预编辑被流式输出或附件结算覆盖 | React 协调或异步解析的附件在浏览器拥有正在组合的文本域时写入应用草稿;重复结算随后可能重新采用过期的 DOM。 | 从 compositionstart 到第一个 compositionend 或失焦,浏览器拥有该文本域。已解析路径在共享语义汇聚点排队;结算在一次性刷新前采用浏览器 DOM。 |
重复的过期流式重渲染保留元素和预编辑;空闲外部草稿仍会同步;并发 SSH 补全保留补全顺序和重复项;两种结算顺序均只运行一次;禁用会丢弃排队工作;失焦不会窃取焦点;原生组合提交一次。 |
| #16949 终端预编辑没有可见光标 | 不透明组合覆盖层覆盖了渲染器光标;在最终单元格处,过宽的行内预编辑还可能将其光标放置到被裁剪屏幕之外。 | 现有 xterm CompositionHelper 在预编辑之后、任何行剩余部分之前拥有可见光标;最终单元格组合在屏幕内右对齐,而行中组合保持左锚定。 |
覆盖开始、更新、任意宽度最终单元格包含、行中剩余部分放置、清理以及无开始更新;预览和正常终端继承实时光标主题。 |
| #16950 输入诊断未记录任何 CJK 样本 | 探针观察回显的 keydown,但不观察已协调的组合提交,然后猜测哪个排队输入拥有不透明 TUI 输出。 | 即使 compositionend.data 为空,也会观察到已协调的组合;只有孤立输入进入精确百分位数,而重叠或输入丢失间隙会产生一个聚合模糊突发。 |
覆盖记录的 Linux IBus 空数据提交、孤立直接和 IME 样本、混合来源歧义、超时/上限间隙、UTF-8 输出字节以及停止/排空清理。 |
| #17104 韩文预编辑重复 Codex 占位符 | 通用 xterm 行尾复现暴露了应用语义的 Codex 或 Claude 编辑器占位符,而展示样式无法安全识别它。 | Xterm 始终保留通用覆盖行文本。Orca 现有的结构化编辑器分类器仅在精确的活跃组合会话期间屏蔽已验证的占位符;重绘重新分类仅在组合期间运行,并且结束、失焦或销毁会清除所有权、类和监听器。任意暗色输出和 shell 相似项保持可见。 | 覆盖 Codex 提示/页脚和 Claude 提示/边框分类、任意全暗色和 shell 相似项负例、重绘进入和退出、结束/失焦/销毁清理,以及在光标列 2 处渲染的 Electron 证据并保留通用行文本。 |
| 问题 | 根本原因 | 所有权不变量 | 所需证据 |
|---|---|---|---|
预编辑单元格前进量 (#19315)¶
单码位 CJK 字素使用当前 Unicode 提供方的单元格宽度和实测字体前进量。普通内联 span 保留浏览器双向文本和基线布局;相等的修正共享一个 run。保持字形不缩放,并使下划线、光标和候选文本框与渲染的预编辑对齐。追加 ASCII、emoji 或其他文字系统时,不得改变现有 CJK 前缀的修正。组合序列、emoji、其他文字系统和空白保留原生整形。字体加载、排版变更和渲染器度量变更必须更新打开的组合;行尾重绘保留其未变更的节点。
冷字体测量和带样式的 run 共享固定的工作预算。重复的 CJK 可以保持为一个已修正的 run;预算耗尽后,剩余文本保留其原生前进量。这会刻意在异常多样的长组合尾部保留原始间距不匹配,而不会将前缀切换回原生间距,也不会重建数千个 span。
terminal-ime-xterm-preedit-cell-grid.test.ts 覆盖文本保留、原生文本簇、生命周期和有界工作。terminal-ime-preedit-cell-grid.spec.ts 检查渲染字形原点、光标/textarea 几何、下划线、字体变更,以及在 DPR 1、1.25 和 2 下 WebGL 开/关时的原生整形。
terminal-ime-preedit-continuity.spec.ts 覆盖混合后缀和预算跨越。
这些检查通过 CDP 使用 Chromium 组合;它们不能替代原生操作系统 IME 证据。
有界状态与所有权契约¶
每个临时集合和所有权跟踪器都必须具有明确的生命周期和边界:
- Native Chat 使用
NATIVE_FILE_DROP_MAX_PATHS(256)。如果已解析的完成结果将超过上限,则整个批次会被原子性地拒绝,并且溢出通知在结算期间保持可见;已接受的路径保留顺序和重复项。队列在重新进入之前以及禁用或 pane-owner 重新挂载时清除。 - 终端占位符掩码跟踪一个标量
activeSessionId,因为 xterm 渲染一个组合视图。较新的开始会取代较旧的开始,过期的结束无法清除最新的所有者,而失焦或销毁会清除它。组合路由有意保留其按 ID 的引用计数映射,用于传输所有权;它不会被标量替换。 - 输入诊断将待处理和被忽略的回显候选项限制在
MAX_PENDING_ECHO_CANDIDATES(64),限制待处理的用户输入信号,排空超时的候选项,并在面板分离时清除所有序列。溢出会成为明确模糊的突发,而不是任意归因。
Native Chat 异步附件结算¶
附件解析是一种外部语义写入,包括本地文件选择、粘贴图像的临时保存和 SSH 上传。在组合处于活动状态时,它不得替换浏览器拥有的 textarea 值。
- 启动两个并发 SSH 上传,先解析第二个,并返回同一路径两次。保留完成顺序和两个重复项。
- 在第一个结算事件时,在刷新排队路径之前采用浏览器 DOM。在一个 React 批次中执行
compositionend然后失焦,以及失焦然后compositionend;两种顺序都必须恰好采用并刷新一次。 - 如果 composer 在上传解析之前或队列刷新之前变为禁用,则丢弃该结果。
- 如果省略
compositionend,失焦会执行相同的一次性结算,而不会聚焦 textarea 或抢回焦点。
跨平台验证¶
合成 DOM 事件证明了 Orca 的事件和渲染契约,但它们不会演练操作系统的输入法。变更还必须覆盖:
| 环境 | 原生证据 |
|---|---|
| 环境 | 原生证据 |
|---|---|
| macOS | Native Chat 和终端中的原生韩语 2-set 组合;预编辑在外部渲染后仍保留,光标保持可见,且提交仅发生一次。 |
| Windows | Microsoft 韩语 IME 位于未修改的 Codex 占位符之上;预编辑是唯一可见文本,取消后占位符恢复,普通行内内容保持可见。 |
| Linux / SSH | 使用 IBus Hangul 和 SSH 托管的 PTY;空数据 compositionend 仍会产生一个诊断样本和一个已提交音节。 |
对于远程证据,live 表示拥有主机报告了当前验证会话或进程身份。exited 需要由主机拥有的正面证据,证明同一身份已终止或不存在。任何传输失败、过期身份、超时或无法询问拥有主机,都会使结果变为 unverifiable;它绝不是组合或 PTY 进程已退出的证据。
代码优雅性门禁¶
每个修复必须通过以下所有检查:
- 复用已经拥有该状态或覆盖层的组件;不要引入第二个组合状态机。
- 明确浏览器、渲染器和 PTY 的所有权边界。临时文本不得泄漏到已提交状态或 PTY 输入中。
- 将本地选择、粘贴图像的临时保存以及 SSH 上传结果通过一个已解析附件汇聚点路由;队列中只应包含语义路径,绝不能包含整个草稿快照。
- 将正确性更改与无关的微优化分开。
- 使用有界的每次组合状态和工作量。随其所有者一起销毁每个监听器、计时器、观察器和 DOM 节点。
- 使用成对的负向测试,保留普通拉丁输入、混合样式终端内容、本地和 SSH PTY、预览终端以及文件夹工作区。
- 将平台特殊行为隐藏在事件契约或运行时平台检查之后;不要根据 IME 供应商、语言或终端代理名称进行分支。
- 将规范的 xterm 源补丁视为唯一手工编辑的源,然后一起重新生成其 bundle 补丁和 lockfile。
- 优先使用确定性重放或状态转换测试。原生证据是第二层,绝不能替代回归覆盖。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca