Skip to content

[R2-05][终端] 补齐终端回复与输入/输出模式并验收固定 TUI #28

Open

Description

@JavaZeroo

当前状态(2026-11-01)

main 3effd6d 已包含 #272(c3e825e):?1004/?9001 接受忽略、不记录状态;单参数 CSI 1t/2t/3t 接受忽略。DA1 仅 strict/replay 回复 ESC[?6c,recovery 产品路径保持静默。DSR 6n、DECCKM/DECTCEM 已有限实现,DECOM由#301接入。

这不代表焦点上报、Win32输入模式、窗口操作已实现,也不意味着真实捕获可全部strict回放(例如OSC仍是独立缺口)。原生硬前置 #27 仍开放,整体TUI验收保持 blocked。

剩余交付

#52 的实验后端 Vim 已按用户决定退出R2处置,不重开该并行产品路线;它的历史成功/失败不能代替本项正式组合验收。未声明应用不计通过,也不由一个Vim场景外推完整TUI。

核心支持表 · 能力矩阵 · 最新切片记录。父项 #7,最终包 #35。

Activity

  1. added
    enhancementNew feature or request
    blocked有明确未完成前置;见原生 blocked-by
    on Oct 24, 2026
  2. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    已定位的具体缺口:产品核心不回复 DSR(CSI 6n)

    对照检查结果:

    位置 行为
    experiments/core/candidate_terminal.hpp(参考实现) 收到 CSI 6n 会产生事件 kind == 1、载荷 \x1b[<row>;<col>R;candidate_terminal_test.cpp 的 alternate_and_replies() 有断言
    experiments/core/terminal.hpp(产品核心) 没有 event/reply/take_* 接口,CSI 6n 在 recovery 模式下被消费掉,不产生任何回复
    experiments/shell 只有测试夹具 query_client.cpp 向子进程发 CSI 6n 并读取回复;产品侧不向应用回复

    因此,任何依赖 DSR 的 TUI(包括我们在 #28 要验收的固定 TUI)在产品核心上会卡住等待光标位置回复。

    建议的最小切片(下一个可自主实现项)

    1. Parser 增加有界回复出口(例如 std::vector<std::string> take_replies() 或回调),只处理已实现的查询:CSI 6n → \x1b[<row>;<col>R;
    2. shell 在每次 tick() 消费输出后把回复写入输入队列(与键盘同一队列,保持顺序与背压语义);
    3. 补一个核心测试:喂 CSI 6n 后断言唯一回复的字节与行列为 row+1;column+1(1 基),并保留"未知查询不回复"的负例;
    4. 不改期限、不改既有恢复语义。

    依赖与边界

  3. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    下一步切片的前置暂被卡住:原版 DA/OSC 回复无法采集

    按 AGENTS 的"未知目标行为先调查"原则,DA1/DA2 与 OSC 10/11 的回复不该凭标准或猜测实现,必须先看原版行为。为此我做了一个探针:

    • 程序依次发送 ESC[c、ESC[>c、OSC 10;?、OSC 11;?、CSI 6n;
    • 用有界 ReadFile 收集控制台输入回复并写入 Results/da-probe.txt;
    • 在 VM 的原版 WindTerm 会话里运行它。

    结果:探针文件始终没有生成。两次尝试分别用了"直接启动 WindTerm"与"UIA 展开会话组 → 点击 TF_UI_CMD → 回车"两种方式,会话都没有真正把该程序跑起来(此前 IME 的 N9/N10 流程可用,说明是会话启动方式的问题,不是探针本身)。

    影响与建议

    • 在拿到原版 DA/OSC 回复之前,不实现这些查询(避免把标准行为当成 WindTerm 行为);
    • 已完成的 DSR 6n 回复不受影响:它有参考实现 CandidateTerminal 与既有测试作为依据;
    • 若你希望继续,可以选择:① 你在自己机器上跑一次探针并把输出贴回来;② 允许我改为在受控 Qt 应用里用同样探针确认"我们的行为",原版对照另找路径。
  4. added a commit that references this issue on Oct 30, 2026
  5. 29 remaining items

  6. JavaZeroo commented on Nov 1, 2026

    @JavaZeroo
    OwnerAuthor

    More 分页器轨迹冻结 + 产品配置冒烟(#28 首批应用切片证据)

    按本项剩余清单首步(先冻结首批应用版本/入口/平台/操作轨迹)交付 More 分页器有界切片,见 PR #306。

    冻结身份(实测)

    • More.com 10.0.26100.1(WinBuild.160101.0800),53,248 字节,SHA-256 dea4ed8963aef4c8ce4aa1491410f614fd6d9b0e07737a9b634612adad731630,LastWrite 2024-04-01;Windows 11 x64,OS build 26200。
    • 入口 more.com pager.txt(CRLF 行结尾,ConPTY 80×24);动作 进入 → 翻页(空格) → 行滚(回车) → 退出(q);搜索不适用(Windows more.com 无 /pattern 交互键)。

    冒烟结果(自主 C++ 核心 strict/recovery + 固定 ConPTY 1.25)

    • 固定 ConPTY 1.25:进入 411B / 退出 810B 经 strict 与 recovery 双路回放均 exit 0、屏幕正确,4 次捕获确定一致。
    • 系统 ConPTY:进入非确定(360B ECH70 变体 B、375B CUF79 变体 A 各半),recovery 通过、strict 以 unsupported escape 失败于 OSC 标题(已知 OSC 缺口)。

    逐项协议预期核对

    • DA1(ESC[c):固定 ConPTY 启动包出现,strict 回复 ESC[?6c、recovery 静默(见 fix(core): 对齐 strict 与 recovery 的接受集,DA1 回复 VT102 #272)。
    • DSR 6n、1049、滚动区:More 轨迹中均未出现(More 用主屏、不查询光标、不设 DECSTBM)。
    • ED2:仅系统 ConPTY 进入出现;固定 ConPTY 用空格+CR 清屏,不触发 ED 分支。

    证据定位

    • 轨迹与独立预期:docs/research/tui-more-trajectory-2026-11-02.md
    • 冒烟归档:experiments/shell/results/2026-11-02-tui-more/validation.json
    • 冻结样本:experiments/core/fixtures/more-pager-fixed-411.bin、more-pager-system-375.bin
    • 回归:experiments/core/test_recovery.py 新增 fixed-conpty More 进入 strict/recovery 回放断言,全套 36 项通过。

    未覆盖(保持开放)

    系统 conhost 双变体根因未定位;= 行号 / F 下一文件 / P / S 交互键、二进制输入、其他语言提示未观测。本切片只冻结轨迹不改产品行为,不代表 #28 整体验收。

  7. JavaZeroo commented on Nov 1, 2026

    @JavaZeroo
    OwnerAuthor

    Vim 轨迹冻结 + 产品配置冒烟(#28 应用矩阵第 2 项,PR #307 / 68eeb93)

    按 More 切片(PR #306)的成熟模式交付 Vim for Windows 有界切片:

    冻结身份(实测)

    • Vim 9.1 patches 1-532 Huge 版(Git for Windows 自带,C:\Program Files\Git\usr\bin\vim.exe),EXE SHA-256 2e0fda63…7646a,与原版对照文档同源。
    • 固定 ConPTY 1.25.260930003;80×24 主轨迹 + 60×12 变体;入口 vim.exe -Nu NONE -n -i NONE(real_app_capture.cpp:135 编辑器块)。

    关键差异与结论(实测)

    • Vim 是全屏 TUI:轨迹含 1049 备用屏进出、DA1/DA2、DSR 6n(3 次)、DECSTBM、XTWINOPS 标题保存/恢复——More 轨迹均无。
    • 进入 2424 字节 3 次捕获逐字节一致(固定 ConPTY 确定性)。
    • strict/recovery 逐项核对:1049/DA1/DSR/DECSTBM/SGR 按预期处理;仍失败项=22;0;0t 与 22;2t/22;1t 标题保存(strict 参数门限)、?2004 括号粘贴、DCS zz 同步查询、DA2——均按设计显式失败或 recovery 忽略,记为本项已知差异。
    • 进入/插入(-- INSERT --,TF_CANDIDATE_TUI 16 字符)/保存退出(:wq,editor.txt 17B,exit 0)/1049 主屏恢复全链路在产品配置通过。

    交付物

    • docs/research/tui-vim-trajectory-2026-11-02.md(逐字节协议预期表,实测/推断/未知分列)
    • fixtures:vim-fixed-80x24-trajectory.bin(2424B)、vim-fixed-60x12-trajectory.bin(1180B)
    • experiments/shell/results/2026-11-02-tui-vim/(README+validation.json);EVIDENCE 新行

    说明

  8. JavaZeroo commented on Nov 8, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot 明确派单:开展 #28 的独立查询回复合同调查,核实正式 C++/Qt/固定ConPTY 产品中「核心回复 → Qt回写 → 真实child收到字节」的证据链。#7 当前开工说明明确 #28 整体TUI依赖#27,但不妨碍独立回复合同调查;#27仍OPEN,本任务不进入整体TUI验收,不关闭#28/#7。

    基线与范围:远程main1124ff04f7afc4dd4864d77bbced49f73a1abb79(含#329),不含未合并#330/#324/#327;从该基线在D:/Code/termforge-agent-worktrees建独立任务工作树/分支,不改源D:/Code/termforge及所有其他工作树/未提交产物。已确认DSH running0/queued0/maxWorkers1,保持一个开发worker、Flash优先,不扩大费用并发。#330已完成的Windows重试成功;Qt下载重试未获追加授权,不得触发;#324/#327/#30/BCD失败路径也不得运行。

    先读AGENTS、ADR0007/0008/0009、#28正文及已有#272/#306/#307证据、核心reply测试/Qt session/transport现有工具。实质缺口是 #28 清单仍未冻结核心状态、Qt编码与真实child接收的分层证据,早期应用捕获/strict回放不能直接当成当前正式Qt接线验收。先核实已有证据是否已经覆盖本次目标,完整则提供精确source/fixture/入口/期望/实收引用并停止,不重复造脚本或跑绿。

    有界目标:只调查已实现的 DSR CSI 6n 回复,在不resize、不备用屏、不滚动区的固定主屏、单会话确定位置下,辨明由哪一层回复以及真实child接收到的字节(必要时对照ConPTY是否自行消费/产生回复)。独立字面期望来自已确认现有reply合同,不能用被测实现的输出反推期望。区分核心孤立测试、ConPTY原始传输、Qt产品回写和child实际接收,记录顺序/身份/来源;已有证据只能支持某一层则如实保留未知。保留DA1 strict/recovery差异,禁止使产品新增DA1/DA2/OSC回复;其它未知语义只列缺口,不凭标准替代原版观察。

    若现有证据确实缺失,可复用现有非交互测试/OwnedJob/child工具做一个有界、自动回收的验证夹具,允许必要的测试/观察工具修改、构建、验证、推送分支和PR;不得修改产品行为/默认入口、扩大query支持、放宽断言/超时。禁止操作个人桌面GUI/剪贴板/IME及电源;无需不可用的BCD主机。若固定ConPTY遮蔽了查询或无法区分回复来源,产出精确限制与下一步可证伪方案即可,不改后端规避证据。

    出口:具体证据/验证PR或明确无新增工作的引用/阻塞,含精确源码、构建、输入原始字节、独立预期、各层实际观察与child身份、OwnedJob回收及局限;不能宣称WindTerm对齐或整体TUI通过。运行发生首失败后先诊断,同一故障最多一次修复重试(诊断重跑也算),再次失败保全停止,次数跨轮保留。合并由调度者处理,Bot不自行合并,不触发Codex review。请确认接单并在范围内推进。

  9. JavaZeroo-Bot commented on Nov 8, 2026

    @JavaZeroo-Bot
    Collaborator

    收到,接手 #28 的独立查询回复合同调查:核实核心回复→Qt 回写→真实 child 收到字节的分层证据链,不进入整体 TUI 验收,完成后推送分支并创建 PR。

  10. JavaZeroo-Bot commented on Nov 8, 2026

    @JavaZeroo-Bot
    Collaborator

    #28 独立查询回复合同调查完成,PR #331 已就绪:https://github.com/JavaZeroo/termforge/pull/331(head 38107b1,基线 main 1124ff0;3 提交,均为 JavaZeroo-Bot 作者且含一次共同作者 trailer;未合并、未关 #28/#7、未触发 Codex review)。

    交付:src/qt/query_reply_test.cpp + CTest qt_query_reply——正式 SessionModel + 固定 ConPTY 1.25 的 80×24 单主屏(无 resize/备用屏/滚动区);同一 exe 以 --query-child 重入作独立接收端,只写固定源 AB+ESC[6n 并记录原始输入字节。

    分层结果:raw-silent(host 不回复)child 收不到字节并自身超时 exit42 → 固定 conhost 不代答;raw-distinct host 写 ESC[9;9R 原样到达 child;product 在 transport offset 23 解析查询,经 Qt 回写后真实 child 恰收 ESC[1;3R(1b5b313b3352),core 光标 (0,2)、PID 绑定、natural_exit/cleanup_verified/active_after=0,Job active 0;两次干净树运行字节一致。结果与身份见 experiments/shell/results/2026-11-09-qt-query-reply/;Vim 轨迹旧“conhost 代答”括注加修正指向、原记录保留;CI 接线已加。

    验证:本地 qt_query_reply 4.34 s 通过,reply_core/private_mode_core 通过;CI 8/8 绿(Qt C++ push 3m32s、PR 4m18s,日志确认 Test #151 通过;alacritty 两平台通过;push Windows regression 14m30s 通过)。PR Windows regression 首轮因既有 hosted shell 超时(#80/#38 同类,与本次无关)失败,按规则重试一次后通过。

    限制:单场景、只覆盖已实现的 DSR 6n,child 启用 VT 输入模式;DA1 仍 strict-only/recovery-silent,DA2/OSC/括号粘贴未变;未做 WindTerm 原版对照、未验证真实 TUI 消费回复;#28 整体 TUI 与 #27/#29/#30 联合验收仍开放;presented_done=null,不声明性能或等价。

  11. JavaZeroo commented on Nov 8, 2026

    @JavaZeroo
    OwnerAuthor

    @JavaZeroo-Bot #331 交付核验反馈:当前head38107b103c939212dc16eea37b190b3031dce89f的8项CI通过;已独立读取Qt job128793885468,raw-silent空/42、raw-distinct 1b5b393b3952、product 1b5b313b3352、Job active0及13/13均确认。核心结论在限定场景成立。本条仅要求修正证据文字,完成后交回调度合并。

    具体不一致:代码的query_offset是transport.find(query_source),query_source为6字节AB+ESC[6n,所以23是整个源串起点;启动包23B,AB占23/24,ESC[6n本身从零基byte25开始。README结论/表格和PR正文却写“offset23解析到查询/ESC[6n”,容易误解为查询起点。validation.json的product_chain已写exact fixed source at23,数据本身不用篡改。

    请做最小文档纠正:明确既有query_offset字段表示固定源串起点23、DSR序列起点25(零基字节偏移),统一README/PR正文及相关说明。保留原始transport_hex、历史测试结果、schema/字段名及产品/测试逻辑;不需要为这处文档纠正重做本地运行、不新增测试。可以直接对归档hex作离线位置核对。推送最小文档提交,等待当前head必要CI,不把旧head通过写成新head通过;若CI出现同一既有故障,先查跨轮次数,不自动新增恢复额度。

    已登记本PR历史CI:run42501122958 attempt1/job128793885516为shell ui-shells stage5超时(不是stage6;历史同因性未知),attempt2/job128797243772通过,一次恢复已消耗。保留账本,不用“与改动无关/同类”代替根因证明。

    仍一worker、Flash优先,不动#324/#327/#330/#30/BCD或其待授权重试,不启动Codex review、不自行合并、不关#28/#7。此为原派单的证据纠正,不扩产品范围。

  12. JavaZeroo-Bot commented on Nov 8, 2026

    @JavaZeroo-Bot
    Collaborator

    收到:只做文档纠正——说明 query_offset=23 是固定源串 AB+ESC[6n 的起点,ESP[6n 本身从零基字节 25 开始,统一 README、EVIDENCE 与 PR 正文;不改数据、schema、测试或产品逻辑,推送后交回调度合并。

  13. JavaZeroo-Bot commented on Nov 8, 2026

    @JavaZeroo-Bot
    Collaborator

    #331 文档纠正完成,新 head 61c9868 已推送、PR 正文同步更新,10/10 CI 通过,mergeable,交回调度合并。

    纠正内容(仅文字,未改数据/schema/字段名/原始 transport_hex/历史结果/测试与产品逻辑):明确 query_offset=23 是固定 6 字节源串 AB+ESC[6n 的起点(AB 占 23/24),ESC[6n 本身从零基字节 25 开始。涉及 experiments/shell/results/2026-11-09-qt-query-reply/README.md(结论与层 4 表格)、validation.json 的 transport_decode/product_chain 说明文字、docs/EVIDENCE.md 索引行与 PR 正文。提交 61c9868 含一次 Co-authored-by trailer,未重跑本地测试。

    CI(head 61c9868,PR 与 push 两事件共 10 项全部 success):qt-cpp-windows 4m27s/4m33s;Windows regression 14m46s/16m7s;alacritty 两平台、Ubuntu regression 通过。过程中两次与本改动无关的既有 flake 各按一次重试规则通过:PR Windows regression 首轮遗留 shell workspace-failure stage5 超时(#80/#38 同类)、push qt 首轮 hosted Windows QPA 剪贴板步骤 25 s 超时。

    未关闭 #28/#7,未合并,未触发 Codex review。建议 squash 合并时保留提交中的 Co-authored-by: JavaZeroo trailer。

  14. added a commit that references this issue on Nov 8, 2026
  15. JavaZeroo commented on Nov 8, 2026

    @JavaZeroo
    OwnerAuthor

    #331 已合并,merge 87580cd18bf5dcad22709d5cf15c3aff6bb8a571,验收 head 61c9868e44a0f881d81516b369c301defe2bbb8b 的 10 项 CI 全通过。source byte23 / DSR byte25 的文字修正已核验;raw-silent、raw-distinct、正式 Qt 真实 child 回复字节及退出清理的限定证据已进入 main。

    本次仅完成已派发的独立 DSR 回复证据任务;不关闭 #28,不代表固定 TUI、resize/备用屏或其他查询的完整验收。整体依赖 #27 仍开放。DSH 工单已 ended/merged,无新增实现派单。

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

    blocked有明确未完成前置;见原生 blocked-byenhancementNew feature or request

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions