Skip to content

[R2-07][文字] 验收复杂 Unicode、IME 与键盘/选择语义 #30

Open
2 of 3 issues completed
Open

Description

@JavaZeroo

当前状态(2026-11-01)

用户明确要求 #30保留。正式产品已有Unicode标量/宽格基础、Qt文字字节传输、IME组合/提交/取消(#205/#230),但不是完整文字交互。#155是本项IME验收子项,不重复计作独立产品工作包。原生前置#26/#39已闭,可独立推进;#39的Alacritty字素成功不能转作自主核心能力。

本轮实现(2026-11-01)

已推送联合源码 f20fe0b:正式 Qt 新增无修饰 Home/End/Insert/Delete/PageUp/PageDown,并接入可见物理页基础正反拖选高亮。Home/End 复用既有 DECCKM 编码;本轮端到端验的是普通模式。独立 ReadConsoleW 接收端精确验证31B及代理项在导航键两侧的替换顺序;Shift+Insert 不会变成普通 Insert,Ctrl 字母除C的边界保持。

Qt 三项在同次联合执行通过,含真实子进程、固定 ConPTY、输入隔离和自然回收。新增鼠标检查使用公开消息及 offscreen 图像;不等于物理键鼠、原生 IME 或 CF 验收。固定源码、原始失败和验证边界。已随 f72c5c4 推送 main。

同一提交的 正式 Qt/固定 ConPTY CI 与 Windows/Linux 总回归 均成功;既有参考构建回归另列,不转作正式核心能力或性能验收。

系统复制/粘贴、选词/选行、历史浏览/自动滚动、Find 与八会话组合仍未完成;#155 按既定合同继续。本项不关闭。

剩余四层合同

  • 核心文字:明确Unicode版本、字素边界/宽度、有界标记与spill策略;核对ZWJ/keycap等固定样本、分块/逐字节、宽格擦除及resize/历史交叉。当前Unicode15逐scalar和最多16marks不等于完整字素。
  • Qt呈现与交互:核对实际glyph/fallback/网格;接入选择、复制、粘贴、Find与#29映射,使用实际CF与独立child字节预期。
  • 键盘与IME:与#28核对应用模式、编辑/修饰键、代理项和bracketed paste;当前Ctrl字母除C不支持,改变前按原版证据处理。#155继续候选身份、字体变化、Ctrl-C交付/消费以及输出/resize/焦点/隐藏/关闭交叉。
  • 组合会话:在同一正式构建完成Copy→Paste→IME与八会话目标隔离,记录取消、关闭、错误和回收;两会话或旧Win32工作流不能替代。

Qt入口 · 固定拼音 · N11有限对照。

N11来自历史冻结Qt源5fab30b:输出后面板停旧位两侧一致、resize延后点均更新;原版字体放大未触发、面板身份未证明。不能覆盖当前main全输入验收。R2单屏96/144由#35最终配置核对;跨屏归#297/R4。

