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
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 不因此关闭。 |
Expand Down
42 changes: 42 additions & 0 deletions experiments/shell/results/2026-10-31-wsl-size-window/README.md
Original file line number Diff line number Diff line change
@@ -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 事件仍未复现,本记录不构成其因果证据。
Original file line number Diff line number Diff line change
@@ -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"
]
}