Skip to content

[R2][Backend] 修复 Console-width Vim stage59 与 native new-buffer 失败 #52

Closed as not planned

Description

@JavaZeroo

用户结果与范围

在显式固定官方 ConPTY、最终 Console glyph width 0x18 下,固定 Vim 进入、编辑、DSR/resize、写盘、退出和主屏恢复按既有事件合同完成。本项拆解 #47 的已知 Vim 门槛,与 #28 的固定 TUI 验收衔接,不扩大 R2。

固定触发与已观察事实

PR #50 最终 C++ 源码 5030058、固定包 1.25.260930003 下:

  • 原 GUI Vim 场景 stage59 未得到 resize 事件文件,命令出现在插入文字中。同批 TUI 为5/6,失败项第二轮未运行。
  • 独立 native real-app capture 在 new-buffer 阶段失败,returncode1;editor_exit91、editor_bytes1999、child signaled、无 capture overflow,外层 Job 0。
  • 更早 flags0 的 GUI Vim 两次和完整 native capture 成功是不同策略/阶段结果,不能证明最终 0x18 通过。More 子阶段成功也不等于整套 capture 成功。

尚未证明两个失败同因;不要将命令进入插入模式直接认定为输入丢失、时序或宽度根因。

当前可执行阶段与最终基线

原冻结配置的真 red 可以独立定位,本项保持 ready-for-agent;不存在等待父聚合项 #47 结项才能开工的依赖。

最终修复必须在 #55 冻结的候选 .4 × 显式官方后端联合基线上重建和验收,保留相同输入、负载、flags、精确断言与原期限。旧 .3、早期 flags0、默认 system 或不同源码的成功不能替代。联合配置暂未复现时只记录该批结果与旧因未知,不自动写 root-cause fix;没有因果闭环不能仅凭一次绿关闭本项。

剩余交付与验收

  • 在固定应用版本、入口、源码/二进制和后端 flags 下分别保留 GUI stage59 与 native new-buffer 的可运行真 red;两条入口都能无人值守。
  • 分别核对 VimEnter/InsertEnter、resize 事件文件、实际 child 尺寸、DSR 请求/回复、输入字节、应用模式和 transport,建立能区分候选假设的时间线。
  • 用单变量实验判断共同或独立根因;最小修复后保留相同触发的修前/修后与必要反例,不能以某一路成功覆盖另一路。
  • 最终 0x18 同源码下 GUI 完整 Vim 两轮、独立 shell/More/editor 全套 native capture 均通过;保留真实写盘内容、正常退出、reader EOF 与自有 Job/desktop 回收检查。
  • flags0 早期绿、最终 flags24 红及新结果分别留证;同步 [R2][Backend] 整合已确认的随包固定微软 ConPTY 正式路线 #47/[R2-05][终端] 补齐终端回复与输入/输出模式并验收固定 TUI #28 的声明和未知范围。

不增加 sleep 或期限,不跳过 Vim,不以 stdout 重绘/猜测代替原事件文件,不删除失败轨迹或将 More 局部成功写成整套通过。

数据来源

父项:#47。此子项阻塞 #47 的既有 TUI/real-app 验收,根因待定位。

当前固定基线

PR #64记录联合 3e5b96d/.4/官方flags24:GUI Vim两轮一绿一红(stage59);独立native全capture也一绿一红(new-buffer)。完整TUI模块通过的另一批结果不覆盖这些原场景red。原输入、事件文件、期限与退出/回收断言保持,本项继续开放。

已修 native 入口与当前剩余

PR #70 已合入实验分支,source aa5fbe5 的 native 夹具原因已因果闭合:两个兄弟 capture 共用父目录,第一轮写入 editor.txt,第二轮打开已有12B文件,旧EXE真实一绿一红(1999B/new-buffer),与原失败吻合。修正每轮使用新建capture目录;父目录预置旧编辑/READY/INSERT的新增实际回归修前红、修后绿,完整real_app模块9/9,原Vim版本/flags24/输入/期限/写盘/正常退出/EOF/Job保留。PR70两套Windows/Linux CI通过。见合同与身份。

GUI stage59继续开放:本次原入口仍有一绿一红,后续原入口两绿仅属未复现;受扰动探针的另种启动崩溃、缺失EXE身份分列,不算修复。实际写字节观察已否定“Ctrl-O先于CPR必红”,下一步定位真实控制台输入到Vim resize/按键处理边界。不能用native修正关闭本项或豁免完整联合TUI验收。