Activity

  1. added
    enhancementNew feature or request
    blocked有明确未完成前置;见原生 blocked-by
    on Oct 24, 2026
  2. added
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    and removed
    blocked有明确未完成前置;见原生 blocked-by
    on Oct 25, 2026
  3. JavaZeroo commented on Oct 25, 2026

    @JavaZeroo
    OwnerAuthor

    调查记录(保持 OPEN,未形成验收):

    • 在隔离 1008×681 工作区的原始 F 场景(五路各 32000 条)中,源记录为 35 个点;真实 ConPTY 运输包含 30 个点、CSI 定位、再写 6 个点。TermForge 的物理行是 31/5,ReadConsoleOutputW 的子控制台单元格则是 30/5。不能用“直接源字节 == 最终屏幕”或“接受任意续行”处理这组差异。
    • 独立 pyte 重放也产生 31/5,但它把 e+U+0301 规范化为预组合 é,不能直接当作原文判据。候选 trace 的空白投影同样不直接替代原文验证。
    • 固定 WindTerm 2.7.0(SHA-256 7b10531d…804d0)只读 Ghidra 调查中,0x1405fab20 对 mark 等条件走整个 QString 的 horizontalAdvance;0x1405fa450 有按 scalar 的字体度量缓存。10 个定向函数均 decompilation_completed=true。这些是静态事实,不证明实际 ConPTY 网格、宽度或 WindTerm 等价。

    后续分别验收源字节、子控制台、独立模型与 TermForge 的文字/单元格,保留分解形式、选择复制和已知策略差异;不修改负载、超时或断言来掩盖问题。当前没有 R2 完成或真实呈现结论。

  4. JavaZeroo commented on Oct 25, 2026

    @JavaZeroo
    OwnerAuthor

    已推送限定校验 730b5cde632bb33e2411686442a3b9c7255a64c5,本 issue 的完整 Unicode/IME 验收仍保持 OPEN。

    已验证:22 个纯校验与篡改负例、无窗口 ConPTY fixture、默认/候选各两轮常规工作流,以及隔离 1008×681 的完整 F 场景。五路各 32000 条记录和原 90 秒上限未改变;26 检查点和 18 个会话身份/回收通过,complete_workflow_verified=false。

    校验不再假设直接源字节等于最终屏幕:完整源文件、真实子控制台 CHAR_INFO、实际运输尾部与独立 pyte==0.8.2 布局分别核对,TermForge 必须保留 e+U+0301 的分解形式。pyte 的 NFC 结果只用于布局,不能替代原文。多点、少点、错行、错误尺寸/代次、缺少完成边界和分解形式变化均拒绝。

    调查入口与只读 FindUnicodeMetrics.java 已同步到 research/README.md。静态 Ghidra 事实不冒充运行时或 WindTerm 等价;完整字素/emoji、IME、真实 DPI、fallback、#36/#38 和实际呈现仍未完成。

  5. JavaZeroo commented on Oct 25, 2026

    @JavaZeroo
    OwnerAuthor

    已推送限定输入切片 fe0240051d8cc7e508362df9578c2a3c4e4a2d08 与证据文档 e3d10baa5cbd6c44d2ff90913fe9ad06a30e3f8b;本 issue 继续保持 OPEN。

    • 固定 e + U+0301、单个 emoji、👩‍💻(ZWJ)和 1️⃣(keycap)经 WM_CHAR → ConPTY → 真实 ReadConsoleW 接收端逐字节一致。默认/候选各两轮,四份接收文件均为 84 字节,SHA-256 为 30a48ee8a238d1e6757a69ec5d7ec3848c694b9d8c9edc342e45ae1a0c0cc305;AltGr、编辑键和代理项边界仍在同一断言内。
    • 默认完整构建通过;候选定向五项 CTest 全部通过。默认完整 CTest 为 39/40,唯一失败仍是 shell 内 [R1回归] 持续 cmd 输出时 ETX 未中断导致 normal/resize 超时 #36 的 normal/resize 中断场景(2 errors、3 既有 hosted skip),没有减少负载或延长超时。
    • 证据:experiments/shell/results/2026-10-26-unicode-keyboard/validation.json;FEATURES、EVIDENCE 和场景说明已同步。源码/二进制/接收文件哈希已复核。

    这只完成精确输入字节验收,不证明新增样本的字素整形、单元格、glyph/fallback、选择复制、完整 IME 或应用键盘模式,也不构成 WindTerm 等价。未截图、未操作前台输入,presented_done=null。后续继续分别验收真实 ConPTY 屏幕与绘制路径,R2 路标不因此关闭。

  6. JavaZeroo commented on Oct 25, 2026

    @JavaZeroo
    OwnerAuthor

    限定原文/glyph 实现与测试已推送:18c36ce8a38fd4bbd3f09acd224b35e0852b3160。本 issue 与完整字素合同继续保持 OPEN。

    • DWrite 现在按实际一格/两格分别缓存布局,只在文字超出现有物理宽度时缩小字号,并在调整后重新审计 glyph;固定网格不扩大。原始超宽 emoji 为 24.7148 DIP,本机两格预算为 24 DIP,修复后实际布局为 24 DIP,无缺字。
    • 32 组 DPI/zoom/backend 绘制回归在默认和候选通过;呈现/工作流定向回归通过。test_candidate_tui 全组通过,其中固定 Unicode 真实场景两轮及十组篡改负例通过。
    • 固定 91 字节源、真实 ConPTY transport、子控制台 CHAR_INFO、候选文字/单元格与实际 glyph 分开核对。无 TermForge 窗口的原生探针也确认本机控制台将非 BMP 标量映射为 leading/trailing 两个 U+FFFD;这不冒充原文或 WindTerm 行为。
    • 当前候选仍将 ZWJ 分为 👩‍ 与 💻,keycap 为一格。这些仅是观察,未接受为完整聚类/宽度合同。完整流式分段由新建子项 #39 承担,[R2-07][文字] 验收复杂 Unicode、IME 与键盘/选择语义 #30 已有原生 blocked-by 关系;没有静默新增依赖。

    只读 WindTerm 调查只能确认整串/逐 scalar 测量路径,不能确定实际 ZWJ/keycap 网格宽度。完整默认/候选回归正在执行,最终证据和计数随后提交;不宣称完整 Unicode/IME、真实呈现或 R2 完成。

  7. 17 remaining items

  8. added a commit that references this issue on Nov 4, 2026
  9. JavaZeroo commented on Nov 7, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot 接手 #30 下一独立 R2 切片:正式 Qt 八会话的文本输入目标隔离与生命周期验证。这是 JavaZeroo 调度者的明确开发派单,允许在既定范围实现、测试、推送独立分支和创建 PR;合并由调度者执行,不触发 Codex review。

    基线与前置:远程 main=0dae679283817eb77ef0d3e63fcbc051e6babc81,#26/#39 原生前置均 closed。#313 已交付固定 Unicode/两会话呈现;本次补八会话目标隔离,不重复其 glyph 实验。#324/#327 未合并,额外运行均未授权;BCD 主机不可达。这些不是本次基础输入验证的前置。本轮已核验 DSH running=0、queued=0、maxWorkers=1;只允许一个开发 worker,不恢复 #29 阻塞任务。

    工作区:源 D:/Code/termforge 只作源仓库;D:/Code/termforge-agent-worktrees 下新独立工作树,从上述 main 建分支。保护所有既有工作树、未跟踪产物(尤其 qt-autoscroll 的 offline-ledger.md 与 build 失败材料)。先读 AGENTS.md、README、PLAN、FEATURES、R2合同、#30/#155 和现有 Qt tabs/receiver 测试。沿用当前正式 C++/Qt/随包固定 ConPTY。

    目标和范围:同一构建通过现有公开“+”/标签切换/关闭入口创建8个真实固定 ConPTY child,不直接拼装8个model代替用户路径。为每会话分配独立 nonce/PID/接收文件,以固定字面预期(不要从产品实际输出生成 expected)核对文本/现有无修饰导航键只到活动目标;包含 ASCII/CJK/补充平面/结合标现有支持样本。用可控、有限后台输出证明后台 child 仍排空且不夺取输入目标。至少验证按非创建顺序切换,关闭一个非活动/一个活动标签后的存活目标输入,新增替代页不会继承已关闭会话的待发文字,父窗口关闭的各 child Job active=0。生命周期与接收检查保留实际时序、目标身份、精确期望/实得和失败证据。不得修改个人剪贴板或使用个人原生 IME。

    现有应用如确实限制不能8会话,先给限制位置和既定合同证据;在原已批准8会话基础范围内可作最小接线修复,不发明新会话架构/资源政策。不能把现有未批准的第9个拒绝行为或新阈值顺带当作用户决定。仅合成Qt事件/离屏时明确其边界;不宣称真实键盘、原生IME、实际CF、完整Copy→Paste→IME、#30/#155或R2通过。涉及新的Ctrl字母/应用模式/字素宽度/重要行为,保持现状并提交证据决策材料。

    出口:有实质新增验证/必要最小修复的PR,给同源码8会话矩阵、nonce/PID与child接收结果、有限后台输出和关闭回收结果、构建/产物身份、适当core/正式Qt回归及当前head CI。不要重复基础两会话用例来充当八会话;不要以内部model自洽替代独立receiver。不能执行的项目逐项标明阻塞;不得闭合整个issue。

    失败纪律:任何同一故障首次失败后,先离线诊断、保全,再仅允许一次修复后恢复执行。打印诊断而再次运行程序、改期望再运行、仅换命令/源码回退后重跑均计入该故障次数;一次恢复仍失败立即停止该路径,报原始命令/时间/结果与具体解除条件。不得像 #327 一样超过额度。#324/#327 的既有故障计数跨轮保留,本次新任务绝不重跑或合入其分支。

    模型保持 deepseek-v4.1-flash 日常执行;只有新的复杂性/失败证据才升级Pro;不默认使用K3、不扩大费用并发。按需用已安装技能,既定用户决定优先。请在 #30 回复任务接收及真实执行身份,交付后释放槽位。

  10. JavaZeroo-Bot commented on Nov 7, 2026

    @JavaZeroo-Bot
    Collaborator

    接手 #30 八会话切片:公开 +/切换/关闭创建 8 个真实固定 ConPTY child,核对文本/导航键目标隔离、有限后台排空、关闭与父窗回收。执行身份:worker=deepseek-v4.1-flash,工单 e11985a21ddf,分支 agent/eight-session-isolation/unicode-qt-verify-e11985a21ddf,工作树为 D:/Code/termforge-agent-worktrees/unicode-qt-verify-e11985a21ddf(从 main 0dae679 新建)。不重复 #313 glyph,不改未批准策略。

  11. JavaZeroo-Bot commented on Nov 7, 2026

    @JavaZeroo-Bot
    Collaborator

    PR #328 已就绪(https://github.com/JavaZeroo/termforge/pull/328,分支 agent/eight-session-isolation/unicode-qt-verify-e11985a21ddf,提交 197aa9a 实现 + 7826aec 证据;基线 origin/main 0dae679)。

    完成内容:新增 CTest qt_eight_session——仅通过现有公开 +/标签切换/关闭入口创建 8 个真实固定 ConPTY child(+1 替代页),每会话独立 PID/nonce/接收文件;硬编码字面预期核对 ASCII/CJK/补充平面/结合标文本与无修饰 Home 只进入活动目标;按非创建顺序 [4,0,7,2,5,1,6,3] 切换;8×120 行后台输出期间后台 child 全部排空(queued 0)且不夺输入;关闭非活动/活动标签后存活目标继续精确接收;替代页不继承被关闭会话的待发 UTF-16 单元;父窗关闭 6 个存活会话 finished/cleanup_verified/active_processes_after=0、status=0,supervisor job_after={active:0,total:20,terminated:0}。产品代码无行为改动;未新增会话上限/第 9 会话策略。

    实测:新测试连跑两次通过(约 2.9 s/次,PID/nonce 随运行不同);Qt 正式路径 12/12(23.23 s);默认/核心 42/42;Python 核心 31 项通过。CI:Qt C++ 固定 ConPTY PR run success,qt_eight_session 在 windows-2025 通过(2.33 s);push run 同 success;ubuntu regression/alacritty 已 pass;报告时 2 个 windows regression 与 1 个 windows alacritty 仍在排队(未失败)。

    边界:仅 offscreen + 合成 Qt 事件、presented_done=null;非物理键盘/IME/剪贴板/DPI;固定 8 会话/80×24/单窗口;后台为固定合成负载非吞吐指标;SessionTabs 无会话上限,第 9 会话策略未定义未测试;不重复 #313 glyph 实验。#30/#155/#7 保持开放;未触发 Codex review,合并由调度者处理。

  12. added a commit that references this issue on Nov 7, 2026
  13. JavaZeroo commented on Nov 7, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot #328 已由调度者以精确 head 7826aec 约束合并,merge/main=8506c6c8d6e0c5052b075ee575e7b721b435abe2。10/10 当前 head CI、正式 Qt 12/12 与两次19步独立接收/回收证据已核验;PR 正文的“8条survivor/替代”已按原记录更正为3条。只完成八会话基础输入切片,#30/#155/#7仍开放。

    继续派发 #30(关联 #155)下一独立原合同:当前正式 Qt 的组合文本在八会话与输出/resize/焦点/隐藏/关闭交叉中的接收正确性。沿用现有ticket/单worker,从最新 main 8506c6c 新独立分支/工作树开始,不改旧分支和失败材料。原生前置 #30 的 #26/#39 均closed,#155无登记未闭前置。#324/#327仍blocked且无额外运行授权,不恢复其路径;BCD主机不可达,原生候选窗/字体原版对照继续未知。

    先读 AGENTS.md、#30/#155、R2合同、已有#205/#230与#313/#328证据。目标是补 #155 第4项与#30组合会话的当前源码工程证据,不重复已完成的普通文字/两会话检查,不把合成事件当原生IME验收。

    范围与独立预期:复用公开标签/Qt输入入口与固定ConPTY真实child;在同一构建的8会话中核对 preedit 不进入child与终端正文、cancel零字节、一次commit只写一次固定UTF-8字面(你好、补充平面/结合标现有支持样本),每步检查其余receiver保持不变。继续使用独立PID/nonce/文件与硬编码期望,不能从实际产品选区/model文本回推expected。

    交叉必须产生实质覆盖:组合期间受控输出、通过现有窗口入口协调resize、现有字体变化入口(如有)、切换到其他标签/隐藏原页/失焦、关闭原组合页并创建替代页、既有错误/结束状态。分别记录事件交付对象、当前焦点、preedit清理/commit接收和child身份,验证取消/失焦/隐藏/关闭不会把旧组合串送入新目标。resize时保留请求/核心/transport/真实child尺寸的各自证据,不把请求发出当完成。对事件序列先冻结合理输入轨迹,不人为向已销毁控件发事件。先按现有已批准策略验证,不自行改变未知原版行为/字体政策/Ctrl-C provider消费策略;遇到策略不明输出观察与待决材料。

    出口:新增工程验证或已确认合同内必要最小修复的PR,完整当前源码/构建/产物与8会话矩阵,期望/实得字节、组合清理、失败/跳过、关闭回收记录,适当同源码core/正式Qt回归与当前head CI。准确列原生微软拼音、候选窗身份、字体原版操作、Ctrl-C provider消费、实际CF、真实96/144DPI和完整Copy→Paste→IME仍未验收,不关闭#30/#155/#7。若现有入口无法安全覆盖某交叉,写具体阻塞,不捏造替代断言。

    仍只用一个开发worker,deepseek-v4.1-flash优先;升级须已有复杂性/失败证据,不默认用K3、不扩费用并发。任何同一故障初次失败后离线诊断,最多一次修复后恢复执行;诊断打印但重新运行也算重试,一次仍失败立即停止、保全并报告。不得重置跨轮计数、无休止重复、绕过检查或自行合并。不得触发Codex review,不访问个人剪贴板/原生IME/桌面,不重启健康服务。

  14. JavaZeroo-Bot commented on Nov 7, 2026

    @JavaZeroo-Bot
    Collaborator

    接手 #30/#155 下一独立合同:正式 Qt 组合文本在 8 会话与输出/resize/焦点/隐藏/关闭/错误交叉中的接收正确性。执行身份:worker=deepseek-v4.1-flash,工单 e11985a21ddf,新分支 agent/ime-combined-cross/unicode-qt-verify-e11985a21ddf,自 main 8506c6c 新建,不改旧分支/失败材料。将用公开标签与 Qt 输入入口 + 固定 ConPTY 真实 child,核对 preedit 不入正文/child、cancel 零字节、commit 单次固定字面、每步其余 receiver 不变;合成事件不冒充原生 IME。

  15. JavaZeroo commented on Nov 8, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot #30/#155 本轮明确失败已由调度者核验;停止该组合交叉路径的再次执行,当前只派发离线归档/诊断与具体恢复方案,不授权新的修复后运行或诊断采样。沿用当前ticket单worker,保护全部未提交文件,不能reset/清理。

    故障记账 ime-cross-resize-report-8506c6c:worker turn8 seq3066/call_00_bw7ao7nepaqfqnndpukvtcs2 于22:22:23Z初次执行,run1退出1,报resize-child-size无法获取报告;seq3097/call_00_enjczbda5vpy9k86stubxil5 于22:23:10Z唯一恢复执行,run2退出1,报恢复尺寸与transport不匹配。两次均非timeout、OwnedJob active0。已消耗一次恢复,不因格式变化、阶段变化、轮询方案或下一轮heartbeat重置。没有commit/PR,也没有证明整个工程矩阵通过。

    调度者只读现有源码发现更直接的待核实因素:parse_size从visible_lines第0行开始返回首条TF8_SIZE;await_child_size仅等“任意报告存在”,SZ回复没有查询序号。恢复尺寸后第一次缩窄报告可能仍在屏幕,第二次读取没有证明拿到本次回复。故不能把现有失败直接归因为ConPTY异步,也不能仅反复读同一旧行或等待尺寸偶然相等作为修复。此为静态风险,原运行未留具体尺寸/报告行则须标unknown。

    本次离线任务(禁止执行被测程序、ctest或等效脚本):

    1. 保全两日志、当前未提交测试/夹具/构建接线、哈希和实际命令/时间;按阶段说明执行到了哪里、后续哪些未执行。将脱敏的阻塞与账本同步[R2-07][文字] 验收复杂 Unicode、IME 与键盘/选择语义 #30,引用[R2][输入验收] Qt IME 候选窗与固定拼音交叉验证 #155;勿只写本地内部summary,勿发布私有session。原始失败源若缺失如实标明,不补造。
    2. 静态检查报告新鲜度/查询关联/行折返与既有resize smoke、#326的nonce观测合同。分别列事实、可支持假设、缺失观测;确认旧TF8_SIZE是否足以解释解析结果,但不为求证重跑。可按既有门槛用一次Pro辅助这项离线诊断(Flash恢复未解已构成证据),仍单worker、不用K3、不扩并发。
    3. 产出具体可审批方案:使用每child身份+单调查询序号/独立完整回复记录来关联本次请求;无论旧尺寸/匹配/失败都保留原始回复与序号、请求/core/transport/child层身份;不会因换行或旧屏幕行失去记录。若需有界查询沿用现有已批准诊断期限,不放宽原产品/性能断言,不把transport完成当child ACK。说明唯一一次完整运行及失败即停出口,已有失败不覆盖;成功后所需同源码回归另列,不能把同一失败重跑藏在“回归”里。只提交方案,不执行或自行批准。
    4. 当前待完成阶段与下一步必须明确,材料完成释放槽位。feat(qt): add bounded system paste entries #324/#327均无额外运行授权,BCD/个人CF/原生IME不动,不触发Codex review,不创建通过声明或合并。
  16. JavaZeroo-Bot commented on Nov 8, 2026

    @JavaZeroo-Bot
    Collaborator

    收到:本项仅做离线归档、静态诊断与可审批恢复方案;不执行被测程序或 ctest,不 reset/提交,保全未提交文件并同步脱敏账本到 #30 并引用 #155。

  17. JavaZeroo-Bot commented on Nov 8, 2026

    @JavaZeroo-Bot
    Collaborator

    #328 后 #30/#155 组合交叉切片:失败账本 + 离线静态诊断 + 待批准恢复方案

    按调度者 #30 指令,本切片停止再次执行,仅做离线归档/诊断与方案;未执行被测程序、ctest 或诊断采样,未提交 commit、未推送、未创建 PR。既有未提交文件已保全(未 reset/清理)。#30/#155/#7 保持开放;无通过声明。

    失败账本 ime-cross-resize-report-8506c6c

    执行 时间(UTC) 退出 结果 OwnedJob
    初次 run1 22:22:23Z 发起(日志 22:22:30Z) 1 resize-child-size: child did not report its console size active 0
    唯一恢复 run2 22:23:10Z 发起(日志 22:23:12Z) 1 child console buffer size does not match the restored transport size active 0

    命令:ctest --test-dir build/qt-cpp -C Release -R '^qt_ime_combined_cross$' --no-tests=error --output-on-failure。一次恢复额度已消耗,不因格式/阶段/轮询/下一轮心跳重置。日志哈希:run1 016b5bc9…、run2 019292ff…(完整哈希与源/差异身份保存在本地归档 ime-cross-offline-archive-2026-11-08/)。

    阶段地图(实际停止位置与未执行项)

    • 已执行并通过(run2 到达最远):8 会话公开 + 创建/READY/独立接收文件;S0 组合 preedit/更新/cancel/commit(你好);S0 受控后台输出 + 组合期 preedit/commit(🙂);窗口缩窄的 core/transport 事务;commit-after-resize(世界);第一次 *SZ* 尺寸查询与比较(run1 在此失败,run2 通过);窗口恢复原尺寸的 core/transport 事务。
    • 失败点:run1 第一次 *SZ* 后未获得报告;run2 恢复尺寸后的第二次 *SZ* 比较失败。
    • 未执行:字体变化交叉、切换/失焦、隐藏/显示、关闭组合页+替代页、已结束会话拒绝 commit、父窗口关闭回收、完整矩阵与后台排空记录、任何同源码回归。没有证明完整矩阵通过;也没有产品 receive/commit 行为失败的证据。

    离线静态诊断(事实 / 支持假设 / unknown)

    事实(仓库相对路径):

    • src/qt/ime_combined_cross_test.cpp:159-184:parse_size 从 visible_lines() 第 0 行起返回第一条 TF8_SIZE 行。
    • src/qt/ime_combined_cross_test.cpp:385-393:await_child_size 只等待“任意报告存在”,不校验请求 id/新鲜度/child 身份;两次 *SZ* 查询(:654、:671)无请求序号,中间未清屏。
    • experiments/shell/eight_session_client.cpp:126-141:尺寸回复是单行控制台文本、无请求序号;handle()(:187-191)仅按固定 marker 触发。旧回复只存在于屏幕,读取依赖 visible_lines。
    • 既有合同均不以屏幕文本作尺寸 oracle:src/qt/resize_smoke.cpp:52-84 用 SizeFixture 命名管道回复,每查询递增 nonce,断言 reply->nonce == nonce、reply->child_pid == model.resize_state().child_pid,保留每条 reply;src/qt/scrollbar_size_test.cpp:42-53 同一 nonce/child_pid 合同,feat(qt): wire real history scrollbar to source reading anchor #326 证据逐阶段保留 requested/transport/pending、child PID/nonce、buffer/window、query_error、match、attempt(experiments/shell/results/2026-11-07-qt-history-scrollbar/README.md:19-20)。
    • SessionModel::resize_state()(src/qt/terminal_session.hpp:27-32,305-311)只含 core/transport 状态,没有 child ACK;既有测试另行向 child 查询。

    支持假设:

    • run1:修复前长 TF8_SIZE pid=... nonce=... buffer_cols=... window_cols=... 行在窄化网格(约 58 列)被折行,单行解析取不齐字段 → 超时;压成单行紧凑格式后 run2 首次查询通过,与该假设一致。
    • run2:恢复尺寸后屏幕仍保留旧的缩窄 TF8_SIZE 行;parse_size 返回旧行 → 与 restored transport 不符。该路径无需假设 ConPTY 异步即可解释症状;因此不能把现有失败归因为 ConPTY child ACK 异步。
    • unknown:两次失败当次解析到的尺寸/行文本、请求时刻、child CSBI 前后值、ConPTY 实际更新时序均未保留;失败时未写 sample.json。不补造数字,离线不重跑求证。

    待批准恢复方案(只提交方案,不实施/不自批)

    1. 每 child 启动按自身 nonce 创建/截断 side record <root>/<nonce>.ack,写身份头并 flush;每次查询追加完整记录并 flush:{"type":"size","request":<id>,"pid":…,"nonce":…,"buffer_cols":…,"buffer_rows":…,"window_cols":…,"window_rows":…,"query_error":0}。身份仍来自 READY 的 PID/nonce,不使用私有 session、不改变公共 + 入口。
    2. 查询经公开 Qt 文本入口发送夹具控制 marker(不写入 receiver),携带每会话单调 request id(如 *SZ*17*);child 解析并回显该 id。旧记录永不满足新 request id。
    3. 测试只认“request id 等于本次 + pid/nonce 等于会话身份”的新记录;比较 child buffer/window 与当前 transport,并把请求/core/transport/child 分层身份与每条原始回复(含不匹配/超时/query_error)保留到证据文件。transport 完成 ≠ child ACK。
    4. 有界等待沿用既有已批准诊断期限(resize smoke 固定 5 s 查询期限),不新增阈值、不放宽产品/性能断言。
    5. 批准后只执行一次完整矩阵运行;第一个失败即停、保全 ack/JSON,不重跑、不换期望;run1/run2 既有失败保留不覆盖。目标通过后另列同源码回归(既有 qt_eight_session(夹具已扩展 marker,需先验证兼容)、完整 Qt CTest、核心 CTest、Python 核心、当前 head CI),不得把同一失败重跑藏在“回归”里。

    需要决定 / 下一步

  18. JavaZeroo commented on Nov 12, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot 明确派发 #30/#155 IME 与 resize 交叉恢复,采用用户2026-11-12已确认的K3技术阻塞接手授权。旧方案 #30 (comment) 已准备,本次允许实施该最小修复并执行一次完整有界矩阵;无需重复询问是否升级K3或该已授权运行。历史失败run1/run2及retryCount1保留,新增预算1、执行0,首失败即停。

    当前main=0493076f38c9ea391e265b58dbd3c2409ed33ea7(含已合并#324系统粘贴、#333离线校准修复)。#30原生依赖#26/#39均closed,#155为本项验收子项;本恢复不依赖BCD主机或#327。DSH开发槽已空,上一autoscroll子会话5817fbbd-421d-4928-8177-ac07f32e6e86已结束;#327仅状态收尾,追加v2待用户,另有qt_find CI失败留待后续串行诊断,不在本任务处理。

    沿用 #30 原ticket e11985a21ddfe7dbe5205395244a5a5b;maxWorkers1,同一时刻最多一个ai-gateway/kimi-k3(非tencent)。由K3主导技术诊断修复,Flash只协调;先核对无其他K3活跃后复用或启动一个,并报告实际模型/会话ID。禁止递归增加K3、触发Codex review、自行合并。

    保护 D:/Code/termforge-agent-worktrees/unicode-qt-verify-e11985a21ddf 的全部未提交成果和 build/ime-cross-offline-archive-2026-11-08/。先读AGENTS、#30/#155合同、原阶段地图和旧失败原始记录;源码D:/Code/termforge只读,不覆盖/clean/reset旧工作树。在安全专属任务树整合最新main,保留已有八会话、粘贴、Find、resize能力。确认原缺陷是解析无请求关联的屏幕旧尺寸回复,不把ConPTY异步当已证根因。

    修复按已准备方案:每child用READY nonce创建/截断自己的.ack,完整记录并flush;公开Qt输入夹具marker携带单调request id;只认本次request id+对应pid/nonce,保留每条buffer/window/query_error及request/core/transport/child身份,不以transport完成替代child ACK,不以屏幕首条旧TF8_SIZE作oracle。查询期限沿用已定5s,不扩大阈值、不替换架构。保留公开+创建和真实child独立接收、合成IME事件边界。

    先离线诊断与适当兼容检查,再预写唯一运行账本/源码与产物身份。修复后的完整矩阵只运行一次:8会话、组合更新/取消/提交、受控后台输出、缩窄和恢复后的新鲜尺寸确认、字体变化、切换失焦/隐藏、关闭组合页及替代页、已结束会话拒绝提交、父窗口关闭回收;保留原固定预期和原始ACK/JSON,首失败停止。用明确opt-in单次入口,避免注册CTest或push/PR双触发重复执行矩阵。旧既有回归单列,不能把同一故障重跑藏在回归中。首失败后只归档/离线诊断,不自动再试。

    出口:K3实际路由,故障事实/假设,最小修复与完整旧新账本,唯一矩阵结果(含失败阶段、未执行项),源码/构建/产物/child身份和新head CI,更新 #30/#155 并提供可验收PR;失败则列解除条件。个人剪贴板/输入桌面不碰;原生微软拼音、候选窗身份、实际CF、96/144DPI、完整Copy→Paste→IME没有实证就保持未验收;不冒充本合成矩阵已覆盖。BCD主机和未使用校准/v2额度不动,#327不重跑。完整#27/#29/#30/#35/#7不因切片关闭,不进入R3。

  19. JavaZeroo-Bot commented on Nov 12, 2026

    @JavaZeroo-Bot
    Collaborator

    收到:按用户确认的 K3 授权,从 main 0493076 新建专属任务树并保护旧工作树/离线归档;K3 主导技术诊断与最小修复设计,Flash 协调执行。实现 nonce ack + 单调 request id,矩阵仅走明确 opt-in 单次入口且不注册 CTest;预写唯一运行账本,执行一次、首失败即停;旧 run1/run2 与 retryCount1 保留,回归单列。实际 K3 模型/会话 ID 稍后报告。

  20. JavaZeroo commented on Nov 12, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot 同一IME派单的角色纠正(非新任务、不新增worker或额度):已核验你启动 ai-gateway/kimi-k3 子会话9729a0ea-76a7-4dd7-be61-610ed3ce6483,但子提示写了“READ-ONLY design; Flash will implement/build/execute”。这与本次派单“K3主导技术诊断修复、Flash仅协调”不符。请复用并通知当前K3:允许其在新专属工作树完成最小修复、构建和唯一一次有界矩阵及证据归档,旧工作树/源仓库仍只读;不要只让K3交建议后由Flash接管实现。Flash可准备工作树/转发/状态归档,不编写技术补丁、不自行执行矩阵。保持当前唯一K3和既有预算1执行0,若已经有任何执行需先如实登记。其余协议、首次失败停止、个人CF/桌面禁用、完整验收边界全部保持。无需再创建K3。

  21. JavaZeroo commented on Nov 12, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot 已读到向9729a0ea-76a7-4dd7-be61-610ed3ce6483转发接管时返回 active teammate not found。若确认它已结束/释放且没有其他K3活跃,可以按原派单规则启动一个替代的 ai-gateway/kimi-k3 接续实际修复与唯一矩阵;“不新增K3”指不要并发或重复派生,不要求复用已不存在的会话。传递现有设计/Flash草稿并由K3接管验证,预算仍为本任务1、已执行0,不增加运行额度;报告新旧会话身份。无需等待新的用户批准。

  22. JavaZeroo commented on Nov 12, 2026

    @JavaZeroo
    OwnerAuthor

    调度核验:IME 唯一矩阵已通过,但交付收尾被模型服务授权错误中断(2026-11-12)。本条仅同步事实,不触发新任务。

    • K3 实际会话 0d0b1dde-bbc5-40ba-a0d8-e9e656df9eae,路由 ai-gateway/kimi-k3。02:41:37Z 发起唯一授权完整矩阵,原始 supervisor JSON 为 passed、exit0、timed_out=false、job_after.active=0。八会话、替代页、缩窄/恢复和字体变化的新鲜请求关联 ACK、父窗口回收有记录。新增运行额度已用 1/1,不得重跑;历史 run1/run2 与 retryCount1 保留。
    • 源基线 0493076f38c9ea391e265b58dbd3c2409ed33ea7 加本地未提交修复。当前文件与预运行账本哈希吻合:测试 006D0AE27CC755EFAC71EED5C265858E8D010E41913B74DCE60AC6EE0CC5569D,child fixture DACEC8F93F4326692B150CE6EAF085CBD271C06A2EA2A4C6B035D2D2FDBC90F8,测试二进制 BE9D0E8B396A7936FAFB933857D8A2AA178669E4E4D4370AE48B827C3280018E,supervisor JSON AEAEF5F75BB9EEE5BC53C568DFCCF98B32CDF9E0C672C781D1818191C4A20DED。
    • 工作树 D:/Code/termforge-agent-worktrees/ime-resize-recovery-e11985a21ddf;证据 build/ime-cross-matrix-evidence-2026-11-12/。账本末尾仍为 pending,调度者依据实际执行日志和原始 JSON 纠正计数,未改写 Bot 原始证据。
    • 后续完整 CTest 未完成且不通过:现存日志含53个 Not Run、4个 Failed、28个 Passed,末尾停在第86/153项开始,没有最终汇总。已观察到部分可执行文件未构建;四个失败为 core/resize_replay_contract/recovery/measure,需恢复后逐项归因,不笼统称全部通过或全部基础设施问题。先前单项 qt_eight_session 通过另列。当前无相关测试进程;无新 commit/PR。
    • 02:52:09Z K3、02:52:10Z 父协调会话均以 403 Consumer is forbidden. / AUTH 结束。DSH服务仍健康,running0/queued0/maxWorkers1;没有重启、重复建单或改路由绕过。403 为访问授权类失败,目前无可自行修复的配置证据,因此未盲目重试。该服务故障恢复重试计数0,额度1保留;解除条件为服务账户/consumer访问恢复并核验后,沿用任务串行接续归档、剩余回归和PR,不再执行已完成的唯一矩阵。
    • 本结果仅为离屏合成IME交叉;原生输入法、候选窗身份、真实CF、96/144DPI等仍未验收。完整 [R2-07][文字] 验收复杂 Unicode、IME 与键盘/选择语义 #30/[R2][输入验收] Qt IME 候选窗与固定拼音交叉验证 #155/R2 保持开放。
    • feat(qt): bounded selection auto-scroll across history #327 修正活性门160→100后的额外一次复验已由用户批准,额度1、执行0,继续保留。当前head 578675251f13c032eec0ac9e2473df8449fd1137 的CI仍9成功/1失败,qt_find问题待K3独立诊断;模型访问恢复前不派发到同一失效服务。BCD主机TCP22本轮仍不可达,校准和原v2额度未使用。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestready-for-agent范围明确且真实阻塞已解除,可开始实施

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions