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 CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ if(BUILD_TESTING)
if(WIN32)
termforge_add_python_test(research_guards -m unittest discover -s research/tests -v)
termforge_add_python_test(windterm_cmd_contract -m unittest benchmarks.tools.test_windterm_cmd -v)
termforge_add_python_test(windterm_c0_settings_contract -m unittest benchmarks.tools.test_windterm_c0_settings -v)
termforge_add_python_test(receive -m unittest experiments.receive.test_receive -v)
termforge_add_python_test(conpty -m unittest experiments.conpty.test_conpty -v)
termforge_add_python_test(conpty_ctrl_c -m unittest experiments.conpty.test_ctrl_c -v)
Expand Down
54 changes: 54 additions & 0 deletions benchmarks/tools/WINDTERM-C0-SETTINGS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# #133:本地 cmd 实际网格与设置读取诊断

状态:生产源 `28f293a5d2c01954dc8b418a02231603128955a6`、准备 HEAD `b22293f` 经复核后,由 root 监督一次独立实际执行,CLI 已结束、Job 已清理。[结果](results/2026-10-29-c0-settings-reference/README.md)为 partial:producer console 和原版 view 的窗口均读到 120×40,其他 C0 设置仍有未知。[原 false proposal](results/2026-10-29-c0-settings-proposal/plan.json)保持不变;另建的[授权计划](results/2026-10-29-c0-settings-reference/plan.json)与新原件分开绑定,不改旧 #119 证据。

