diff --git a/docs/EVIDENCE.md b/docs/EVIDENCE.md index a323d875..d9de9efc 100644 --- a/docs/EVIDENCE.md +++ b/docs/EVIDENCE.md @@ -80,6 +80,7 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分 | 系统 ConPTY resize 后的客户端尺寸回复(#145 未关闭) | [有界重复采样](../experiments/conpty/results/2026-10-29-resize-reply-r145/README.md)、[固定验证身份](../experiments/conpty/results/2026-10-29-resize-reply-r145/validation.json) | 新增 tag 化探针:hosted 2000 次交替 resize + 500 次全新会话、本机 200 + 100,均无陈旧回复,buffer/window 无分歧,resize VT 全部先于回复,回复中位 8.7–16.1ms。只否定“resize 后立即查询存在必然竞态”;原两条 CI 失败、原始探针/5 秒等待与 #145/#38 状态不变。 | | 原生命周期探针重复与控制台测试后采样(#145 未关闭) | [固定结果](../experiments/conpty/results/2026-10-29-probe-repeat-r145/README.md)、[验证身份](../experiments/conpty/results/2026-10-29-probe-repeat-r145/validation.json) | 隔离重复 40×4=160 会话 0 红;先跑 conpty_ctrl_c/conpty_margin 后采样 20×4=80 会话,1 红但 resize 回复正确(resized=1、120x40、exit 37),原因是会话后线程基线 4→6 超过 1s 结算窗口。旧尺寸回复仍未复现;该线程稳态红归 #38 族,不并入 #145 根因。 | | 持续 cmd 输出与原始 Ctrl-C 回归(#36 未关闭) | [受监督入口](../experiments/conpty/README.md#持续-cmd-输出与-ctrlc-独立回归)、[三次 fresh 公开记录及本地字节复核](../experiments/conpty/results/2026-10-26-ctrl-c-retest/validation.json) | 原百万次输出、单次 ETX、五秒期限和退出 37 保留;三次 fresh 原始字节/Job0 本地重算。后续成功未解释历史失败,未改产品 Ctrl-C 路径。 | +| WSL 尺寸标记观察窗口(#80 未关闭,stage 5 支线已修) | [成因与修法记录](../experiments/shell/results/2026-10-31-wsl-size-window/README.md)、[固定验证记录](../experiments/shell/results/2026-10-31-wsl-size-window/validation.json) | 失败作业 124536048854 的 185B 窗口含命令回显 + `ESC[10;1H` + 标记;oracle 的三条 CUP 合同禁止把该定位当边界,故改为在场景层重开观察窗口。修前该作业红在 stage 5、修后同一回归绿,差异仅一处。**不构成本项原始 hosted stage-6 事件的因果证据**,故 #80 保持开放 | | 持续输出中断的原失败记录 | [#36](https://github.com/JavaZeroo/termforge/issues/36)、[ConPTY 输入机制研究](research/conpty-ctrl-c-input.md)、[原 R1 历史证据](../experiments/shell/results/2026-10-23-r1-foundations/validation.json) | 原 Windows 11 回归中的 normal/resize 超时与 ETW/插桩观察;调试扰动及管道读完成缺口保留。不是当前全套结果,后续未复现不能抹去此失败。 | | controller B 正常结束后 cmd 退出未验收(#44) | [原失败脱敏记录](../experiments/shell/results/2026-10-26-controller-exit/validation.json)、[新退出诊断及有界重放](../experiments/shell/results/2026-10-26-controller-exit-observation/validation.json)、[关闭合同](https://github.com/JavaZeroo/termforge/issues/44) | 原 child 收完 32B、退出 0/join/Job0;cmd 只留下 close 后 0xC000013A,close 前未知。新观察分列输入、wait、pre-close 与清理;多轮未复现不构成历史修复,继续阻塞 #38。 | | 原 10 秒纯夹具超时的阶段保留(#40 未关闭) | [限定合同](research/inventory-timeout-checkpoints.md)、[正常与受控超时对照](../research/ime/results/2026-10-26-inventory-timeout-checkpoints/validation.json) | 保持原 10 秒期限;超时后保留有界阶段、原异常和回收。受控挂起对照已通过,但历史 CI 的阶段/根因仍未知,#40 不因此关闭。 | diff --git a/experiments/shell/results/2026-10-31-wsl-size-window/README.md b/experiments/shell/results/2026-10-31-wsl-size-window/README.md new file mode 100644 index 00000000..dbb2b932 --- /dev/null +++ b/experiments/shell/results/2026-10-31-wsl-size-window/README.md @@ -0,0 +1,42 @@ +# WSL 尺寸标记观察窗口:成因与修法(#80) + +## 现象 + +`ui-shells` 场景在 stage 5(四会话尺寸就绪验证)超时,`shells-size-readiness.jsonl` 里三个会话 `transport_completed=true`,**只有 wsl 为 false**(`observed_output_tail_bytes=185`)。 + +## 观察窗口原文 + +失败作业 124536048854(run 41200805448)的 artifact 中,`shells-transport-probe.jsonl` 记录了判定窗口: + +``` +window_bytes = 185 +解码: " ESC[?1004h ESC[?25l /mnt/d/a/termforge/termforge/build/bin/Release/shell_size_client.exe" + ESC[10;1H ← conhost 把 helper 的 CRLF 渲染成绝对定位 + TF_SIZE_54x12 CRLF + TF> +``` + +即:命令回显与标记落在同一条记录里,中间只有一个 CUP。 + +## 为什么不能改 oracle + +`transport_completion_test.cpp` 有三条合同用例明确要求带 `ESC[6;1H`/`ESC[7;1H` 的回显前缀**不得**被当作换行(`CUP cannot discard an echo prefix to invent marker output` 等)。把 CUP 当边界会直接违反它们。 + +## 修法(已合并) + +在场景层让窗口变干净,而不是让判定变宽松:`workspace_shells_scenario.hpp` 的 `sizes_ready()` 中,当窗口含 `shell_size_client`(回显已完成)但**不含 marker**(标记未到)时,重新 `begin_output_observation()`。两个条件同时成立才重开,避免标记已到却被清掉。 + +## 修前/修后对照 + +| 版本 | Windows 回归结果 | +|---|---| +| 修前(同内容,不含窗口修复) | 红:`workspace-failure mode=ui-shells stage=5` | +| 修后(含 #290) | 绿 | + +两次运行差异只有窗口重开逻辑一处。 + +## 限制 + +- 只覆盖四会话 + 固定尺寸这一配置; +- 未取得修后运行的 `shells-size-readiness.jsonl`(该文件只在失败产物里),因此 wsl 行是否变为 `true` 未直接观测; +- 本项 #80 的原始 hosted stage-6 事件仍未复现,本记录不构成其因果证据。 diff --git a/experiments/shell/results/2026-10-31-wsl-size-window/validation.json b/experiments/shell/results/2026-10-31-wsl-size-window/validation.json new file mode 100644 index 00000000..ac781a2b --- /dev/null +++ b/experiments/shell/results/2026-10-31-wsl-size-window/validation.json @@ -0,0 +1,36 @@ +{ + "schema": "termforge-wsl-size-window-validation-v1", + "issue": 80, + "evidence": { + "failing_job": 124536048854, + "failing_run": 41200805448, + "artifact": "failure-windows-2025", + "probe_row": { + "role": "wsl", + "marker": "TF_SIZE_54x12", + "window_bytes": 185, + "transport_completed_expected_false": true + }, + "readiness_rows": { + "cmd": true, + "pwsh": true, + "powershell": true, + "wsl": false + } + }, + "mechanism": "command echo and size marker share one record separated only by CUP; the transport oracle refuses CUP as a line boundary", + "fix": { + "commit_ref": "#290", + "file": "experiments/shell/workspace_shells_scenario.hpp", + "rule": "reopen the observation window when the helper echo is present and the marker is not" + }, + "contrast": { + "before": "workspace-failure mode=ui-shells stage=5", + "after": "regression (windows-2025) success" + }, + "limitations": [ + "single configuration: four sessions, fixed grid", + "post-fix readiness file not retained by passing runs, so wsl transport_completed=true unobserved", + "not causal evidence for the original hosted stage-6 event" + ] +}