新联合源保留 GUI 真 red

PR #76曾因测试进程PATH缺Vim在stage50失败,该准备错误与补齐PATH后的真实stage59分列保留。最新PR #77验证源eae4b6a/.4/官方1.25 flags24,固定MSYS2 Vim9.1 patches1-532(SHA256 2e0fda63a89171adfc46c9417d5105cc39ed778cc69a890b83a4eabc34e7646a)已在进程PATH,完整TUI6项仍5通过/1 stage59失败:resize命令进入插入内容。外层未超时、Job0/desktopgone。固定同源码记录。native旧修正不替代GUI,#53关闭回复修正也未修复此入口,根因继续待定位。

GUI 输入边界的有界观测(2026-10-27)

在188228e源码上仅加临时writer内存记录与Vim ModeChanged/VimResized观测,固定Vim SHA和flags24不变;上限六轮,实际遇一绿一stage59红后两轮停止,非修复验收。探针EXE SHA256 9dda6b0eea69444d2405d255f7858314726ae06465b1c0111a10d9ebd41c95c1;原件local/r52-mode-probe含源码/patch/EXE/逐运行哈希。

红例91条writer记录完整:含Ctrl-O的原93B命令一次WriteFile全部成功,随后31ms记录CPR。Vim仅记MODE n:i及RESIZE 60x12,没有i→niI/命令模式;冒号进入InsertCharPre。绿例有完整模式转换与写盘/退出;writer记录在后续helper命令处达到256条上限,截断明确保留,不能当作全程输入追踪。两轮Job0/desktopgone。此前绿例已否定“Ctrl-O先于CPR必红”,当前先后关系仍不等于原因。

新证据排除了该红例在TermForge writer之前丢失Ctrl-O,尚不能判断ConPTY、MSYS或Vim哪层消耗了它。临时观测已移除并强制重建(还原文件时间戳可能导致MSBuild复用插桩EXE,已核对并纠正);未增加sleep或期限、未修改原fixture合同、未宣称GUI已修。

输入边界工具的适用性检查

已核对本机 MSYS运行库版本 3.4.10-2e2ef940151485490aff0c7b00c00965ef7a71a4、DLL SHA256 3096d2ba9be20e90be1399edd391bac65d84bc387f5a419b502c9b326081930f,并读取对应固定公开源码。其控制台输入和resize事件有读取/移除/回写分支,这只是下一观测点;不能由静态代码认定原Ctrl-O在哪层被消耗。该版本strace的read记录只有长度/返回值,不能直接证明缓冲内容。

有界包装实验预设最多两轮,遇其他失败立即停止。保持原 188228e 源码干净、已恢复EXE e81d92a8c7d380d4c33639861180b04935e021bc7c1a5179197c8a9e3c83454a、固定Vim与官方flags24,只在该测试进程PATH加入strace包装;原输入和25s/40s期限不变。实际首轮Vim启动出现 c0000005,场景stage50返回2,外层非超时,Job active0/total8/terminated0、desktopgone;142B跟踪未包含原stage59边界,按条件停止、未运行第二轮。源码未修改,原件、包装及工具哈希保存在local/r52-strace。

该包装改变了进程/调试上下文且可能扰动时序,因此启动异常与原GUI stage59严格分列。没有新修复或GUI验收结论;后续仍需在原触发下观测实际输入内容,避免只凭计数或另一个入口归因。