[#133](https://github.com/JavaZeroo/termforge/issues/133) 的父项为 #3,真实前置 #119 已关闭。沿用其 14 行/536B ASCII 全文 oracle、原版本地 cmd→producer、OwnedJob 和非输入 desktop 边界;本项只调查请求配置是否有实际读取路径,不取得完整 C0、历史淘汰或性能验收。

## 静态线索、请求与实际值

下表的默认值来自固定官方资源,是静态线索,均不填入 actual:

| 配置 key | 静态值 | 本次请求 | 请求写入位置 |
|---|---|---|---|
| `window.autoAdjustRowsAndColumns` | true | false | 独立 synthetic `user.sessions` |
| `window.columns` / `window.rows` | 80 / 24 | 120 / 40 | 同上 |
| `window.scrollbackLimit` | 999999 | 10000 | 同上 |
| `text.fontFamily1` | Roboto Mono | Cascadia Mono | 自有副本 `app/global/wind.config` |
| `text.fontSize` | 10 | 12 | 同上 |
| `terminal.autoComplete.enabled` | true | false | 同上 |

官方 `terminal/configs/statusbar.config` 对当前 view 调用 `terminal.activeView()` / `terminal.view()`,并读取 `view.windowRows/windowColumns`。`terminal/configs/session.config` 和 `global/wind.config` 提供上述 key;这不能证明 profile 请求已消费或当前网格为 120×40。

实际取证分开保留:producer 的 console window/buffer 行列与模式;原版 view 的 windowRows/windowColumns;document 的 screenLineCapacity;QWidget 的 geometry、QFont family/pointSizeF/pixelSize。capacity 不替代 PTY rows,QWidget 字体不证明自绘 glyph、真实 fallback 或字体文件身份。Cascadia Mono 缺失时只记录可读返回或 unknown,不安装字体、不调整用户 DPI。

## 受控配置差异

[新 runner](windterm_c0_settings.py)先调用固定 #119 的 `prepare_run()`:完整核对原 4,047 文件清单后才修改自有副本。仅 `global/wind.config` 的三个声明 key 允许变化,其他原发行文件必须逐一保持 SHA 相同;synthetic session 只追加上述四个请求字段。

该 global 文件含 UTF-8 BOM、CRLF 和内联 `//` 注释,不能当严格 JSON 重写。离线准备发现并保留了这个格式事实。补丁仅替换三条唯一匹配行的标量值 token,保留 BOM、注释、空白及其他所有字节。计划固定修改前 SHA 与预计修改后 SHA;执行时再记录实际前后 SHA、逐 key 的带类型旧/请求值、原/配置后完整 manifest SHA 和唯一差异文件集合。离线摘要重新从原始字节计算补丁,核对输出精确相同。

因此身份是**固定二进制及原发行物基线 + 明确的自有配置差异**,不称整个包未改。对其他字段的改动、缺失/重复 key 或格式不符均在启动前拒绝。原始配置文件和副本只留 local,不提交资源内容。

## 独立源与公共 helper

旧 `windterm_cmd.py`、`qt_cmd_diagnostic.js` 保持逐字节不变,SHA 分别为 `e517f8cab36d55e5d4bdda3fc14d4641e5ce6256991af04762dbf43c25961297`、`9ed0d6ee6bd6e82bae6d9a6802690b3b0b83f437c7b20f0333008b5f6c214756`。新 runner 只调用旧工具的公开 workload/producer、全文 oracle、设置投影和清理 helper,不改 base 全局变量或伪装旧 run。

[新原生启动边界](../../research/ui/cmd_owned_launcher.py)仅负责独立 desktop、suspended→Job→resume、公共 REA CLI 等待及最终清理。新 probe 由固定旧 Qt helper 前缀(`function state(){` 之前)与[新 driver](../../research/ui/qt_cmd_settings.js)组成,不复制旧完整 runner。九个实际 source SHA、两个模板 SHA、旧前缀 SHA、组合模板 SHA 均在计划中;运行后另记替换 run_id/thread/目录参数后的完整注入脚本 SHA,离线精确重建比较。

Oracle 输入和 run_id 在计划中预先固定。另建授权计划时可用 `--run-id` 保留已 review 的 nonce 与全部 536B 输入;必须使用新计划文件和唯一输出,不能修改旧 false proposal。producer 仍先发送固定清屏序列后写完整 payload;producer 的计数器不作为终端消费或呈现端点。

## 有界只读发现与出口

新 probe 仅调用已有静态依据的无参 current-view 读取,优先 `activeView()`、再 `view()`;窗口指标只读属性,不调用未知 getter 方法。设置发现限定四个 owner × 七个固定 key,共 28 项属性读取;另对每个 owner 保留最多 128 项外显遍历范围内的 13 名白名单命中。发现函数名不会执行 `getSetting()`、`setting()` 或 `value()`。此限制不保证 QJSEngine 内部枚举耗时,因此没有观测开销结论。

每条实际读取保留 status/type/value。owner 缺失、undefined、非标量、读取异常、类型不符、非有限数值或不可公开字符串均为 null 并保留原因。未知值不替换成请求或静态默认。实际读到其他行列/字体,也按实际返回记录,不改窗口、ROI 或等待预算追求请求值。

最多一次原版执行,REA capture=30 秒、CLI wait=45 秒。原版更早启动并另等 2 秒,准备及回收另计,整程上限为 null。禁止用户输入桌面、剪贴板、个人会话或显示配置操作。执行者需等待 CLI 真正结束及 Job active=0 后再审计。结构/身份失败保留原件和停止,不重跑;配置只部分可读时,合法摘要明确为 `partial-settings-diagnostic`。

公开 CLI 在全部校验完成后才创建输出,只保留完整文本校验结果、合成输入、白名单标量与哈希;原日志、像素、PID、路径、profile 和原资源留 local。producer 按 run_id/负载关联,不声称已独立核验进程祖先。consumer_done/presented_done=null,C0 可见且无遮挡、完整 C0、10000 行淘汰、UTF-8/其他开关全量验证、字体文件/fallback、扰动和性能基线均未知,不关闭 #3/#4。

## 离线验证

[公共测试](test_windterm_c0_settings.py)覆盖严格 14 行 oracle、请求/实际/未知分离、全 manifest 先验、仅三 token 的 BOM/注释字节保留、配置和发现白名单、普通/`-O` CLI 拒绝 false plan 且不创建输出、cmd 元字符提前拒绝,以及合成 WinAPI 边界的 Job-before-resume 和 CLI 异常回收。[合成 QJSEngine 边界](../../research/ui/test_cmd_settings_probe.js)执行实际新读值逻辑,验证有限枚举、异常值抑制和不调用未知方法。

离线新工具普通及 `python -O` 各 14 项通过;旧工具 12 项保持通过,Debug 配置 CTest `windterm_cmd_contract` / `windterm_c0_settings_contract` 2/2 通过;组合注入脚本另经 Node 语法检查。这些工具测试没有启动原版。其后唯一实际执行及独立离线重算见结果;九个生产源、false proposal、正常/优化导出及全部原件保持不变。本项仍不提供完整 C0 或性能通过事实。
93 changes: 93 additions & 0 deletions benchmarks/tools/results/2026-10-29-c0-settings-proposal/plan.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
{
"schema": "termforge.windterm-c0-settings.v1",
"issue": 133,
"execution_authorized": false,
"maximum_original_runs": 1,
"source_base_commit": "28f293a5d2c01954dc8b418a02231603128955a6",
"run_id": "e736ad1ca79c4cfc85d468fdd5e5899e",
"rea_capture_seconds": 30,
"cli_wait_timeout_seconds": 45,
"whole_lifecycle_bound_seconds": null,
"module_sha256": {
"WindTerm.exe": "7b10531dccc7cd614ae559f36f1ef518e0c96335637431b4646354823b2804d0",
"Qt5Core.dll": "8d2ff4ce9096ddccc4f4cd62c2e41fc854cfd1b0d6e8d296645a7f5fd4ae565a",
"Qt5Gui.dll": "5e7d2d41b8b92a880e83b8cc0ca173f5da61218604186196787ee1600956be1e",
"Qt5Widgets.dll": "3788c669d4b645e5a576de9fc77fca776bf516d43c89143dc2ca28291ba14358",
"Qt5Qml.dll": "30035484c81590976627f8face9507caa8581a7dc7630cccf6a8d6de65cab707"
},
"baseline_files_manifest_sha256": "e459adf2f12adb6a1b7f55e66a9da1c22794185e66e848057d21e0c60d669203",
"requested_session": {
"window.autoAdjustRowsAndColumns": false,
"window.columns": 120,
"window.rows": 40,
"window.scrollbackLimit": 10000
},
"requested_global": {
"text.fontFamily1": "Cascadia Mono",
"text.fontSize": 12,
"terminal.autoComplete.enabled": false
},
"static_resource_sha256": {
"global/wind.config": "0a4f02250b855e9209960f934892f30e3b4b800c0c4c80cea3acd8af527ca177",
"terminal/configs/session.config": "e97009e1c57ba17709bc52738c964df18341cfc0c24895f76821b9a6141803cd",
"terminal/configs/statusbar.config": "a4f7df8f9f215eeba227714438c0ee15070cc85921ab1ebd88d991ad4efef25d"
},
"static_config_hints": {
"evidence_kind": "static-only",
"global": {
"text.fontFamily1": "Roboto Mono",
"text.fontSize": 10,
"terminal.autoComplete.enabled": true
},
"session": {
"window.autoAdjustRowsAndColumns": true,
"window.columns": 80,
"window.rows": 24,
"window.scrollbackLimit": 999999
}
},
"expected_configured_global_sha256": "01a5465e6b4dec6567ac4cf3d21df360f09b737f77c0861ec3f250400806081d",
"source_files_sha256": {
"benchmarks/tools/windterm_c0_settings.py": "609614b51f20fd76ba8da0a5cc82bd47c45b8f3715c906050a258e557ed50970",
"research/ui/qt_cmd_settings.js": "b0c008afd2318ae60cdf3a8f3f3cc87cc042db9bb03013c09246ba1a498f866b",
"research/ui/cmd_owned_launcher.py": "20f38736fa14600b5c659d9e14bfb150932639af1326d2bbe04fcfe6cd32c357",
"benchmarks/tools/windterm_cmd.py": "e517f8cab36d55e5d4bdda3fc14d4641e5ce6256991af04762dbf43c25961297",
"research/ui/qt_cmd_diagnostic.js": "9ed0d6ee6bd6e82bae6d9a6802690b3b0b83f437c7b20f0333008b5f6c214756",
"research/ui/launch.py": "6970e0d4f2fe5e7ec4827df7aa1026cd0e74aeb828cdc9b7a0b42b3c887eb4e6",
"research/ui/r1_launch.py": "54fb41872c6abcc48242a0938044184854b016785cc13659c66b1bf404da0d8a",
"benchmarks/tools/play.py": "1c83f400d45f94f4d7100c177c7cf42f98d0add037c5d31f232092f4dd6b9fea",
"experiments/conpty/run.py": "c8eef1e36b6d200b2d508cef91eaa5ca79a91fa87c5daf6265b2475c31dce329"
},
"composed_template_sha256": "314e7320146bb3422e4488a41b9af1bc22b52c920b6b73e078d2c0e0761017fc",
"helper_prefix_sha256": "ca8057c1979d700957eceb829e12b2d866c64eff7d3ae04daa9c95abea11299e",
"workload": {
"lines": [
"TF-CMD-BEGIN e736ad1ca79c4cfc85d468fdd5e5899e",
"TF-CMD-000 35f0debf71dd0844cfac4f9d",
"TF-CMD-001 247605d13990f0ed8aec7035",
"TF-CMD-002 06b01e9778fea56e4ef334f1",
"TF-CMD-003 a05831d81fe13dac18746dbb",
"TF-CMD-004 1e2f6b1e2d6156984fd38e68",
"TF-CMD-005 8f66fae705ec7fc7c0a8b766",
"TF-CMD-006 54bf94fa52a55e12489c166b",
"TF-CMD-007 740d7c69a480613408434292",
"TF-CMD-008 febc0660156a697069d422b9",
"TF-CMD-009 e658d25af22aefd3ada53833",
"TF-CMD-010 6e781bafc07a68895a2674b4",
"TF-CMD-011 8cb1e7d5def3ce44b479e072",
"TF-CMD-END e736ad1ca79c4cfc85d468fdd5e5899e"
],
"payload_hex": "54462d434d442d424547494e2065373336616431636137396334636663383564343638666464356535383939650d0a54462d434d442d303030203335663064656266373164643038343463666163346639640d0a54462d434d442d303031203234373630356431333939306630656438616563373033350d0a54462d434d442d303032203036623031653937373866656135366534656633333466310d0a54462d434d442d303033206130353833316438316665313364616331383734366462620d0a54462d434d442d303034203165326636623165326436313536393834666433386536380d0a54462d434d442d303035203866363666616537303565633766633763306138623736360d0a54462d434d442d303036203534626639346661353261353565313234383963313636620d0a54462d434d442d303037203734306437633639613438303631333430383433343239320d0a54462d434d442d303038206665626330363630313536613639373036396434323262390d0a54462d434d442d303039206536353864323561663232616566643361646135333833330d0a54462d434d442d303130203665373831626166633037613638383935613236373462340d0a54462d434d442d303131203863623165376435646566336365343462343739653037320d0a54462d434d442d454e442065373336616431636137396334636663383564343638666464356535383939650d0a",
"payload_bytes": 536,
"sha256": "2bf0d9bc3e5b296fb7484c8cca86491d6c307f054b43cd37b81845d8b612b7d8"
},
"scope": "Non-input-desktop small-cmd settings read diagnostic, not C0 visibility, history eviction, terminal timing or performance acceptance",
"actual_original_runs": 0,
"actual_settings": null,
"consumer_done": null,
"presented_done": null,
"c0_verified": false,
"history_eviction_verified": false,
"performance_gate": "not_evaluated",
"private_plan_sha256": "e8813242dd87c001b03b63dc42690c2996ae5d127ac7ed399394abeb6c51cb18"
}
Loading