Skip to content
Closed
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: 3 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,8 @@ if(WIN32)
if(TERMFORGE_BUILD_SOURCE_CONPTY_EXPERIMENT)
add_executable(conpty_source_margin_probe experiments/conpty/margin_probe.cpp)
add_executable(conpty_source_backend_probe experiments/conpty/backend_probe.cpp)
foreach(target conpty_source_margin_probe conpty_source_backend_probe)
add_executable(conpty_source_margin_controls experiments/conpty/margin_controls_probe.cpp)
foreach(target conpty_source_margin_probe conpty_source_backend_probe conpty_source_margin_controls)
termforge_warnings(${target})
target_compile_definitions(${target} PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0A00
TERMFORGE_CONPTY_SOURCE_EXPERIMENT=1)
Expand Down Expand Up @@ -370,6 +371,7 @@ if(BUILD_TESTING)
termforge_add_python_test(measure -m unittest experiments.measure.test_measure experiments.measure.test_r54_contract.CostPlanTests -v)
termforge_add_python_test(binary_paths -m unittest experiments.test_build_paths -v)
termforge_add_python_test(conpty_margin_contract -m unittest experiments.conpty.test_margin_contract -v)
termforge_add_python_test(conpty_margin_controls -m unittest experiments.conpty.test_margin_controls -v)
termforge_add_python_test(benchmark_tools -m unittest discover -s benchmarks/tests -v)
termforge_add_python_test(differential -m unittest discover -s experiments/differential -p test_*.py -v)
termforge_add_python_test(ime_inventory -m unittest research.ime.test_hosted_inventory research.ime.test_prepare_hosted research.ime.test_product_ime -v)
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分
| 纯 AST 夹具的生命周期记录 | [#40](https://github.com/JavaZeroo/termforge/issues/40)、[计时、进度与回收验证](../research/ime/results/2026-10-26-inventory-lifecycle/validation.json)、[专用 CI 40253727745](https://github.com/JavaZeroo/termforge/actions/runs/40253727745) | 旧 10 秒 AST 夹具及专用 CI 记录启动、AST 和 Job0;原超时根因未确定。诊断增强见 #40 阶段保留,不由一次 CI 成功结项。 |
| 原生 margin 逐字段合同与历史修复候选(#56 仍开放) | [合同、源码与路径](research/conpty-native-margin-path.md)、[独立 oracle](../experiments/conpty/margin_contract.py)、[2026-10-26固定运行](../experiments/conpty/results/2026-10-26-native-margin-path/validation.json) | 当时系统与官方原生 final 仍红,官方80列两次原5秒生命周期失败保留;补丁当时仅可应用。后续真实同源构建/运行另列,不改写旧失败。 |
| 固定源码 ConPTY margin 运行对照(#56 限定实验) | [构建身份、运行与复验](research/conpty-source-margin-runtime.md)、[白名单验证](../experiments/conpty/results/2026-10-27-source-margin-runtime/validation.json) | 同源baseline与patched,原175B两尺寸native red→green;四阶段文本/格属性/光标、末端文本和VT-off反例独立检查,共8次自然退出/EOF/Job0。15个API/身份场景及8个清单拒绝通过;显式样式、历史、resize、完整产品未验,未选择后端。 |
| 源码 ConPTY 主屏与重复切屏对照(#56 限定实验) | [输入、预期与结果](research/conpty-source-margin-controls.md)、[白名单验证](../experiments/conpty/results/2026-10-27-source-margin-controls/validation.json) | 三场景×两尺寸×同源两版共12次;主屏均正确,默认备用屏/重复h/l为具体旧错误→原生全部正确,两版末端最终文字均正确;全部自然退出/EOF/Job0。独立输入不替代原175B,样式/历史/resize及产品未验。 |
| ConPTY 系统/固定官方后端的同源 margin A/B(#41、#47 未关闭) | [合同与第一方来源](research/conpty-margin-backends.md)、[固定 175B 与 16 case 结果](../experiments/conpty/results/2026-10-26-margin-backends/validation.json) | 相同 175B、两网格/两 mode/两 fresh:系统末端 margin 错,固定官方后端的末端正确;CHAR_INFO 仍错。禁用 VT 由窄屏反例拒绝;仅诊断可行性,不证明 PR #50 或 main 联合整合通过。 |
| 实验输入 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、完整后端或性能通过。 |
Expand Down
2 changes: 1 addition & 1 deletion docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
| 显式候选 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.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 及原生样本、[#88 回显完成判据](research/workspace-restore-transport-oracle.md)的原保存/恢复/钳制分别通过;[#87 完整记录检查点](research/workflow-record-checkpoint.md)有受控旧红/新绿及最终同源码两轮原八会话 data-only。最新官方完整回归 56/57、8 项内部 skip,[Vim #52](https://github.com/JavaZeroo/termforge/issues/52)仍红,[MSYS输入边界](research/vim-msys-input-boundary.md)已定位捕获样本的Ctrl-O丢失位置,后续[隔离运行库补丁](research/vim-msys-runtime-prototype.md)在重建基点red后原方法四轮通过;正式固定运行库验收未完成,[#63 工作区残尾](research/workspace-native-viewport.md)已由同EXE单变量与运输回放确认现有viewport修复覆盖,原UI/主区三轮重复两批及完整shell通过;更早缺运输样本保留未知。[#53 UI fence](research/ui-paste-fence.md)与[行键复用/关闭回复](research/resize-replay-cost.md)、[#62 worker 夹具](research/sender-fence.md)各自限定通过。终端 margin 与原生状态分列,#47 及完整后端仍开放;旧失败和历史运输缺口保留 |

另有默认关闭的[源码 ConPTY margin 探针实验](research/conpty-source-margin-runtime.md):固定同源 baseline/patched 对照在原175B两尺寸取得原生四阶段 red→green,VT-off反例保持一致。它只构建独立探针,尚未成为产品后端;样式、历史、resize及完整合同仍由 #56/#41 跟踪。
另有默认关闭的[源码 ConPTY margin 探针实验](research/conpty-source-margin-runtime.md):固定同源 baseline/patched 对照在原175B两尺寸取得原生四阶段 red→green,VT-off反例保持一致。后续[主屏与重复切屏对照](research/conpty-source-margin-controls.md)以独立输入完成12次原生/末端验证,补充默认备用屏区域和重复h/l的限定证据。它只构建独立探针,尚未成为产品后端;样式、历史、resize及完整合同仍由 #56/#41 跟踪。

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

Expand Down
44 changes: 44 additions & 0 deletions docs/research/conpty-source-margin-controls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# 源码 ConPTY:主屏与重复切屏的原生对照

同源 margin 补丁在三个补充场景中符合预先固定的结果:主屏单独滚动保持正确;新建或再次进入备用屏使用默认全屏滚动区域;返回主屏和重复离开备用屏后恢复原来的 `2;3r`。未修补版在后两个场景出现具体预期错误,修补版通过全部原生阶段。实际运输的最终主屏在两版中均正确,不能用末端正确掩盖原生错误。

这是 [#56](https://github.com/JavaZeroo/termforge/issues/56) 的独立补充实验。预期依据是既有 R2 每缓冲区 margin 合同和固定上游状态路径,运行前已记录在 issue;WindTerm 2.7.0 对这些场景的实际行为仍未知。本结果不验收 WindTerm 等价、不选择产品后端,也不关闭 #56/#41。

## 固定输入与观测边界

沿用[原 175B 对照](conpty-source-margin-runtime.md)的同源 baseline/patched:Terminal `dc8ae365847d41f62d1ebca93815bb00959bc12f`、构建 run `40449292015` 和已审核的双文件 SHA、variant/summary/patch receipt。本次未修改上游补丁或重新构建上游。

三个场景各在 `80×24`、`12×7` 下运行 baseline/patched 一次,共 12 次,只开 VT;无自动重试。输入由独立 controls 探针发送,原 175B、四阶段 probe/oracle 和既有期限不变。新场景使用 `CTRL_DONE`,字节数与原负载分列。

| 场景 | 80×24 / 12×7 字节数 | 运行前固定的原生预期 | 未修补版实际结果 | 修补版实际结果 |
|---|---:|---|---|---|
| `main-only` | 99 / 99 | 无备用屏;主屏 `2;3r` 滚动,区域外不变 | before/final 均正确 | before/final 均正确 |
| `default-alt` | 150 / 149 | 主屏区域不传给新备用屏;物理底部换行应全屏滚动;返回后仍为主屏区域 | alt 未全屏滚动:保留 `ALT_TOP`,`ALT_LAST` 被覆盖;其余阶段正确 | before/alt/restored/final 全部正确 |
| `repeat-alt` | 221 / 220 | alt1 的 `4;5r` 不传给再次创建的 alt2;两次离开后主屏仍为 `2;3r` | alt2 同样未全屏滚动;final 出现 `REGION_CIXED`;其余阶段正确 | before/alt1/alt2/restored/final 全部正确 |

每个阶段分别检查 `ReadConsoleOutputCharacterW` 文本、完整 `CHAR_INFO` 字符/属性、光标及 viewport top。预期为字面值,不使用候选 parser 生成;baseline 必须符合上述具体旧状态,异常、生命周期失败或其他文字错误均不计为有效反例。没有设置 SGR,属性检查只证明初始属性保持。

12 次都自然退出 37、读端 EOF 109,creation flags=0,内层子进程清零,外层 Job 为 active0/total4/terminated0,无强制取消。每次仍为 5 秒 child wait、15 秒外期限、共享 5 秒 cleanup;离线候选回放另由既有 trace 入口管理。两版实际运输的最终文字和 alternate=false 均符合预期;没有观测末端逐阶段光标、属性或实际呈现。

## 源码、构建与验证身份

- 本地实际运行源码 `edec26bb3c4d04858a667a96debf69c139476172`,工作树干净;参与文件 SHA、探针、trace、输入、运输、每阶段捕获及监督记录 SHA 见[脱敏清单](../../experiments/conpty/results/2026-10-27-source-margin-controls/validation.json)。
- Windows 11 x64 build 26200;VS17 / MSVC 19.42.34433 / SDK 26100,Release x64。controls 探针 SHA `a71c94795806a40062ace7788ee69cfbac0cd8a274765dce6b28aa6d7f33c7ee`;`.5` trace SHA `5941d4569d0ae146eb005f12ecfb15014bc06c18ee48d1c9460824ab65df93d3`。
- 新旧 margin 判据与 GO/回收回归 17/17,通过耗时 0.375 秒;原 loader/API/清理回归 14/14、零跳过,1.020 秒。后者复用前一批相同源码的原探针 EXE,运行本次修改后的 Python supervisor;不冒充重新编译原探针。两个实际 stdout 日志均保存在本地并记录 SHA,时长仅为测试诊断。
- `TERMFORGE_BUILD_SOURCE_CONPTY_EXPERIMENT` 仍默认 OFF;新增 `conpty_source_margin_controls` 独立目标。仅 supervisor 增加可选参数和期限,既有 API 调用默认仍为 20 秒。纯 controls 判据纳入 Windows/Linux CTest,不依赖 native DLL;原生矩阵需显式运行。

私有原件位于 `local/r56-margin-controls/matrix-1`;公开清单仅含合成场景结果、必要身份和文件哈希,不包含绝对路径、原生二进制、原始运输或用户状态。

## 复验与剩余范围

先按[源码构建说明](../../experiments/conpty/upstream/README.md)取得并审核固定 run 的 baseline/patched。使用全新的输出目录:

```powershell
cmake -S . -B local/source-controls-build -A x64 -DTERMFORGE_BUILD_SOURCE_CONPTY_EXPERIMENT=ON -DTERMFORGE_BUILD_CANDIDATE_ADAPTER=OFF -DTERMFORGE_CONPTY_BACKEND_DIR= -DBUILD_TESTING=OFF
cmake --build local/source-controls-build --config Release --target conpty_source_margin_controls --parallel 2
cargo +1.92.0 build --manifest-path experiments/candidates/alacritty/Cargo.toml --locked --release --bin termforge-alacritty-trace
python -m experiments.conpty.source_margin_controls --baseline local/source-baseline --patched local/source-patched --probe local/source-controls-build/bin/Release/conpty_source_margin_controls.exe --candidate-trace experiments/candidates/alacritty/target/release/termforge-alacritty-trace.exe --output local/source-controls-new
python -m unittest experiments.conpty.test_margin_controls -v
```

本次只补无备用屏、默认备用屏区域、重复 h/l 的真实交叉。显式样式、非零光标保存恢复、历史隔离/压力、resize、查询/API 写入、完整产品工作流、性能及维护升级仍未验证;原 175B 的 VT-off 证据属于前一批,不能合并成同批更大矩阵。原系统/官方失败、#52、#97 和 #99 的独立失败继续保留。正式方案仍由 #34 提交证据及取舍,经用户确认后生效。
4 changes: 2 additions & 2 deletions docs/research/conpty-source-margin-runtime.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

## 隔离入口与身份拒绝

`TERMFORGE_BUILD_SOURCE_CONPTY_EXPERIMENT` 默认 OFF,仅建立 `conpty_source_margin_probe` 与 `conpty_source_backend_probe`,不能与产品 `TERMFORGE_CONPTY_BACKEND_DIR` 同时启用。只有这两个目标编译新的 source factory;默认及官方 factory 仍严格接受各自原身份。产品 bundle、默认后端和 PR #50 的固定官方配置均未切换。
`TERMFORGE_BUILD_SOURCE_CONPTY_EXPERIMENT` 默认 OFF,本次使用 `conpty_source_margin_probe` 与 `conpty_source_backend_probe`;后续[补充对照](conpty-source-margin-controls.md)另增加 `conpty_source_margin_controls`。只有这三个独立目标编译 source factory,不能与产品 `TERMFORGE_CONPTY_BACKEND_DIR` 同时启用;默认及官方 factory 仍严格接受各自原身份。产品 bundle、默认后端和 PR #50 的固定官方配置均未切换。

source factory 只允许表中两个 SHA 对,分别报告 `source-dc8-r56-baseline-run40449292015` / `source-dc8-r56-patched-run40449292015`。Python 入口另核对原始 summary、patch、精确 variant 字段与类型、文件大小和 SHA;布尔值不能以 0/1 代替。DLL 与 EXE 在加载期间保持只读共享句柄;create/resize/close 使用同一模块,模块存活至会话和子进程回收之后。

Expand Down Expand Up @@ -63,6 +63,6 @@ python -m experiments.conpty.source_margin_run --baseline local/source-baseline
python -m experiments.conpty.source_backend_check --baseline local/source-baseline --patched local/source-patched --official local/official-conpty-1.25 --probe-directory local/source-margin-build/bin/Release --output local/source-backend-new
```

待补无备用屏、重复 h/l、默认 margin、非零光标和显式样式、历史隔离、resize、查询及 API 写入的真实交叉;上游 focused 测试虽覆盖重复 h/l,不能代替这些原生运行。之后仍需实际产品联合源码、支持平台、资源与维护/升级验证,并由 #34 提出正式方案供用户确认。
无备用屏、重复 h/l、默认 margin 的后续 12 次[原生补充对照](conpty-source-margin-controls.md)已单独记录,不更改或扩充本批 175B 结果。非零光标和显式样式、历史隔离、resize、查询及 API 写入仍待真实交叉;之后还需实际产品联合源码、支持平台、资源与维护/升级验证,并由 #34 提出正式方案供用户确认。

独立的 [#97 candidate-scroll 退出超时](https://github.com/JavaZeroo/termforge/issues/97)发生于 parent `5c073e4` 的 candidate/system push CI:正确末帧已经产生,但原 20 秒期限未自然结束。它不是本 175B 输入,同 HEAD 的其他 CI 成功不能覆盖该失败;此处的源构建修补也不构成其因果修复。原官方 80 列 5 秒失败、Vim #52、完整 R2、WindTerm 行为等价、性能与实际呈现均没有由本实验验收。
Loading