From 21a353df6a075cc420866554931d5c882182b8d1 Mon Sep 17 00:00:00 2001 From: JavaZeroo-Bot <133958205+JavaZeroo-Bot@users.noreply.github.com> Date: Wed, 4 Nov 2026 18:29:47 +0800 Subject: [PATCH] docs(core): archive the confirmed hidden-frame return difference Record the 2026-11-04 user decision: keep the full hidden-frame body and accept the observed WindTerm 2.7.0 return-time clipping as an intentional product difference. Update ADR-0010, FEATURES, EVIDENCE and the hidden-height retention test contract so the original observation, intentional product difference, engineering regression and formal-path acceptance stay separate records. The preserved strict audit failure, offline supplemental audit and semantic_acceptance=false are unchanged; #27/#29 stay open and the change does not claim complete resize/reflow, WindTerm equivalence or R2 acceptance. Co-authored-by: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com> --- docs/EVIDENCE.md | 4 +-- docs/FEATURES.md | 4 +-- docs/adr/0010-bounded-resize-retention.md | 32 +++++++++++++++++-- .../core/resize_hidden_height_test.cpp | 15 ++++++--- .../README.md | 4 +-- .../README.md | 8 ++++- 6 files changed, 53 insertions(+), 14 deletions(-) diff --git a/docs/EVIDENCE.md b/docs/EVIDENCE.md index 99e7ed39..579c341e 100644 --- a/docs/EVIDENCE.md +++ b/docs/EVIDENCE.md @@ -18,8 +18,8 @@ | 原版 resize 后寻址与自主核心字面诊断 | [独立直接协议样本](../research/ui/results/2026-11-02-resize-address-reference/README.md)、[默认裁剪路径的失败诊断](../experiments/core/results/2026-11-02-resize-address/README.md) | 四例自然追加、CR、LF、CUP 保留动作前观测,文档、DSR、显示坐标分别核对;第五例 EL1 保留原审计失败。默认 `Screen::resize` 历史诊断仅 16/64 阶段通过、退出 1;当时 `EXCLUDE_FROM_ALL`,现参与默认构建但 CTest 只注册另行验证的显式保留入口。旧红不设 `WILL_FAIL`,常规 CI 或另一入口通过不能豁免默认路径差异 | | 缩窄后跨前方显示重排的 CUP/DSR 寻址(#27/#29 显式入口) | [单例原版四阶段严格记录](../research/ui/results/2026-11-03-reflow-addressing-reference/README.md)、[核心字面回放与身份](../experiments/core/results/2026-11-03-reflow-addressing/README.md):`CSI 8;2HQ` 写入文档行 6(保留的缩放前源片段行)而非重排行 5,DSR `8;3`、caret 同口径;窄屏矩形 (155,144) 恢复 (155,126) 证实显示页独立 +1 行重排 | 单例固定 ASCII、`91×20→61×20→91×20`、一个动作、最大一次运行;只补既有样本无法区分的行映射,不含备用屏、高度、Unicode、历史、样式、Qt/固定 ConPTY 或性能;默认 `Screen::resize`/Qt 未切换,#27/#29 不关闭 | | 正式 Qt / 固定 ConPTY 接入保留事务、显示投影与显示光标 | [契约、身份与差异](../experiments/shell/results/2026-11-03-qt-retained-display/README.md):可达真实 child→固定 ConPTY→core→widget;新 `qt_terminal_modes_retained` 12/12 检查通过,只缩宽后显示页第 8 行与原生重排逐字节一致,B/C/D 保留源位,命中经 layout revision 回到源格;Qt 正式路径 CTest 5/5,核心 36/36(含 `display_cursor_core`) | 旧六阶段 `--resize` 仍 exit 1 且失败信息不变,保留为原生重排网格与保留行合同的坐标差;同时缩宽+缩高的原版视口/滚动与后续 CUP 仍缺独立证据;不覆盖真实呈现/DPI/历史/Find/性能,#27/#29 不关闭 | -| 隐藏主屏纯高度变化的正文保留(#27 工程合同) | [RED/GREEN、命令与边界](../experiments/core/results/2026-11-04-hidden-height-retention/README.md):修复前 `resize_hidden_height_test` 证明隐藏 live/历史被按未变宽度裁剪并丢失保留尾;`resize_preserving` 改为只在宽度实际变化时适配隐藏帧后,三场景通过并注册 `retained_resize_hidden_height_core`;组合回放 20/20、事务检查不变,正式 Qt CTest 5/5 | 工程不变量;原版对照见下一行。未覆盖备用屏后续输出、保存光标交叉、Unicode、历史淘汰、Qt 物理呈现/DPI 或性能;#27/#29 不关闭 | -| 原版隐藏主屏高度的录制恢复与离线补充审计(#27/#29) | [补充审计、阶段观察与差异](../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md):七阶段原版录制的严格审计失败保留;从仍可用的取证环境只读恢复完整输入后,离线补充审计通过(计划 `938992c4…`、参考 EXE `7b1053…`/4047 清单 `e459adf2…`、执行源清单 `51e80b93…`,0 次重跑),补充件 `4c0f28f2…` | 审计显示返回主屏后宽行按当前宽度裁剪为 61 空格 + `w`(62 字符)、DSR `19;7→14;7`,与 #311 的保留合同存在待用户确认的差异;本记录不修改实现、不重跑、不关闭 #27/#29;语义验收 false,备用屏阶段 API 文本不等于活动备用屏网格 | +| 隐藏主屏纯高度变化的正文保留(#27 工程合同) | [RED/GREEN、命令与边界](../experiments/core/results/2026-11-04-hidden-height-retention/README.md):修复前 `resize_hidden_height_test` 证明隐藏 live/历史被按未变宽度裁剪并丢失保留尾;`resize_preserving` 改为只在宽度实际变化时适配隐藏帧后,三场景通过并注册 `retained_resize_hidden_height_core`;组合回放 20/20、事务检查不变,正式 Qt CTest 5/5 | 工程不变量;原版对照见下一行。2026-11-04 用户确认保留完整正文、接受原版返回裁剪差异,工程身份不变,正式 Qt 路径验收未完成。未覆盖备用屏后续输出、保存光标交叉、Unicode、历史淘汰、Qt 物理呈现/DPI 或性能;#27/#29 不关闭 | +| 原版隐藏主屏高度的录制恢复与离线补充审计(#27/#29) | [补充审计、阶段观察与差异](../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md):七阶段原版录制的严格审计失败保留;从仍可用的取证环境只读恢复完整输入后,离线补充审计通过(计划 `938992c4…`、参考 EXE `7b1053…`/4047 清单 `e459adf2…`、执行源清单 `51e80b93…`,0 次重跑),补充件 `4c0f28f2…` | 审计显示返回主屏后宽行按当前宽度裁剪为 61 空格 + `w`(62 字符)、DSR `19;7→14;7`,与 #311 的保留合同存在差异;2026-11-04 用户已确认保留完整正文、接受该原版观察为产品有意差异([决定评论](https://github.com/JavaZeroo/termforge/issues/29#issuecomment-6627911863));本记录不修改实现、不重跑、不关闭 #27/#29;语义验收 false,备用屏阶段 API 文本不等于活动备用屏网格 | | 原版取证运行时与归档可恢复性盘点 | [环境类别、已核验身份、解除方式与条件](research/original-evidence-runtime-2026-11-04.md):原取证 QEMU 域仍可用,参考 EXE `7b1053…`、4047 文件清单 `e459adf2…`、隐藏高度计划 `938992c4…`、执行源清单 `51e80b93…` 与完整录制输入均在;宿主归档缺少 `app`/`profile`/`reference-source.json` 是此前 blocked 的原因 | 只发布路径类别、哈希与证明字段;私有录制/profile/原包不发布;解除方式只适用于原始输入完整且允许只读复核的记录,不外推到未核对归档;环境丢失后同类旧失败只能保持 blocked | | 自主 C++ 同 owner 保留列宽事务与有限编辑(#27/#29 独立入口) | [源码、定向红绿与限制](../experiments/core/results/2026-11-02-retained-columns/README.md):`a35be70` 的四个寻址 case 为 64/64 阶段;`fdeaed6` 使打印/ICH/DCH 按协议宽更新目标行,内容长度与 `written` 分离,三例编辑为 64/64 阶段。该固定源码重新构建后核心 22/22、Qt/固定 ConPTY 4/4,各配置身份独立记录 | 默认 resize / Qt 未切换;Qt 回归不执行新保留入口。Q/R 与 ICH/DCH 红绿分别保留,owner 存储及空白长度工程检查没有独立先行 RED。后续光标与隐藏帧修正另列,不继承本轮结果;默认裁剪与 B/CD 失败不豁免 | | 原版活动/隐藏帧与缩放后下一字符 | [6次原版、29阶段](../research/ui/results/2026-11-02-resize-frame-reference/README.md):5次原审计通过、1次隐藏主屏原审计失败后独立离线补充通过;无补跑。文档、DSR与显示分别记录 | 活动备用屏保留正文;隐藏主屏返回的正文和边界不同;4个ON/OFF缩放末列样本支持下一字符覆盖当前位置。原版Document索引差异、私有模式位及完整网格不据此判定 | diff --git a/docs/FEATURES.md b/docs/FEATURES.md index c1b52a5f..8b4be3a3 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -31,7 +31,7 @@ 行存储已由 owner 封装,行 ID 与文档顺序分离;[精确查询](../experiments/core/results/2026-10-29-order-query/README.md)、[封存存储](../experiments/core/results/2026-10-29-sealed-row-storage/README.md)及 `text_search.hpp` 的顺序 revision 处理已在 main(#170/#172/#175)。#169 的关闭本身不证明 Qt 历史/选择/Find 已交付。[#29](https://github.com/JavaZeroo/termforge/issues/29) 的叠加 `ViewMapping` 已引入(#264),`HistoryViewport` 快照现携带显示页映射;部分列选区不再投影成整行。Qt 基础拖选通过同一映射命中与高亮,颜色只写入显示副本,普通点击清除选区;[模型与 Qt 接线记录](../experiments/shell/results/2026-11-01-r2-core-input/README.md)分列核心映射和用户事件证据。系统复制/粘贴、选词/选行、历史浏览/自动滚动与 Find 仍未迁移,物理 resize 仍会丢弃裁掉的正文;#29/#30 均未结项。旧 #108–#113 堆叠方案已关闭,不再列为待合入产品实现。 -[有界 Unicode Cell 显示投影](../experiments/core/results/2026-11-02-display-projection-unicode/README.md)保留完整宽字、已有组合标/样式、源身份和选择/Find范围,显示补白不创造源文字。[增量 `ProjectionJob`](../experiments/core/results/2026-11-02-projection-job/README.md)每步最多读200个源片段,保存未完成半行和页面,完整页才发布;500个单列片段实际按200/200/100步完成,跨步骤选择、复制与Find映射通过。每片段仍限500 Cell,每lead最多68字节/16个mark;不完整原子、trail起点及一列放不下宽字等请求拒绝。任务绑定owner、epoch、order、独立content revision与请求代次;旧单次`project`的source_limit可能停滞,需使用分步入口。源锚点不是全局显示行号,任意显示位置定位与持续输出下的进展保证仍待实现。默认 `Screen::resize` 仍物理裁剪;正式 Qt 路径已改走保留事务并绘制独立显示页、显示光标与映射命中([只缩宽契约](../experiments/shell/results/2026-11-03-qt-retained-display/README.md)),旧六阶段 native-sync 失败保留为原生重排网格与保留行坐标层的差异;隐藏主屏纯高度变化保留正文的[工程合同](../experiments/core/results/2026-11-04-hidden-height-retention/README.md)与[原版补充审计](../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md)已分别记录:原版返回时按当前宽度裁剪隐藏行,与当前保留合同存在待确认差异。#27/#29保持开放。 +[有界 Unicode Cell 显示投影](../experiments/core/results/2026-11-02-display-projection-unicode/README.md)保留完整宽字、已有组合标/样式、源身份和选择/Find范围,显示补白不创造源文字。[增量 `ProjectionJob`](../experiments/core/results/2026-11-02-projection-job/README.md)每步最多读200个源片段,保存未完成半行和页面,完整页才发布;500个单列片段实际按200/200/100步完成,跨步骤选择、复制与Find映射通过。每片段仍限500 Cell,每lead最多68字节/16个mark;不完整原子、trail起点及一列放不下宽字等请求拒绝。任务绑定owner、epoch、order、独立content revision与请求代次;旧单次`project`的source_limit可能停滞,需使用分步入口。源锚点不是全局显示行号,任意显示位置定位与持续输出下的进展保证仍待实现。默认 `Screen::resize` 仍物理裁剪;正式 Qt 路径已改走保留事务并绘制独立显示页、显示光标与映射命中([只缩宽契约](../experiments/shell/results/2026-11-03-qt-retained-display/README.md)),旧六阶段 native-sync 失败保留为原生重排网格与保留行坐标层的差异;隐藏主屏纯高度变化保留正文的[工程合同](../experiments/core/results/2026-11-04-hidden-height-retention/README.md)与[原版补充审计](../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md)已分别记录:原版返回时按当前宽度裁剪隐藏行;2026-11-04 用户已确认产品保留完整正文并接受该原版差异([ADR-0010](adr/0010-bounded-resize-retention.md))。工程回归仍仅指核心显式入口门禁,正式 Qt 路径对该场景的验收尚未完成。#27/#29保持开放。 [同 owner 保留列宽事务](../experiments/core/results/2026-11-02-retained-columns/README.md)使用独立 `Screen::resize_columns_preserving` 入口:活动正文保留源 Cell、ID/version 与有效软续接,历史不被补齐或重写;普通打印、ICH/DCH 按当前协议宽度更新目标行,独立内容长度保留有意义的尾空白。实际列宽变化会[限制活动光标并取消延迟末列写入](../experiments/core/results/2026-11-02-resize-pending/README.md),并[复位两帧的滚动边界](../experiments/core/results/2026-11-02-resize-mode/README.md);[隐藏主屏](../experiments/core/results/2026-11-02-resize-hidden/README.md)还会裁剪 live 正文,不与活动正文采用同一保留策略。原版字面回放分别覆盖寻址、写入/插删、缩放后下一字符和隐藏主屏返回,各组身份与验证范围在对应报告中独立记录。[缩窄后跨前方重排的 CUP/DSR 寻址原版样本](../research/ui/results/2026-11-03-reflow-addressing-reference/README.md)与[对应核心回放](../experiments/core/results/2026-11-03-reflow-addressing/README.md)确认协议行仍是保留的缩放前行、DSR/caret 同口径,显示页独立重排;仍只走显式入口,默认 `Screen::resize` 与 Qt 未切换。 @@ -56,7 +56,7 @@ Qt 构建显式准备并部署[固定微软 CRT 14.51.36247.0](../third_party/ms | 中文 IME 与键盘 | **限定验收**:基础按键/修饰键/UTF-16 与实际接收字节;[固定 ZWJ/keycap 输入](../experiments/shell/results/2026-10-26-unicode-keyboard/validation.json)在默认/候选各两轮精确接收。固定 Microsoft 拼音[产品场景](../research/ime/results/2026-10-24-product-ime-contexts/validation.json)覆盖两区域组合/提交/取消、候选、输出/resize/zoom/受控 DPI、隐藏/关闭、历史阅读和原生控件 | 限定 Windows Server 2025 固定拼音及已有场景;同次组合由八会话工作流另验收。固定字素绘制/选择已由 #39 限定完成,但所有输入法、应用键盘模式、完整 IME 和真实不同 DPI 跨屏仍未完成 | R1 / R2 | | VT 核心 | **实现中,未验收**:默认自研支持基础光标/擦除(含 ECH)、CR/LF/BS/TAB、有限 SGR(粗体/暗色/下划线/反显/删除线/隐藏/上划线)和有界恢复;新增编辑类 `ICH`/`DCH`(`CSI @`/`CSI P`)、`IL`/`DL`(`CSI L`/`CSI M`)、滚动区域 `DECSTBM`(`CSI Pt;Pb r`,归位与非法区域行为按参考实现)、`ED3`(`CSI 3J` 只清回滚)与 `RIS`(`ESC c`),`DSR 6n` 回复、`DECCKM`(`?1`)与 `DECTCEM`(`?25`)已接入 Win32 与 Qt 两个入口,均有[核心契约测试](../experiments/core/edit_csi_test.cpp)与[回复测试](../experiments/core/reply_test.cpp)。显式候选 `.4` 接入 `Term/Processor`、C++ 拥有值适配、稳定行元数据、每缓冲区 margin 与流式字素;[共同轨迹](../experiments/differential/results/2026-10-26-candidate-common-v6/summary.json)及[源 margin 合同](../experiments/shell/results/2026-10-26-margin-state/validation.json)为各自固定版本结果 | [#27](https://github.com/JavaZeroo/termforge/issues/27) 的 origin/wrap、模式/resize、插删与滚动区域交叉未闭合;[#41](https://github.com/JavaZeroo/termforge/issues/41) 系统 ConPTY 已丢失的 margin 不能由末端补回。ECH pending-wrap 差异见[限定合同](research/more-capture-ech.md);`DA1` 仅 strict 回放回复 VT102,recovery 产品路径不回复;`DA2` 与 `OSC 10/11` 回复未实现,原版未知仍不算匹配;`SGR 58` 等下划线颜色属性亦未实现;#36/#38、完整呈现和平台支持独立验收 | R2 / R4 | | Unicode 与文字显示 | **实现中,未验收**:默认自研保留 Unicode 15。显式候选 `.4` 的 [#39 Unicode 17 流式字素合同](research/streaming-graphemes.md)已限定验收:固定 ZWJ/keycap 的单 lead/两列、光标、SGR/查询、原子选择复制、单列 resize 与有界无损分片;实际 ConPTY/DWrite 核对固定样本的单 glyph、字体和网格 | [#30](https://github.com/JavaZeroo/termforge/issues/30) 仍需完整输入/IME 交叉;所有脚本/整形、通用 fallback、所有原生重放、真彩色/更多属性、Powerline 和真实跨屏未验收。分段 helper 的规范数据通过不代表完整终端 Unicode 正确性;[#54](https://github.com/JavaZeroo/termforge/issues/54) 保留已观察的性能成本 | R2 / R4 | -| resize 与 reflow | **实现中,未验收**:默认仍按 ADR-0005 物理行裁剪;[显式保留列宽事务与显示投影](../experiments/core/results/2026-11-02-retained-columns/README.md)通过四例有限寻址诊断;[同 owner 宽高组合保留事务](../experiments/core/results/2026-11-02-retained-combined/README.md)把固定五阶段原版回放从 8/20 阶段修至 20/20,并注册核心门禁;正式 Qt 路径已接入该事务、独立显示页、显示光标与映射命中([只缩宽契约](../experiments/shell/results/2026-11-03-qt-retained-display/README.md) 12/12、Qt 正式 CTest 5/5),默认 resize 入口未替换;[隐藏主屏纯高度变化保留正文的工程合同](../experiments/core/results/2026-11-04-hidden-height-retention/README.md)已注册门禁,[原版七阶段补充审计](../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md)显示返回主屏时按当前宽度裁剪隐藏行,与当前保留合同存在待确认差异。历史候选在[固定 ConPTY 重放](../experiments/core/results/2026-10-26-resize-replay/validation.json)与连续同步中保持行身份、Find/选区和有界历史,淘汰/清空不复活;候选 `.4` 另覆盖主/备用屏缩到单列 | [ADR-0010](adr/0010-bounded-resize-retention.md)已确认正文保留与显示投影方向,#27/#29 联合交叉仍未完成;[正式路径 B/CD 缩放诊断](../experiments/shell/results/2026-11-02-qt-terminal-modes/README.md)仍红且失败信息保留,已归类为原生重排网格与保留行坐标层差异,同时缩宽+缩高的原版视口/滚动与后续 CUP 仍缺独立证据;隐藏主屏高度的严格审计失败保留、离线补充审计已通过(单次七阶段,0 次重跑),返回时按当前宽度裁剪与当前保留合同的差异待用户确认。固定事务不等于完整 reflow 或 WindTerm 等价。[#156固定交错诊断](../experiments/shell/results/2026-10-29-resize-repaint-witness/README.md)见证默认核心在两种时序下选区失效,历史几何错配已有字节/消费网格证据;[#194](https://github.com/JavaZeroo/termforge/issues/194) 后续按用户接受未复现收口,未证明产品修复,重现时按该项条件重开。系统/实验 ConPTY、备用屏/滚动区、真实 DPI、呈现、性能及 #36/#38 分别验收;默认缩窄不可恢复 | R2 | +| resize 与 reflow | **实现中,未验收**:默认仍按 ADR-0005 物理行裁剪;[显式保留列宽事务与显示投影](../experiments/core/results/2026-11-02-retained-columns/README.md)通过四例有限寻址诊断;[同 owner 宽高组合保留事务](../experiments/core/results/2026-11-02-retained-combined/README.md)把固定五阶段原版回放从 8/20 阶段修至 20/20,并注册核心门禁;正式 Qt 路径已接入该事务、独立显示页、显示光标与映射命中([只缩宽契约](../experiments/shell/results/2026-11-03-qt-retained-display/README.md) 12/12、Qt 正式 CTest 5/5),默认 resize 入口未替换;[隐藏主屏纯高度变化保留正文的工程合同](../experiments/core/results/2026-11-04-hidden-height-retention/README.md)已注册门禁,[原版七阶段补充审计](../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md)显示返回主屏时按当前宽度裁剪隐藏行;该差异已由用户于 2026-11-04 确认保留完整正文并接受为产品有意差异([ADR-0010](adr/0010-bounded-resize-retention.md)),其正式 Qt 路径验收仍未完成。历史候选在[固定 ConPTY 重放](../experiments/core/results/2026-10-26-resize-replay/validation.json)与连续同步中保持行身份、Find/选区和有界历史,淘汰/清空不复活;候选 `.4` 另覆盖主/备用屏缩到单列 | [ADR-0010](adr/0010-bounded-resize-retention.md)已确认正文保留与显示投影方向,#27/#29 联合交叉仍未完成;[正式路径 B/CD 缩放诊断](../experiments/shell/results/2026-11-02-qt-terminal-modes/README.md)仍红且失败信息保留,已归类为原生重排网格与保留行坐标层差异,同时缩宽+缩高的原版视口/滚动与后续 CUP 仍缺独立证据;隐藏主屏高度的严格审计失败保留、离线补充审计已通过(单次七阶段,0 次重跑),返回时按当前宽度裁剪已确认为产品有意差异(保留完整正文,2026-11-04);正式路径验收仍待补。固定事务不等于完整 reflow 或 WindTerm 等价。[#156固定交错诊断](../experiments/shell/results/2026-10-29-resize-repaint-witness/README.md)见证默认核心在两种时序下选区失效,历史几何错配已有字节/消费网格证据;[#194](https://github.com/JavaZeroo/termforge/issues/194) 后续按用户接受未复现收口,未证明产品修复,重现时按该项条件重开。系统/实验 ConPTY、备用屏/滚动区、真实 DPI、呈现、性能及 #36/#38 分别验收;默认缩窄不可恢复 | R2 | | 本地 shell 选择 | **实现中,未验收**:`ShellLaunch` 分离可执行文件、参数、工作目录及 shell 命令差异;cmd、Windows PowerShell 5.1、PowerShell 7、显式 Ubuntu WSL 各有[两轮真实启动/目录/尺寸/正常退出证据](../experiments/shell/results/2026-10-24-r2-shell-lifecycle/validation.json),无效程序启动错误可见且可关闭后恢复 cmd。四 shell 测试已补 [WSL 原生尺寸程序返回后的新提示符同步](research/wsl-size-return.md),正常退出证据只在实际全部回收后写入;默认/system 的事件反例、原两轮及完整回归分别留证 | 仅声明上述固定入口和隔离目录;#80 原 hosted stage6 是否同因仍未知,#81 hosted 准备超时另行定位;任意 profile/参数、通用分屏/排序、全部运行时错误提示及管理员 shell 未完成 | R2;权限场景 R4 | | 常用 TUI | **实现中,未验收**:显式候选 + 系统 ConPTY 有固定 Vim 进入、编辑、60×12 resize、退出写盘、主屏恢复及光标回复的[产品证据](../experiments/core/CANDIDATE.md);More 尾部 ECH 与捕获端点有[限定修复](research/more-capture-ech.md) | [#28](https://github.com/JavaZeroo/termforge/issues/28) 的更多应用及完整输入/输出模式未完成;PR #50 实验后端的 GUI Vim [#52](https://github.com/JavaZeroo/termforge/issues/52) 仍有失败;[native 捕获目录复用](research/vim-fixture-isolation.md)已独立定位并修正,不能代替 GUI 或完整 TUI 验收。headless 比较与自有 DIB 不等于真实呈现,`presented_done=null` | R2 | diff --git a/docs/adr/0010-bounded-resize-retention.md b/docs/adr/0010-bounded-resize-retention.md index 8aff5493..480c9de9 100644 --- a/docs/adr/0010-bounded-resize-retention.md +++ b/docs/adr/0010-bounded-resize-retention.md @@ -1,7 +1,7 @@ # ADR-0010:有界正文保留与独立显示投影 -- 状态:已确认实施方向;内容替换与联合验收尚未完成 -- 日期:2026-11-02 +- 状态:已确认实施方向;内容替换与联合验收尚未完成。2026-11-04 另确认隐藏帧返回保留完整正文、接受原版裁剪差异。 +- 日期:2026-11-02(2026-11-04 增补确认) - 决策者:项目负责人(用户) - 执行范围:[#27](https://github.com/JavaZeroo/termforge/issues/27) / [#29](https://github.com/JavaZeroo/termforge/issues/29) 联合切片;具体证据、责任及切片见[已确认方案](../research/r27-r29-resize-proposal.md)。 @@ -27,6 +27,34 @@ 局部补搬 B/CD 或附加裁剪缓存不能覆盖软硬行、后续写入、历史淘汰和文字锚点的一致性;继续只裁剪也不能完成保留的 #29 任务。因此选择在现有 owner 内完成可验证的内容与视图分离。 +## 隐藏帧返回的保留行为差异(2026-11-04 已确认) + +[#311](https://github.com/JavaZeroo/termforge/pull/311) 已登记隐藏主屏纯高度变化的正文保留工程合同。[#312](https://github.com/JavaZeroo/termforge/pull/312) 的离线补充审计显示:原版 WindTerm 2.7.0 在“先缩窄主屏、进入备用屏、改变高度、再返回主屏”的固定七阶段路径上,返回时按**当时的协议宽度**裁剪隐藏主屏行。固定样本由 `89 空格 + uvw`(92 字符)变为 `61 空格 + w`(62 字符),`u`/`v` 与第 61–90 列空格消失,DSR `19;7 → 14;7`。这与当前保留合同不一致,需用户决定。该审计不重跑、不改写原严格失败,`semantic_acceptance=false`。 + +用户原答(2026-11-04): + +> 保留完整正文,明确接受与 WindTerm 的这项差异 + +**决定**:维持 #311 的保留方向,产品保留完整正文;不为匹配原版的返回裁剪新增裁剪,也不把该场景改写为“原版一致”。该差异登记为**已确认的产品有意差异**,解除 `hidden-frame-return-retention-vs-observed-clipping` 的人工确认阻塞,不再重复要求用户选择同一问题。 + +**确认依据**:[决定评论](https://github.com/JavaZeroo/termforge/issues/29#issuecomment-6627911863)、[隐藏主屏高度补充审计](../../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md)。 + +**四项身份分别保留**: + +| 身份 | 内容 | 证据/状态 | +|---|---|---| +| 原版观察 | WindTerm 2.7.0 在上述单例七阶段路径返回时裁剪隐藏行 | [补充审计](../../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md);旧严格失败保留,未重跑 | +| 产品有意差异 | TermForge 返回主屏保留完整源正文 | 本节;用户 2026-11-04 确认 | +| 工程回归 | `resize_hidden_height_test`(`retained_resize_hidden_height_core`,核心显式入口) | [#311 工程合同](../../experiments/core/results/2026-11-04-hidden-height-retention/README.md);工程不变量,不是原版 oracle | +| 正式路径验收 | 真实 child → 固定 ConPTY → Qt 路径上的同一场景 | **未完成**:既有 Qt 保留契约只覆盖仅缩宽、同高度(12/12),#311 的 Qt CTest 5/5 只是既有套件回归;留 #29 后续切片 | + +**边界**: + +- 仅覆盖上述路径与固定样本;不外推到所有隐藏帧、其他尺寸、连续 resize、Unicode/宽字/结合字、保存光标、历史淘汰或备用屏后续输出。 +- 不改写原严格失败、[离线补充审计](../../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md)、`semantic_acceptance=false` 或原版隐藏策略分类保持 null 的事实。 +- 不改变 [R2 范围及验收合同](../milestones/R2-local-terminal.md);#27/#29 保持 OPEN,不据此声明完整 resize/reflow、WindTerm 等价或 R2 完成。 +- 若正式路径实测未保留完整正文,按新证据修正并重新取证;本确认不豁免工程回归。 + ## 实施与确认边界 - 按方案的小切片推进:先固定影响实现的原版行为,再实现有界保留/投影及协议交叉,联动 TextDocument、HistoryViewport、ViewMapping、TextSelection、TextSearch,最后在同一 Qt / 固定 ConPTY 配置闭合用户路径。 diff --git a/experiments/core/resize_hidden_height_test.cpp b/experiments/core/resize_hidden_height_test.cpp index 4f2f0ec2..39e6c5a3 100644 --- a/experiments/core/resize_hidden_height_test.cpp +++ b/experiments/core/resize_hidden_height_test.cpp @@ -1,10 +1,15 @@ // Retained-frame engineering contract: a hidden primary frame keeps its // retained source cells when only the height changes. The original -// hidden-primary height recording is preserved but its strict audit failed, so -// these assertions are an implementation invariant under the confirmed -// retained-body direction (ADR-0010), not an original-behavior oracle. A width -// change while the frame is hidden still fits it to the protocol footprint, -// matching the separately recorded hidden-width policy. +// hidden-primary height recording is preserved but its strict audit failed; +// the 2026-11-04 supplemental audit observed the original clipping the +// retained row to the current protocol width on return, and the user then +// confirmed keeping the full body and accepting that difference as an +// intentional product difference (ADR-0010, issue #29 comment 6627911863). +// These assertions therefore remain an engineering regression under the +// confirmed retained-body direction: not an original-behavior oracle and not +// the formal-path (real child/ConPTY/Qt) acceptance for the confirmed +// scenario. A width change while the frame is hidden still fits it to the +// protocol footprint, matching the separately recorded hidden-width policy. #include "terminal.hpp" #include "history_view.hpp" #include "text_document.hpp" diff --git a/experiments/core/results/2026-11-04-hidden-height-retention/README.md b/experiments/core/results/2026-11-04-hidden-height-retention/README.md index e996d7e0..375c82e9 100644 --- a/experiments/core/results/2026-11-04-hidden-height-retention/README.md +++ b/experiments/core/results/2026-11-04-hidden-height-retention/README.md @@ -15,7 +15,7 @@ | 组合字面回放 `resize_combined_test` | **20/20 阶段、0/560 失败**;映射/选择 20/20、0/744 | 与 #308 相同字面预期,未放宽 | | 事务分配失败/历史检查 `resize_preserving_transaction_test` | 通过(151/42 次注入失败后重试一致等) | 既有工程检查,未改断言 | | 核心 CTest | **37/37 通过**(新增 `retained_resize_hidden_height_core`) | 本工作树定向构建 | -| Qt 正式路径 CTest | **5/5 通过**(含 `qt_terminal_modes_retained` 12/12 契约) | 真实 child → 固定 ConPTY → core → widget,offscreen | +| Qt 正式路径 CTest | **5/5 通过**(含 `qt_terminal_modes_retained` 12/12 契约) | 真实 child → 固定 ConPTY → core → widget,offscreen;既有套件回归,不覆盖本报告的隐藏帧返回场景 | | 隐藏高度探针离线 CTest | **3/3 通过,65.76 秒**(normal / `-O` / node controller) | 只校验冻结探针与导出器,不启动原版 | | 旧六阶段 `--resize` 诊断 | **exit 1,失败保留** | 未弱化、未设 `WILL_FAIL`;原生重排网格与保留行坐标层差异不变 | @@ -34,4 +34,4 @@ ctest --test-dir build/qt-cpp -C Release -R "^(qt_cpp_(shell|resize)|qt_unicode_ - 未覆盖备用屏活动期间的后续输出、保存光标交叉、Unicode/宽字/结合字、历史淘汰上限、Qt 物理呈现/DPI、选择/Find 用户流程或性能。 - #27/#29 保持 OPEN;本切片不声明完整 resize/reflow、WindTerm 等价或 R2 完成。 -**2026-11-04 后续:** 取证环境内完整录制恢复后,隐藏主屏高度七阶段记录的离线补充审计已完成,旧严格失败保留;审计显示返回主屏时按当前宽度裁剪隐藏行,与本报告的保留合同存在差异。见[补充审计](../../../../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md);本报告的工程验证与 #311 身份保持不变。 +**2026-11-04 后续:** 取证环境内完整录制恢复后,隐藏主屏高度七阶段记录的离线补充审计已完成,旧严格失败保留;审计显示返回主屏时按当前宽度裁剪隐藏行,与本报告的保留合同存在差异。用户于同日确认**保留完整正文、接受该原版差异**([决定评论](https://github.com/JavaZeroo/termforge/issues/29#issuecomment-6627911863)、[ADR-0010](../../../../docs/adr/0010-bounded-resize-retention.md)),因此本报告维持工程回归身份:不是原版 oracle,也不代替正式 Qt 路径对该场景的验收。见[补充审计](../../../../research/ui/results/2026-11-02-resize-hidden-height-reference/README.md);#311 的身份与验证结果不变。 diff --git a/research/ui/results/2026-11-02-resize-hidden-height-reference/README.md b/research/ui/results/2026-11-02-resize-hidden-height-reference/README.md index fb98f725..49e91051 100644 --- a/research/ui/results/2026-11-02-resize-hidden-height-reference/README.md +++ b/research/ui/results/2026-11-02-resize-hidden-height-reference/README.md @@ -29,7 +29,7 @@ 当前核心在 #311 后的工程合同是“隐藏帧只在宽度实际变化时适配足迹,纯高度变化保留源 Cell”(`resize_hidden_height_test`,已合入)。实测该路径返回主屏后保留 `89 空格 + uvw`(92 字符);上表原版返回后为 `61 空格 + w`(62 字符)。因此: - 原版行为更接近“返回时按当前宽度裁剪隐藏主屏保留行”,与 #311 的保留合同**不一致**; -- 当前产品按 ADR-0010 已确认的正文保留方向实现,属于对原版观察的**有意差异**,但差异本身尚未经用户确认,也未据本记录修改实现或 #311 报告; +- 当前产品按 ADR-0010 已确认的正文保留方向实现,属于对原版观察的**有意差异**;该差异当时尚未经用户确认(状态已于 2026-11-04 由用户决定解除,见下方更新),也未据本记录修改实现或 #311 报告; - 该差异涉及隐藏帧/1049 返回的具体行为选择,按项目规则应提交用户确认后再决定是否调整合同或实现。 本记录只完成取证与对比,不修改核心代码,不关闭 #27/#29,`semantic_acceptance=false`、`hidden_height_policy_classification=null`。 @@ -56,3 +56,9 @@ python -m research.ui.audit_resize_hidden_height_tail --directory