Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ if(WIN32)
add_executable(conpty_backend_probe experiments/conpty/backend_probe.cpp)
termforge_warnings(conpty_backend_probe)
target_compile_definitions(conpty_backend_probe PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0A00)
add_executable(conpty_resize_native_probe experiments/conpty/resize_native_probe.cpp)
termforge_warnings(conpty_resize_native_probe)
target_compile_definitions(conpty_resize_native_probe PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0A00)
target_link_libraries(conpty_resize_native_probe PRIVATE bcrypt)
add_executable(presentation_probe experiments/presentation/presentation.cpp)
termforge_warnings(presentation_probe)
target_compile_definitions(presentation_probe PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分
| 实验输入 worker 持块与停止(#62) | [sender fence 合同](research/sender-fence.md)、[固定源码与实际字段](../experiments/shell/results/2026-10-26-sender-fence/validation.json) | `519a3f3` 的系统/官方各两进程、每次 stop/cancel/竞争,共 12 条实际 worker 记录,均 join/Job0;另有各一次原 focus 单测和各 2/2 纯 CTest。明确修正旧 never-read/output-first 不能保证 16KiB 的夹具假设,同 EXE 旧顺序仍红。实现仅在 PR #50 实验整合,main 未包含;probe 未链接候选 VT,纯 EOF 为模拟,#53 UI/3MB/768B/八会话及完整官方矩阵未验收。 |
| 实验 UI 未完成粘贴(#53) | [机制与边界](research/ui-paste-fence.md)、[旧固定记录](../experiments/shell/results/2026-10-26-ui-paste-fence/validation.json)、[组合修复](research/resize-replay-cost.md)、[最终同源码记录](../experiments/shell/results/2026-10-26-replay-cost-and-close/validation.json) | `eae4b6a` 单窗口两轮、真实EOF/无GO负例及两轮原八会话data-only通过;行键复用及关闭期间不回复分别有诊断/因果回归,原completed/stage45/退出错误保留。完整CTest54/56仍有Vim59、resize43、main7/ui52与shell180秒期限;未计真实CF/IME、完整后端或性能通过。 |
| Native Vim 捕获目录隔离 | [原因与复验](research/vim-fixture-isolation.md)、[固定原件审计](../experiments/conpty/results/2026-10-26-vim-fixture-isolation/validation.json) | 实验分支同旧 EXE 的兄弟运行一绿一红;修正新目录隔离后完整模块9/9。仅闭合 #52 native 夹具原因;GUI stage59 仍开放,未知与受扰动探针分列。 |
| 原生 viewport resize 与默认策略隔离(#51) | [原因与复现](research/native-viewport-resize.md)、[固定验证及六组合成原件](../experiments/conpty/results/2026-10-27-native-viewport-resize/validation.json) | 原 `.4` GUI stage43 与独立 native/replay 红;`.5` 原 resize/Unicode、历史/空格复制、六组 native 对照通过。默认策略填充误判经实际红绿修复;最终完整回归 54/56、12 项内部 skip,#52/#88 及此前 #87 的失败独立保留,不计完整后端或 WindTerm 等价。 |
| 工作区几何与交互的固定记录 | [#38](https://github.com/JavaZeroo/termforge/issues/38)、[工作区几何与输出验证](../experiments/shell/results/2026-10-26-workspace-geometry/validation.json)、[resize 限定证据](../experiments/core/results/2026-10-26-resize-replay/validation.json) | 固定 27f376d 的客户区/布局/输出、默认/候选恢复及窄屏记录;其完整回归仍有 #36/#38 红项,不代表当前所有配置或 R2 通过。 |
| 短窗口选区夹具与 hosted 四 shell 前置(#38) | [固定锚点回归](../experiments/shell/test_shell.py)、[准备入口](../tools/prepare_hosted_shells.py)、[夹具收尾合同](research/hosted-wsl-fixture-cleanup.md)、[云端结果与剩余阻塞](https://github.com/JavaZeroo/termforge/issues/38) | 短窗口保留相同选择断言;仅指定一次性 hosted VM 准备固定 Ubuntu。夹具强制收尾与产品自然退出分列,未知归属/回收仍失败。 |
| 工作区恢复的运输完成端点(#38 夹具修正) | [限定合同](research/workspace-restore-transport-oracle.md)、[原失败及默认/候选验证](../experiments/shell/results/2026-10-26-workspace-transport-oracle/validation.json) | OSC 标题中的重复标记与 column-one CUP 误导旧端点;新判定保留完整 UTF-8、期限、负载及恢复断言。仅修夹具,不宣称修复产品恢复。 |
Expand Down
2 changes: 1 addition & 1 deletion docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
|---|---|---|
| 默认 main:自研核心 + 系统 ConPTY | 默认构建与已发布 Alpha 的基础路线,不需要 Rust | 已有 R1 限定验收;VT/Unicode 能力仍为有限子集,不能引用候选核心的字素或 TUI 结果 |
| 显式候选 main:`termforge.4` + 系统 ConPTY | `TERMFORGE_BUILD_CANDIDATE_ADAPTER=ON`;按 [ADR-0003](adr/0003-core-reference-and-reuse.md)保留为可评估实验,正式核心选型待用户确认 | [固定来源](../experiments/candidates/alacritty/PROVENANCE.md)、[适配边界](../experiments/core/CANDIDATE.md)与 [#39 字素合同](research/streaming-graphemes.md);候选正确性通过不关闭系统 ConPTY 或 R2 父项 |
| 实验分支:`termforge.4` + 固定官方 ConPTY | [PR #50(Draft)](https://github.com/JavaZeroo/termforge/pull/50),联合源码 `3e5b96d` 已重建并[冻结真实基线](research/joint-conpty-baseline.md),尚未合并或通过产品整体验收 | [#47](https://github.com/JavaZeroo/termforge/issues/47) 跟踪后端整合;终端 margin 与原生状态分列。[resize 残尾 #51](https://github.com/JavaZeroo/termforge/issues/51)、[Console-width Vim #52](https://github.com/JavaZeroo/termforge/issues/52)、[未完成粘贴 #53](https://github.com/JavaZeroo/termforge/issues/53)的[UI fence](research/ui-paste-fence.md)与[行键复用/关闭回复修复](research/resize-replay-cost.md)已在同源码验证单窗口两轮、真实EOF/无GO负例及两轮原八会话data-only;完整CTest仍54/56,resize43、Vim59、main7/ui52与shell180秒期限保留,不能据此验收整个后端;原completed与组合失败记录保留。worker gate [#62](https://github.com/JavaZeroo/termforge/issues/62) 已有[独立夹具修正与双后端实际 worker 验证](research/sender-fence.md),默认产品路径不启用 fence,也不替代 #53 的 UI 取消/关闭;工作区 [#63](https://github.com/JavaZeroo/termforge/issues/63) 回归仍开放 |
| 实验分支:`termforge.5` + 固定官方 ConPTY | [PR #50(Draft)](https://github.com/JavaZeroo/termforge/pull/50),`.4` 联合源码 `3e5b96d` 的[真实基线](research/joint-conpty-baseline.md)保留,尚未合并 main 或通过产品整体验收 | [#51 原生 viewport 修复](research/native-viewport-resize.md)保留历史并对齐宿主坐标,原 resize/Unicode 两轮及六组原生样本通过;最终完整回归 54/56,保留 [Vim #52](https://github.com/JavaZeroo/termforge/issues/52)、[恢复 stage1 #88](https://github.com/JavaZeroo/termforge/issues/88)和此前[八会话半行 #87](https://github.com/JavaZeroo/termforge/issues/87),同源码记录见该证据。[#53 UI fence](research/ui-paste-fence.md)与[行键复用/关闭回复](research/resize-replay-cost.md)、[#62 worker 夹具](research/sender-fence.md)各自限定通过。终端 margin 与原生状态分列,#47/#63 及完整后端仍开放;旧残尾、超时和组合失败记录保留 |

以下能力默认指已合并实现;某个配置的通过结果不能转用于另一个配置。R1 的真实系统 CF/拼音验收属于固定自研核心配置,不外推到候选 `.4` 或实验后端联合配置。

Expand Down
2 changes: 1 addition & 1 deletion docs/PROVENANCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

- `experiments/core/unicode_width.hpp`:通过原创生成器从 Python 3.12.10 `unicodedata` 所带 Unicode 15.0.0 属性数据生成,含项目自己的宽度/拒绝策略。未复制 CPython 实现源码。Unicode 数据保留[官方许可](../experiments/core/UNICODE-LICENSE.txt)与归属,来源为 [Unicode](https://www.unicode.org/);正常构建使用固定生成文件。此数据不归项目 MIT 许可覆盖。

- 外部核心候选当前使用 `alacritty_terminal 0.26.1-dev+termforge.4`(Apache-2.0),固定上游 commit `542147067dd016fc5f49120ef0ba605a98a4e3a7` 的 manifest/changelog/许可证与 `src/`,并保留 ED、稳定行身份/淘汰、安全 swap、每缓冲区滚动区域和流式字素补丁;精确传递依赖及校验值由 `Cargo.lock` 固定。未复制上游 46 MiB 行为录制,候选不进入当前产品包;默认 CMake 不依赖 Rust,显式适配器构建使用 staticlib。原始 0.26.0 身份、当前来源、许可证和补丁清单见[候选来源台账](../experiments/candidates/alacritty/PROVENANCE.md)。
- 外部核心候选当前使用 `alacritty_terminal 0.26.1-dev+termforge.5`(Apache-2.0),固定上游 commit `542147067dd016fc5f49120ef0ba605a98a4e3a7` 的 manifest/changelog/许可证与 `src/`,并保留 ED、稳定行身份/淘汰、安全 swap、每缓冲区滚动区域和流式字素补丁;精确传递依赖及校验值由 `Cargo.lock` 固定。未复制上游 46 MiB 行为录制,候选不进入当前产品包;默认 CMake 不依赖 Rust,显式适配器构建使用 staticlib。原始 0.26.0 身份、当前来源、许可证和补丁清单见[候选来源台账](../experiments/candidates/alacritty/PROVENANCE.md)。

- 候选新增精确锁定 `unicode-segmentation 1.13.3`(Unicode 17,MIT OR Apache-2.0),官方来源为 [unicode-rs](https://github.com/unicode-rs/unicode-segmentation) 与 [crates.io 固定版本](https://crates.io/crates/unicode-segmentation/1.13.3)。保留原依赖许可证;与既有 `unicode-width 0.2.2` 同使用 Unicode 17,默认自研核心仍使用 Unicode 15。版本、包哈希、MSRV、依赖成本和修改边界见[候选来源台账](../experiments/candidates/alacritty/PROVENANCE.md)。

Expand Down
2 changes: 1 addition & 1 deletion docs/milestones/R2-local-terminal.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ flowchart LR

## 下一批的任务边界

1. **在已冻结基线上逐项闭合后端回归。** #55 已交付含红的真实基线;接续 #51–#53 与 #63 的独立失败。#62 的[真实 writer 持块、取消与停止夹具](../research/sender-fence.md)不降低原 4MiB/16KiB/期限,#53 已接入默认关闭的 fence,[单窗口 UI/3MB/768B 与控制故障切片](../research/ui-paste-fence.md)及[同源码两轮原八会话data-only](../research/resize-replay-cost.md)已通过;完整官方回归仍保留resize/Vim/工作区失败和shell聚合期限,真实CF/IME组合独立验收。#51–#53 可以用原冻结输入独立定位,最终修复验收须在联合配置重建;一次未复现不自动构成因果修复。
1. **在已冻结基线上逐项闭合后端回归。** #55 已交付含红的真实基线;接续 #51–#53、#63、[#87 八会话半行观测](https://github.com/JavaZeroo/termforge/issues/87)与 [#88 恢复 stage1](https://github.com/JavaZeroo/termforge/issues/88)的独立失败。#62 的[真实 writer 持块、取消与停止夹具](../research/sender-fence.md)不降低原 4MiB/16KiB/期限,#53 已接入默认关闭的 fence,[单窗口 UI/3MB/768B 与控制故障切片](../research/ui-paste-fence.md)及[同源码两轮原八会话data-only](../research/resize-replay-cost.md)已通过;[#51 原生 viewport 修复](../research/native-viewport-resize.md)的原 resize 与 Unicode 限定回归通过,完整官方回归中的 Vim/#88、此前 #87、历史工作区失败及聚合期限证据分别保留,真实 CF/IME 组合独立验收。#51–#53 可以用原冻结输入独立定位,最终修复验收须在联合配置重建;一次未复现不自动构成因果修复。
2. **并行处理原版对照、平台语义与性能。** [原生语义处理路径 #56](https://github.com/JavaZeroo/termforge/issues/56)先明确 #41 原合同需要什么、哪些路径可支持;保留必要的上游或独立实现工作,不用“平台不同”豁免缺口。#3/#4 优先建立原版 Windows 本地终端基线;#54 现在冻结重复方法与完成端点并定位吞吐成本,数值预算作为提案交用户确认,不等到 #34 才补性能。
3. **在主线推进独立行为合同。** #29 核对极窄/极短、软硬行、历史/淘汰、选择/Find、连续 resize 和 child ack;#30 核对 IME 组合/提交/取消与输出/resize/切换、应用键盘/粘贴接收、实际复制及同次八会话。已验收的 #39 只提供首批字素基础,最终配置的交叉验收仍需执行。
4. **补终端模式和应用矩阵。** #27 明确 DECOM/DECAWM、pending-wrap、保存恢复、异常序列与 margin×resize;#28 先固定应用版本/入口/动作及协议字节预期,再逐应用完成进入、操作、resize、退出、主屏恢复。Vim 的一个修复不替代完整 TUI 验收。
Expand Down
48 changes: 48 additions & 0 deletions docs/research/native-viewport-resize.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 显式官方后端的原生 viewport resize

本项处理 [#51](https://github.com/JavaZeroo/termforge/issues/51) 的连续 GUI resize 残尾。固定原基线为 `e0b4d67`、候选 `termforge.4`、官方 ConPTY `1.25.260930003`、Console glyph width flags `0x18`;修复为同一候选的 `.5`。默认 system 后端和正式核心选择不由此项决定。

## 观察与原因

原场景末屏出现 `TF_SIZE_100x28OW`,原断言要求整行恰为 `TF_SIZE_100x28`。原生 `ReadConsoleOutputW` 捕获在同一次失败中显示该行正确,候选屏幕却保留 `OW`。原运输与 resize 时序可以逐步重现失败;移除中间两次请求仍出现同样终态,所以不能仅归因于请求合并或遗漏 host resize。

候选的通用 reflow 会在增高或增宽合并行时把历史拉回可见区,并可能为了保持光标行而删掉底部行。原生控制台没有终端已经保留的历史;随后由 host 发送的绝对坐标更新仍针对其原生可见区。两套布局先分歧、再接受局部覆盖,造成旧文字残留。六组独立原生样本分别覆盖增高、可见软行合并、光标所在软行合并、历史/可见区续行边界和部分合并后的底行保留。

| 初始→目标(列×行) | 关注点 | 原生末屏(省略行尾填充) | 原生光标(0 起算) |
|---|---|---|---|
| 8×3→8×6 | 增高不拉回 H0/H1 | TOP / MID / BOT / 空 / 空 / 空 | 2,3 |
| 8×3→16×3 | 合并后不拉回 H1 | 123456789 / P> / 空 | 1,2 |
| 8×3→16×3 | 光标位于被合并行 | H2 / 123456789 / 空 | 1,9 |
| 8×3→5×3 | 历史续行不能改变原生可见区 | 90123 / 45678 / 90 | 2,2 |
| 8×4→10×4 | 部分合并不能丢 BOTTOM | H1 / ABCDEFGHIJ / KLMNO / BOTTOM | 1,9 |
| 8×3→16×3 | 增宽不跨历史边界合并 | 9012345678901234 / 567890 / 空 | 1,6 |

这些是 ASCII 合成用例的原生快照,不是由候选算法计算的预期。原生采样会影响时序;微型探针不回答 CPR,固定 host 的有界等待亦影响时序。因此本记录不作为吞吐、交互延迟或原版性能证据。

## 实现边界

新增显式 `native_viewport` 策略,仅由官方后端的候选窗口选择。历史和可见区分别 reflow,增高/合并产生的空行置于可见区底部;保留光标、底行、历史身份和有界淘汰语义。跨边界续行保留逻辑换行元数据,以独立标记区分布局填充与文本;任何可变单元格访问都会使该标记失效。保留原跨度内的尾空格,保证完整复制及后续 resize 不增删空格。默认 `reflow_history`、系统候选和默认自研核心保持各自合同。

本项目独立实现这些修改,保留第三方许可与版本身份;不是恢复出的 WindTerm 源码,也不是确认 WindTerm 运行时一致。完整 resize/选择/Find、备用屏与模式交叉仍归 #29/#27,正式选型归 #34。

## 可复现入口

先按[显式官方后端说明](experimental-conpty-backend.md)构建候选配置。以下输出目录须不存在,后端目录必须是经过双 SHA 校验的固定包;探针不会下载或回退。

```powershell
cmake --build build/candidate --config Release --target conpty_resize_native_probe candidate_resize_replay candidate_core_test
python -m experiments.conpty.resize_native_run --exe build/candidate/bin/Release/conpty_resize_native_probe.exe --replay build/candidate/bin/Release/candidate_resize_replay.exe --backend build/candidate/bin/Release/conpty-backend --out local/resize-native-new
ctest --test-dir build/candidate -C Release -R '^candidate_(core|resize_replay)$' --output-on-failure
```

探针先等待监督器 GO 和自有 Job,再启动私有控制台子进程。每组保存源 VT、前后原生 UTF-16、真实 transport、resize plan、两策略末端状态、二进制/源码哈希和清理状态。child 必须确认真实新尺寸、自然退出 37;父级检查 EOF、无强制取消、无溢出和 Job 清空。内层等待最多 5 秒、外层 20 秒,失败不扩大预算。回归中的预期来自上表,默认策略对照的差异单列。

## 验证与限制

[固定验证记录](../../experiments/conpty/results/2026-10-27-native-viewport-resize/validation.json)区分原 `.4` 真失败、正式 `.5` 与早期临时探针。原 GUI 的精确 marker、Unicode、位置/历史、child ack、Job/desktop 回收断言及原期限保持;未删除 `OW`、改成子串、清屏或关闭 reflow。

诊断中有两组结果不进入因果证据:只保留错误字符串的缩减最终删掉全部 resize,不能作为此缺陷的最小复现;另一次用保留旧 mtime 的文件复制恢复源码,增量构建复用了旧修复二进制。后者已按实际二进制哈希排除,重新写入源码、实际编译后恢复了原 stage43 red。公开记录保留这些排除原因。

六组合成探针可公开复现;原 GUI 原件保留本地,只发布审核后的状态、哈希和固定断言结果。完整 R1/R2、实际呈现、真实 CF/IME 组合与 WindTerm 对照不从本项推导,`presented_done` 保持 null。其他真实失败由对应 issue 继续跟踪。

最终产品源 `92eac12` 的显式官方配置完整 CTest 为 54/56、411.59 秒,另有 12 项内部 skip;失败为 Vim stage59(#52)和第二轮工作区恢复 stage1(#88)。同次八会话工作流通过,但此前两次编号半行失败仍由 #87 跟踪。原 resize、resize-close 和 Unicode 检查通过只验收本项限定修复,不覆盖这些独立失败。
2 changes: 1 addition & 1 deletion experiments/candidates/alacritty/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading