Description
用户结果与范围
在显式固定官方 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 局部成功写成整套通过。
数据来源
- PR #50
- 固定设计与差异说明
- 固定验证记录:focused_tests、configured_console_width_real_app_capture、earlier_flags_zero_results
父项:#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没有重跑。
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Activity
Merge pull request #92 from JavaZeroo/diagnose/vim-input-frida-r52
JavaZeroo commentedon Oct 30, 2026
当前可达性(只读核对)
核对对象:worktree
D:\Code\termforge-uia-note,HEADd3f24d6(落后origin/main7ff5cde2 个提交,差异只有experiments/shell/clipboard_scenario_state.hpp与research/ime/test_hosted_inventory.py,未触及下文所引行)。结论:源码 fixture 仍在,但(b)环境 +(c)路线/构建收敛使冻结配置不在当前树的可构建目标里。
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)起子进程C:\Program Files\Git\usr\bin\vim.exe,SHA2562e0fda63a89171adfc46c9417d5105cc39ed778cc69a890b83a4eabc34e7646a,版本输出VIM - Vi IMproved 9.1 … Included patches: 1-532 / Compiled by <https://www.msys2.org/>,与本项固定身份一致;where.exe vim为空,PATH 中无 msys/Git 项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)local/qt-build-deps/conpty:conpty.dllFEEEF341…5A、OpenConsole.exe3D66B23D…86,与backend.hpp:90-91钉住的值一致(该目录在 .gitignore 内)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结果。能否关闭
不能,本项原文即禁止:
0x18同源码下 GUI 完整 Vim 两轮、独立 shell/More/editor 全套 native capture 均通过。"边界
TERMFORGE_CONPTY_BACKEND_DIR的目标,未运行candidate-tui/native capture,未改源码或测试,未做任何 PATH/环境变更。3e5b96d与当前 main 的产品代码差异。local/qt-build-deps/conpty之外的固定包来源;未在origin/main上重跑,也未验证替换后的0x18配置验收。JavaZeroo commentedon Oct 31, 2026
基线已变:本项引用的固定分支已被 main 的正式整合取代
本项原文要求「最终修复必须在 #55 冻结的候选 .4 × 显式官方后端联合基线上重建和验收」。这条前提现在不成立:
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.mddocs/research/vim-msys-input-boundary.mddocs/research/vim-msys-runtime-prototype.mddocs/research/vim-fixture-isolation.md需要说明:这四份目前没有被任何文档引用(
git grep检查为 0 处),属于"在 main 上但不可发现"。我已在证据索引层面提出过这个问题,是否把它们并入docs/EVIDENCE.md待定。复现前置条件(本机已确认的部分)
candidate_shell_tui这类 TUI 场景要求 PATH 上有固定 Vim;Git for Windows 的vim.exe在usr/bin,不在默认 PATHalacritty-headless (windows-2025)的反复失败已定位为候选事件分派不全(kind 8/9/10/11/13 未处理),修复后 CI 转绿建议的下一步
candidate_shell_tui(不是旧分支),确认 stage59 是否仍然失败5030058上的一致,可沿用原时间线方法;若不同,先记录新签名再定位0x18同源码双入口通过)保持原样,只换基线本条只更新基线前提与可用文档,不修改验收标准,也不关闭本项。
JavaZeroo commentedon Nov 1, 2026
按用户决定:按「实验后端不属 R2 产品路径」收口(选项 A)
用户明确选择 A。
依据
CMakeLists.txt的termforge_qt_entry关闭时保留的内容
边界