实际 MSYS 输入转换边界(PR #92,诊断未修复)

PR #92在基点44ea45b(产品c662011相同)/.5/官方flags24上保留原Vim、输入、25s/40s和精确断言。首批最多4轮、原stage59与诊断绿均出现或遇不同失败即停止,实际两红一绿;函数边界核对最多2轮、首次失败即停,实际一红。四轮均无截断、外层超时或Job/desktop残留。完整原件及临时补丁/二进制仅本地;白名单证据 SHA256为55268bfb82364719231cf38e9b3315d8daff73286fdbe99dcbbe64b70540b624。

三个红例均是writer成功写出93B、原生输入含Ctrl-O、MSYS read(0)仅交付后续92B。函数边界记录进一步确认:process_input_message先Peek到resize并进入send_winch_maybe,另一线程cons_master_thread读走resize,原调用随后用于清理的Read实际取走新到Ctrl-O,返回input_winch后才读出剩余92B。这定位了所捕获失败的MSYS转换边界,否定该红例在writer/原生输入之前丢失或Vim已收到但忽略Ctrl-O。

固定源码解释及限制:send_winch_maybe释放输入锁期间旧Peek快照失效,与观测相符;该解锁用于避免信号longjmp死锁,不能简单移除。PR #92当时尚无单变量修补红绿;后续隔离实验见下文,正式兼容方案仍未完成。Frida及握手会扰动调度,provider身份缺口与附加前调用不覆盖保持显式;一次诊断绿不算修复验收,也不追溯归因没有输入记录的历史失败。

临时C++已逐字节恢复并重建;重建EXE独立标识,没有产品/测试源码改动。两项独立审查无剩余阻塞。#52继续开放,GUI完整Vim两轮与最终联合验收仍未完成;native旧修复保持独立。

隔离运行库单变量实验(PR #94)

PR #94已以 b60cd65b9fa6af724279780faa8d78847eb5cef0 合入实验父分支,正式产品与原固定运行库合同不变。TermForge源ed55a87(产品c662011相同)、同一无插桩EXE7f26395942f107297565f50402568650e1e17c5eb23924bee1bfb02c50c60d16、候选.5/官方1.25 flags24、原Vim9.1 patches1–532、原输入/脚本/断言及25s/40s均保持。SDK与编译依赖仅在隔离目录,既有Git/Vim安装五个文件已按哈希复核未变。

预先限定原DLL一次原两轮方法;未修重建DLL最多两次原方法,首次stage59或其他失败即停;只有基点复现原失败后才运行修补DLL最多两次方法,任何失败即停。实际原DLL两轮一绿一stage59;未修重建DLL首轮stage59后停止;补丁两批共四轮通过后停止。合计7个GUI样本,全部外层非超时、Job active/terminated0、desktopgone,没有额外GUI重跑。两个red的InsertCharPre均为同221B、resize文件空;input.bin也为空且未刷新,不作为完整输入轨迹或未收到输入的证据。

固定MSYS公开源码2e2ef940...仅console.cc一处主动改动(12+/6-):在input_mutex仍保护旧Peek前缀时先消费WINDOW_BUFFER_SIZE_EVENT前缀,再保留原send_winch_maybe解锁/SIGWINCH/再加锁,返回read循环重新Peek。未修重建DLL SHA d9e490fdbe31c233eab6578168fb4f2bda84f53252be3898d0cdd0e8610db721;修补DLL SHA dd792766fa976b031cbff0540744b6f3d2b3fc0d695ed764a01457b65eab6258。两变体同GCC16.2/GNU17及固定2024 w32api12头文件,310项构建对象中6项不同,含重新生成的版本对象;不是官方2024工具链的逐字节重建。

实验记录、LGPLv3+上游许可与补丁、白名单验证,JSON SHA256 f598968797b86c495dc99131c516240440de8feebca136084d80ce3bfdb2d178。两路独立审查无发现;原断言、对象/原件哈希、补丁应用、上游许可和公开字段已离线核验。原件保留local/r52-msys-build,发布材料不含DLL/原始终端输出/个人路径。

这补充了输入边界诊断的修补实验红绿,仍不等于正式兼容方案。本批无Frida、新API跟踪或实际加载模块路径观察;MOUSE、实际信号longjmp、读取失败、其他应用、完整57项及性能未验。原固定运行库完整官方56/57与GUI失败继续保留,#52/#47/Draft #50不关闭,实验DLL不进入产品。下一步核对固定原版的同应用路径与可实施兼容方案,保留用户对主要依赖/后端选择和重要差异的确认权。

固定原版的有限对照(PR #95)

PR #95、四份观测及限制、白名单记录已以 3adec0b49947257c3f02207b743d6de9f1ab168f 合入实验父分支;JSON SHA256 b737caf2de2b8cfe23d9c0af17cabafb6ced2264354f610e0e3adae854245c1b。固定官方2.7.0 EXE/4047文件清单、相同Vim和原MSYS五文件;四个预先各限一次的样本已结束,自有Job均active0,原件/合成文件/哈希已离线核对。

原版一次从cmd键入原命令,完成READY/[New]、插入、真实60×12、原93 B Ctrl-O命令、写盘和返回TF>;Vim输入115 B、事件58 B、文件17 B、尺寸5 B逐字节符合原预期。但随后原尺寸门槛stage56超时,shell-handle观察器另有一次参数类型错误,正常退出没有证据,不能写成完整原方法通过。

另一个独立样本用原size helper及GetConsoleScreenBufferInfo同时观测buffer60×3000/viewport60×12,原dwSize60×12预期为false;其CPR原入口stage52未得到回复。进一步独立模式样本实测output3→7→3、input503→512→503,相同CPR EXE得到ESC[7;1R/exit0,shell自然37。前一失败的模式未测,不用新值回填或宣称已因果修复;CPR生产方仍未知。模式包装器是不同配置,不合并成一次完整Vim工作流。

这些是原版行为及夹具前提的线索,不采用WinPTY、不替换用户MSYS、不修改产品/测试或原验收。#52原固定运行库兼容、#28完整TUI、#56原生合同与#34产品选择保持各自原出口;既有官方56/57没有重跑。

Activity

  1. added
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    compatibility平台、协议或行为兼容问题
    on Oct 26, 2026
  2. self-assigned this
    on Oct 26, 2026
  3. added a commit that references this issue on Oct 26, 2026
  4. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    当前可达性(只读核对)

    核对对象:worktree D:\Code\termforge-uia-note,HEAD d3f24d6(落后 origin/main 7ff5cde 2 个提交,差异只有 experiments/shell/clipboard_scenario_state.hpp 与 research/ime/test_hosted_inventory.py,未触及下文所引行)。

    结论:源码 fixture 仍在,但(b)环境 +(c)路线/构建收敛使冻结配置不在当前树的可构建目标里。

    环节 当前状态 证据(文件:行)
    stage59 fixture 仍在 experiments/shell/shell.cpp:723(启动 Vim,stage 50)、:735(stage 59 命令)、:736-741(轮询 candidate-resize-log.txt)
    原入口 仍在 experiments/shell/test_candidate_tui.py:31-58(candidate-tui,40 s);run.py:430-457 以 dict(os.environ) 起子进程
    固定 Vim 在盘上,但不在 PATH C:\Program Files\Git\usr\bin\vim.exe,SHA256 2e0fda63a89171adfc46c9417d5105cc39ed778cc69a890b83a4eabc34e7646a,版本输出 VIM - Vi IMproved 9.1 … Included patches: 1-532 / Compiled by <https://www.msys2.org/>,与本项固定身份一致;where.exe vim 为空,PATH 中无 msys/Git 项
    固定官方后端 flags24 无目标可选中 cmake/ConptyBackend.cmake:5-35 的 termforge_use_bundled_conpty 只在 termforge_qt_entry 内调用(CMakeLists.txt:400-438,调用点 :417);Win32 shell 只走 termforge_candidate_shell(CMakeLists.txt:166-172,仅加 TERMFORGE_CANDIDATE_CORE);后端为编译期选择,未定义即 system()(experiments/conpty/backend.hpp:112-122)
    固定包文件 本机存在,仅接 Qt local/qt-build-deps/conpty:conpty.dll FEEEF341…5A、OpenConsole.exe 3D66B23D…86,与 backend.hpp:90-91 钉住的值一致(该目录在 .gitignore 内)
    本项证据源码 不在本 tree d6b3f79(PR #92)、b60cd65(PR #94)、27bea78、3adec0b+fa74143(PR #95)、3e5b96d(联合基点)均非 HEAD 祖先,只在 diagnose/* 分支

    影响:按本树直接跑原入口会先在 shell.cpp:723 启动 Vim 处失败(即正文 PR #76 记录的 stage50 准备错误),不是 stage59;即使补上 PATH,候选 GUI 在本树也只会用 system()/flags 0,拿不到正文冻结的 0x18 身份。ADR-0007/0008 把固定后端收拢到 Qt 产品入口、把候选降为参考,但同时写明路线确认不关闭既有缺口,所以本项不是"已被取代可删",而是固定配置退到实验分支,需要一个范围决定(是否把 GUI Vim 门禁迁到自主 C++/Qt/固定 ConPTY 组合)才能改变验收身份。

    一个下一步观测

    只把 C:\Program Files\Git\usr\bin 加入测试进程 PATH(不改系统设置、不改源码),用本树实际可构建的候选配置(TERMFORGE_BUILD_CANDIDATE_ADAPTER=ON、不设 TERMFORGE_CONPTY_BACKEND_DIR)跑一次 CandidateTuiTests.test_real_fullscreen_editor_and_cursor_reply(40 s 外层期限),记录 stage59 是否再现。它只区分"症状在可构建配置仍存活"与"只与已退役联合后端绑定",是不同后端身份,不能当作 0x18 结果。

    能否关闭

    不能,本项原文即禁止:

    • "联合配置暂未复现时只记录该批结果与旧因未知,不自动写 root-cause fix;没有因果闭环不能仅凭一次绿关闭本项。"
    • "不能用native修正关闭本项或豁免完整联合TUI验收。"
    • 最终验收条:"最终 0x18 同源码下 GUI 完整 Vim 两轮、独立 shell/More/editor 全套 native capture 均通过。"

    边界

    • 只做只读核对:未构建候选适配器或带 TERMFORGE_CONPTY_BACKEND_DIR 的目标,未运行 candidate-tui/native capture,未改源码或测试,未做任何 PATH/环境变更。
    • 未重建 [R2][集成] 冻结候选 .4 与显式官方 ConPTY 的联合基线 #55 冻结的联合基线,未核对 3e5b96d 与当前 main 的产品代码差异。
    • 未验证固定 Vim 之外的 Git for Windows/MSYS 运行库文件身份,也未做运行库对照实验。
    • 未核对 local/qt-build-deps/conpty 之外的固定包来源;未在 origin/main 上重跑,也未验证替换后的 0x18 配置验收。
  5. JavaZeroo commented on Oct 31, 2026

    @JavaZeroo
    OwnerAuthor

    基线已变:本项引用的固定分支已被 main 的正式整合取代

    本项原文要求「最终修复必须在 #55 冻结的候选 .4 × 显式官方后端联合基线上重建和验收」。这条前提现在不成立:

    • PR 实验:候选 .5 与固定官方 ConPTY 联合整合(保留真实回归) #50 已关闭,其实现不再作为交付路径
    • main 的正式 Qt 入口已经接线固定后端与固定运行库(CMakeLists.txt:417-423:termforge_use_bundled_conpty() + termforge_use_msvc_runtime())
    • cmake/ConptyBackend.cmake 在固定包缺失或双文件/manifest/LICENSE 身份不符时直接失败,不退回系统 ConPTY

    因此两条真 red(GUI Vim stage59、native new-buffer)应在 main 的 termforge_qt_entry 构建上复现,而不是在 5030058 上。

    与本项相关的文档已随 #261 进入 main

    从旧分支抢救的结论文档现在可引用:

    文档 内容
    docs/research/vim-windterm-reference.md 原版对照
    docs/research/vim-msys-input-boundary.md msys 输入边界
    docs/research/vim-msys-runtime-prototype.md 运行时原型
    docs/research/vim-fixture-isolation.md 夹具目录隔离(已在 main)

    需要说明:这四份目前没有被任何文档引用(git grep 检查为 0 处),属于"在 main 上但不可发现"。我已在证据索引层面提出过这个问题,是否把它们并入 docs/EVIDENCE.md 待定。

    复现前置条件(本机已确认的部分)

    建议的下一步

    1. 在 main 组合上先跑 candidate_shell_tui(不是旧分支),确认 stage59 是否仍然失败
    2. 若失败签名与 5030058 上的一致,可沿用原时间线方法;若不同,先记录新签名再定位
    3. 本项剩余的四条验收(可运行真 red、时间线区分假设、单变量实验、0x18 同源码双入口通过)保持原样,只换基线

    本条只更新基线前提与可用文档,不修改验收标准,也不关闭本项。

  6. JavaZeroo commented on Nov 1, 2026

    @JavaZeroo
    OwnerAuthor

    按用户决定:按「实验后端不属 R2 产品路径」收口(选项 A)

    用户明确选择 A。

    依据

    事实 出处
    本项的失败(Console-width Vim stage59 / native new-buffer)发生在实验后端与历史配置 本项正文的记录
    系统 ConPTY 与 WinPTY 是诊断对照,产品路径是随包固定 ConPTY ADR-0007
    产品入口只走固定包 CMakeLists.txt 的 termforge_qt_entry

    关闭时保留的内容

    • 原始失败记录与观测未被删除,仍可按原路径复查;
    • 若将来要在实验后端继续 Vim 工作,可重新开项。

    边界

  7. removed
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    on Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

compatibility平台、协议或行为兼容问题

Projects

Relationships

None yet

Development

No branches or pull requests

Issue actions