From 06bf6b5cf4c5f7457cbb02355aa4971276c2b581 Mon Sep 17 00:00:00 2001 From: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com> Date: Mon, 26 Oct 2026 23:28:54 +0800 Subject: [PATCH 1/5] perf: reuse row keys during resize replay reconciliation (#53) --- experiments/core/candidate_terminal.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/experiments/core/candidate_terminal.cpp b/experiments/core/candidate_terminal.cpp index cc12246e..9bb1fab8 100644 --- a/experiments/core/candidate_terminal.cpp +++ b/experiments/core/candidate_terminal.cpp @@ -86,12 +86,11 @@ std::string replay_key(const Line& line) { template std::vector replay_keys(const History& history, const Lines& lines) { std::vector result; - const auto append = [&](const Line& line) { - auto key = replay_key(line); - if (!key.empty()) result.push_back(std::move(key)); - }; - for (const auto& line : history) append(line); - for (const auto& line : lines) append(line); + result.reserve(history.size() + lines.size()); + // Keep empty entries aligned with their rows so reconciliation can reuse + // each serialization while scanning the original and incoming order. + for (const auto& line : history) result.push_back(replay_key(line)); + for (const auto& line : lines) result.push_back(replay_key(line)); return result; } } // namespace @@ -150,17 +149,18 @@ std::unordered_set CandidateTerminal::reconcile_replay(std::vector{}, retained); std::unordered_map old_counts, new_counts; - for (const auto& key : expected) ++old_counts[key]; - for (const auto& key : actual) ++new_counts[key]; + for (const auto& key : expected) if (!key.empty()) ++old_counts[key]; + for (const auto& key : actual) if (!key.empty()) ++new_counts[key]; std::vector origin; origin.insert(origin.end(), source.history.begin(), source.history.end()); origin.insert(origin.end(), source.lines.begin(), source.lines.end()); std::unordered_set mapped; size_t origin_index = 0; - for (auto& line : retained) { - const auto key = replay_key(line); + for (size_t index = 0; index < retained.size(); ++index) { + auto& line = retained[index]; + const auto& key = actual[index]; if (key.empty() || old_counts[key] != 1 || new_counts[key] != 1) continue; - while (origin_index < origin.size() && replay_key(origin[origin_index]) != key) ++origin_index; + while (origin_index < origin.size() && expected[origin_index] != key) ++origin_index; if (origin_index == origin.size()) break; line.id = origin[origin_index].id; line.version = origin[origin_index].version; From eae4b6a4ef3e044ebfebbbbfeccf9aec74cd7f0d Mon Sep 17 00:00:00 2001 From: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com> Date: Mon, 26 Oct 2026 23:45:37 +0800 Subject: [PATCH 2/5] fix: stop terminal replies while closing input (#53) --- CMakeLists.txt | 12 +- .../shell/candidate_reply_close_test.cpp | 110 ++++++++++++++++++ experiments/shell/shell.cpp | 5 +- 3 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 experiments/shell/candidate_reply_close_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f29e609..2454a7b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,6 +247,16 @@ if(BUILD_TESTING) add_test(NAME candidate_title COMMAND candidate_title_test) set_tests_properties(candidate_title PROPERTIES TIMEOUT 35 ENVIRONMENT "TERMFORGE_TEST_ARTIFACTS=${PROJECT_BINARY_DIR}/test-artifacts") + if(TERMFORGE_CONPTY_BACKEND_DIR) + add_executable(candidate_reply_close_test experiments/shell/candidate_reply_close_test.cpp experiments/shell/shell_launch.cpp) + termforge_warnings(candidate_reply_close_test) + target_compile_definitions(candidate_reply_close_test PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE) + target_link_libraries(candidate_reply_close_test PRIVATE termforge_core d2d1 dwrite gdi32 user32 imm32 ole32 oleaut32 uuid bcrypt) + termforge_candidate_shell(candidate_reply_close_test) + add_dependencies(candidate_reply_close_test termforge_shell_assets) + add_test(NAME candidate_reply_close COMMAND candidate_reply_close_test) + set_tests_properties(candidate_reply_close PROPERTIES TIMEOUT 30) + endif() endif() add_dependencies(runtime_observation_test termforge_shell_assets) add_test(NAME runtime_observation COMMAND runtime_observation_test) @@ -374,7 +384,7 @@ endif() if(WIN32) foreach(target termforge_conpty_probe conpty_ctrl_c_probe conpty_margin_probe conpty_backend_probe real_app_capture termforge_shell workflow_fixture_test shell_queue_probe shell_paste_probe - runtime_observation_test candidate_title_test raw_console_receiver_test) + runtime_observation_test candidate_title_test candidate_reply_close_test raw_console_receiver_test) if(TARGET ${target}) termforge_use_conpty_backend(${target}) endif() diff --git a/experiments/shell/candidate_reply_close_test.cpp b/experiments/shell/candidate_reply_close_test.cpp new file mode 100644 index 00000000..1a5e0149 --- /dev/null +++ b/experiments/shell/candidate_reply_close_test.cpp @@ -0,0 +1,110 @@ +// Exercise the real receive -> parser -> reply route while closing the input +// side. The existing owned desktop/Job supervises the window and console child. +#define WinMain included_shell_entry +#include "shell.cpp" +#undef WinMain +#include "ime_desktop_process.hpp" + +namespace { +template +void reply_wait(Predicate predicate, const char* detail) { + const auto deadline = GetTickCount64() + 3000; + while (!predicate()) { + require(GetTickCount64() < deadline, detail); + Sleep(1); + } +} + +int reply_client(const wchar_t* name) { + BOOL owned = FALSE; + require(IsProcessInJob(GetCurrentProcess(), nullptr, &owned) && owned, "reply client requires owned Job"); + const std::wstring prefix(name); + const auto open = [&](const wchar_t* suffix) { + return tf_conpty::Handle(OpenEventW(SYNCHRONIZE | EVENT_MODIFY_STATE, FALSE, (prefix + suffix).c_str())); + }; + auto ready = open(L"-ready"), release = open(L"-release"), written = open(L"-written"); + require(ready.get() && release.get() && written.get(), "reply client gates unavailable"); + DWORD mode = 0; + const auto output = GetStdHandle(STD_OUTPUT_HANDLE); + require(GetConsoleMode(output, &mode) && SetConsoleMode(output, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING), + "reply client output mode failed"); + require(SetEvent(ready.get()), "reply client ready failed"); + require(WaitForSingleObject(release.get(), 3000) == WAIT_OBJECT_0, "reply client release deadline"); + constexpr char bytes[] = "TF_REPLY_CLOSE_READY\r\n\x1b[6n"; + DWORD count = 0; + require(WriteFile(output, bytes, sizeof(bytes) - 1, &count, nullptr) && count == sizeof(bytes) - 1, + "reply client query write failed"); + require(SetEvent(written.get()), "reply client written signal failed"); + // The parent owns cancellation; do not let a natural child exit precede it. + Sleep(10000); + return 2; +} + +int reply_window_case() { + require(tf_shell::is_ime_desktop_child(), "reply test requires owned non-input desktop"); + BOOL owned = FALSE; + require(IsProcessInJob(GetCurrentProcess(), nullptr, &owned) && owned, "reply test requires owned Job"); + require(SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2), "reply test DPI setup failed"); + const auto prefix = L"Local\\TermForgeReply-" + std::to_wstring(GetCurrentProcessId()) + L"-" + std::to_wstring(GetTickCount64()); + const auto create = [&](const wchar_t* suffix) { + const auto event = CreateEventW(nullptr, TRUE, FALSE, (prefix + suffix).c_str()); + const auto error = GetLastError(); + if (!event || error == ERROR_ALREADY_EXISTS) { + if (event) CloseHandle(event); + throw std::runtime_error("reply gates must be fresh"); + } + return event; + }; + tf_conpty::Handle ready(create(L"-ready")), release(create(L"-release")), written(create(L"-written")); + ShellWindow window("", ""); + window.enable_runtime_observation(); window.begin_output_observation(); + tf_shell::ShellLaunch launch; + wchar_t path[32768]{}; + const auto path_size = GetModuleFileNameW(nullptr, path, 32768); + require(path_size && path_size < 32768, "reply fixture executable path unavailable"); + launch.id = L"reply-close"; launch.executable.assign(path, path_size); + launch.arguments = L"--reply-client \"" + prefix + L"\""; + window.create(nullptr, launch); + require(WaitForSingleObject(ready.get(), 3000) == WAIT_OBJECT_0, "reply console ready deadline"); + const auto before = window.runtime_snapshot(); + require(SetEvent(release.get()), "reply release failed"); + require(WaitForSingleObject(written.get(), 3000) == WAIT_OBJECT_0, "reply console write deadline"); + reply_wait([&] { return window.runtime_snapshot().output.queued_bytes > before.output.queued_bytes; }, + "reply transport receive deadline"); + require(window.runtime_snapshot().consumed_bytes == 0, "query must remain unparsed before close"); + window.close(); + reply_wait([&] { return window.runtime_snapshot().input.stopping; }, "reply input stop deadline"); + const auto deadline = GetTickCount64() + 5000; + while (IsWindow(window.handle())) { + require(GetTickCount64() < deadline, "reply window cleanup deadline"); + MSG message{}; + for (int count = 0; count < 256 && PeekMessageW(&message, nullptr, 0, 0, PM_REMOVE); ++count) { + TranslateMessage(&message); DispatchMessageW(&message); + } + MsgWaitForMultipleObjects(0, nullptr, FALSE, 1, QS_ALLINPUT); + } + const bool query = window.observed_output().find("\x1b[6n") != std::string::npos; + const auto final = window.runtime_snapshot(); + std::cout << "{\"query_consumed_after_close\":" << (query ? "true" : "false") + << ",\"consumed_bytes\":" << final.consumed_bytes + << ",\"input_stopping\":" << (final.input.stopping ? "true" : "false") + << ",\"input_rejected\":" << final.input.rejected << "}\n"; + const auto result = window.collect(); + require(query && window.live_contains_line("TF_REPLY_CLOSE_READY") && final.consumed_bytes > 4 && + final.input.stopping && final.input.rejected == 0 && result.complete && result.active_children == 0, + "closing input must drain the real query without attempting a reply"); + return 0; +} +} + +int main(int argc, char** argv) { + try { + if (argc == 3 && std::string(argv[1]) == "--reply-client") return reply_client(utf16(argv[2]).c_str()); + if (argc == 2 && std::string(argv[1]) == "--owned-desktop-child") return reply_window_case(); + require(argc == 1, "unexpected reply test arguments"); + for (int round = 0; round < 2; ++round) + require(tf_shell::run_ime_desktop_child(12000) == 0, "owned candidate closing reply failed"); + std::cout << "{\"closing_reply\":\"passed\",\"owned_job_zero\":true,\"desktop_deleted\":true}\n"; + return 0; + } catch (const std::exception& error) { std::cerr << error.what() << '\n'; return 1; } +} diff --git a/experiments/shell/shell.cpp b/experiments/shell/shell.cpp index cd112860..90b3f166 100644 --- a/experiments/shell/shell.cpp +++ b/experiments/shell/shell.cpp @@ -766,7 +766,10 @@ class ShellWindow { for (const auto& event : parser_.take_events()) { switch (event.kind) { case 1: - if (!event.bytes.empty()) require(input_.send(event.bytes), "terminal reply rejected by input queue"); + // Closing stops input before the remaining output is drained. + // Queries in that output no longer have a live input peer. + if (!closing_ && !event.bytes.empty()) + require(input_.send(event.bytes), "terminal reply rejected by input queue"); break; case 2: terminal_title_ = utf16(event.bytes); break; case 3: terminal_title_.clear(); break; From 848cb0e621a291f732cc0e046d0b2fab6a77d962 Mon Sep 17 00:00:00 2001 From: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com> Date: Tue, 27 Oct 2026 00:05:57 +0800 Subject: [PATCH 3/5] docs: record original eight-session repair and remaining regressions (#53) --- docs/EVIDENCE.md | 2 +- docs/FEATURES.md | 2 +- docs/milestones/R2-local-terminal.md | 2 +- docs/research/resize-replay-cost.md | 36 + docs/research/ui-paste-fence.md | 2 +- .../closing-reply.json | 65 + .../headless-ordinary.json | 376 ++++ .../headless-resize.json | 398 +++++ .../intermediate-workflows.json | 716 ++++++++ .../probe/README.md | 12 + .../probe/headless-instrumentation.patch | 41 + .../probe/ordinary_probe.cpp | 53 + .../probe/probe_timing.hpp | 16 + .../probe/resize_probe.cpp | 54 + .../probe/ui-core-instrumentation.patch | 49 + .../probe/ui-instrumentation.patch | 103 ++ .../probe/ui_timing.hpp | 31 + .../ui-profiles.json | 699 ++++++++ .../validation.json | 1513 +++++++++++++++++ 19 files changed, 4166 insertions(+), 4 deletions(-) create mode 100644 docs/research/resize-replay-cost.md create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/closing-reply.json create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/headless-ordinary.json create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/headless-resize.json create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/intermediate-workflows.json create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/README.md create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/headless-instrumentation.patch create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ordinary_probe.cpp create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/probe_timing.hpp create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/resize_probe.cpp create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui-core-instrumentation.patch create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui-instrumentation.patch create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui_timing.hpp create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/ui-profiles.json create mode 100644 experiments/shell/results/2026-10-26-replay-cost-and-close/validation.json diff --git a/docs/EVIDENCE.md b/docs/EVIDENCE.md index c888f434..a4e1db22 100644 --- a/docs/EVIDENCE.md +++ b/docs/EVIDENCE.md @@ -53,7 +53,7 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分 | 原生 margin 逐字段合同与修复候选(#56 仍开放) | [合同、源码与路径](research/conpty-native-margin-path.md)、[独立 oracle](../experiments/conpty/margin_contract.py)、[固定运行](../experiments/conpty/results/2026-10-26-native-margin-path/validation.json) | 四阶段文字/格属性/光标独立判据;系统与官方原生 final 仍红,官方80列两次原5秒生命周期失败保留。共享单 margin 源码支持小 MIT fork 候选;patch 仅可应用,未编译、未运行、不计修复。 | | 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) | `a15eb7f` 单窗口两轮取消/关闭及真实管道 EOF/无GO负例通过;close 实际cancel唤醒与最终stop分列。原completed red保留;八会话带采样两次、无采样诊断一次仍stage45失败,不能用局部动作或回收关闭#53。 | +| 实验 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 仍开放,未知与受扰动探针分列。 | | 工作区几何与交互的固定记录 | [#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。夹具强制收尾与产品自然退出分列,未知归属/回收仍失败。 | diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 220a9feb..5ecb1828 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -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 sender fence 修复](research/ui-paste-fence.md)已验证两轮3MB/768B取消与关闭及真实EOF/无GO失败出口,但完整八会话仍在后台消费和后续输入阶段超时,不能结项;原 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.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) 回归仍开放 | 以下能力默认指已合并实现;某个配置的通过结果不能转用于另一个配置。R1 的真实系统 CF/拼音验收属于固定自研核心配置,不外推到候选 `.4` 或实验后端联合配置。 diff --git a/docs/milestones/R2-local-terminal.md b/docs/milestones/R2-local-terminal.md index c1677c8a..a1b81700 100644 --- a/docs/milestones/R2-local-terminal.md +++ b/docs/milestones/R2-local-terminal.md @@ -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),完整八会话仍失败,继续按原期限闭合组合出口。#51–#53 可以用原冻结输入独立定位,最终修复验收须在联合配置重建;一次未复现不自动构成因果修复。 +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 可以用原冻结输入独立定位,最终修复验收须在联合配置重建;一次未复现不自动构成因果修复。 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 验收。 diff --git a/docs/research/resize-replay-cost.md b/docs/research/resize-replay-cost.md new file mode 100644 index 00000000..9352fbab --- /dev/null +++ b/docs/research/resize-replay-cost.md @@ -0,0 +1,36 @@ +# 八会话的 resize 重放成本与关闭回复 + +接续 [UI sender fence](ui-paste-fence.md) 的 [#53](https://github.com/JavaZeroo/termforge/issues/53)。候选 `.4` × 显式官方 ConPTY `1.25.260930003`、flags24 在源码 `eae4b6a4ef3e044ebfebbbbfeccf9aec74cd7f0d` 上通过两轮原八会话 **data-only** 合同。修复保留原 3MB 汉字、768B checkpoint、16KiB sender 门槛、后台输出量、UI70秒和 fixture55秒期限。[固定身份与最终回归](../../experiments/shell/results/2026-10-26-replay-cost-and-close/validation.json)与[全部诊断样本](../../experiments/shell/results/2026-10-26-replay-cost-and-close/)分列,不把真实剪贴板/IME、其他构建或整个 R2 算作通过。 + +## 成本定位与有限优化 + +旧源 `8ff112e` 的两次真实八会话插桩仍在 stage45 失败,Job0、desktop 已回收。第一次把约64秒定位到 parser feed;第二次进一步分开内部阶段:parser feed 63.987秒、Rust feed 0.560秒、synchronize 63.420秒,其中 cell export 2.031秒、reconcile_replay 60.905秒。计数是主线程累计的嵌套 wall time,不能相加,也不是实际呈现或输入延迟。两次均关闭资源采样,仅作诊断;[完整计时、源码/二进制身份与原始记录哈希](../../experiments/shell/results/2026-10-26-replay-cost-and-close/ui-profiles.json)保留。 + +普通无 resize 的 headless F1 输入未复现高成本:[2,048,000B 的六样本](../../experiments/shell/results/2026-10-26-replay-cost-and-close/headless-ordinary.json)均满足逐行文字、光标和历史预期,未插桩三次 wall 为0.446–0.486秒。缩小到204,800B后,只在计时前加入一次同尺寸 `resize(17,74)`,未插桩两次从无 resize 的0.046/0.044秒变成0.929/0.969秒;六次最终 screen JSON 哈希全部相同。[全部样本与冻结输入](../../experiments/shell/results/2026-10-26-replay-cost-and-close/headless-resize.json)、[诊断驱动及计时边界](../../experiments/shell/results/2026-10-26-replay-cost-and-close/probe/README.md)可审查。 + +观察与源码共同支持一个有限原因:resize 保留了重放起始屏幕,后续每次同步的 `reconcile_replay` 会反复序列化同一行,查找 origin 时还会再次生成行键。`06bf6b5` 让同次同步生成的 expected/actual 键向量保留空行位置,并直接按索引复用;计数仍跳过空键。键内容、重复行处理、匹配顺序、行 ID/version 映射、重放生命期和历史策略保持原合同。缓存只在一次调用内存在。 + +这些样本来自共享 Windows 11 build26200 宿主,8逻辑核,MSVC19.42 Release x64;headless 只输入 producer 字节,没有 ConPTY 变换或 UI。短样本与插桩均有扰动,不据此计算产品提速比例,也不替代 [#54](https://github.com/JavaZeroo/termforge/issues/54) 的预冻结 `.3/.4` 正式 A/B、用户性能预算或 WindTerm 对标。 + +## 关闭期间仍发送回复的独立错误 + +只完成键复用后的原八会话在27.467秒完成后台消费,35.974秒完成粘贴关闭和后续输入,但退出时因 `terminal reply rejected by input queue` 返回2。额外诊断的两轮分别成功与失败;失败现场为 `closing=1, stopping=1, queued=0, failed=0, paste_busy=0`,回复是 `ESC[4;4R`。这些成功/失败均保留在[中间运行记录](../../experiments/shell/results/2026-10-26-replay-cost-and-close/intermediate-workflows.json),一次成功不消除退出错误。 + +原因是关闭已停止输入队列,剩余输出中的光标位置查询仍经 `route_terminal_events` 发送回复。新增真实 ConPTY 回归先将查询留在 OutputQueue,明确要求尚未消费输出,再关闭并确认输入停止,最后才泵窗口消息。旧代码0.19秒即因输入拒绝失败;`eae4b6a` 仅在 `closing_` 时不再发送回复,两次新进程均实际观察查询、消费65B、解析标记文字、零输入拒绝并完成回收。输出仍解析、排空和发布;正常会话的回复失败仍严格报错。 + +[红绿身份](../../experiments/shell/results/2026-10-26-replay-cost-and-close/closing-reply.json)明确记录夹具变化:绿色版本增加了已解析标记与消费字节断言,未放宽旧条件。测试只注册于候选+显式后端组合,不能据此声明默认/system 配置已验收。 + +## 最终结果与剩余边界 + +最终源码两轮八会话包含资源采样,后台完成时间分别为26.268、27.312秒,粘贴关闭后输入验证分别在34.675、35.808秒完成。每轮26个检查点、五轮6↔8会话、拒绝第9个会话、精确接收字节和18个会话关闭均通过,Job0、desktop已删除。两轮 cancel/close 的动作前均为 sent17391 / accepted18414 / held1023;取消接收18414B,关闭恰768B,in_flight0、retained15。close 的实际唤醒为 cancelled,最终状态为 stopped,二者分列。 + +同源码完整 CTest 为54/56,465.08秒:`candidate_shell_tui` 的六项中 Vim stage59 失败,其余五项通过;`shell` 聚合触及原180秒期限,已记录 resize/resize-close43、main第三轮7、ui第三轮52。聚合中单窗口粘贴两轮和 EOF/无GO反例均已完成并通过;负例的产品运行仍返回2、接收恰768B、Job0/desktopgone,未因清理转绿。未结束的 shell 项不能算通过。 + +内部 skip 也保留:可选 Rust 对比/real-app 工具未构建、托管实际 CF/IME 保护、原版失败注入 opt-in 及私有站点 OpenClipboard 权限失败。CTest 条目通过不表示其中被跳过的场景通过。#51/#52/#63、真实系统剪贴板/IME、实际呈现、长期资源、正式性能及产品核心/后端选型仍需各自完成。自动化使用自有非输入桌面,不要求操作用户窗口。 + +```powershell +cmake --build build/candidate --config Release +ctest --test-dir build/candidate -C Release --output-on-failure +``` + +复验前按贡献指南显式选择 `.4` 与固定官方后端,准备固定 Vim 的测试进程 PATH;结果同时记录二进制/依赖哈希。单独复验关闭查询可用 `ctest --test-dir build/candidate -C Release -R '^candidate_reply_close$' --output-on-failure`。完整回归的失败不会因局部修复通过而被忽略。 diff --git a/docs/research/ui-paste-fence.md b/docs/research/ui-paste-fence.md index f7a0e475..704589d5 100644 --- a/docs/research/ui-paste-fence.md +++ b/docs/research/ui-paste-fence.md @@ -1,6 +1,6 @@ # 未完成 UI 粘贴的确定性取消与关闭 -对应 [#53](https://github.com/JavaZeroo/termforge/issues/53),属于 [#50](https://github.com/JavaZeroo/termforge/pull/50) 的实验后端整合。实现源 `a15eb7f67315fb53c9d66b9c5a4424e13511a311` 的单窗口两轮取消/关闭及控制故障检查通过,**完整八会话仍失败,#53 保持开放**。[固定源码、二进制、原始记录哈希与逐字段结果](../../experiments/shell/results/2026-10-26-ui-paste-fence/validation.json)分列原 red、针对性验证与整体验证,不能互相替代。 +对应 [#53](https://github.com/JavaZeroo/termforge/issues/53),属于 [#50](https://github.com/JavaZeroo/termforge/pull/50) 的实验后端整合。实现源 `a15eb7f67315fb53c9d66b9c5a4424e13511a311` 的单窗口两轮取消/关闭及控制故障检查通过,**该源码的完整八会话仍失败**。后续在 `eae4b6a` 上通过两轮原 data-only 合同,见[行键成本与关闭回复修复](resize-replay-cost.md);本页保留修复前证据。[固定源码、二进制、原始记录哈希与逐字段结果](../../experiments/shell/results/2026-10-26-ui-paste-fence/validation.json)分列原 red、针对性验证与整体验证,不能互相替代。 ## 原失败与修改 diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/closing-reply.json b/experiments/shell/results/2026-10-26-replay-cost-and-close/closing-reply.json new file mode 100644 index 00000000..f3ca2ca5 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/closing-reply.json @@ -0,0 +1,65 @@ +{ + "red_test_note": "Red used the same ordering fixture before strengthening the green marker/consumed-byte assertions; source hashes differ explicitly.", + "native_backend": "candidate .4 plus explicit official ConPTY 1.25.260930003 flags24", + "runs": [ + { + "phase": "red", + "identity": { + "commit": "06bf6b5cf4c5f7457cbb02355aa4971276c2b581", + "files": { + "experiments/shell/candidate_reply_close_test.cpp": "79386c5fe342a959d8f14e0dd1a9d321aa9f6bac93d460532595a31a6b4898af", + "experiments/shell/shell.cpp": "b369968152bbff107c699181d4e23f271e62a5732f0c41793159b3efc3609321", + "experiments/core/candidate_terminal.cpp": "3092ee2ea44ca0f897a7d3b6244c079ba8073dc109993204e435f065388a2ed1", + "CMakeLists.txt": "f5bb85e12b7a815c4feb7417da9ebc5298de58664bcd2792b277cb282729da73", + "build/candidate/bin/Release/candidate_reply_close_test.exe": "7df5ef5ddc896b8fef626ed15cb9c3dbfd4955c93009bf83700e1b9c115e9664" + }, + "result": "query observed after close; stopping=true; rejected=1; terminal reply rejected by input queue" + }, + "log_sha256": "9c2fcbd3c53d9e831cae2d23396d8fe0c46578cf433f6ac3e14bf5f6f8f92baf", + "observations": [ + { + "query_consumed_after_close": true, + "consumed_bytes": 0, + "input_stopping": true, + "input_rejected": 1 + } + ], + "passed": false + }, + { + "phase": "green", + "identity": { + "files": { + "experiments/shell/candidate_reply_close_test.cpp": "453ab888fb57d4f918bcfa583da7167a21463ce185be2a3d67caec74505fc424", + "experiments/shell/shell.cpp": "ac4dd44861aa2928213fffe91d30cdaf3aedf19f08468aefeed22828352296cc", + "experiments/core/candidate_terminal.cpp": "3092ee2ea44ca0f897a7d3b6244c079ba8073dc109993204e435f065388a2ed1", + "CMakeLists.txt": "f5bb85e12b7a815c4feb7417da9ebc5298de58664bcd2792b277cb282729da73", + "build/candidate/bin/Release/candidate_reply_close_test.exe": "662a331701e49885ce56328ae19ddc2166347c5f802d7faa2787eef46e25b000", + "build/candidate/bin/Release/termforge_shell.exe": "9c01fa0577d8fc922d239d8a711ac13d1e4989104aad68795230bfcd998b4eb6" + }, + "result": "two actual owned processes; query observed after input stop; received65B; rejected0; Job0 and desktop deletion" + }, + "log_sha256": "d3e40250906444017e55fc7dc62fa00c7280131f83a521c300547349140a97af", + "observations": [ + { + "query_consumed_after_close": true, + "consumed_bytes": 65, + "input_stopping": true, + "input_rejected": 0 + }, + { + "query_consumed_after_close": true, + "consumed_bytes": 65, + "input_stopping": true, + "input_rejected": 0 + }, + { + "closing_reply": "passed", + "owned_job_zero": true, + "desktop_deleted": true + } + ], + "passed": true + } + ] +} diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/headless-ordinary.json b/experiments/shell/results/2026-10-26-replay-cost-and-close/headless-ordinary.json new file mode 100644 index 00000000..e3db1b60 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/headless-ordinary.json @@ -0,0 +1,376 @@ +{ + "plan": { + "schema": "local-candidate-phase-probe-v1", + "source_commit": "8ff112e785073dde91a74142cf1a3000fa240007", + "files": { + "experiments\\core\\candidate_terminal.cpp": "0d0eaabe5ef896aa7b263c8151622f579f37c421bf9473fc3d69ada010a64e61", + "local\\r53-cost-probe\\instrumented.cpp": "753b5b1c5a9fb1585401dee36fba0722be78038ef6967c713ca61e4334997d12", + "local\\r53-cost-probe\\phase_probe.cpp": "3a39b8b01e97f6ae245a1cb0bd0fc05f8a6cab6e14a5584d6b8b98fdc942ba63", + "local\\r53-cost-probe\\probe_timing.hpp": "a114631fbb6777808a791a3e75c665a0f3b92e1103c2ed91a4e1fb46daed2579", + "local\\r53-cost-probe\\CMakeLists.txt": "a6d0346bdde98988d07f2b594b7ef79f6de9bf1570be0cba573913f9cbb83a6a", + "local\\r53-cost-probe\\f1.bin": "c0d35b68ed7d8147bfa42eb9ea7e8a64ddafef8a786b1b1f42b0b85f179057a4", + "experiments\\candidates\\alacritty\\target\\release\\termforge_alacritty_core.lib": "aa41a9ea5749f3933a0db8bfa41dda68812c68727d47d394fc3edd859973a260" + }, + "workload": { + "role": "F1 producer bytes; no ConPTY transformation", + "bytes": 2048000, + "rows": 17, + "columns": 74, + "history": 100, + "chunk": 8192 + }, + "order": [ + "plain", + "instrumented", + "instrumented", + "plain", + "plain", + "instrumented" + ], + "limitations": [ + "headless, no transport or GUI", + "shared host", + "timers perturb execution", + "diagnostic only, not R54 formal sample or performance budget" + ] + }, + "os": "Windows-11-10.0.26200-SP0", + "logical_cpus": 8, + "power_plan": "电源方案 GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c (高性能)", + "binaries": { + "plain": "be21af65b5017a9277092747843f894321a6b82621a25d0766377258cffb706a", + "instrumented": "0c27682bac6a51ed874d2d3b23f0b4d13de513c2ff0cf8e00f6bb3bd09698680" + }, + "run_script": "b19a723a976751a656a68ce24e1f428e67eb21a76a8fc24b1226bb46d246195a", + "utc_start": "2026-10-26T15:13:52Z", + "samples": [ + { + "mode": "plain", + "returncode": 0, + "outer_seconds": 0.5309999999590218, + "background_cpu_before_percent": 30.0, + "result": { + "bytes": 2048000, + "cpu_ns": 453125000, + "wall_ns": 486336100, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 1, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 2, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 3, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 4, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 5, + "ns": 0, + "max_ns": 0, + "count": 0 + } + ] + }, + "state_sha256": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0" + }, + { + "mode": "instrumented", + "returncode": 0, + "outer_seconds": 0.4690000000409782, + "background_cpu_before_percent": 34.1, + "result": { + "bytes": 2048000, + "cpu_ns": 437500000, + "wall_ns": 430316800, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 70976000, + "max_ns": 655500, + "count": 250 + }, + { + "id": 1, + "ns": 534800, + "max_ns": 26400, + "count": 250 + }, + { + "id": 2, + "ns": 358655700, + "max_ns": 2857500, + "count": 250 + }, + { + "id": 3, + "ns": 33800, + "max_ns": 1400, + "count": 250 + }, + { + "id": 4, + "ns": 295519000, + "max_ns": 2096700, + "count": 250 + }, + { + "id": 5, + "ns": 35803000, + "max_ns": 881800, + "count": 250 + } + ] + }, + "state_sha256": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0" + }, + { + "mode": "instrumented", + "returncode": 0, + "outer_seconds": 0.4839999999385327, + "background_cpu_before_percent": 15.6, + "result": { + "bytes": 2048000, + "cpu_ns": 437500000, + "wall_ns": 448960700, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 72738000, + "max_ns": 724000, + "count": 250 + }, + { + "id": 1, + "ns": 460500, + "max_ns": 12300, + "count": 250 + }, + { + "id": 2, + "ns": 375608200, + "max_ns": 2725500, + "count": 250 + }, + { + "id": 3, + "ns": 27600, + "max_ns": 1300, + "count": 250 + }, + { + "id": 4, + "ns": 312636300, + "max_ns": 1923500, + "count": 250 + }, + { + "id": 5, + "ns": 35133200, + "max_ns": 586600, + "count": 250 + } + ] + }, + "state_sha256": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0" + }, + { + "mode": "plain", + "returncode": 0, + "outer_seconds": 0.4839999999385327, + "background_cpu_before_percent": 28.7, + "result": { + "bytes": 2048000, + "cpu_ns": 421875000, + "wall_ns": 446410900, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 1, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 2, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 3, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 4, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 5, + "ns": 0, + "max_ns": 0, + "count": 0 + } + ] + }, + "state_sha256": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0" + }, + { + "mode": "plain", + "returncode": 0, + "outer_seconds": 0.5160000000614673, + "background_cpu_before_percent": 33.8, + "result": { + "bytes": 2048000, + "cpu_ns": 468750000, + "wall_ns": 478586600, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 1, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 2, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 3, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 4, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 5, + "ns": 0, + "max_ns": 0, + "count": 0 + } + ] + }, + "state_sha256": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0" + }, + { + "mode": "instrumented", + "returncode": 0, + "outer_seconds": 0.546000000089407, + "background_cpu_before_percent": 25.6, + "result": { + "bytes": 2048000, + "cpu_ns": 500000000, + "wall_ns": 496894700, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 80278700, + "max_ns": 1027000, + "count": 250 + }, + { + "id": 1, + "ns": 810600, + "max_ns": 103900, + "count": 250 + }, + { + "id": 2, + "ns": 414892000, + "max_ns": 6602700, + "count": 250 + }, + { + "id": 3, + "ns": 66400, + "max_ns": 6800, + "count": 250 + }, + { + "id": 4, + "ns": 325008500, + "max_ns": 5494600, + "count": 250 + }, + { + "id": 5, + "ns": 51881600, + "max_ns": 1497400, + "count": 250 + } + ] + }, + "state_sha256": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0" + } + ], + "local_raw_identity_sha256": "5fd91a263fb64c2487882aa1c98f35970fbff4eaa97c763c301595f02d81a52a", + "local_raw_files_sha256": { + "00-plain.state.json": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0", + "00-plain.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "00-plain.stdout": "00cc5fd93c82252f6968a348206e7c910ad7265160f1ae515857e9b47f94a3a9", + "01-instrumented.state.json": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0", + "01-instrumented.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "01-instrumented.stdout": "46b812a26f02455cfad72e5253fc1af4436909af5a8880b6e5483da6113aef2a", + "02-instrumented.state.json": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0", + "02-instrumented.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "02-instrumented.stdout": "f2d05c9fa772228c7900a288589d4a3a8ac9a2909595b972e3ca8cb0eec18cdb", + "03-plain.state.json": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0", + "03-plain.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "03-plain.stdout": "a3fe321b8bab4643b8530adf767adb6346a0e17af78ed892cfe0cd1b01d4e2ac", + "04-plain.state.json": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0", + "04-plain.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "04-plain.stdout": "28b8830d041869aa2b13826d5da2a0877a87b9216db31281960de97c712ea33d", + "05-instrumented.state.json": "ecfa1c1b31203793cd40d0d2977910e6fef4df1c9f33ba8d7f65a8eee4364dc0", + "05-instrumented.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "05-instrumented.stdout": "e20225b03b1c861180d2ce4620e1265b97eae88469bc9d39c5715ef0b12540ce", + "identity.json": "5fd91a263fb64c2487882aa1c98f35970fbff4eaa97c763c301595f02d81a52a" + } +} diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/headless-resize.json b/experiments/shell/results/2026-10-26-replay-cost-and-close/headless-resize.json new file mode 100644 index 00000000..bfc3ec00 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/headless-resize.json @@ -0,0 +1,398 @@ +{ + "plan": { + "source_commit": "8ff112e785073dde91a74142cf1a3000fa240007", + "hypothesis": "same-size resize activates replay-origin reconciliation for subsequent ordinary output", + "files": { + "CMakeLists.txt": "fda1598de7e5f379dad96f66cd8a3f7eeaba3f67419a47604debaa523c2fb559", + "f1.bin": "e2639311e8fd54ea2632d4e35efa590d467284b0c3f25ba85875ef0312107580", + "instrumented.cpp": "753b5b1c5a9fb1585401dee36fba0722be78038ef6967c713ca61e4334997d12", + "original.cpp": "0d0eaabe5ef896aa7b263c8151622f579f37c421bf9473fc3d69ada010a64e61", + "phase_probe.cpp": "3e9b7260814772630bb2c32aae56fe3ff293cf46a0320c25146ed1ee59ef5980", + "probe_timing.hpp": "a114631fbb6777808a791a3e75c665a0f3b92e1103c2ed91a4e1fb46daed2579" + }, + "order": [ + [ + "plain", + "plain" + ], + [ + "plain", + "resize" + ], + [ + "instrumented", + "resize" + ], + [ + "instrumented", + "plain" + ], + [ + "plain", + "resize" + ], + [ + "plain", + "plain" + ] + ], + "workload": { + "bytes": 204800, + "records": 3200, + "rows": 17, + "columns": 74, + "history": 100, + "chunk": 8192 + }, + "limitations": [ + "shared host", + "headless diagnostic", + "not R54 formal samples or user budget" + ] + }, + "os": "Windows-11-10.0.26200-SP0", + "logical_cpus": 8, + "power_plan": "电源方案 GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c (高性能)", + "binaries": { + "plain": "e007dae8618944dde2c9c57e05796be9e6f4d68052badfa2690e248dd7d4e90e", + "instrumented": "9b0d14a30f0ae2fdfe649e0e89e9d5ebeb78b6b30291ea7eb7efda374e270a03" + }, + "run_script": "96d11bbf8c6a58859f10673db46bd091df18459f099e99adab48f9b550c48f73", + "utc_start": "2026-10-26T15:26:14Z", + "samples": [ + { + "mode": "plain", + "context": "plain", + "returncode": 0, + "outer_seconds": 0.06199999991804361, + "background_cpu_before_percent": 39.3, + "result": { + "bytes": 204800, + "cpu_ns": 46875000, + "wall_ns": 46402100, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 1, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 2, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 3, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 4, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 5, + "ns": 0, + "max_ns": 0, + "count": 0 + } + ] + }, + "state_sha256": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e" + }, + { + "mode": "plain", + "context": "resize", + "returncode": 0, + "outer_seconds": 0.9529999999795109, + "background_cpu_before_percent": 29.7, + "result": { + "bytes": 204800, + "cpu_ns": 921875000, + "wall_ns": 929186300, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 1, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 2, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 3, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 4, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 5, + "ns": 0, + "max_ns": 0, + "count": 0 + } + ] + }, + "state_sha256": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e" + }, + { + "mode": "instrumented", + "context": "resize", + "returncode": 0, + "outer_seconds": 0.9529999999795109, + "background_cpu_before_percent": 17.5, + "result": { + "bytes": 204800, + "cpu_ns": 921875000, + "wall_ns": 931817400, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 7996700, + "max_ns": 824700, + "count": 25 + }, + { + "id": 1, + "ns": 104500, + "max_ns": 26100, + "count": 25 + }, + { + "id": 2, + "ns": 923683900, + "max_ns": 38156500, + "count": 25 + }, + { + "id": 3, + "ns": 9200, + "max_ns": 1100, + "count": 25 + }, + { + "id": 4, + "ns": 28528000, + "max_ns": 1404800, + "count": 25 + }, + { + "id": 5, + "ns": 891658400, + "max_ns": 36740200, + "count": 25 + } + ] + }, + "state_sha256": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e" + }, + { + "mode": "instrumented", + "context": "plain", + "returncode": 0, + "outer_seconds": 0.0940000000409782, + "background_cpu_before_percent": 31.4, + "result": { + "bytes": 204800, + "cpu_ns": 62500000, + "wall_ns": 60924400, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 10826000, + "max_ns": 1149300, + "count": 25 + }, + { + "id": 1, + "ns": 119100, + "max_ns": 20200, + "count": 25 + }, + { + "id": 2, + "ns": 49945500, + "max_ns": 3270500, + "count": 25 + }, + { + "id": 3, + "ns": 8900, + "max_ns": 2700, + "count": 25 + }, + { + "id": 4, + "ns": 37565700, + "max_ns": 2179600, + "count": 25 + }, + { + "id": 5, + "ns": 7396500, + "max_ns": 886500, + "count": 25 + } + ] + }, + "state_sha256": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e" + }, + { + "mode": "plain", + "context": "resize", + "returncode": 0, + "outer_seconds": 1.0, + "background_cpu_before_percent": 39.5, + "result": { + "bytes": 204800, + "cpu_ns": 953125000, + "wall_ns": 968977700, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 1, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 2, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 3, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 4, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 5, + "ns": 0, + "max_ns": 0, + "count": 0 + } + ] + }, + "state_sha256": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e" + }, + { + "mode": "plain", + "context": "plain", + "returncode": 0, + "outer_seconds": 0.06199999991804361, + "background_cpu_before_percent": 30.6, + "result": { + "bytes": 204800, + "cpu_ns": 46875000, + "wall_ns": 44071200, + "valid": true, + "phases": [ + { + "id": 0, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 1, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 2, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 3, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 4, + "ns": 0, + "max_ns": 0, + "count": 0 + }, + { + "id": 5, + "ns": 0, + "max_ns": 0, + "count": 0 + } + ] + }, + "state_sha256": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e" + } + ], + "local_raw_identity_sha256": "f4b084750d02bc8ca2c7b9a9c736c5c4b6fd727b2b514e63093b9bdfd3736b8d", + "local_raw_files_sha256": { + "00-plain-plain.state.json": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e", + "00-plain-plain.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "00-plain-plain.stdout": "ac3258615fda6a3a7e5e900f9ebe62c83b85dfb3e3fe662fd62229b0cd1fd854", + "01-plain-resize.state.json": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e", + "01-plain-resize.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "01-plain-resize.stdout": "4223388fbc400eb96eccbe2863f2f8f5e43c9326d81ecb8610f3a019dbe5ce65", + "02-instrumented-resize.state.json": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e", + "02-instrumented-resize.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "02-instrumented-resize.stdout": "3a59d598755257174e624d9e265df19cfeaf791942029161a4a969f8dfaa4b50", + "03-instrumented-plain.state.json": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e", + "03-instrumented-plain.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "03-instrumented-plain.stdout": "40f4e11781aae3fbfea6d9854df4816aa9beacb8a2b819b7842f454a5ed022e8", + "04-plain-resize.state.json": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e", + "04-plain-resize.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "04-plain-resize.stdout": "845a7ddb7e0b9e8680c07b9f7f987d8b7af30457f992ceda73829dedfc90b4e9", + "05-plain-plain.state.json": "aa05cafdeb1bf5737e553ef5c01669a8b30e9aef5b4e8eac3c73597ee005b19e", + "05-plain-plain.stderr": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "05-plain-plain.stdout": "51761f7531d0d0e2a36b04c56a61fddd5cd9ddbb023544fd8e474ef31c5749f2", + "identity.json": "f4b084750d02bc8ca2c7b9a9c736c5c4b6fd727b2b514e63093b9bdfd3736b8d" + } +} diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/intermediate-workflows.json b/experiments/shell/results/2026-10-26-replay-cost-and-close/intermediate-workflows.json new file mode 100644 index 00000000..4f2d8610 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/intermediate-workflows.json @@ -0,0 +1,716 @@ +{ + "runs": [ + { + "run": "run-868918e65b584884877b410fa6c48805", + "sample": { + "mode": "ui-workflow-sessions", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "desktop_gone": true, + "resources": { + "summary": "resource-summary.json", + "scope": "launcher-tree", + "performance_gate": "not_evaluated" + }, + "error_kind": "ProbeFailure" + }, + "data_only": true, + "system_clipboard": false, + "ime": false, + "checkpoints": [ + { + "phase": "eight-ready", + "elapsed_ms": 572, + "cycle": 0 + }, + { + "phase": "reject-ninth", + "elapsed_ms": 576, + "cycle": 0 + }, + { + "phase": "load-started", + "elapsed_ms": 766, + "cycle": 0 + }, + { + "phase": "reading-before-append", + "elapsed_ms": 798, + "cycle": 0 + }, + { + "phase": "reading-after-append", + "elapsed_ms": 944, + "cycle": 0 + }, + { + "phase": "search-running", + "elapsed_ms": 1105, + "cycle": 0 + }, + { + "phase": "find-complete", + "elapsed_ms": 6944, + "cycle": 0 + }, + { + "phase": "foreground-input", + "elapsed_ms": 7093, + "cycle": 0 + }, + { + "phase": "zoom-75", + "elapsed_ms": 7222, + "cycle": 0 + }, + { + "phase": "switch-zoom", + "elapsed_ms": 7377, + "cycle": 0 + }, + { + "phase": "history-evicted", + "elapsed_ms": 7660, + "cycle": 0 + }, + { + "phase": "paste-cancel-pending", + "elapsed_ms": 8297, + "cycle": 0 + }, + { + "phase": "paste-cancelled", + "elapsed_ms": 8728, + "cycle": 0 + }, + { + "phase": "background-complete", + "elapsed_ms": 27467, + "cycle": 0 + }, + { + "phase": "cycle-six", + "elapsed_ms": 27779, + "cycle": 1 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 29048, + "cycle": 1 + }, + { + "phase": "cycle-six", + "elapsed_ms": 29328, + "cycle": 2 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 30633, + "cycle": 2 + }, + { + "phase": "cycle-six", + "elapsed_ms": 30925, + "cycle": 3 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 32255, + "cycle": 3 + }, + { + "phase": "cycle-six", + "elapsed_ms": 32580, + "cycle": 4 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 33843, + "cycle": 4 + }, + { + "phase": "cycle-six", + "elapsed_ms": 34162, + "cycle": 5 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 35424, + "cycle": 5 + }, + { + "phase": "paste-close-pending", + "elapsed_ms": 35756, + "cycle": 5 + }, + { + "phase": "after-paste-close", + "elapsed_ms": 35974, + "cycle": 5 + } + ], + "paste_cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ], + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "frame.bmp": "4443a91feb73693650c2a6f8ac4feb91fa9fe3fee9e1340086892c2257db1990", + "resource-observations.jsonl": "dd709b8cd12e332610082a7ae44c1dcbbe486e9451a7a21b7b899639c83453a0", + "resource-phases.jsonl": "f6dc0847c07730eafd232b117c375628a3d746285700805245570f087c926b05", + "resource-summary.json": "75f03192836a8f1b0dd3f7789b618a6305025bb4f6b11ff98efc3fac12aef32a", + "sample.json": "170f4625886507719d22cbcc1d05e3e72df3c1d53f9c54b6dba7697cc9b09cfa", + "sample.public.json": "63735633ab5fcace05f2deb18b21a39d9df834cc9534f6f9ad16a1e3385dfcf9", + "sessions.json": "ba4522ff74c1942f45da7fd2729a8ba0e631c9783d3d01292a1c8bf3cae528cc", + "validation.json": "a01ca51810fd51c4fee9947b3a43422dede0cba5e6ae6a9a72a0fef8a10bc5b0", + "workspace.layout": "9a96d62943f54727e7c50ce5785a571efbfa6cbece6248f6a6d144257c1e1d58" + }, + "observed_failure": "terminal reply rejected by input queue", + "source": "06bf6b5cf4c5f7457cbb02355aa4971276c2b581" + }, + { + "run": "run-39a01aa2558747c3b71d531c66e234e8", + "sample": { + "mode": "ui-workflow-sessions", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workflow-sessions", + "sessions_closed": 18, + "active_children_after": 0, + "presented_done": null + }, + "frame_sha256": "68fb528174c7f7edf2916ca1b6f1f7d2a6b80deeb4cec787539fb051bb344ee5", + "sessions_workflow": { + "schema": "termforge-workflow-sessions-identity-validation-v1", + "live_sessions": 8, + "checkpoints": 26, + "rejected_ninth": true, + "load_foreground_verified": true, + "data_workflow_verified": true, + "complete_workflow_verified": false, + "system_clipboard_verified": false, + "ime_verified": false + }, + "resources": { + "summary": "resource-summary.json", + "scope": "launcher-tree", + "performance_gate": "not_evaluated" + }, + "error_kind": null + }, + "data_only": true, + "system_clipboard": false, + "ime": false, + "checkpoints": [ + { + "phase": "eight-ready", + "elapsed_ms": 570, + "cycle": 0 + }, + { + "phase": "reject-ninth", + "elapsed_ms": 573, + "cycle": 0 + }, + { + "phase": "load-started", + "elapsed_ms": 727, + "cycle": 0 + }, + { + "phase": "reading-before-append", + "elapsed_ms": 747, + "cycle": 0 + }, + { + "phase": "reading-after-append", + "elapsed_ms": 867, + "cycle": 0 + }, + { + "phase": "search-running", + "elapsed_ms": 1011, + "cycle": 0 + }, + { + "phase": "find-complete", + "elapsed_ms": 6314, + "cycle": 0 + }, + { + "phase": "foreground-input", + "elapsed_ms": 6454, + "cycle": 0 + }, + { + "phase": "zoom-75", + "elapsed_ms": 6591, + "cycle": 0 + }, + { + "phase": "switch-zoom", + "elapsed_ms": 6751, + "cycle": 0 + }, + { + "phase": "history-evicted", + "elapsed_ms": 7000, + "cycle": 0 + }, + { + "phase": "paste-cancel-pending", + "elapsed_ms": 7606, + "cycle": 0 + }, + { + "phase": "paste-cancelled", + "elapsed_ms": 7990, + "cycle": 0 + }, + { + "phase": "background-complete", + "elapsed_ms": 26131, + "cycle": 0 + }, + { + "phase": "cycle-six", + "elapsed_ms": 26437, + "cycle": 1 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 27720, + "cycle": 1 + }, + { + "phase": "cycle-six", + "elapsed_ms": 28020, + "cycle": 2 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 29254, + "cycle": 2 + }, + { + "phase": "cycle-six", + "elapsed_ms": 29556, + "cycle": 3 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 30810, + "cycle": 3 + }, + { + "phase": "cycle-six", + "elapsed_ms": 31122, + "cycle": 4 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 32383, + "cycle": 4 + }, + { + "phase": "cycle-six", + "elapsed_ms": 32669, + "cycle": 5 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 33961, + "cycle": 5 + }, + { + "phase": "paste-close-pending", + "elapsed_ms": 34293, + "cycle": 5 + }, + { + "phase": "after-paste-close", + "elapsed_ms": 34504, + "cycle": 5 + } + ], + "paste_cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ], + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "frame.bmp": "68fb528174c7f7edf2916ca1b6f1f7d2a6b80deeb4cec787539fb051bb344ee5", + "resource-observations.jsonl": "86c5915c71b43c3724b5c083401c481d2fc644d7b92c7c7b71c6fac3b7eb8c1c", + "resource-phases.jsonl": "2c438eed39c5948baaebb03893ea1791c28c563f6f08555dff9da7c4007edb2e", + "resource-summary.json": "a1af28883ff9efa10a0ac32af7a649047a886161d7fbf9a24d8ee286e32b75ed", + "sample.json": "6e4100ef925345920031c7885393ffea19621c138ba4a7c990fd8f4d01592195", + "sample.public.json": "9507843aee6d9088fd93fb35fb925f64d9b854f0d0c307dc5bc6676422ff7604", + "sessions.json": "8daad6179ab2acbbc4800f02e8d1377bb925c477028ce999bbb4ef47efcda590", + "validation.json": "e2d23746c84fed9ac9dcddb248fabee42cd8f8bfe13bfe2cf9ff6cd87f15acd5", + "workspace.layout": "9a96d62943f54727e7c50ce5785a571efbfa6cbece6248f6a6d144257c1e1d58" + }, + "source": "06bf6b5 plus bounded reply-state diagnostics" + }, + { + "run": "run-942f5c4bfd9d4922a23481675ad17e7d", + "sample": { + "mode": "ui-workflow-sessions", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "desktop_gone": true, + "resources": { + "summary": "resource-summary.json", + "scope": "launcher-tree", + "performance_gate": "not_evaluated" + }, + "error_kind": "ProbeFailure" + }, + "data_only": true, + "system_clipboard": false, + "ime": false, + "checkpoints": [ + { + "phase": "eight-ready", + "elapsed_ms": 533, + "cycle": 0 + }, + { + "phase": "reject-ninth", + "elapsed_ms": 536, + "cycle": 0 + }, + { + "phase": "load-started", + "elapsed_ms": 685, + "cycle": 0 + }, + { + "phase": "reading-before-append", + "elapsed_ms": 704, + "cycle": 0 + }, + { + "phase": "reading-after-append", + "elapsed_ms": 825, + "cycle": 0 + }, + { + "phase": "search-running", + "elapsed_ms": 966, + "cycle": 0 + }, + { + "phase": "find-complete", + "elapsed_ms": 6316, + "cycle": 0 + }, + { + "phase": "foreground-input", + "elapsed_ms": 6441, + "cycle": 0 + }, + { + "phase": "zoom-75", + "elapsed_ms": 6575, + "cycle": 0 + }, + { + "phase": "switch-zoom", + "elapsed_ms": 6738, + "cycle": 0 + }, + { + "phase": "history-evicted", + "elapsed_ms": 6984, + "cycle": 0 + }, + { + "phase": "paste-cancel-pending", + "elapsed_ms": 7647, + "cycle": 0 + }, + { + "phase": "paste-cancelled", + "elapsed_ms": 8011, + "cycle": 0 + }, + { + "phase": "background-complete", + "elapsed_ms": 26248, + "cycle": 0 + }, + { + "phase": "cycle-six", + "elapsed_ms": 26542, + "cycle": 1 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 27794, + "cycle": 1 + }, + { + "phase": "cycle-six", + "elapsed_ms": 28111, + "cycle": 2 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 29384, + "cycle": 2 + }, + { + "phase": "cycle-six", + "elapsed_ms": 29719, + "cycle": 3 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 30983, + "cycle": 3 + }, + { + "phase": "cycle-six", + "elapsed_ms": 31270, + "cycle": 4 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 32527, + "cycle": 4 + }, + { + "phase": "cycle-six", + "elapsed_ms": 32839, + "cycle": 5 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 34055, + "cycle": 5 + }, + { + "phase": "paste-close-pending", + "elapsed_ms": 34351, + "cycle": 5 + }, + { + "phase": "after-paste-close", + "elapsed_ms": 34568, + "cycle": 5 + } + ], + "paste_cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ], + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "frame.bmp": "4443a91feb73693650c2a6f8ac4feb91fa9fe3fee9e1340086892c2257db1990", + "resource-observations.jsonl": "97e19f4c8fe8de708740e1d2cce01f8117b531ba7c231a4552a3091a5668adbf", + "resource-phases.jsonl": "100f32a411ed3930e70630d411c7c354019366470eb4d5bbce3e7ba5431b76ce", + "resource-summary.json": "2feb2d4c8ecfc99d7a82b9b0f4213df47396d9b6dab29d5604c15ea146df1d26", + "sample.json": "7edc081e4c8dc9e22ee08dc40dfdf90f99062c82ccd234f2c9ccfa8c2eb6177f", + "sample.public.json": "63735633ab5fcace05f2deb18b21a39d9df834cc9534f6f9ad16a1e3385dfcf9", + "sessions.json": "6afe299c8fbb4014d8c2875ed824bbcd8bb5f8076e42115dea3f204d4c74336e", + "validation.json": "6e9c0fe26639b5dae2ee347a9f2b972e89b4402568e9ef60c76881c9051dbc9d", + "workspace.layout": "9a96d62943f54727e7c50ce5785a571efbfa6cbece6248f6a6d144257c1e1d58" + }, + "observed_failure": "terminal reply rejected by input queue; session=3 closing=1 stopping=1 queued=0 failed=0 paste_busy=0 reply_hex=1b5b343b3452", + "source": "06bf6b5 plus bounded reply-state diagnostics" + } + ], + "reply_diagnostic_identity": { + "original_sha256": "b369968152bbff107c699181d4e23f271e62a5732f0c41793159b3efc3609321", + "diagnostic_sha256": "bcae8cd6c012fe3cf8b0e8ca5219c5136210dd6cd1e4940a9562d1eb73b59156" + } +} diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/README.md b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/README.md new file mode 100644 index 00000000..f9722477 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/README.md @@ -0,0 +1,12 @@ +# 成本诊断的固定计时边界 + +本目录归档 `8ff112e785073dde91a74142cf1a3000fa240007` 上实际使用的诊断源与插桩差异,不参与产品或 CI 构建。原始 EXE、屏幕、运输记录留在本地;脱敏后的全部样本、原始文件哈希及构建身份见上级 JSON。 + +- `ordinary_probe.cpp` 和 `resize_probe.cpp` 是实际 headless 驱动,分别消费 2,048,000B 和 204,800B;最终状态按独立的逐行字面值、历史长度、淘汰数及光标验证。 +- 合成输入每行由 `f'TF_R108_F1_{row:05d} 中文 e\u0301'.encode('utf-8').ljust(62, b'.') + b'\r\n'` 生成;分别连接 32,000 / 3,200 行。其字节哈希、17×74、history100、chunk8192 与完整样本次序已记录。 +- headless 构建将驱动与固定源码的 `experiments/core/candidate_terminal.cpp`(或应用 `headless-instrumentation.patch` 的副本)链接到同一固定 `.4` Rust Release 库;MSVC `/W4 /utf-8`、C++17,链接 `ws2_32 userenv ntdll`。构造和可选同尺寸 resize 在计时前,循环 feed 计时,finish 和正确性校验在计时后。每个样本是新的进程。 +- headless phases 0–5 依次是 Rust feed、scan_replay、synchronize、event drain、cell export、reconcile 及后续同步收尾。phase5 包含后续工作,不能直接称为纯 reconcile。UI 第二次插桩才把 reconcile、history merge 和 versions/copy 分开。 +- UI 第一批使用 `ui-instrumentation.patch` 的 phases0–9;第二批再使用 `ui-core-instrumentation.patch` 增加 phases10–16。`ui_timing.hpp` 为最终17槽版本;第一批仅10槽。UI 计时由主线程累计,析构写到 `TERMFORGE_DIAGNOSTIC_PHASE_OUT`;原场景仍由自有 Job/desktop 与原期限监督。 +- UI patch 的 include 位置已从本机绝对路径改成仓库相对标识,移植时需令其可由 include 搜索路径解析;各 patch 已规范化换行和行末空白。这些是归档差异,不是当前分支的可直接应用补丁。JSON 中源码与 EXE 哈希对应实际运行的本地版本。 + +嵌套 wall time 不相加。采样很短,宿主有其他负载,插桩有扰动;这些是定位原因的诊断,不是 #54 的正式 A/B、性能预算或实际呈现验收。修复后回归使用未插桩的产品代码。 diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/headless-instrumentation.patch b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/headless-instrumentation.patch new file mode 100644 index 00000000..ed03091a --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/headless-instrumentation.patch @@ -0,0 +1,41 @@ +--- candidate_terminal.cpp ++++ instrumented.cpp +@@ -1,3 +1,4 @@ ++#include "probe_timing.hpp" + #include "candidate_terminal.hpp" + #include "../candidates/alacritty/include/termforge_candidate.h" + #include +@@ -224,10 +225,12 @@ + + void CandidateTerminal::feed(std::string_view bytes) { + std::array error{}; +- check(tf_terminal_feed(impl_, reinterpret_cast(bytes.data()), bytes.size(), +- error.data(), error.size()), "candidate feed failed"); +- scan_replay(bytes); +- synchronize(); ++ { ProbeTimer timer(0); ++ check(tf_terminal_feed(impl_, reinterpret_cast(bytes.data()), bytes.size(), ++ error.data(), error.size()), "candidate feed failed"); } ++ { ProbeTimer timer(1); scan_replay(bytes); } ++ { ProbeTimer timer(2); synchronize(); } ++ ProbeTimer event_timer(3); + uint32_t kind = 0; + for (;;) { + size_t needed = 0; +@@ -295,6 +298,7 @@ + std::vector retained(meta.history + meta.rows); + std::vector raw_ids; + raw_ids.reserve(retained.size()); ++ { ProbeTimer export_timer(4); + for (size_t r = 0; r < retained.size(); ++r) { + TfRowMeta row{}; + check(tf_terminal_row_meta(impl_, r, &row), "candidate row metadata failed"); +@@ -313,6 +317,8 @@ + } + retained[r] = std::move(line); + } ++ } ++ ProbeTimer reconcile_timer(5); + const auto preserved = reconcile_replay(retained); + if (replay_show_) preserve_history_ = true; + if (preserve_history_ && !replay_origin_ && meta.history == 0 && meta.discarded == screen.discarded) diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ordinary_probe.cpp b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ordinary_probe.cpp new file mode 100644 index 00000000..7980cfd9 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ordinary_probe.cpp @@ -0,0 +1,53 @@ +#define NOMINMAX +#include +#include "candidate_terminal.hpp" +#include "text_projection.hpp" +#include "probe_timing.hpp" +#include +#include +#include +#include +#include + +uint64_t cpu_ns() { + FILETIME created{}, exited{}, kernel{}, user{}; + if (!GetProcessTimes(GetCurrentProcess(), &created, &exited, &kernel, &user)) + throw std::runtime_error("GetProcessTimes failed"); + const auto value = [](const FILETIME& ft) { return (uint64_t(ft.dwHighDateTime)<<32) | ft.dwLowDateTime; }; + return (value(kernel)+value(user))*100; +} +int main(int argc, char** argv) { + try { + if(argc!=3) throw std::runtime_error("usage: phase_probe input.bin state.json"); + std::ifstream input(argv[1], std::ios::binary); + if(!input) throw std::runtime_error("input missing"); + const std::string bytes((std::istreambuf_iterator(input)), {}); + if(bytes.size()!=2048000) throw std::runtime_error("unexpected workload"); + termforge::CandidateTerminal terminal(17,74,100); + probe_ns.fill(0); probe_count.fill(0); probe_max.fill(0); + const auto cpu_start=cpu_ns(); const auto start=ProbeTimer::Clock::now(); + for(size_t i=0;i(ProbeTimer::Clock::now()-start).count(); + const auto cpu_elapsed=cpu_ns()-cpu_start; + terminal.finish(); + const auto& screen=terminal.screen; + if(screen.row!=16 || screen.column!=0 || screen.history.size()!=100 || screen.retained_size()!=117 || screen.discarded!=31884) + throw std::runtime_error("final cursor/history mismatch"); + for(size_t r=0;r<116;++r) { + std::ostringstream expected; + expected<<"TF_R108_F1_"< +#include +#include +inline std::array probe_ns{}, probe_max{}, probe_count{}; +struct ProbeTimer { + using Clock = std::chrono::steady_clock; + size_t phase; + Clock::time_point start = Clock::now(); + explicit ProbeTimer(size_t value) : phase(value) {} + ~ProbeTimer() { + const auto elapsed = static_cast(std::chrono::duration_cast(Clock::now()-start).count()); + probe_ns[phase] += elapsed; ++probe_count[phase]; + if (elapsed > probe_max[phase]) probe_max[phase] = elapsed; + } +}; diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/resize_probe.cpp b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/resize_probe.cpp new file mode 100644 index 00000000..68fbf318 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/resize_probe.cpp @@ -0,0 +1,54 @@ +#define NOMINMAX +#include +#include "candidate_terminal.hpp" +#include "text_projection.hpp" +#include "probe_timing.hpp" +#include +#include +#include +#include +#include + +uint64_t cpu_ns() { + FILETIME created{}, exited{}, kernel{}, user{}; + if (!GetProcessTimes(GetCurrentProcess(), &created, &exited, &kernel, &user)) + throw std::runtime_error("GetProcessTimes failed"); + const auto value = [](const FILETIME& ft) { return (uint64_t(ft.dwHighDateTime)<<32) | ft.dwLowDateTime; }; + return (value(kernel)+value(user))*100; +} +int main(int argc, char** argv) { + try { + if(argc!=4) throw std::runtime_error("usage: phase_probe input.bin state.json resize|plain"); + std::ifstream input(argv[1], std::ios::binary); + if(!input) throw std::runtime_error("input missing"); + const std::string bytes((std::istreambuf_iterator(input)), {}); + if(bytes.size()!=204800) throw std::runtime_error("unexpected workload"); + termforge::CandidateTerminal terminal(17,74,100); + if(std::string(argv[3])=="resize") terminal.resize(17,74); + probe_ns.fill(0); probe_count.fill(0); probe_max.fill(0); + const auto cpu_start=cpu_ns(); const auto start=ProbeTimer::Clock::now(); + for(size_t i=0;i(ProbeTimer::Clock::now()-start).count(); + const auto cpu_elapsed=cpu_ns()-cpu_start; + terminal.finish(); + const auto& screen=terminal.screen; + if(screen.row!=16 || screen.column!=0 || screen.history.size()!=100 || screen.retained_size()!=117 || screen.discarded!=3084) + throw std::runtime_error("final cursor/history mismatch"); + for(size_t r=0;r<116;++r) { + std::ostringstream expected; + expected<<"TF_R108_F1_"< +@@ -224,10 +225,11 @@ + + void CandidateTerminal::feed(std::string_view bytes) { + std::array error{}; +- check(tf_terminal_feed(impl_, reinterpret_cast(bytes.data()), bytes.size(), +- error.data(), error.size()), "candidate feed failed"); +- scan_replay(bytes); +- synchronize(); ++ { UiPhase phase_core(10); ++ check(tf_terminal_feed(impl_, reinterpret_cast(bytes.data()), bytes.size(), ++ error.data(), error.size()), "candidate feed failed"); } ++ { UiPhase phase_scan(11); scan_replay(bytes); } ++ { UiPhase phase_sync(12); synchronize(); } + uint32_t kind = 0; + for (;;) { + size_t needed = 0; +@@ -295,6 +297,7 @@ + std::vector retained(meta.history + meta.rows); + std::vector raw_ids; + raw_ids.reserve(retained.size()); ++ { UiPhase phase_export(13); + for (size_t r = 0; r < retained.size(); ++r) { + TfRowMeta row{}; + check(tf_terminal_row_meta(impl_, r, &row), "candidate row metadata failed"); +@@ -313,11 +316,16 @@ + } + retained[r] = std::move(line); + } +- const auto preserved = reconcile_replay(retained); ++ } ++ std::unordered_set preserved; ++ { UiPhase phase_reconcile(14); preserved = reconcile_replay(retained); } + if (replay_show_) preserve_history_ = true; + if (preserve_history_ && !replay_origin_ && meta.history == 0 && meta.discarded == screen.discarded) + preserve_history_ = false; ++ { UiPhase phase_merge(15); + merge_history(retained, raw_ids, meta.history, meta.discarded); ++ } ++ UiPhase phase_versions(16); + if (replay_show_) replay_origin_.reset(); + screen.normalize_identities(retained); + for (size_t r = 0; r + 1 < retained.size(); ++r) diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui-instrumentation.patch b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui-instrumentation.patch new file mode 100644 index 00000000..fefd5eac --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui-instrumentation.patch @@ -0,0 +1,103 @@ +--- experiments/shell/shell.cpp ++++ experiments/shell/shell.cpp +@@ -1,3 +1,4 @@ ++#include "local/r53-cost-probe/ui_timing.hpp" + // Local shell with physical-row resize. See README for the limited contract. + #include "../presentation/render.hpp" + #ifdef TERMFORGE_CANDIDATE_CORE +@@ -367,7 +368,7 @@ + closed_.store(true); + }); + } +- void publish(std::optional scroll_operation=std::nullopt,bool scroll_changed=false) { ++ void publish(std::optional scroll_operation=std::nullopt,bool scroll_changed=false) { UiPhase probe(3); + selection_.reconcile(termforge::TextDocument(parser_.screen)); + auto view = viewport_.snapshot(parser_.screen); + if(runtime_enabled_) runtime_published_viewport_=view.viewport; +@@ -617,7 +618,7 @@ + stage_ = 6; + #endif + } +- void scenario() { ++ void scenario() { UiPhase probe(5); + if (mode_.empty() || closing_) return; + require(ms(start_) < 25000, "shell scenario timeout"); + if (mode_ == "watchdog") { +@@ -778,7 +779,7 @@ + } + } + #endif +- void tick() { ++ void tick() { UiPhase probe(0); + const auto began = Clock::now(); ++result_.ticks; + poll_paste(); + selection_autoscroll(); +@@ -793,7 +794,7 @@ + if(observed_output_.size()>8192) observed_output_.erase(0,observed_output_.size()-8192); + } + resize_trace_.observe(tf_shell_test::ResizeTrace::feed, parser_.screen.height(), parser_.screen.width(), 0, stage_, bytes); +- parser_.feed(bytes); batch += bytes.size(); ++ { UiPhase probe(1); parser_.feed(bytes); } batch += bytes.size(); + #ifdef TERMFORGE_CANDIDATE_CORE + route_terminal_events(); + #endif +@@ -914,7 +915,7 @@ + } + if (message == WM_TIMER && (self->started_ || self->closing_)) { self->tick(); return 0; } + if (message == WM_ERASEBKGND) return 1; +- if (message == WM_PAINT) { ++ if (message == WM_PAINT) { UiPhase probe(6); + PAINTSTRUCT paint{}; HDC dc = BeginPaint(hwnd, &paint); + const int painted_revision=self->snapshot_->revision; + const bool observed=self->operation_observations_.paint_candidate(painted_revision); +--- experiments/shell/search_interactions.hpp ++++ experiments/shell/search_interactions.hpp +@@ -12,7 +12,7 @@ + find_->focus_query(); + } + +-inline void ShellWindow::search_changed() { ++inline void ShellWindow::search_changed() { UiPhase probe(2); + const termforge::TextDocument document(parser_.screen); + search_.notify_change(document); + if(find_resize_pending_ && !find_resize_anchor_.reconcile(document)) clear_find_resize_anchor(); +@@ -66,7 +66,7 @@ + publish(); + } + +-inline void ShellWindow::poll_find() { ++inline void ShellWindow::poll_find() { UiPhase probe(4); + if(closing_) return; + termforge::TextDocument document(parser_.screen); + if(find_) { +--- experiments/shell/workspace_workflow_scenario.hpp ++++ experiments/shell/workspace_workflow_scenario.hpp +@@ -44,7 +44,7 @@ + require(FlushFileBuffers(evidence.resource_phase_file.get())!=FALSE,"workflow resource phase flush failed"); + } + } +-inline void Workspace::workflow_checkpoint(const char* phase,unsigned cycle,const std::vector& names) { ++inline void Workspace::workflow_checkpoint(const char* phase,unsigned cycle,const std::vector& names) { UiPhase probe(8); + auto& evidence=*workflow_;evidence.reserve_observations(names.empty()?static_cast(session_count()):names.size()); + workflow_resource_mark(phase,cycle); + JOBOBJECT_BASIC_ACCOUNTING_INFORMATION job{}; +@@ -169,7 +169,7 @@ + if(workflow_system_ && stage_==100 && workflow_->closed.size()==18) workflow_system_finish();return; + } + } +-inline void Workspace::scenario_workflow() { ++inline void Workspace::scenario_workflow() { UiPhase probe(7); + if(image_.empty() || closing_) return; + require(workflow_!=nullptr,"workflow scenario state is missing"); + if(ms(started_)>=70000) throw std::runtime_error("workflow sessions scenario timeout at stage "+std::to_string(stage_)); +--- experiments/shell/workspace.hpp ++++ experiments/shell/workspace.hpp +@@ -381,7 +381,7 @@ + if(!settings_error_.empty()) result+=L": "+utf16(settings_error_.c_str()); + return result; + } +- void paint(HDC dc) { ++ void paint(HDC dc) { UiPhase probe(9); + auto old=SelectObject(dc,font_); SetBkMode(dc,TRANSPARENT); + fill(dc,{0,0,width_,height_},background); + label(dc,{0,0,82,33},L"Session"); label(dc,{82,0,150,33},L"View"); diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui_timing.hpp b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui_timing.hpp new file mode 100644 index 00000000..9b576009 --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/probe/ui_timing.hpp @@ -0,0 +1,31 @@ +#pragma once +#include +#include +#include +#include +#include +struct UiProfile { + std::array ns{}, count{}, maximum{}; + ~UiProfile() { + const char* path=std::getenv("TERMFORGE_DIAGNOSTIC_PHASE_OUT"); + if(!path) return; + std::ofstream out(path); + out<<"{\"phases\":["; + for(size_t i=0;i(std::chrono::duration_cast(Clock::now()-start).count()); + ui_profile.ns[phase]+=elapsed; ++ui_profile.count[phase]; + if(elapsed>ui_profile.maximum[phase]) ui_profile.maximum[phase]=elapsed; + } +}; diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/ui-profiles.json b/experiments/shell/results/2026-10-26-replay-cost-and-close/ui-profiles.json new file mode 100644 index 00000000..ebc26ccf --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/ui-profiles.json @@ -0,0 +1,699 @@ +[ + { + "run": "ui-run-2b18652f1a8841f5a097e28148ff0d34", + "sample": { + "mode": "ui-workflow-sessions", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "desktop_gone": true, + "error_kind": "ProbeFailure" + }, + "data_only": true, + "system_clipboard": false, + "ime": false, + "checkpoints": [ + { + "phase": "eight-ready", + "elapsed_ms": 579, + "cycle": 0 + }, + { + "phase": "reject-ninth", + "elapsed_ms": 583, + "cycle": 0 + }, + { + "phase": "load-started", + "elapsed_ms": 857, + "cycle": 0 + }, + { + "phase": "reading-before-append", + "elapsed_ms": 881, + "cycle": 0 + }, + { + "phase": "reading-after-append", + "elapsed_ms": 1130, + "cycle": 0 + }, + { + "phase": "search-running", + "elapsed_ms": 1392, + "cycle": 0 + }, + { + "phase": "find-complete", + "elapsed_ms": 11461, + "cycle": 0 + }, + { + "phase": "foreground-input", + "elapsed_ms": 11678, + "cycle": 0 + }, + { + "phase": "zoom-75", + "elapsed_ms": 11894, + "cycle": 0 + }, + { + "phase": "switch-zoom", + "elapsed_ms": 12152, + "cycle": 0 + }, + { + "phase": "history-evicted", + "elapsed_ms": 12611, + "cycle": 0 + }, + { + "phase": "paste-cancel-pending", + "elapsed_ms": 13775, + "cycle": 0 + }, + { + "phase": "paste-cancelled", + "elapsed_ms": 14486, + "cycle": 0 + }, + { + "phase": "background-complete", + "elapsed_ms": 50071, + "cycle": 0 + }, + { + "phase": "cycle-six", + "elapsed_ms": 50552, + "cycle": 1 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 51912, + "cycle": 1 + }, + { + "phase": "cycle-six", + "elapsed_ms": 52683, + "cycle": 2 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 54041, + "cycle": 2 + }, + { + "phase": "cycle-six", + "elapsed_ms": 54799, + "cycle": 3 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 56168, + "cycle": 3 + }, + { + "phase": "cycle-six", + "elapsed_ms": 56961, + "cycle": 4 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 58253, + "cycle": 4 + }, + { + "phase": "cycle-six", + "elapsed_ms": 58889, + "cycle": 5 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 60200, + "cycle": 5 + }, + { + "phase": "paste-close-pending", + "elapsed_ms": 60724, + "cycle": 5 + } + ], + "paste_cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ], + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "identity.json": "bd2605c691401cbaba684f8b3dbf8d5ec4d87004dc5cc2a99043dd7137e0bd05", + "resource-phases.jsonl": "eb0a3de3035663d0086328cc52f98dac18a5e553f64197057a516169a4be56f3", + "sample.json": "7159224e988be562a77cbad22953c4bb2ef47b7ccc19ac9593c037630bde513e", + "sessions.json": "6ef9405ea3055273463e9d72fa467f7df9e9c4459dffb7a203a061c7dbaa3e94", + "ui-phases.json": "6644c6534aa391b9bd4bf2a6c344c4e8d9d1548c4c2fc3656e589b8a61809997", + "workspace.layout": "9a96d62943f54727e7c50ce5785a571efbfa6cbece6248f6a6d144257c1e1d58" + }, + "observed_failure": "workflow sessions scenario timeout at stage 45", + "instrumentation": { + "phases": [ + "whole_tick", + "parser_feed", + "search_changed", + "publish", + "poll_find", + "shell_scenario", + "shell_paint", + "workflow_scenario", + "workflow_checkpoint", + "workspace_paint" + ], + "source": { + "experiments/shell/shell.cpp": { + "original": "b369968152bbff107c699181d4e23f271e62a5732f0c41793159b3efc3609321", + "instrumented": "0e0cfbd952c37d05a0333bd79662ead2777dd19db220f08993a762437cb9bb77" + }, + "experiments/shell/search_interactions.hpp": { + "original": "75f1ac520dc3070efba2d01812bf56c29e8683540196956423b0984c42d7b181", + "instrumented": "b337e56639d273b45faca154ed20830157991b6e158834e3c377a1a74c6f4b55" + }, + "experiments/shell/workspace_workflow_scenario.hpp": { + "original": "467571556440f4e89305bc1261d389bb8f24ba84f607b8cd36b8078a58314369", + "instrumented": "2a95c33f6b6212f61c8217fd55298b16ca90209f8b9cd972e7dc135e94fc4c57" + }, + "experiments/shell/workspace.hpp": { + "original": "5669a13701b2fe60e8bd567a122edb970bdc4aadcb98ceb3927905f0c000275e", + "instrumented": "9cbe9e5db3529e578eec705307d9cab23035623b3f46ac9d14d6838f7ab7c61e" + } + }, + "original_exe": "0a1fee632cb640dff4599fdcca277c959038d31ec88bfed8cff893b3271d26a6", + "instrumented_exe": "babd7b24d89ae970f614c6d4b6090054db9df3a40dfbcbdcadaf53b5b2e79f24", + "resources": false + }, + "phase_wall_times": { + "phases": [ + { + "id": 0, + "ns": 64631951400, + "max_ns": 55502600, + "count": 4896 + }, + { + "id": 1, + "ns": 64079457000, + "max_ns": 55183600, + "count": 1771 + }, + { + "id": 2, + "ns": 335900, + "max_ns": 24500, + "count": 1806 + }, + { + "id": 3, + "ns": 500625100, + "max_ns": 8645600, + "count": 1958 + }, + { + "id": 4, + "ns": 73427600, + "max_ns": 9092300, + "count": 4896 + }, + { + "id": 5, + "ns": 745500, + "max_ns": 20500, + "count": 4754 + }, + { + "id": 6, + "ns": 1053698100, + "max_ns": 10532400, + "count": 233 + }, + { + "id": 7, + "ns": 1137670500, + "max_ns": 268286300, + "count": 611 + }, + { + "id": 8, + "ns": 157240300, + "max_ns": 17637500, + "count": 25 + }, + { + "id": 9, + "ns": 160054100, + "max_ns": 40076700, + "count": 48 + } + ] + }, + "limitations": [ + "nested inclusive wall timers; do not add phases", + "instrumentation overhead", + "resource sampler disabled for diagnosis", + "shared host; not formal R54 samples", + "no actual presented endpoint; no user-approved performance tolerance" + ] + }, + { + "run": "ui-run-82b1582d98de4cc1bd659c481ee99cfa", + "sample": { + "mode": "ui-workflow-sessions", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "desktop_gone": true, + "error_kind": "ProbeFailure" + }, + "data_only": true, + "system_clipboard": false, + "ime": false, + "checkpoints": [ + { + "phase": "eight-ready", + "elapsed_ms": 603, + "cycle": 0 + }, + { + "phase": "reject-ninth", + "elapsed_ms": 606, + "cycle": 0 + }, + { + "phase": "load-started", + "elapsed_ms": 839, + "cycle": 0 + }, + { + "phase": "reading-before-append", + "elapsed_ms": 870, + "cycle": 0 + }, + { + "phase": "reading-after-append", + "elapsed_ms": 1104, + "cycle": 0 + }, + { + "phase": "search-running", + "elapsed_ms": 1350, + "cycle": 0 + }, + { + "phase": "find-complete", + "elapsed_ms": 11017, + "cycle": 0 + }, + { + "phase": "foreground-input", + "elapsed_ms": 11226, + "cycle": 0 + }, + { + "phase": "zoom-75", + "elapsed_ms": 11434, + "cycle": 0 + }, + { + "phase": "switch-zoom", + "elapsed_ms": 11664, + "cycle": 0 + }, + { + "phase": "history-evicted", + "elapsed_ms": 12079, + "cycle": 0 + }, + { + "phase": "paste-cancel-pending", + "elapsed_ms": 13120, + "cycle": 0 + }, + { + "phase": "paste-cancelled", + "elapsed_ms": 14002, + "cycle": 0 + }, + { + "phase": "background-complete", + "elapsed_ms": 47021, + "cycle": 0 + }, + { + "phase": "cycle-six", + "elapsed_ms": 47482, + "cycle": 1 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 48797, + "cycle": 1 + }, + { + "phase": "cycle-six", + "elapsed_ms": 49478, + "cycle": 2 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 50760, + "cycle": 2 + }, + { + "phase": "cycle-six", + "elapsed_ms": 51410, + "cycle": 3 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 52749, + "cycle": 3 + }, + { + "phase": "cycle-six", + "elapsed_ms": 53355, + "cycle": 4 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 54707, + "cycle": 4 + }, + { + "phase": "cycle-six", + "elapsed_ms": 55349, + "cycle": 5 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 56623, + "cycle": 5 + }, + { + "phase": "paste-close-pending", + "elapsed_ms": 57079, + "cycle": 5 + } + ], + "paste_cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ], + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "identity.json": "7dc04a9a23392081f4b638214f91063c0a4b1704727470d1d14394d37aa97cde", + "resource-phases.jsonl": "0ed18c34974f8bf7e8d3e20949384e52b911672723293df5a3acf8c036cfb646", + "sample.json": "4d3fdb3f0561f468199900f2dfaaf4ed980cc1bdcdb9a1fa2db249676c170bbc", + "sessions.json": "1197f7ec3928c0dd08d8497610fe95b5171aa96559e9058e4ce1669f2fdc86cf", + "ui-phases.json": "cf363bd31befa7c37a6495591d630b1f0b9b164c07b1a9baa7871f6b1032aae4", + "workspace.layout": "9a96d62943f54727e7c50ce5785a571efbfa6cbece6248f6a6d144257c1e1d58" + }, + "observed_failure": "workflow sessions scenario timeout at stage 45", + "instrumentation": { + "phases": [ + "whole_tick", + "parser_feed", + "search_changed", + "publish", + "poll_find", + "shell_scenario", + "shell_paint", + "workflow_scenario", + "workflow_checkpoint", + "workspace_paint", + "core_feed", + "scan_replay", + "synchronize", + "cell_export", + "reconcile_replay", + "merge_history", + "versions_copy" + ], + "source": { + "experiments/shell/shell.cpp": { + "original": "b369968152bbff107c699181d4e23f271e62a5732f0c41793159b3efc3609321", + "instrumented": "0e0cfbd952c37d05a0333bd79662ead2777dd19db220f08993a762437cb9bb77" + }, + "experiments/shell/search_interactions.hpp": { + "original": "75f1ac520dc3070efba2d01812bf56c29e8683540196956423b0984c42d7b181", + "instrumented": "b337e56639d273b45faca154ed20830157991b6e158834e3c377a1a74c6f4b55" + }, + "experiments/shell/workspace_workflow_scenario.hpp": { + "original": "467571556440f4e89305bc1261d389bb8f24ba84f607b8cd36b8078a58314369", + "instrumented": "2a95c33f6b6212f61c8217fd55298b16ca90209f8b9cd972e7dc135e94fc4c57" + }, + "experiments/shell/workspace.hpp": { + "original": "5669a13701b2fe60e8bd567a122edb970bdc4aadcb98ceb3927905f0c000275e", + "instrumented": "9cbe9e5db3529e578eec705307d9cab23035623b3f46ac9d14d6838f7ab7c61e" + }, + "experiments/core/candidate_terminal.cpp": { + "original": "0d0eaabe5ef896aa7b263c8151622f579f37c421bf9473fc3d69ada010a64e61", + "instrumented": "5138c797086f84f584a254894004286257a1434bf2903ffcafd3751acb60ebba" + } + }, + "original_exe": "0a1fee632cb640dff4599fdcca277c959038d31ec88bfed8cff893b3271d26a6", + "instrumented_exe": "23b92b9087d836947bf848da3de7e04f624bada0c6ca6284690ea63719b6668f", + "resources": false + }, + "phase_wall_times": { + "phases": [ + { + "id": 0, + "ns": 64458192200, + "max_ns": 56417700, + "count": 5278 + }, + { + "id": 1, + "ns": 63986560900, + "max_ns": 56035900, + "count": 1892 + }, + { + "id": 2, + "ns": 449600, + "max_ns": 17600, + "count": 1922 + }, + { + "id": 3, + "ns": 432217300, + "max_ns": 3678600, + "count": 2074 + }, + { + "id": 4, + "ns": 52400300, + "max_ns": 4067000, + "count": 5278 + }, + { + "id": 5, + "ns": 787000, + "max_ns": 88700, + "count": 5137 + }, + { + "id": 6, + "ns": 958451800, + "max_ns": 11927600, + "count": 233 + }, + { + "id": 7, + "ns": 1086472600, + "max_ns": 239174200, + "count": 671 + }, + { + "id": 8, + "ns": 149742300, + "max_ns": 18294300, + "count": 25 + }, + { + "id": 9, + "ns": 141821100, + "max_ns": 21889600, + "count": 48 + }, + { + "id": 10, + "ns": 559755900, + "max_ns": 3343000, + "count": 1892 + }, + { + "id": 11, + "ns": 4690100, + "max_ns": 51400, + "count": 1892 + }, + { + "id": 12, + "ns": 63419742700, + "max_ns": 55759500, + "count": 1892 + }, + { + "id": 13, + "ns": 2031090200, + "max_ns": 7882100, + "count": 1930 + }, + { + "id": 14, + "ns": 60905226900, + "max_ns": 54182500, + "count": 1930 + }, + { + "id": 15, + "ns": 317300, + "max_ns": 3000, + "count": 1930 + }, + { + "id": 16, + "ns": 363684200, + "max_ns": 3660300, + "count": 1930 + } + ] + }, + "limitations": [ + "nested inclusive wall timers; do not add phases", + "instrumentation overhead", + "resource sampler disabled for diagnosis", + "shared host; not formal R54 samples", + "no actual presented endpoint; no user-approved performance tolerance" + ] + } +] diff --git a/experiments/shell/results/2026-10-26-replay-cost-and-close/validation.json b/experiments/shell/results/2026-10-26-replay-cost-and-close/validation.json new file mode 100644 index 00000000..a575046f --- /dev/null +++ b/experiments/shell/results/2026-10-26-replay-cost-and-close/validation.json @@ -0,0 +1,1513 @@ +{ + "schema": "termforge-replay-cost-closing-reply-v1", + "date": "2026-10-26", + "issue": 53, + "source_commit": "eae4b6a4ef3e044ebfebbbbfeccf9aec74cd7f0d", + "source_tree": "b07036829c5c8bd61ede6a8aa46f655e541ada1b", + "source_files": { + "CMakeLists.txt": { + "git_blob": "2454a7b8dc34fa2bbd74b25b0ad77d19a71a5f18", + "checkout_sha256": "f5bb85e12b7a815c4feb7417da9ebc5298de58664bcd2792b277cb282729da73" + }, + "experiments/core/candidate_terminal.cpp": { + "git_blob": "9bb1fab8f6deac294d0ba1a44712b67c919d03c7", + "checkout_sha256": "3092ee2ea44ca0f897a7d3b6244c079ba8073dc109993204e435f065388a2ed1" + }, + "experiments/shell/shell.cpp": { + "git_blob": "90b3f166e8a50ca2488f749e8e188c52cb5e4a91", + "checkout_sha256": "ac4dd44861aa2928213fffe91d30cdaf3aedf19f08468aefeed22828352296cc" + }, + "experiments/shell/candidate_reply_close_test.cpp": { + "git_blob": "1a5e0149c553469645dbfe3ddb217908b1958d42", + "checkout_sha256": "453ab888fb57d4f918bcfa583da7167a21463ce185be2a3d67caec74505fc424" + }, + "experiments/shell/test_workflow_sessions.py": { + "git_blob": "de6cef3be06725d606b91ae68eb1cc45eb744fb5", + "checkout_sha256": "6c968a443c46b30e75a929f880228e6a23bf2b92d9221bbbf18816933babd6e7" + }, + "experiments/shell/test_shell.py": { + "git_blob": "66512ac1099cf477cac8f26f225b18c301c1d3d8", + "checkout_sha256": "a6b63c1754b0e0dc1cc01863891f4c7c9d989f818d351838a8cfe295edaf811c" + }, + "experiments/shell/run.py": { + "git_blob": "bbd4dfc05012c55956973d7e2c69be717b48b1a9", + "checkout_sha256": "45976b828eecb316881d698dedaef09ad304f72d991dfa360f1c552bbcbe9f1d" + }, + "experiments/shell/workflow_sessions_checks.py": { + "git_blob": "8369b412abe893393bf316430ccedd22e9eb75ba", + "checkout_sha256": "b976d3504837eef57ff13319daed254870727741f36f265412a6b14b4cb3faae" + } + }, + "environment": { + "os": "Windows-11-10.0.26200-SP0", + "architecture": "AMD64", + "compiler": "MSVC 19.42.34433", + "configuration": "Release x64", + "candidate": "alacritty_terminal 0.26.1-dev+termforge.4", + "backend": "Microsoft.Windows.Console.ConPTY 1.25.260930003", + "glyph_width_flags": 24 + }, + "request": { + "utf8_bytes": 3000000, + "utf16_units": 1000000, + "literal": "U+6C49 repeated 1000000", + "sha256": "0ba67970de9941c1bc33e97869b116a0e129c8a859e3b4c0087e20c51f6a404b", + "minimum_sent": 16384, + "receiver_checkpoint_bytes": 768 + }, + "deadlines_ms": { + "standalone_ui": 35000, + "standalone_outer": 40000, + "receiver_gate": 15000, + "eight_session_ui": 70000, + "workflow_fixture": 55000, + "missing_go_negative_only": 2000 + }, + "binaries": { + "alpha_normal_smoke.exe": "36ac6dbe36c942b9850d6d9f5b3538fbfe2fc251f38ac026ea12c343b0e9abc8", + "candidate_core_test.exe": "6e9df1abbe2271690a1480a1be9042e219a5947779b6a4b03f529a742fbd10ce", + "candidate_reply_close_test.exe": "662a331701e49885ce56328ae19ddc2166347c5f802d7faa2787eef46e25b000", + "candidate_resize_replay.exe": "3d91227adb37bba4defcef8f803f0f3c2916001223300b99d18e0e2ab695de94", + "candidate_title_test.exe": "a9591c36d5a54a1f54cf30ec8f8b0e7ff047096f5adf2e2a74169252ab041852", + "clipboard_policy_test.exe": "809815e9838cad5b3443c98620d23a4e6c7186b5304b524d0990988eb47a6da9", + "conpty_backend_probe.exe": "3c54962c20f04e688a0413bb822713e908582af20b0be8bcfd188fb436907ef8", + "conpty_ctrl_c_probe.exe": "ac5ae5ccdb77c82512a8a6d769fafbe74693bf6fc535ce4d22bf60b0c8df2bfa", + "conpty_margin_probe.exe": "5404b009d0e005cd940d8a65afeb0fb9caf9c9ce2a18f651a88146343c41c252", + "core_measure.exe": "df9df797b16239d2fb71707f8a042a1ed956ad30c407d884527cdf18d600e785", + "find_bar_test.exe": "030733a2396ca9b31bbd029c610f1b838ab52394338c08410274501747dd9982", + "history_test.exe": "035507366facfd6de00e0c2762775c8d3816f605da3e55d498995a74a3f447d2", + "ime_context_test.exe": "be0d71ca72aee3dbd1565c9ad2314f81f0cd0c5511ec54cb623bbd39eede9974", + "ime_input_expectation_test.exe": "a5ea4532a06b893d955299793b4859cb9ccf221fab64e51949e1af2ee6ba5d0b", + "keyboard_test.exe": "18a35c2b2ab8a6316e0c938d8c36d0b82bcc131989d683205888b08bf4d33e19", + "layout_state_test.exe": "307519003536ce16d7d6fc552b3a25e9de25356d50a80c2de0c01168a10784a9", + "paste_test.exe": "47e9a5ce33335370b6fb199b0ff11adc19e2ab55bf64657061a13c1c020a24b0", + "presentation_probe.exe": "b7043cace46f65b22c7295df2fc06b214f060c2fd6fe18ac5ff27e13d943e096", + "raw_console_receiver_test.exe": "9c05cdb80d87ff264b3275387eb01dabc8f57640adbc7ee3910b0fc44f378224", + "real_app_capture.exe": "011efaad94da74ce182e30a3ff8abb0c1e1f58235bc77fa8c347ec3d9dcb822e", + "receive.exe": "ef316e11ddcc764ddac57426fc37b8b69f599ddb28a0ffedf5c2e85a3004a9d4", + "recovery_probe.exe": "c84e7b1b1792773b993f2758d5cafa59b80495451c01d194c3afd6cc653f0344", + "renderer_metrics_test.exe": "4cebad62798ff0f8eac42641a1119c7b9725728dd5fd31befcdf7e1ecb686cfd", + "replay.exe": "674f96ebbf00497576951a6780a5cf5195e3b80cc4acdb7f296fa8910a6203b7", + "resize_test.exe": "f566c56a1fa34e2a8ff480900ac5ae5059e2ac6872554208d5dbf0e24673dde0", + "runtime_observation_test.exe": "b721e08397dc0a1b80cff3cc9b3354d5ba81c59d9ef3e0934a7ec27fb2f5eebe", + "scenario_tick_gate_test.exe": "06cd4e813f1034d1a8c7fea592979f49c3ef89117c97fc6636cdae5012017ce8", + "search_test.exe": "0f29f3ea3147cc45eb2e500e683f3bcc1db04f820470b2ff473fffcb31cdb4f4", + "selection_test.exe": "104576787b62c2c4bb2428e0786c7742e63a23ceb766df293c88a5ccc6a1b836", + "sender_fence_pipe_test.exe": "6a94ac84631434a81ae1098932813d7ceeb81f2bb33a2e4b2456834bd8972e92", + "sender_fence_test.exe": "ab4af3b0f148f6e6377e70c98936c6c34d0be0d3cee4b17b3f8554c39b2d3e52", + "sent_message_wait_test.exe": "bc3cff14f60e3f1b17b3fd6255ff1c5b507f506d897d528802efa9666be74dcf", + "shell_clipboard_reader.exe": "bacc4bff465ca644fae61f9d26184a7adc22df9793470feca647af1d823fece8", + "shell_ime_client.exe": "d787ebf702cf5895e1ad0d71f895a51b3dead34d02953b5e7deff086c2bf8eb7", + "shell_input_client.exe": "850c82fb8bb58de8170bf096cc6dd4f8ba34d9ba11dbd2addc41508cddc31d8c", + "shell_launch_test.exe": "ace9b63148848bf7b405edb4b8818ca23d52699ac2ce8ca03a90c5bc1e32622d", + "shell_paste_probe.exe": "1370c6381b990270dfd816f53758e5aa57c63deba050fa7cf0dbd0d5cbf4f315", + "shell_query_client.exe": "71419f7918bc58f4ee47d14f8e6de35aa1828ac838a73ed607797fc120f56886", + "shell_queue_probe.exe": "7f34d6ff66b3e00d56798e22a480fb20a5afa083cff65a9d689dcbca44dbe12d", + "shell_selection_text_client.exe": "dbad81a22ecce4508eada90ae445f9a75abfe1effd2571776ef31b32144c8ac4", + "shell_size_client.exe": "5394d9863df9a589012f0d9a31f7e4167e7bc4ea23e93f9711c0a67c540651f6", + "shell_test_launcher.exe": "dbde4249dc08c7df80120398ffd252aa5e4958e4ef640cc161ea4c2d28b9f291", + "shell_text_client.exe": "9485b03424e421a4018596cc9487e7feeb33c26d30820985aa45843fdcf315d9", + "termforge_conpty_probe.exe": "7dd59bc8d0309ad5b131cde1c3ed98819139b6bb70f505347c98aabe8396f618", + "termforge_ime_probe.exe": "788a186b5fafb6d155eeab74f78d4f7cb992a599937b3aa48c5efcf49affe993", + "termforge_shell.exe": "9c01fa0577d8fc922d239d8a711ac13d1e4989104aad68795230bfcd998b4eb6", + "terminal_trace.exe": "40e869753f4c00515ee0990f3732eac04f965fe2c3070f1bf772717476269f3d", + "text_action_policy_test.exe": "535b469c9aa0da7e77670578f75d04956d98e9f912d5c9a6c310ab796ab58d4f", + "transport_completion_test.exe": "b83b797cacd8aaa05bfe8697b54f86da4d0ffe618b37b9b7080dbe05a0e99ad9", + "workflow_fixture_test.exe": "a6624a6b1536c6f445f92e05ff72a5318ece47d455500f6adc467d94f9f04222", + "workspace_state_test.exe": "ac3fbc8a56d33efda33cc9040c731c183e0a8666e23fce48d368c1868797714d", + "conpty-backend/conpty.dll": "feeef341d891643c62d30b6b07800bc70f0bc148f44cb8c3bee84aa557ae805a", + "conpty-backend/OpenConsole.exe": "3d66b23d0a71bb8eed2b77edc8b9df9bf54ce6c8fb74c863a30e760997f80586" + }, + "vim": { + "version": "9.1 patches 1-532, MSYS2", + "sha256": "2e0fda63a89171adfc46c9417d5105cc39ed778cc69a890b83a4eabc34e7646a", + "scope": "test-process PATH only" + }, + "final_ctest": { + "started_at": "2026-10-26T15:52:21.7023013Z", + "completed_at": "2026-10-26T16:00:07.0924704Z", + "exit_code": 8, + "tests": [ + { + "number": 1, + "name": "shell_launch", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 2, + "name": "candidate_title", + "result": "Passed", + "elapsed_seconds": 0.78 + }, + { + "number": 3, + "name": "candidate_reply_close", + "result": "Passed", + "elapsed_seconds": 0.36 + }, + { + "number": 4, + "name": "runtime_observation", + "result": "Passed", + "elapsed_seconds": 1.66 + }, + { + "number": 5, + "name": "ime_input_expectation", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 6, + "name": "sent_message_wait", + "result": "Passed", + "elapsed_seconds": 0.3 + }, + { + "number": 7, + "name": "find_bar", + "result": "Passed", + "elapsed_seconds": 0.37 + }, + { + "number": 8, + "name": "renderer_metrics", + "result": "Passed", + "elapsed_seconds": 0.92 + }, + { + "number": 9, + "name": "ime_context", + "result": "Passed", + "elapsed_seconds": 0.35 + }, + { + "number": 10, + "name": "layout_state", + "result": "Passed", + "elapsed_seconds": 0.13 + }, + { + "number": 11, + "name": "workspace_state", + "result": "Passed", + "elapsed_seconds": 0.34 + }, + { + "number": 12, + "name": "transport_completion", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 13, + "name": "scenario_tick_gate", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 14, + "name": "candidate_core", + "result": "Passed", + "elapsed_seconds": 1.17 + }, + { + "number": 15, + "name": "resize_core", + "result": "Passed", + "elapsed_seconds": 0.02 + }, + { + "number": 16, + "name": "history_core", + "result": "Passed", + "elapsed_seconds": 0.02 + }, + { + "number": 17, + "name": "selection_core", + "result": "Passed", + "elapsed_seconds": 0.09 + }, + { + "number": 18, + "name": "search_core", + "result": "Passed", + "elapsed_seconds": 0.12 + }, + { + "number": 19, + "name": "paste", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 20, + "name": "sender_fence", + "result": "Passed", + "elapsed_seconds": 1.03 + }, + { + "number": 21, + "name": "sender_fence_pipe", + "result": "Passed", + "elapsed_seconds": 0.38 + }, + { + "number": 22, + "name": "clipboard_policy", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 23, + "name": "keyboard", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 24, + "name": "text_action_policy", + "result": "Passed", + "elapsed_seconds": 0.01 + }, + { + "number": 25, + "name": "candidate_resize_replay", + "result": "Passed", + "elapsed_seconds": 0.56 + }, + { + "number": 26, + "name": "candidate_shell_tui", + "result": "***Failed", + "elapsed_seconds": 30.68 + }, + { + "number": 27, + "name": "core", + "result": "Passed", + "elapsed_seconds": 6.15 + }, + { + "number": 28, + "name": "recovery", + "result": "Passed", + "elapsed_seconds": 9.89 + }, + { + "number": 29, + "name": "measure", + "result": "Passed", + "elapsed_seconds": 4.03 + }, + { + "number": 30, + "name": "binary_paths", + "result": "Passed", + "elapsed_seconds": 0.18 + }, + { + "number": 31, + "name": "conpty_margin_contract", + "result": "Passed", + "elapsed_seconds": 0.36 + }, + { + "number": 32, + "name": "benchmark_tools", + "result": "Passed", + "elapsed_seconds": 5.57 + }, + { + "number": 33, + "name": "differential", + "result": "Passed", + "elapsed_seconds": 3.67 + }, + { + "number": 34, + "name": "ime_inventory", + "result": "Passed", + "elapsed_seconds": 50.6 + }, + { + "number": 35, + "name": "text_actions", + "result": "Passed", + "elapsed_seconds": 5.6 + }, + { + "number": 36, + "name": "workflow_fixture", + "result": "Passed", + "elapsed_seconds": 22.74 + }, + { + "number": 37, + "name": "workflow_sessions", + "result": "Passed", + "elapsed_seconds": 77.08 + }, + { + "number": 38, + "name": "workflow_resources", + "result": "Passed", + "elapsed_seconds": 0.6 + }, + { + "number": 39, + "name": "workflow_resource_phases", + "result": "Passed", + "elapsed_seconds": 4.35 + }, + { + "number": 40, + "name": "workflow_system_content", + "result": "Passed", + "elapsed_seconds": 0.16 + }, + { + "number": 41, + "name": "workflow_system_runner", + "result": "Passed", + "elapsed_seconds": 0.67 + }, + { + "number": 42, + "name": "copy_error_frame", + "result": "Passed", + "elapsed_seconds": 0.17 + }, + { + "number": 43, + "name": "paste_fence_evidence", + "result": "Passed", + "elapsed_seconds": 0.12 + }, + { + "number": 44, + "name": "resize_trace", + "result": "Passed", + "elapsed_seconds": 0.13 + }, + { + "number": 45, + "name": "research_guards", + "result": "Passed", + "elapsed_seconds": 5.06 + }, + { + "number": 46, + "name": "receive", + "result": "Passed", + "elapsed_seconds": 0.25 + }, + { + "number": 47, + "name": "conpty", + "result": "Passed", + "elapsed_seconds": 23.48 + }, + { + "number": 48, + "name": "conpty_ctrl_c", + "result": "Passed", + "elapsed_seconds": 4.42 + }, + { + "number": 49, + "name": "conpty_margin", + "result": "Passed", + "elapsed_seconds": 0.36 + }, + { + "number": 50, + "name": "conpty_backend", + "result": "Passed", + "elapsed_seconds": 1.24 + }, + { + "number": 51, + "name": "presentation", + "result": "Passed", + "elapsed_seconds": 4.05 + }, + { + "number": 52, + "name": "shell", + "result": "***Timeout", + "elapsed_seconds": 180.05 + }, + { + "number": 53, + "name": "selection_bytes", + "result": "Passed", + "elapsed_seconds": 3.65 + }, + { + "number": 54, + "name": "selection_context", + "result": "Passed", + "elapsed_seconds": 3.91 + }, + { + "number": 55, + "name": "raw_console_receiver", + "result": "Passed", + "elapsed_seconds": 0.41 + }, + { + "number": 56, + "name": "paste_system", + "result": "Passed", + "elapsed_seconds": 6.7 + } + ], + "ctest_log_sha256": "8aafbb86aff94166f27131a0730ae9f89047eabfd573df3009c1b2be7d60bef2", + "last_test_log_sha256": "c7c335df7b947320a6fcd0fdd22287d8bdb13aed18bc9ed95377b8c8dc2e64a2" + }, + "diagnostic_artifacts": [ + "headless-ordinary.json", + "headless-resize.json", + "ui-profiles.json", + "intermediate-workflows.json", + "closing-reply.json" + ], + "limitations": [ + "Only candidate .4 with explicit official backend validated here", + "Data-only eight-session contract; no hosted real clipboard or IME acceptance", + "Shared-host diagnostics are not R54 formal samples or WindTerm performance equivalence", + "No user-approved numeric budget; presentation endpoint unknown", + "Unrelated Vim, resize and workspace failures remain open" + ], + "eight_session_runs": [ + { + "run": "run-40c6fff18ecd453684ad2ee06a44c669", + "sample": { + "mode": "ui-workflow-sessions", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workflow-sessions", + "sessions_closed": 18, + "active_children_after": 0, + "presented_done": null + }, + "frame_sha256": "68fb528174c7f7edf2916ca1b6f1f7d2a6b80deeb4cec787539fb051bb344ee5", + "sessions_workflow": { + "schema": "termforge-workflow-sessions-identity-validation-v1", + "live_sessions": 8, + "checkpoints": 26, + "rejected_ninth": true, + "load_foreground_verified": true, + "data_workflow_verified": true, + "complete_workflow_verified": false, + "system_clipboard_verified": false, + "ime_verified": false + }, + "resources": { + "summary": "resource-summary.json", + "scope": "launcher-tree", + "performance_gate": "not_evaluated" + }, + "error_kind": null + }, + "data_only": true, + "system_clipboard": false, + "ime": false, + "checkpoints": [ + { + "phase": "eight-ready", + "elapsed_ms": 571, + "cycle": 0 + }, + { + "phase": "reject-ninth", + "elapsed_ms": 574, + "cycle": 0 + }, + { + "phase": "load-started", + "elapsed_ms": 731, + "cycle": 0 + }, + { + "phase": "reading-before-append", + "elapsed_ms": 749, + "cycle": 0 + }, + { + "phase": "reading-after-append", + "elapsed_ms": 877, + "cycle": 0 + }, + { + "phase": "search-running", + "elapsed_ms": 1021, + "cycle": 0 + }, + { + "phase": "find-complete", + "elapsed_ms": 6355, + "cycle": 0 + }, + { + "phase": "foreground-input", + "elapsed_ms": 6493, + "cycle": 0 + }, + { + "phase": "zoom-75", + "elapsed_ms": 6626, + "cycle": 0 + }, + { + "phase": "switch-zoom", + "elapsed_ms": 6775, + "cycle": 0 + }, + { + "phase": "history-evicted", + "elapsed_ms": 7020, + "cycle": 0 + }, + { + "phase": "paste-cancel-pending", + "elapsed_ms": 7606, + "cycle": 0 + }, + { + "phase": "paste-cancelled", + "elapsed_ms": 7975, + "cycle": 0 + }, + { + "phase": "background-complete", + "elapsed_ms": 26268, + "cycle": 0 + }, + { + "phase": "cycle-six", + "elapsed_ms": 26584, + "cycle": 1 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 27859, + "cycle": 1 + }, + { + "phase": "cycle-six", + "elapsed_ms": 28160, + "cycle": 2 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 29429, + "cycle": 2 + }, + { + "phase": "cycle-six", + "elapsed_ms": 29734, + "cycle": 3 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 31003, + "cycle": 3 + }, + { + "phase": "cycle-six", + "elapsed_ms": 31326, + "cycle": 4 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 32562, + "cycle": 4 + }, + { + "phase": "cycle-six", + "elapsed_ms": 32875, + "cycle": 5 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 34169, + "cycle": 5 + }, + { + "phase": "paste-close-pending", + "elapsed_ms": 34461, + "cycle": 5 + }, + { + "phase": "after-paste-close", + "elapsed_ms": 34675, + "cycle": 5 + } + ], + "paste_cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ], + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "frame.bmp": "68fb528174c7f7edf2916ca1b6f1f7d2a6b80deeb4cec787539fb051bb344ee5", + "resource-observations.jsonl": "39a33bf36d3da8512f99e18c617bb8ae9d2ce18bd45d8fb923ea89e3bc6fd15c", + "resource-phases.jsonl": "3d4bed0243cafdcb17e067cf7a80fc0a8deab7b297a4976cd4ca3fab6595b100", + "resource-summary.json": "8084b1234602e26ee63f26be0067a9fc8845eef227e9db7277c7092ea0528273", + "sample.json": "efb0f88de0d82b21f38592e2858c3937c9e4c56a0f57c9cbfc128b8cdb5ef818", + "sample.public.json": "9507843aee6d9088fd93fb35fb925f64d9b854f0d0c307dc5bc6676422ff7604", + "sessions.json": "953d27af5461179b5cfa672022f9ab7d7f1c50670b20f3acba9fb9bb046f7f28", + "validation.json": "0449c92f202590a5255928fb7df1f5ab615821d26656a3675c9b78a50c7692ef", + "workspace.layout": "9a96d62943f54727e7c50ce5785a571efbfa6cbece6248f6a6d144257c1e1d58" + } + }, + { + "run": "run-529ed519a8f145f191c850d0218abb04", + "sample": { + "mode": "ui-workflow-sessions", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 77, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workflow-sessions", + "sessions_closed": 18, + "active_children_after": 0, + "presented_done": null + }, + "frame_sha256": "4443a91feb73693650c2a6f8ac4feb91fa9fe3fee9e1340086892c2257db1990", + "sessions_workflow": { + "schema": "termforge-workflow-sessions-identity-validation-v1", + "live_sessions": 8, + "checkpoints": 26, + "rejected_ninth": true, + "load_foreground_verified": true, + "data_workflow_verified": true, + "complete_workflow_verified": false, + "system_clipboard_verified": false, + "ime_verified": false + }, + "resources": { + "summary": "resource-summary.json", + "scope": "launcher-tree", + "performance_gate": "not_evaluated" + }, + "error_kind": null + }, + "data_only": true, + "system_clipboard": false, + "ime": false, + "checkpoints": [ + { + "phase": "eight-ready", + "elapsed_ms": 570, + "cycle": 0 + }, + { + "phase": "reject-ninth", + "elapsed_ms": 574, + "cycle": 0 + }, + { + "phase": "load-started", + "elapsed_ms": 730, + "cycle": 0 + }, + { + "phase": "reading-before-append", + "elapsed_ms": 752, + "cycle": 0 + }, + { + "phase": "reading-after-append", + "elapsed_ms": 881, + "cycle": 0 + }, + { + "phase": "search-running", + "elapsed_ms": 1038, + "cycle": 0 + }, + { + "phase": "find-complete", + "elapsed_ms": 6482, + "cycle": 0 + }, + { + "phase": "foreground-input", + "elapsed_ms": 6642, + "cycle": 0 + }, + { + "phase": "zoom-75", + "elapsed_ms": 6791, + "cycle": 0 + }, + { + "phase": "switch-zoom", + "elapsed_ms": 6946, + "cycle": 0 + }, + { + "phase": "history-evicted", + "elapsed_ms": 7233, + "cycle": 0 + }, + { + "phase": "paste-cancel-pending", + "elapsed_ms": 7992, + "cycle": 0 + }, + { + "phase": "paste-cancelled", + "elapsed_ms": 8387, + "cycle": 0 + }, + { + "phase": "background-complete", + "elapsed_ms": 27312, + "cycle": 0 + }, + { + "phase": "cycle-six", + "elapsed_ms": 27632, + "cycle": 1 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 28930, + "cycle": 1 + }, + { + "phase": "cycle-six", + "elapsed_ms": 29255, + "cycle": 2 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 30560, + "cycle": 2 + }, + { + "phase": "cycle-six", + "elapsed_ms": 30907, + "cycle": 3 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 32144, + "cycle": 3 + }, + { + "phase": "cycle-six", + "elapsed_ms": 32466, + "cycle": 4 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 33763, + "cycle": 4 + }, + { + "phase": "cycle-six", + "elapsed_ms": 34105, + "cycle": 5 + }, + { + "phase": "cycle-eight", + "elapsed_ms": 35332, + "cycle": 5 + }, + { + "phase": "paste-close-pending", + "elapsed_ms": 35604, + "cycle": 5 + }, + { + "phase": "after-paste-close", + "elapsed_ms": 35808, + "cycle": 5 + } + ], + "paste_cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ], + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "frame.bmp": "4443a91feb73693650c2a6f8ac4feb91fa9fe3fee9e1340086892c2257db1990", + "resource-observations.jsonl": "4a24473a1c2c48d3f96098f18dd8c99b16e1e33c30856900727c20af6cd4a832", + "resource-phases.jsonl": "4ddef626506c4410572d43f8daaa521487ce6121bc26fadca51c17a3ed73dc50", + "resource-summary.json": "a1c3b5a9b1c224c2ee9bd398ee72edecfc0046aacd464998ed68d20171dd5a59", + "sample.json": "d8abba7266e09bfbfab499957e620b1fd2e111c0b26aab6994baf0222108f3cf", + "sample.public.json": "2a0f6f9d77f7a858d372dcc0ad139b74b6e5e27550af87acb11f099df85986ed", + "sessions.json": "29bea82e4c709a55704b9dc6491e7a9c9a1cba08dfb42e4ef0564e765128aacf", + "validation.json": "1cc474b79845172d40b6544689ef261a331cdd7ebb4760d908c55c8d21fa9c41", + "workspace.layout": "9a96d62943f54727e7c50ce5785a571efbfa6cbece6248f6a6d144257c1e1d58" + } + } + ], + "internal_skips": [ + "setUpClass (test_candidate_compare.CandidateComparisonTests) ... skipped 'optional Alacritty binary is not built; core-candidate workflow runs these checks'", + "setUpClass (test_capability_matrix.CapabilityMatrixTests) ... skipped 'optional Alacritty binary is not built; core-candidate workflow runs these checks'", + "setUpClass (test_fuzz_matrix.FuzzMatrixTests) ... skipped 'optional Alacritty binary is not built; core-candidate workflow runs these checks'", + "setUpClass (test_real_app_matrix.RealApplicationMatrixTests) ... skipped 'optional real application capture dependencies are not built'", + "test_actual_system_copy_paste_and_shortcuts_twice (experiments.shell.test_actions.ActionWindowTest.test_actual_system_copy_paste_and_shortcuts_twice) ... skipped 'actual system Copy/Paste requires a disposable hosted VM'", + "test_suspended_target_is_reclaimed_if_job_assignment_fails (test_ui_r1.EvidenceBoundaryTests.test_suspended_target_is_reclaimed_if_job_assignment_fails) ... skipped 'opt-in pinned reference failure injection'", + "test_mouse_selection_to_real_system_clipboard (experiments.shell.test_shell.ShellTests.test_mouse_selection_to_real_system_clipboard) ... skipped 'system copy UI gate requires a disposable hosted VM'", + "test_system_clipboard_product_read_errors_cancel_and_close (experiments.shell.test_shell.ShellTests.test_system_clipboard_product_read_errors_cancel_and_close) ... skipped 'product clipboard read gate requires a disposable hosted VM'", + "test_system_clipboard_shortcut_to_window_confirmation_and_receiver (experiments.shell.test_shell.ShellTests.test_system_clipboard_shortcut_to_window_confirmation_and_receiver) ... skipped 'real system clipboard UI gate requires a disposable hosted VM'", + "test_real_system_copy_shortcuts_for_styled_fixture_twice (experiments.shell.test_selection_bytes.SelectionBytesWindowTest.test_real_system_copy_shortcuts_for_styled_fixture_twice) ... skipped 'system CF requires a disposable hosted VM'", + "test_real_system_copy_and_edit_context_twice (experiments.shell.test_selection_context.SelectionContextWindowTest.test_real_system_copy_and_edit_context_twice) ... skipped 'real CF/EDIT Copy requires a disposable hosted VM'", + "test_real_system_clipboard (experiments.shell.test_paste.PasteTests.test_real_system_clipboard) ... skipped 'Private window station OpenClipboard denied (5); system API gate remains unverified." + ], + "shell_unit_status": [ + { + "name": "test_clipboard_evidence_rejects_leaks_missing_phases_and_false_cleanup", + "status": "ok" + }, + { + "name": "test_hosted_guards_reject_missing_or_partial_identity_before_any_work", + "status": "ok" + }, + { + "name": "test_native_clipboard_mode_refuses_non_hosted_before_window_creation", + "status": "ok" + }, + { + "name": "test_actual_client_bounds_drive_geometry", + "status": "ok" + }, + { + "name": "test_native_copy_return_highlight_cf_and_target_are_independent_gates", + "status": "ok" + }, + { + "name": "test_occupied_product_copy_keeps_original_error_sentinel_target_and_strict_join", + "status": "ok" + }, + { + "name": "test_old_v3_is_readable_but_never_claims_the_new_copy_popup_gate", + "status": "ok" + }, + { + "name": "test_assignment_failure_reaps_gated_launcher_and_preserves_failure", + "status": "ok" + }, + { + "name": "test_close_during_continuous_output", + "status": "ok" + }, + { + "name": "test_close_while_resizing_continuous_output", + "status": "ERROR" + }, + { + "name": "test_commands_unicode_editing_interrupt_and_normal_exit", + "status": "ok" + }, + { + "name": "test_desktop_creation_failure_closes_job_and_keeps_evidence", + "status": "ok" + }, + { + "name": "test_find_continuous_output_partial_navigation_replace_cancel_and_target_close", + "status": "ok" + }, + { + "name": "test_find_real_edit_navigation_unicode_output_isolation_and_cancel", + "status": "ok" + }, + { + "name": "test_invalid_arguments_create_no_session", + "status": "ok" + }, + { + "name": "test_keyboard_message_path_to_real_console_bytes", + "status": "ok" + }, + { + "name": "test_launch_failure_is_visible_and_recoverable", + "status": "ok" + }, + { + "name": "test_local_shell_launch_working_directory_and_cleanup", + "status": "ok" + }, + { + "name": "test_main_and_bottom_sessions_focus_geometry_and_cleanup", + "status": "ERROR" + }, + { + "name": "test_main_split_background_restore_close_and_focus", + "status": "ok" + }, + { + "name": "test_mouse_selection_copy_model_zoom_sessions_and_eviction", + "status": "ok" + }, + { + "name": "test_mouse_selection_to_real_system_clipboard", + "status": "skipped" + }, + { + "name": "test_paste_confirmation_and_hidden_target_preserve_visible_focus", + "status": "ok" + }, + { + "name": "test_paste_control_eof_remains_failure_after_cleanup", + "status": "ok" + }, + { + "name": "test_paste_missing_go_remains_failure_after_cleanup", + "status": "ok" + }, + { + "name": "test_per_session_zoom_and_controlled_dpi_transitions", + "status": "ok" + }, + { + "name": "test_queues_apply_bounded_backpressure_and_reject_input", + "status": "ok" + }, + { + "name": "test_real_history_scroll_anchor_eviction_and_hidden_sessions", + "status": "ok" + }, + { + "name": "test_real_monitor_round_trip_preserves_workspace", + "status": "ok" + }, + { + "name": "test_resize_child_dimensions_and_interrupt", + "status": "ERROR" + }, + { + "name": "test_selection_autoscroll_with_short_and_tall_workspace", + "status": "ok" + }, + { + "name": "test_system_clipboard_product_read_errors_cancel_and_close", + "status": "skipped" + }, + { + "name": "test_system_clipboard_shortcut_to_window_confirmation_and_receiver", + "status": "skipped" + }, + { + "name": "test_watchdog_contains_real_shell_tree", + "status": "ok" + }, + { + "name": "test_workspace_rename_drag_and_fresh_process_restore", + "status": "ok" + }, + { + "name": "test_workspace_sessions_resize_and_cleanup", + "status": "ERROR" + }, + { + "name": "test_workspace_v1_empty_and_invalid_recovery", + "status": "ok" + }, + { + "name": "test_workspace_v2_empty_session_roundtrip", + "status": "ok" + } + ], + "shell_module_complete": false, + "shell_module_limitation": "CTest killed aggregate at original 180s; listed method statuses do not make the complete module pass", + "standalone_paste_runs": [ + { + "run": "paste-0", + "sample": { + "mode": "ui-paste", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 12, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 12, + "terminated": 0 + }, + "desktop_gone": true + }, + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "confirmation.bmp": "2b63b1d079427584b5bb4be1739dc221535af2291ef0b062994c3e5903a7c6a8", + "frame.bmp": "6e947f9d4d723f67da816440e3182629b4c4321a9ccb5876c87a4fa2ea06b9ce", + "input.bin": "d4acd50607214fe6614644e1f5502d7f1043dc3e0d38ca87bbdaf66f12e527b2", + "paste-workflow.json": "6c971df3ae4711bcbf07ecf4f5336211e7da3256a0ffcf694c7a9b06574f464b", + "sample.json": "f14a5f6d1977734e06a599aeed4b01da1f9ff17e523953f8035cf4b1544726f1", + "workspace.layout": "4c271282879f651f87a060c325ff62287a9ddd86cda103c86855a3133b209b13" + }, + "workflow": { + "schema": "termforge-window-paste-v2", + "keyboard": { + "default_enter_accept": true, + "default_escape_cancel": true, + "tab_enter_accept": true + }, + "cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ] + } + }, + { + "run": "paste-1", + "sample": { + "mode": "ui-paste", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 12, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 12, + "terminated": 0 + }, + "desktop_gone": true + }, + "raw_sha256": { + "cancel.bin": "bcc3593351da0137a27071da66416a7cbe02ca5605f49b14e5a6c85ebac894a6", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "close.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "close.bin.before.json": "42d48c9b60c19059b0fd753b871521787ece886f5976aef804fe05baa7db1584", + "confirmation.bmp": "2b63b1d079427584b5bb4be1739dc221535af2291ef0b062994c3e5903a7c6a8", + "frame.bmp": "6e947f9d4d723f67da816440e3182629b4c4321a9ccb5876c87a4fa2ea06b9ce", + "input.bin": "d4acd50607214fe6614644e1f5502d7f1043dc3e0d38ca87bbdaf66f12e527b2", + "paste-workflow.json": "6c971df3ae4711bcbf07ecf4f5336211e7da3256a0ffcf694c7a9b06574f464b", + "sample.json": "d52d098a6e8be6cf6e415bee3659f3add3d6d9998e3ed1bc702ceeda70da81c1", + "workspace.layout": "4c271282879f651f87a060c325ff62287a9ddd86cda103c86855a3133b209b13" + }, + "workflow": { + "schema": "termforge-window-paste-v2", + "keyboard": { + "default_enter_accept": true, + "default_escape_cancel": true, + "tab_enter_accept": true + }, + "cases": [ + { + "name": "cancel", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 18414, + "flood_observed": true, + "fence": { + "generation": 1, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "cancelled", + "wrong_generation_rejected": true + } + }, + { + "name": "close", + "target": 1, + "total": 3000000, + "before_sent": 17391, + "before_accepted": 18414, + "accepted": 18414, + "sent": 18414, + "in_flight": 0, + "retained_capacity": 15, + "state": "cancelled", + "checkpoint_bytes": 768, + "received": 768, + "flood_observed": true, + "fence": { + "generation": 2, + "held": true, + "owned_bytes": 1023, + "wait_finished": true, + "other_responsive": true, + "exit": "cancelled", + "final_state": "stopped", + "wrong_generation_rejected": true + } + } + ] + } + }, + { + "run": "paste-control-eof", + "sample": { + "mode": "ui-paste-control-eof", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 11, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 11, + "terminated": 0 + }, + "desktop_gone": true + }, + "raw_sha256": { + "cancel.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "confirmation.bmp": "2b63b1d079427584b5bb4be1739dc221535af2291ef0b062994c3e5903a7c6a8", + "input.bin": "d4acd50607214fe6614644e1f5502d7f1043dc3e0d38ca87bbdaf66f12e527b2", + "paste-control-failure.json": "b0fd2d17e5d7fa2d635cae3416293e4a2c1d11e240a48f829b5da4552b51d68c", + "sample.json": "2f9a3caf3ad18d64dd7d6f542c465c52db071c462dfbac552096ed01d127a1f5", + "workspace.layout": "a26afdba5f7a4c7a7056bab7530fc98f0866419b5d87087cd85142d4243b163c" + }, + "observed_failure": "paste control EOF rejected", + "control_failure": { + "eof_observed": true, + "timed_out": false, + "wait_finished": true, + "state": "failed", + "in_flight": 0, + "retained_capacity": 15 + }, + "receiver_bytes": 768 + }, + { + "run": "paste-control-timeout", + "sample": { + "mode": "ui-paste-control-timeout", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 11, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 11, + "terminated": 0 + }, + "desktop_gone": true + }, + "raw_sha256": { + "cancel.bin": "61da7e55d911305206ae68ac162a0a73d2fc1433efae5f0cfda2b9d0c9b5363c", + "cancel.bin.before.json": "a90746e62c8e815c76305806dfff25d55dd34d67f54308b0c865152693425663", + "confirmation.bmp": "2b63b1d079427584b5bb4be1739dc221535af2291ef0b062994c3e5903a7c6a8", + "input.bin": "d4acd50607214fe6614644e1f5502d7f1043dc3e0d38ca87bbdaf66f12e527b2", + "paste-control-failure.json": "e296e5fa38603e2d8818e9332d52248bb5a68c32c42c0593b84cfb311d473ec1", + "sample.json": "fbf107cba73ca6b72f1f78ae14cdbc94c3809b2cd5c919a3002c9a5c6828ee3c", + "workspace.layout": "a26afdba5f7a4c7a7056bab7530fc98f0866419b5d87087cd85142d4243b163c" + }, + "observed_failure": "paste control missing GO rejected", + "control_failure": { + "eof_observed": false, + "timed_out": true, + "wait_finished": true, + "state": "failed", + "in_flight": 0, + "retained_capacity": 15 + }, + "receiver_bytes": 768 + } + ], + "other_shell_failures": [ + { + "run": "resize-0", + "stage": 43, + "sample": { + "mode": "resize", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "desktop_gone": true + }, + "expected_exact_line": "TF_SIZE_100x28", + "observed_line": "TF_SIZE_100x28OW", + "local_raw_sample_sha256": "ac6f650ce3bd87b934755ca47072f65b689be5662ea3396cb7939c41e847d7da" + }, + { + "run": "resize-close-0", + "stage": 43, + "sample": { + "mode": "resize-close", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "desktop_gone": true + }, + "expected_exact_line": "TF_SIZE_100x28", + "observed_line": "TF_SIZE_100x28OW", + "local_raw_sample_sha256": "6489fa48ad6bb446e5c5395f3b133829d9f8852479f352f15926a126a8308c2f" + }, + { + "run": "main-2", + "stage": 7, + "sample": { + "mode": "ui-main", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 16, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 16, + "terminated": 0 + }, + "desktop_gone": true + }, + "expected_exact_line": null, + "observed_line": null, + "local_raw_sample_sha256": "8ca836c302b4bdf21a81dbfd1668381978d7c55c45fb05140bbcbad596712926" + }, + { + "run": "ui-2", + "stage": 52, + "sample": { + "mode": "ui", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 12, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 12, + "terminated": 0 + }, + "desktop_gone": true + }, + "expected_exact_line": null, + "observed_line": null, + "local_raw_sample_sha256": "de287a2da956ccb3a75985ec690146d8097ca61da63517c9fd61f33b02bc99d4" + } + ] +} From 4daf99250a2740e1943635b6d46293d633427163 Mon Sep 17 00:00:00 2001 From: JavaZeroo <71128095+JavaZeroo@users.noreply.github.com> Date: Tue, 27 Oct 2026 00:33:54 +0800 Subject: [PATCH 4/5] fix: recognize empty record redraw before persistence output (#72) --- .../workspace-restore-transport-oracle.md | 5 ++-- experiments/shell/transport_completion.hpp | 14 +++++---- .../shell/transport_completion_test.cpp | 29 +++++++++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/docs/research/workspace-restore-transport-oracle.md b/docs/research/workspace-restore-transport-oracle.md index 7aeb7cfd..8c812dfe 100644 --- a/docs/research/workspace-restore-transport-oracle.md +++ b/docs/research/workspace-restore-transport-oracle.md @@ -14,12 +14,13 @@ - 独立扫描 7-bit ESC 形式的完整 OSC(BEL 或 ST 终止)和 CSI。OSC 内容不参与正文匹配,UTF-8 的所有高位正文 bytes 原样保留,包括 `目` 中的 `0x9b`。 - 标记必须匹配完整正文记录,前后不可附加命令、其它正文或任意子串。LF 结束记录;显式正行号、第 1 列 CUP/HVP 仅可结束完整标记或提示符,不能清除命令前缀或拼接分散的标记片段。其它非空内容遇 CUP 保持未知,直到真实 LF;SGR 和其它 CSI 不会凭空结束标记。 -- 在首次匹配输出之前,命令编辑中的 BS 只会污染当前记录;CUP 不能解除该污染,也不把退格两侧文字拼起来。真实 LF 后可验证新的完整记录。已经匹配输出后的 BS 仍拒绝,不能借编辑过的提示符证明命令完成;其它裸控制字符的拒绝保持不变。 +- 在首次匹配输出之前,命令编辑中的 BS 只会污染当前记录;CUP 不能解除该污染,也不把退格两侧文字拼起来。真实 LF 后可验证新的完整记录。已经匹配输出后的 BS 仍拒绝,不能借编辑过的提示符证明命令完成。 +- CRLF 的 CR 不改变正文。裸 CR 仅在已观察到记录边界、当前记录为空且未受 BS 污染、尚未匹配输出时允许经过;它不清除文字、不结束记录,也不替代之后的完整标记和新提示符。初始裸 CR、非空或受编辑污染记录中的裸 CR、已匹配输出后的裸 CR,以及其它裸控制字符仍拒绝。 - 该记录之后必须出现独立的 `TF>` 或 `TF> ` 记录,才证明 shell 返回;输入命令回显、标题内标记、旧提示符和输出行前缀都不满足条件。 - 完整 CSI 仅按语法封装剥离,不解释或验收其执行语义;其中受限 column-one CUP 的记录边界另按上条处理。不完整或格式错误的封装、未知 ESC 引导形式、DCS 等其它控制字符串保持未证明状态。这只覆盖固定持久化命令已输出和返回提示符的运输证据,不扩展为第二个通用 VT 核心;产品屏幕及恢复断言仍独立保留。 - 保留原有 8192-byte 观测上限、30 秒总期限、真实目录/版本、返回提示符、恢复成员/标题/缩放/分屏/几何及尺寸检查和真实 Job/desktop 回收断言。 -`transport_completion_test` 独立覆盖标题重复遮蔽、BEL/ST、SGR、CUP、UTF-8、命令编辑前缀 BS,以及命令回显、BS 拼接/提示符编辑、OSC/DCS payload、不完整控制、缺失或旧提示符等反例。它修正的是测试 oracle,不构成产品恢复故障修复或完整 R2 验收。 +`transport_completion_test` 独立覆盖标题重复遮蔽、BEL/ST、SGR、CUP、UTF-8、命令编辑前缀 BS、空记录裸 CR,以及命令回显、CR/BS 拼接或提示符编辑、OSC/DCS payload、不完整控制、缺失或旧提示符等反例。它修正的是测试 oracle,不构成产品恢复故障修复或完整 R2 验收。 ```powershell ctest --test-dir build/default -C Release -R '^transport_completion$' --output-on-failure diff --git a/experiments/shell/transport_completion.hpp b/experiments/shell/transport_completion.hpp index cc56ce3a..e038584c 100644 --- a/experiments/shell/transport_completion.hpp +++ b/experiments/shell/transport_completion.hpp @@ -13,17 +13,19 @@ namespace tf_shell_test { // A command-editor BS before output invalidates that record until a real LF; // it cannot erase an echo prefix or splice a marker. Unknown ESC forms, // malformed/incomplete envelopes and other controls remain unproven. +// A bare CR is harmless only in an empty, unedited record after an observed +// boundary and before marker output. It cannot discard text or end a record. // ShellWindow retains its independent 8192-byte observation cap. inline bool transport_output_completed(std::string_view raw, std::string_view marker) { if(marker.empty()) return false; for(const unsigned char byte:marker) if(byte<0x20 || byte==0x7f) return false; const auto prompt=[](std::string_view line) { return line=="TF>" || line=="TF> "; }; std::string line; - bool output_seen=false,prompt_seen=false,literal_line=true; + bool output_seen=false,prompt_seen=false,literal_line=true,record_boundary=false; const auto end_line=[&] { if(literal_line && line==marker) output_seen=true; else if(literal_line && output_seen && prompt(line)) prompt_seen=true; - line.clear(); literal_line=true; + line.clear(); literal_line=true; record_boundary=true; }; for(std::size_t i=0;i(raw[i++]); @@ -73,9 +75,11 @@ inline bool transport_output_completed(std::string_view raw, std::string_view ma if(!terminated) return false; } else return false; } else if(byte=='\r') { - // CR alone may overwrite an echo; only a following LF proves the - // literal output line has completed. - if(i==raw.size() || raw[i]!='\n') return false; + // Only CRLF completes literal text. An empty redraw before the + // marker leaves the record empty and still needs fresh output. + if(i==raw.size() || raw[i]!='\n') { + if(!record_boundary || !line.empty() || !literal_line || output_seen) return false; + } } else if(byte=='\n') { end_line(); } else if(byte=='\b') { diff --git a/experiments/shell/transport_completion_test.cpp b/experiments/shell/transport_completion_test.cpp index 1707f4d4..70a412af 100644 --- a/experiments/shell/transport_completion_test.cpp +++ b/experiments/shell/transport_completion_test.cpp @@ -31,6 +31,19 @@ int main() { line+"TF>",marker),"command redraw BS before a fresh literal output line does not poison later records"); check(transport_output_completed("echo old\b\r\n"+line+"TF_PS_MAJOR=5\r\nTF> ",marker), "fresh output remains independent of a prior edited command record"); + const std::string save="\x1b[?25l\x1b[1;3H> \x1b[93mWrite-Output \x1b[36m" + "'TF_SAVE_PS' \x1b[m\r\n" + "\x1b[63X\x1b[63C\r\x1b[?25hTF_SAVE_PS\r\nTF> "; + auto no_empty_cr=save; + no_empty_cr.erase(no_empty_cr.find("\r\x1b[?25h"),1); + check(transport_output_completed(no_empty_cr,"TF_SAVE_PS"), + "removing only the empty-record CR isolates the captured rejection"); + check(transport_output_completed(save,"TF_SAVE_PS"), + "captured PowerShell empty-record CR must not hide independent output and prompt"); + check(transport_output_completed("echo old\r\n\r"+line+"TF>",marker), + "an empty record CR preserves a later exact output and prompt"); + check(transport_output_completed("echo old\b\r\n\x1b[63X\x1b[63C\r\r"+line+"TF> ",marker), + "LF restores an independent record before repeated empty redraw CRs"); check(!transport_output_completed("TF>echo "+line+"TF>",marker),"command echo is not independent output"); check(!transport_output_completed(title+"\a\r\nTF>",marker),"OSC BEL payload is not output"); @@ -69,6 +82,22 @@ int main() { check(!transport_output_completed(line+"\bTF>",marker),"BS after a marker cannot manufacture prompt"); check(!transport_output_completed(line+"TF>\b",marker),"trailing prompt BS remains unknown"); check(!transport_output_completed("\t\r\n"+line+"TF>",marker),"other bare controls remain rejected"); + check(!transport_output_completed("\r"+line+"TF>",marker), + "initial bare CR lacks an observed record boundary"); + check(!transport_output_completed("echo\r\nTF>echo \r"+line+"TF>",marker), + "CR cannot erase a nonempty echo prefix"); + check(!transport_output_completed("echo\r\n\b\r"+line+"TF>",marker), + "CR cannot reset an empty BS-tainted record"); + check(!transport_output_completed("echo\r\nTF_CMD_DIR=\rrestore-cmd \xe7\x9b\xae\xe5\xbd\x95\r\nTF>",marker), + "CR-separated marker fragments do not form literal output"); + check(!transport_output_completed("echo\r\n\rTF>echo "+line+"TF>",marker), + "empty-record CR does not admit a later command echo"); + check(!transport_output_completed("echo\r\n\rTF_CMD_DIR=restore-cmd \xe7\x9b\xfe\xe5\xbd\x95\r\nTF>",marker), + "empty-record CR does not repair corrupted UTF-8 marker bytes"); + check(!transport_output_completed("echo\r\n\r"+line+"\x1b[31",marker), + "empty-record CR does not admit an incomplete trailing envelope"); + check(!transport_output_completed(line+"\rTF>",marker), + "bare CR after matched output does not manufacture a prompt"); std::cout<<"transport completion checks passed\n"; } catch(const std::exception& error) { std::cerr< Date: Tue, 27 Oct 2026 00:49:42 +0800 Subject: [PATCH 5/5] docs: record empty-record CR cause and configuration-specific validation (#72) --- docs/EVIDENCE.md | 1 + docs/FEATURES.md | 4 +- .../workspace-restore-transport-oracle.md | 4 + .../validation.json | 3195 +++++++++++++++++ 4 files changed, 3202 insertions(+), 2 deletions(-) create mode 100644 experiments/shell/results/2026-10-27-workspace-empty-cr/validation.json diff --git a/docs/EVIDENCE.md b/docs/EVIDENCE.md index a4e1db22..2614b33b 100644 --- a/docs/EVIDENCE.md +++ b/docs/EVIDENCE.md @@ -59,6 +59,7 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分 | 短窗口选区夹具与 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、期限、负载及恢复断言。仅修夹具,不宣称修复产品恢复。 | | 工作区恢复的命令编辑前缀(#61) | [BS 因果反例及复验](../experiments/shell/results/2026-10-26-workspace-restore-bs/validation.json)、[运输完成合同](research/workspace-restore-transport-oracle.md) | 原失败中的 PowerShell 命令重绘 BS 污染当前记录;真实 LF 后仍须完整输出与新提示符,回显/拼接/非法封装拒绝保留。仅修完成 oracle,原 30/40 秒与产品断言不变。 | +| 工作区保存的空记录重绘(#72) | [原 122 B 因果回归与三配置结果](../experiments/shell/results/2026-10-27-workspace-empty-cr/validation.json)、[运输完成合同](research/workspace-restore-transport-oracle.md) | 两次 CI 失败记录逐字节相同;空且未编辑的记录在输出前允许裸 CR,仍须完整独立标记与新提示符。默认/system、候选/system、候选/官方各两轮保存/恢复/钳制共 18 次通过;最终完整回归、跳过和未闭合项独立记录。 | | 候选文字观测与回显端点(#38 夹具修正) | [同源码前后对照及反事实](../experiments/shell/results/2026-10-26-native-observation/validation.json)、[标准文本投影](../experiments/core/text_projection.hpp) | 观测改用标准文本投影,回显完成后才全选;原断言和负例保留。修正夹具时序/投影,不宣称产品选择策略已变或 R2 全绿。 | | 拒绝负例的读取前停止(#46 夹具修正) | [原记录、反事实及 fresh 验证](../experiments/shell/results/2026-10-26-receiver-stop/validation.json)、[公开空数据夹具](../experiments/shell/fixtures/rejected-order-before-read.json) | 旧 oracle 错误拒绝“首读前已停止”;同一空数据/零读原件红→绿,正常读取约束保留。限定夹具修正,不解释 #44 的退出。 | | 候选 GUI 合法空标题(#45) | [真实 GUI 前后对照](../experiments/shell/results/2026-10-26-empty-title/validation.json)、[转换入口](../experiments/presentation/render.hpp)、[持续回归](../experiments/shell/candidate_title_test.cpp) | 真实空 OSC 标题使旧 UTF 转换抛异常;修后两 fresh GUI 正常,非法非空反例保留。不回填旧 normal-1 未知异常的根因。 | diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 5ecb1828..90d01e56 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -45,7 +45,7 @@ | 基础窗口操作 | **限定验收**:新建/切换/关闭/重命名、五条分隔线、面板显隐、底部焦点模式 | 完整会话动作/快捷键、命令面板、目标 Focus/SyncInput 行为 | R1 / R4 | | 工作区外观 | **实现中,未验收**:两种逻辑尺寸下部分外框/层级依据直接取证;UI 字体来自独立 OFL 来源,私有加载、实际 GDI face/em/行高与缺失资产失败有自动检查 | 不是像素等价;图标、主题/透明度、多语言及所有状态仍缺。Explorer/Filer/Outline 当前为空区域 | R2 / R3 / R4 | | DPI 与文字缩放 | **限定验收**:每会话 50%–200%,受控 96→144→192→96;[字体/显示合同](milestones/R2-font-display.md)明确 12×26 基准网格。两台真实 96-DPI 显示器间往返两次保持窗口、rename 焦点、隐藏标签和网格,[证据](../experiments/shell/results/2026-10-24-r2-monitor-font/validation.json)明确 `distinct_dpi=false`;v2 会话恢复另覆盖 100%/150%/75% zoom | 不同 DPI 的真实跨屏、实际呈现和真实 IME 跨屏仍未验收;恢复证据为同一 96-DPI 私有 desktop,目标字形/逐字形 fallback 未等价 | R2 | -| 配置与会话持久化 | **限定验收**:有界 v2、原子替换、v1 迁移、空会话与损坏/未知版本保护;[多会话恢复](../experiments/shell/results/2026-10-25-workspace-restore-multi/validation.json)覆盖 shell 类型/目录/标题/zoom/split/窗口,[迁移回退](../experiments/shell/results/2026-10-25-workspace-recovery-guards/validation.json)及[写失败与关闭策略](../experiments/shell/results/2026-10-25-workspace-write-failure/validation.json)均有真实验证。[#61 的合法编辑 BS 前缀](../experiments/shell/results/2026-10-26-workspace-restore-bs/validation.json)已在默认/候选 system 限定修正;目录/版本完成按[独立输出与新提示符合同](research/workspace-restore-transport-oracle.md)核对;只重建白名单 shell,不恢复原进程/历史;保存失败保留窗口,显式放弃保存才跳过 | 仅当前单工作区、正常窗口和白名单本地会话;偏好、分组/搜索、最大化/多窗口与文字标记恢复归后续。真实 DPI、呈现和 #38 等独立回归不因此视为通过,R2 出口未宣告完成 | R2 / R3 / R4 | +| 配置与会话持久化 | **限定验收**:有界 v2、原子替换、v1 迁移、空会话与损坏/未知版本保护;[多会话恢复](../experiments/shell/results/2026-10-25-workspace-restore-multi/validation.json)覆盖 shell 类型/目录/标题/zoom/split/窗口,[迁移回退](../experiments/shell/results/2026-10-25-workspace-recovery-guards/validation.json)及[写失败与关闭策略](../experiments/shell/results/2026-10-25-workspace-write-failure/validation.json)均有真实验证。[#61 的合法编辑 BS 前缀](../experiments/shell/results/2026-10-26-workspace-restore-bs/validation.json)与 [#72 的空记录 CR 重绘](../experiments/shell/results/2026-10-27-workspace-empty-cr/validation.json)已限定修正;后者同源码三配置共 18 次保存/恢复/钳制通过;目录/版本完成按[独立输出与新提示符合同](research/workspace-restore-transport-oracle.md)核对;只重建白名单 shell,不恢复原进程/历史;保存失败保留窗口,显式放弃保存才跳过 | 仅当前单工作区、正常窗口和白名单本地会话;偏好、分组/搜索、最大化/多窗口与文字标记恢复归后续。真实 DPI、呈现和 #38 等独立回归不因此视为通过,R2 出口未宣告完成 | R2 / R3 / R4 | | 文本增强与辅助面板 | **未实现** | 高亮/时间戳/折叠/outline、补全与 Fish 增强、命令历史、Sender/QuickBar、Free Type Mode(输入模式,行为待取证)、vim 本地/远程键位、锁屏、Sysmon | R4 | ## 远程、文件与协议 @@ -68,7 +68,7 @@ | 组合验收基础 | **限定验收**:[固定源码审计](../experiments/shell/results/2026-10-24-r1-workflow-foundation/validation.json)覆盖基础数据与快照;[受控夹具](../experiments/shell/WORKFLOW.md)分离编号日志、ConPTY传输、原始接收与阶段日志;固定输入前缀保持4096 UTF-16容量,旧IME模式仍要求空前缀 | 该基础证据不单独验收八会话或真实Copy→Paste→IME;组合出口见 #18 独立验收 | R1 | | 八会话文字工作流 | **限定验收**:[R1 固定源码整体验收](../experiments/shell/results/2026-10-24-r1-system-workflow/validation.json)覆盖同次 8 会话/拒绝第 9 个、后台有限洪流、历史/Find/实际选择与 CF 复制/确认粘贴/真实拼音、切换缩放、淘汰、取消关闭和重复回收;实际字节、目标隔离、动作与 Job/desktop 回收有独立审计 | 限定 Windows 固定拼音、本地 cmd 与有界负载;这是固定 R1 配置的组合验收,不能替代 R2 候选/新后端组合。实际呈现、常用 TUI、长期稳定及 UI/性能等价仍未验收 | R1 | | 活体资源与滚动端点 | **限定测量**:普通启动默认关闭;[R1 组合审计](../experiments/shell/results/2026-10-24-r1-system-workflow/validation.json)绑定实际接收、state 与同 revision 的 WM_PAINT/BitBlt/GdiFlush 提交,保留跨时钟校准与阶段资源,可离线重算 | launcher-tree 不等于 UI 归因;观察进程成本不等于增量采样成本,短命进程及退出 CPU 可能漏采。短驻留不证明长期无泄漏,`presented_done=null`,不构成性能通过 | R1;扩展 R4 / R5 | -| 自动正确性与构建 | **限定验收**:Windows shell/ConPTY/呈现及 Windows/Linux 核心 CI、差分/恢复/队列/生命周期场景 | 产品打包、干净机器使用、依赖升级、长期回归和更广平台矩阵;#40 的 CI 纯夹具超时,以及后续保存 stage2 #72 / 窄窗口选择 #73 的独立失败仍未闭合 | R2 / R4 | +| 自动正确性与构建 | **限定验收**:Windows shell/ConPTY/呈现及 Windows/Linux 核心 CI、差分/恢复/队列/生命周期场景 | 产品打包、干净机器使用、依赖升级、长期回归和更广平台矩阵;#40 的 CI 纯夹具超时,以及窄窗口选择 #73 等独立失败仍未闭合;#72 保存完成判据的限定修正不代替完整回归 | R2 / R4 | | Windows 产品交付 | **实现中,未验收**:首个 [v0.1.0-alpha.1 预发布](releases/v0.1.0-alpha.1.md)提供 Windows x64、静态 MSVC 运行库、附资源许可和构建身份的免安装 ZIP;未签名,已验环境限 Windows 11 本机与 Server 2025 CI,布局仍写入 LOCALAPPDATA | 这是 R1 体验包,尚非 R2 日常开发版;干净机器与更广平台矩阵、签名/安装、配置升级及持续运行仍待完成。Windows 10 未验收,Server 2022 已知资源门槛未过 | R2 / R3 | | Linux/macOS 与其他架构 | **未实现**客户端;Linux 核心 CI 已有。[官方平台范围台账](../research/windterm-2.7.0-platform-scope.md)已固定 2.7.0 的 Windows x86/x64、macOS x64、Linux x64 资产及声明下限;这不是 TermForge 支持或实测结论 | 最终需真实 Linux/macOS 客户端;平台调查可提前进行,整合及完整验收排在 Windows 11 x64 完整版本之后。其他系统版本、最低版本和架构由用户后续明确;旧系统及 ARM 等保持调查记录,不自动承诺或排除,也不能由核心 CI 推断产品支持 | 持续调查;R5 全平台出口 | | 吞吐、响应、内存与稳定性 | **实现中,未验收**:已有机制实验、连续 CPU 区间校准与合成回归;候选字素改动的受限诊断中 project/interactive 吞吐中位数约下降 16%/9%,由 [#54](https://github.com/JavaZeroo/termforge/issues/54) 跟踪 | 共享宿主、allocator 包装与缺少真实呈现/输入时延端点使该诊断不构成正式预算。仍需同负载/同正确性、无插桩对照、观测开销和长期/多会话公平性;可靠原版基线后提出逐项预算及允许波动范围,**由用户明确确认**。与 WindTerm 的实际差距**待取证** | 当前优先;贯穿 R1–R5 | diff --git a/docs/research/workspace-restore-transport-oracle.md b/docs/research/workspace-restore-transport-oracle.md index 8c812dfe..7d8a17b2 100644 --- a/docs/research/workspace-restore-transport-oracle.md +++ b/docs/research/workspace-restore-transport-oracle.md @@ -10,6 +10,10 @@ [#61](https://github.com/JavaZeroo/termforge/issues/61) 的两份默认/system 新失败具有不同原因:PowerShell 命令编辑重绘在实际输出之前带一个裸 BS(`0x08`)。旧 oracle 因它直接拒绝整个运输,即使随后已有真正 CRLF、完整目录/版本输出和新提示符。用原字节独立重放,两个 PowerShell 条件均为 false,而 cmd/底部条件为 true;仅移除前缀 BS 的诊断输入使旧条件转为 true,证实拒绝分支。修正不模拟退格或删除回显,而是把该前缀记录标记为不可信,直到真正 LF 才允许后续独立输出;[限定复验](../../experiments/shell/results/2026-10-26-workspace-restore-bs/validation.json)保留原始失败及各配置身份。这是测试完成端点修正,不是产品输出丢失或恢复功能缺陷的修复。 +[#72](https://github.com/JavaZeroo/termforge/issues/72) 的两次默认/system CI 保存 stage2 失败记录逐字节相同。PowerShell 的 122 B 原运输在真实 LF 后、完整输出之前含 `CSI 63X / CSI 63C / CR / CSI ?25h`;旧 helper 对空记录的裸 CR 永久拒绝。保留完整原字节的 C++ 回归先红后绿,仅移除这一 CR 的诊断对照在旧 helper 下已通过。修正只允许下述受限空记录情形,不删除运输字节或改变产品输出。源码 `4daf992` 下默认/system、候选/system、候选/官方 flags24 各两轮保存、普通恢复、钳制恢复共 18 次真实运行通过;[身份与结果](../../experiments/shell/results/2026-10-27-workspace-empty-cr/validation.json)分别保留因果回归、原始失败及各配置的实际断言与回收。局部通过不替代最终完整回归或 CI。 + +同源码官方配置完整 CTest 为 54/56、449.38 秒;工作区保存/恢复方法也在完整 shell 套件中通过。剩余为 Vim stage59,以及 shell 的 resize/resize-close stage43、main stage7、workspace stage52,分别由 #51/#52/#63 承接。此次 shell 套件实际完成 40 方法,4 error、3 skip,用时 174.65 秒;旧批次的 180 秒聚合超时仍保留。内部可选依赖、hosted 系统输入和私有剪贴板跳过逐项记录,不写成这些能力通过。PR #78 的两条 CI 均通过,其中 Windows 默认/system 为 51/51、273.64 秒;其实际合并 checkout 与本机源码分别列明。 + ## 限定 oracle 合同 - 独立扫描 7-bit ESC 形式的完整 OSC(BEL 或 ST 终止)和 CSI。OSC 内容不参与正文匹配,UTF-8 的所有高位正文 bytes 原样保留,包括 `目` 中的 `0x9b`。 diff --git a/experiments/shell/results/2026-10-27-workspace-empty-cr/validation.json b/experiments/shell/results/2026-10-27-workspace-empty-cr/validation.json new file mode 100644 index 00000000..1f029aff --- /dev/null +++ b/experiments/shell/results/2026-10-27-workspace-empty-cr/validation.json @@ -0,0 +1,3195 @@ +{ + "source_commit": "4daf99250a2740e1943635b6d46293d633427163", + "platform": "Windows-11-10.0.26200-SP0", + "python": "3.12.10", + "started_utc": "2026-10-26T16:35:57.098152+00:00", + "source_sha256": { + "CMakeLists.txt": "f5bb85e12b7a815c4feb7417da9ebc5298de58664bcd2792b277cb282729da73", + "experiments/shell/transport_completion.hpp": "535ff47bfbdd1038dca22820b467d1ee0d1839a29be38cd750e4de49439b602f", + "experiments/shell/transport_completion_test.cpp": "c9bb02bd739f916e78530590ee0f3b29bc952c58e445d31bc047ee69d301dcee", + "experiments/shell/workspace_persistence_scenario.hpp": "7f70d755549718d0fddb94b43cce12f3955727fcc51599a8bb124bf3e59ec263", + "experiments/shell/test_shell.py": "a6b63c1754b0e0dc1cc01863891f4c7c9d989f818d351838a8cfe295edaf811c", + "experiments/shell/run.py": "45976b828eecb316881d698dedaef09ad304f72d991dfa360f1c552bbcbe9f1d", + "experiments/shell/shell.cpp": "ac4dd44861aa2928213fffe91d30cdaf3aedf19f08468aefeed22828352296cc", + "experiments/shell/test_launcher.cpp": "19cab4a960f47f252c02f92a36316d43eed2481da1f72b5a7e97003c4fa1c2ed", + "experiments/core/candidate_terminal.cpp": "3092ee2ea44ca0f897a7d3b6244c079ba8073dc109993204e435f065388a2ed1", + "experiments/candidates/alacritty/Cargo.lock": "896c6e60909d55d61fb26d277b1a98daf9245e8aee811caff37fc3e9d06ca627" + }, + "source_git_blobs": { + "CMakeLists.txt": "2454a7b8dc34fa2bbd74b25b0ad77d19a71a5f18", + "experiments/shell/transport_completion.hpp": "e038584c5d719d2890ce58b292d5c2ac27c94ca2", + "experiments/shell/transport_completion_test.cpp": "70a412afaa644413460ada14f8c28c91b206d509", + "experiments/shell/workspace_persistence_scenario.hpp": "f7f73dbd771f559384d9b4e569d815d2ef0792da", + "experiments/shell/test_shell.py": "66512ac1099cf477cac8f26f225b18c301c1d3d8", + "experiments/shell/run.py": "bbd4dfc05012c55956973d7e2c69be717b48b1a9", + "experiments/shell/shell.cpp": "90b3f166e8a50ca2488f749e8e188c52cb5e4a91", + "experiments/shell/test_launcher.cpp": "6da0882255cd9587111aa4536b1f0b5a93b193bf", + "experiments/core/candidate_terminal.cpp": "9bb1fab8f6deac294d0ba1a44712b67c919d03c7", + "experiments/candidates/alacritty/Cargo.lock": "6501189a98bfe0610ebcb5e3c31d3abc2ae3f132" + }, + "configurations": [ + { + "build_config": "system-r72", + "candidate": false, + "backend": "system", + "binaries_sha256": { + "shell_clipboard_reader.exe": "6afbaba725490cc3856df97b56a8a16190251b27fa5c34024c63132a6c6bde41", + "shell_ime_client.exe": "2f032970045e33b80b615e0ffebe06e29ebe7b18698b7609bffc129af9b4d7df", + "shell_input_client.exe": "0471578cce2959b200c2e174514cbd8663e2b51db1bb973f8932ebe5a866f1b7", + "shell_query_client.exe": "d92be37207a6a7a4c03d4b08dd1f704ccddc2e86b7ef00085e028168d1a915e1", + "shell_selection_text_client.exe": "0ec9d66d66e672e98487bf38ee4db4313ac7bdad8b6852ebdc8fcd6309fd4358", + "shell_size_client.exe": "323583d4127d4aca27026cbe3ef9328a80390a269e99be763580f706c1cb4115", + "shell_test_launcher.exe": "3e72c4d5bd418eaa22062606f39891f0412acaf46a2841a3f9d219f24bc33014", + "shell_text_client.exe": "f151602090a8700fd48115cd4db1169a9f2cfe8e856f454bc21bf1509ddff85b", + "termforge_shell.exe": "433905e75f4f12699e59adc8c8775756f9098125aa68595d2dec6290c334dfeb", + "transport_completion_test.exe": "ba1c84b60d68d366c9d9e15e0b11e96b84e7066376c805b6ee0122c7defedc67" + }, + "cmake_cache_sha256": "27b22b5286dfc2aba8325201d143f7102400812bf27667300025232fc6394500", + "tests": [ + { + "name": "transport-completion", + "returncode": 0, + "started_utc": "2026-10-26T16:35:57.572260+00:00", + "elapsed_seconds": 0.141528, + "log_sha256": "c804b0583bcb4501edf84ab54dfe03ddcf8aeb00f7e6ffddf65d25cf6e031cb0" + }, + { + "name": "workspace", + "returncode": 0, + "started_utc": "2026-10-26T16:35:57.713788+00:00", + "elapsed_seconds": 10.657289, + "log_sha256": "eae576610ed3c3de80350f33f0d094c51b612339639b0fcf26108f3ba3eb80c2" + } + ], + "cases": [ + { + "case": "workspace-v2-clamped-0", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 0, + 60, + 2560, + 799 + ], + "client": [ + 2544, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 2544, + 238 + ], + "visible": 1, + "grid": [ + 210, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 69, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 1272, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 139, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "e1b9fdfa4c0be1cf1901dfc4678c2952f5be23b95ca1d2a434c92b17f5069ce0", + "sample.json": "78f0976c47b06a5007bd588febd69f08bf2e3c48ac4476d548896ff6a4af319f", + "workspace.layout": "11f3b16527405dd1119da84184d416509f384d791371fca82644f257d306e87e" + } + }, + { + "case": "workspace-v2-clamped-1", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 0, + 60, + 2560, + 799 + ], + "client": [ + 2544, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 2544, + 238 + ], + "visible": 1, + "grid": [ + 210, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 69, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 1272, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 139, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "e1b9fdfa4c0be1cf1901dfc4678c2952f5be23b95ca1d2a434c92b17f5069ce0", + "sample.json": "2d802b2f19ac76b98bae2a8455fc094be1abb857543062072d52bdac7d27b74e", + "workspace.layout": "657ae2809533be0c5138485fed93babf98a75061aea17e0f18a4dc74f5913cae" + } + }, + { + "case": "workspace-v2-restore-0", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "fa0f1df0488dc2f6c7f650ade82dd1ebe12d40a14ae7b12419dc9f569928daab", + "workspace.layout": "59e62adef0b758158c65b56919350064f7d2c344906d2c848bab80e6f32739de" + } + }, + { + "case": "workspace-v2-restore-1", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "95b7d480f900492b5ef1cb2d75ee939eb9bb2c4aa047be9dd213fb49371525fd", + "workspace.layout": "37b9ad8d5a982460f484042018baed17340c713c7e5d361376a1ebd3c31fb21d" + } + }, + { + "case": "workspace-v2-save-0", + "sample": { + "mode": "ui-workspace-save", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-save", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "cc79cd9828da737c892cf94466baf7fceda5844c42fee17c140dec83a6ef5275", + "workspace.layout": "59e62adef0b758158c65b56919350064f7d2c344906d2c848bab80e6f32739de" + } + }, + { + "case": "workspace-v2-save-1", + "sample": { + "mode": "ui-workspace-save", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-save", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "1316f55f86c6af9c425b9b5d996d0d9fad6b16f3745fda847ca9b798bbe0bb1d", + "workspace.layout": "37b9ad8d5a982460f484042018baed17340c713c7e5d361376a1ebd3c31fb21d" + } + } + ] + }, + { + "build_config": "candidate-system-r72", + "candidate": true, + "backend": "system", + "binaries_sha256": { + "shell_clipboard_reader.exe": "71faaa8009762d7bfe0186cc499422762f532581288eb57fde949d7774872e98", + "shell_ime_client.exe": "c671b3bcc051f2f4397467fa52029a964a721613841913e7c2e334355d4e5236", + "shell_input_client.exe": "a550513b18161e05bae681d4c9ddf79cb1a86d42bafb3a7518057a44105b99c2", + "shell_query_client.exe": "58e704e2090c4b9b0550622c84cb4ffafc6f6f42df1cdfe363a0e99e6e7db486", + "shell_selection_text_client.exe": "37862fcc2f1db49118d10c3e03dac1be851bf255cbebe2f0556f89062342bc18", + "shell_size_client.exe": "427afbd778881f5e921a1782d473ad190a1340fb691b95adce9e138a516317b5", + "shell_test_launcher.exe": "cb96d03fed43d7e63e820e0ced6cf0f241762b0cc4dbec094c458041f38f1e55", + "shell_text_client.exe": "b81cba00bdaed52c50783d6fa0a1528301e3df40d2c6c4e060aa01a9c2f81ce3", + "termforge_shell.exe": "6c756b03e445dfec9a1fd4fd8b5d628f031076d546defd4e3f3eb0c546e1cb4d", + "transport_completion_test.exe": "1945189627c71d0bedd1f8875f6bb80da6065246c687fa8651efa205346d336b" + }, + "cmake_cache_sha256": "65d497ede16ae771b8f5bad312df0d7dc98e70c095622bfbec009f455c6decdb", + "tests": [ + { + "name": "transport-completion", + "returncode": 0, + "started_utc": "2026-10-26T16:36:08.380170+00:00", + "elapsed_seconds": 0.144565, + "log_sha256": "173c950ca1f323012ddd687b96628b2bd747bbf63e28a971fef46fa28b0e2e66" + }, + { + "name": "workspace", + "returncode": 0, + "started_utc": "2026-10-26T16:36:08.524735+00:00", + "elapsed_seconds": 10.226751, + "log_sha256": "276fc4b4f011a8e5eae6e3b748d01a83b0f907771d7463fb7677c23470b846f4" + } + ], + "cases": [ + { + "case": "workspace-v2-clamped-0", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 0, + 60, + 2560, + 799 + ], + "client": [ + 2544, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 2544, + 238 + ], + "visible": 1, + "grid": [ + 210, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 69, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 1272, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 139, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "e1b9fdfa4c0be1cf1901dfc4678c2952f5be23b95ca1d2a434c92b17f5069ce0", + "sample.json": "4120d7f440c8effc70b25ba522cbc3b44a64999a4e1875f467478fe96b03245a", + "workspace.layout": "2b84a08b2af758e35a196ad71dc3356a5c15836c9ff301845e5a0fcc80fc767a" + } + }, + { + "case": "workspace-v2-clamped-1", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 0, + 60, + 2560, + 799 + ], + "client": [ + 2544, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 2544, + 238 + ], + "visible": 1, + "grid": [ + 210, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 69, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 1272, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 139, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "e1b9fdfa4c0be1cf1901dfc4678c2952f5be23b95ca1d2a434c92b17f5069ce0", + "sample.json": "0b54da0e331d564807006ede5bc5141d6ebb3dcbc78fc703ec9afb84e9e835f8", + "workspace.layout": "b396797597866e3036655c455b67ea7f3525fb73bc83dcd4a6124740f6a6a00d" + } + }, + { + "case": "workspace-v2-restore-0", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "bb7dcffd003f6836c81ebe2c1a76add10137e75c17de550d4c79f02cf09ac770", + "workspace.layout": "fad7156f6463e92356c52c64121b793c2989eada6377228f502b314dcc1cd822" + } + }, + { + "case": "workspace-v2-restore-1", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "bb37ee8b05088b72c466f87a716434b2ad1eee5e83f5597a8c438de7c729415b", + "workspace.layout": "dff8885eeadffc72e58dc84b031fe4d6a3179edeffce82853c5f480e12c6d055" + } + }, + { + "case": "workspace-v2-save-0", + "sample": { + "mode": "ui-workspace-save", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-save", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "ed0cfb5a2ddcbffb67515f70aceca1817e78da50eee4979166aeae7e07bed292", + "workspace.layout": "fad7156f6463e92356c52c64121b793c2989eada6377228f502b314dcc1cd822" + } + }, + { + "case": "workspace-v2-save-1", + "sample": { + "mode": "ui-workspace-save", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-save", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "ab509cefe2e4a9dde03dc8d9e12b0d3060026a8b8392db9a847a004321544d1b", + "workspace.layout": "dff8885eeadffc72e58dc84b031fe4d6a3179edeffce82853c5f480e12c6d055" + } + } + ] + }, + { + "build_config": "candidate", + "candidate": true, + "backend": "reviewed-side-by-side-1.25.260930003", + "binaries_sha256": { + "alpha_normal_smoke.exe": "36ac6dbe36c942b9850d6d9f5b3538fbfe2fc251f38ac026ea12c343b0e9abc8", + "candidate_core_test.exe": "6e9df1abbe2271690a1480a1be9042e219a5947779b6a4b03f529a742fbd10ce", + "candidate_reply_close_test.exe": "40603aa54fbad42d55a5a7ea24b7aecebefdacd8f3c802e3ac89c52ef3a4b74d", + "candidate_resize_replay.exe": "3d91227adb37bba4defcef8f803f0f3c2916001223300b99d18e0e2ab695de94", + "candidate_title_test.exe": "90db63148f6aafaf79d65d5b40e61bbdc9f54486a6be36e26523699e0b46035d", + "clipboard_policy_test.exe": "809815e9838cad5b3443c98620d23a4e6c7186b5304b524d0990988eb47a6da9", + "conpty_backend_probe.exe": "3c54962c20f04e688a0413bb822713e908582af20b0be8bcfd188fb436907ef8", + "conpty_ctrl_c_probe.exe": "ac5ae5ccdb77c82512a8a6d769fafbe74693bf6fc535ce4d22bf60b0c8df2bfa", + "conpty_margin_probe.exe": "5404b009d0e005cd940d8a65afeb0fb9caf9c9ce2a18f651a88146343c41c252", + "core_measure.exe": "df9df797b16239d2fb71707f8a042a1ed956ad30c407d884527cdf18d600e785", + "find_bar_test.exe": "030733a2396ca9b31bbd029c610f1b838ab52394338c08410274501747dd9982", + "history_test.exe": "035507366facfd6de00e0c2762775c8d3816f605da3e55d498995a74a3f447d2", + "ime_context_test.exe": "be0d71ca72aee3dbd1565c9ad2314f81f0cd0c5511ec54cb623bbd39eede9974", + "ime_input_expectation_test.exe": "a5ea4532a06b893d955299793b4859cb9ccf221fab64e51949e1af2ee6ba5d0b", + "keyboard_test.exe": "18a35c2b2ab8a6316e0c938d8c36d0b82bcc131989d683205888b08bf4d33e19", + "layout_state_test.exe": "307519003536ce16d7d6fc552b3a25e9de25356d50a80c2de0c01168a10784a9", + "paste_test.exe": "47e9a5ce33335370b6fb199b0ff11adc19e2ab55bf64657061a13c1c020a24b0", + "presentation_probe.exe": "b7043cace46f65b22c7295df2fc06b214f060c2fd6fe18ac5ff27e13d943e096", + "raw_console_receiver_test.exe": "9c05cdb80d87ff264b3275387eb01dabc8f57640adbc7ee3910b0fc44f378224", + "real_app_capture.exe": "011efaad94da74ce182e30a3ff8abb0c1e1f58235bc77fa8c347ec3d9dcb822e", + "receive.exe": "ef316e11ddcc764ddac57426fc37b8b69f599ddb28a0ffedf5c2e85a3004a9d4", + "recovery_probe.exe": "c84e7b1b1792773b993f2758d5cafa59b80495451c01d194c3afd6cc653f0344", + "renderer_metrics_test.exe": "4cebad62798ff0f8eac42641a1119c7b9725728dd5fd31befcdf7e1ecb686cfd", + "replay.exe": "674f96ebbf00497576951a6780a5cf5195e3b80cc4acdb7f296fa8910a6203b7", + "resize_test.exe": "f566c56a1fa34e2a8ff480900ac5ae5059e2ac6872554208d5dbf0e24673dde0", + "runtime_observation_test.exe": "dfd04533d35d78401da75ad7d0965d923d7b7e95ad304775367b6088acc341ed", + "scenario_tick_gate_test.exe": "06cd4e813f1034d1a8c7fea592979f49c3ef89117c97fc6636cdae5012017ce8", + "search_test.exe": "0f29f3ea3147cc45eb2e500e683f3bcc1db04f820470b2ff473fffcb31cdb4f4", + "selection_test.exe": "104576787b62c2c4bb2428e0786c7742e63a23ceb766df293c88a5ccc6a1b836", + "sender_fence_pipe_test.exe": "6a94ac84631434a81ae1098932813d7ceeb81f2bb33a2e4b2456834bd8972e92", + "sender_fence_test.exe": "ab4af3b0f148f6e6377e70c98936c6c34d0be0d3cee4b17b3f8554c39b2d3e52", + "sent_message_wait_test.exe": "bc3cff14f60e3f1b17b3fd6255ff1c5b507f506d897d528802efa9666be74dcf", + "shell_clipboard_reader.exe": "bacc4bff465ca644fae61f9d26184a7adc22df9793470feca647af1d823fece8", + "shell_ime_client.exe": "d787ebf702cf5895e1ad0d71f895a51b3dead34d02953b5e7deff086c2bf8eb7", + "shell_input_client.exe": "850c82fb8bb58de8170bf096cc6dd4f8ba34d9ba11dbd2addc41508cddc31d8c", + "shell_launch_test.exe": "ace9b63148848bf7b405edb4b8818ca23d52699ac2ce8ca03a90c5bc1e32622d", + "shell_paste_probe.exe": "1370c6381b990270dfd816f53758e5aa57c63deba050fa7cf0dbd0d5cbf4f315", + "shell_query_client.exe": "71419f7918bc58f4ee47d14f8e6de35aa1828ac838a73ed607797fc120f56886", + "shell_queue_probe.exe": "7f34d6ff66b3e00d56798e22a480fb20a5afa083cff65a9d689dcbca44dbe12d", + "shell_selection_text_client.exe": "dbad81a22ecce4508eada90ae445f9a75abfe1effd2571776ef31b32144c8ac4", + "shell_size_client.exe": "5394d9863df9a589012f0d9a31f7e4167e7bc4ea23e93f9711c0a67c540651f6", + "shell_test_launcher.exe": "dbde4249dc08c7df80120398ffd252aa5e4958e4ef640cc161ea4c2d28b9f291", + "shell_text_client.exe": "9485b03424e421a4018596cc9487e7feeb33c26d30820985aa45843fdcf315d9", + "termforge_conpty_probe.exe": "7dd59bc8d0309ad5b131cde1c3ed98819139b6bb70f505347c98aabe8396f618", + "termforge_ime_probe.exe": "788a186b5fafb6d155eeab74f78d4f7cb992a599937b3aa48c5efcf49affe993", + "termforge_shell.exe": "650ea74ba3ad39b91ab4773c72af3ee70e59bc9d63e76249ea8fa6745a367081", + "terminal_trace.exe": "40e869753f4c00515ee0990f3732eac04f965fe2c3070f1bf772717476269f3d", + "text_action_policy_test.exe": "535b469c9aa0da7e77670578f75d04956d98e9f912d5c9a6c310ab796ab58d4f", + "transport_completion_test.exe": "9f63a2f8a08ddcd459d422f69bfbeae9ceaee9527edc0198c7e4fbd07bff7dc4", + "workflow_fixture_test.exe": "a6624a6b1536c6f445f92e05ff72a5318ece47d455500f6adc467d94f9f04222", + "workspace_state_test.exe": "ac3fbc8a56d33efda33cc9040c731c183e0a8666e23fce48d368c1868797714d" + }, + "cmake_cache_sha256": "d652393042e1195908894a592dda1ebf0c8e1e8ccd3e05ecacec2760b41bc2ff", + "tests": [ + { + "name": "transport-completion", + "returncode": 0, + "started_utc": "2026-10-26T16:36:18.796351+00:00", + "elapsed_seconds": 0.134451, + "log_sha256": "2bcde71179fda986d1dab2d5b84737f9d5a4c965da407e6f2f07b4c60faa49cd" + }, + { + "name": "workspace", + "returncode": 0, + "started_utc": "2026-10-26T16:36:18.932314+00:00", + "elapsed_seconds": 10.383378, + "log_sha256": "9004ff6178e1bec317c7c8de5c70c0a7318ef5a298aae3e48a161e85b05a2b34" + } + ], + "cases": [ + { + "case": "workspace-v2-clamped-0", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 0, + 60, + 2560, + 799 + ], + "client": [ + 2544, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 2544, + 238 + ], + "visible": 1, + "grid": [ + 210, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 69, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 1272, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 139, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "e1b9fdfa4c0be1cf1901dfc4678c2952f5be23b95ca1d2a434c92b17f5069ce0", + "sample.json": "4f5443ddb183618cbe787be35499c53a9c5dc71383e1242f44b98b565ecb2794", + "workspace.layout": "85ad2c772bbe4ae1a16ac48dcb4d6d52dfaed5a50f60cbf818a6538d94fa32af" + } + }, + { + "case": "workspace-v2-clamped-1", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 0, + 60, + 2560, + 799 + ], + "client": [ + 2544, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 2544, + 238 + ], + "visible": 1, + "grid": [ + 210, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 69, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 1272, + 93, + 1272, + 321 + ], + "visible": 1, + "grid": [ + 139, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "e1b9fdfa4c0be1cf1901dfc4678c2952f5be23b95ca1d2a434c92b17f5069ce0", + "sample.json": "88bd123a353389461c7e3f69a05baac16695a3b1a43c70dfbf4d8818f996561d", + "workspace.layout": "eaa185a9288a25bab6e5d3518fb87182b9959b3b591a1840a0699cb999c62fff" + } + }, + { + "case": "workspace-v2-restore-0", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "61e5af44331e37e52fc4f46e10f56e8ba11f2c1316d3a123ce79d3dbda073d2e", + "workspace.layout": "c5cc46a5395e488830e636e2cae90b038fe5eaac0cb3244395754c24830757fe" + } + }, + { + "case": "workspace-v2-restore-1", + "sample": { + "mode": "ui-workspace-restore", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-restore", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "23088bdaea3a39e571c3407357847fc1559b62839b5a5fd13bad69bc8f0bf9d5", + "workspace.layout": "ce7ccde5387ee25fc6ef9e2485f794d737406942d0cdbd72970c33938bf0cd8d" + } + }, + { + "case": "workspace-v2-save-0", + "sample": { + "mode": "ui-workspace-save", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-save", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "118e7fca8cedbd507e67a915eb98425603dc48d12edd50cfeee8119221788d46", + "workspace.layout": "c5cc46a5395e488830e636e2cae90b038fe5eaac0cb3244395754c24830757fe" + } + }, + { + "case": "workspace-v2-save-1", + "sample": { + "mode": "ui-workspace-save", + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 14, + "terminated": 0 + }, + "desktop_gone": true, + "result": { + "valid": true, + "mode": "ui-workspace-save", + "sessions_closed": 3, + "active_children_after": 0, + "settings_save_failed": false, + "presented_done": null + }, + "data_only": true + }, + "geometry": { + "schema": "termforge-workspace-restore-v1", + "dpi": 96, + "window": [ + 90, + 60, + 1216, + 799 + ], + "client": [ + 1200, + 760 + ], + "ratios": [ + 0.24, + 0.21, + 0.57, + 0.38, + 0.69 + ], + "sides": 0, + "focus_mode": 0, + "focused": "bottom", + "bottom_active": 0, + "main_active": 0, + "split_index": 1, + "split_active": 1, + "split_right_focus": 1, + "tabs": [ + { + "group": "bottom", + "kind": "cmd", + "title": "底部 cmd", + "zoom": 100, + "rect": [ + 0, + 465, + 1200, + 238 + ], + "visible": 1, + "grid": [ + 98, + 9 + ], + "cell": [ + 12, + 26 + ] + }, + { + "group": "main", + "kind": "cmd", + "title": "主 cmd", + "zoom": 150, + "rect": [ + 0, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 32, + 8 + ], + "cell": [ + 18, + 39 + ] + }, + { + "group": "main", + "kind": "powershell", + "title": "研究 PowerShell", + "zoom": 75, + "rect": [ + 600, + 93, + 600, + 321 + ], + "visible": 1, + "grid": [ + 64, + 16 + ], + "cell": [ + 9, + 20 + ] + } + ] + }, + "raw_sha256": { + "restore-geometry.json": "5cc777f65d580599f8bda2d3e7e3d246b63aba19dba55a27e65d358709402638", + "sample.json": "33bb1634252634013da65fd77333a253ad2277350fdbac4ccbad07cc9e1596fa", + "workspace.layout": "ce7ccde5387ee25fc6ef9e2485f794d737406942d0cdbd72970c33938bf0cd8d" + } + } + ] + } + ], + "completed_utc": "2026-10-26T16:36:29.317251+00:00", + "local_identity_sha256": "4584b1e3190d354115907cf46ad9344d9d45a6048da4fc6babe6f61f9407aeaa", + "schema": "termforge-workspace-empty-cr-v1", + "scope": "Test completion oracle correction; no product persistence or timeout change", + "compiler": "MSVC 19.42.34433 x64 Release; Windows SDK 10.0.26100", + "alacritty": "0.26.1-dev+termforge.4", + "candidate_library_sha256": "aa41a9ea5749f3933a0db8bfa41dda68812c68727d47d394fc3edd859973a260", + "preserved_contract": { + "observation_cap_bytes": 8192, + "native_deadline_seconds": 30, + "outer_deadline_seconds": 40, + "rounds_per_configuration": 2, + "processes_per_round": 3, + "independent_exact_output_and_fresh_prompt": true, + "unicode_directories_and_power_shell_version": true, + "layout_titles_zoom_split_window_and_child_grid": true, + "owned_job_and_noninput_desktop": true, + "presented_done": null + }, + "causal_observation": { + "original_and_repeated_failure_bytes_identical": true, + "failure_json_sha256": "71b9a860f70cbee2e8b52501bb0877ee8e218c8962f580321df40e215f4d6f4a", + "powershell_observed_bytes": 122, + "powershell_observed_sha256": "4c1d91f70cb82f745b1fa3eab3bca03048ac419aab0fe8c1e510cc2bc63041b5", + "original_run": 40313671258, + "original_job": 121540798389, + "repeated_run": 40355938302, + "repeated_job": 121688289054, + "repeated_source_head": "848cb0e621a291f732cc0e046d0b2fab6a77d962", + "repeated_checkout": "f72c239bb1bfa6d978c72646d88cbccf434f3fd5", + "repeated_artifact": 12665678304, + "repeated_archive_sha256": "c0b2aad326ee14b3e3c89aba06c12366bdf7f45af3a2233709729427919c4ab2", + "original_status": "failed", + "original_exit_code": 2, + "original_stage": 2, + "native_child_exit": null, + "reader_eof": null, + "native_forced_cleanup": null, + "no_cr_diagnostic_control_passed_old_helper": true, + "unchanged_captured_bytes_passed_old_helper": false, + "unchanged_captured_bytes_passed_corrected_helper": true, + "cr_removal": "diagnostic control only; accepted input and transport bytes remain unchanged" + }, + "causal_runs": [ + { + "phase": "red", + "passed": false, + "runtime_seconds": 0.02, + "files_sha256": { + "ctest.log": "d9d8617d9bbbebd631e88c800872fee19634c2673523b2f7348d7df4b3525a09", + "transport_completion.hpp": "47f85232785ccade107123342019a81f013991e33cacffad7616ce8334fe69ab", + "transport_completion_test.cpp": "c9bb02bd739f916e78530590ee0f3b29bc952c58e445d31bc047ee69d301dcee", + "transport_completion_test.exe": "62b08594caa62170468316ad65e6038954e9d2d40bddb0ce42db1342732cea9d" + } + }, + { + "phase": "green", + "passed": true, + "runtime_seconds": 0.01, + "files_sha256": { + "ctest.log": "8d61cc19d56f28141ec46fdb9d22845036f434cbe5f49301bdc14d426c36c46f", + "transport_completion.hpp": "535ff47bfbdd1038dca22820b467d1ee0d1839a29be38cd750e4de49439b602f", + "transport_completion_test.cpp": "c9bb02bd739f916e78530590ee0f3b29bc952c58e445d31bc047ee69d301dcee", + "transport_completion_test.exe": "9f63a2f8a08ddcd459d422f69bfbeae9ceaee9527edc0198c7e4fbd07bff7dc4" + } + } + ], + "full_candidate_official": { + "source_commit": "4daf99250a2740e1943635b6d46293d633427163", + "platform": "Windows-11-10.0.26200-SP0", + "started_utc": "2026-10-26T16:37:05.024869+00:00", + "backend": "reviewed-side-by-side-1.25.260930003", + "candidate": true, + "binaries_sha256": { + "alpha_normal_smoke.exe": "36ac6dbe36c942b9850d6d9f5b3538fbfe2fc251f38ac026ea12c343b0e9abc8", + "candidate_core_test.exe": "6e9df1abbe2271690a1480a1be9042e219a5947779b6a4b03f529a742fbd10ce", + "candidate_reply_close_test.exe": "40603aa54fbad42d55a5a7ea24b7aecebefdacd8f3c802e3ac89c52ef3a4b74d", + "candidate_resize_replay.exe": "3d91227adb37bba4defcef8f803f0f3c2916001223300b99d18e0e2ab695de94", + "candidate_title_test.exe": "90db63148f6aafaf79d65d5b40e61bbdc9f54486a6be36e26523699e0b46035d", + "clipboard_policy_test.exe": "809815e9838cad5b3443c98620d23a4e6c7186b5304b524d0990988eb47a6da9", + "conpty_backend_probe.exe": "3c54962c20f04e688a0413bb822713e908582af20b0be8bcfd188fb436907ef8", + "conpty_ctrl_c_probe.exe": "ac5ae5ccdb77c82512a8a6d769fafbe74693bf6fc535ce4d22bf60b0c8df2bfa", + "conpty_margin_probe.exe": "5404b009d0e005cd940d8a65afeb0fb9caf9c9ce2a18f651a88146343c41c252", + "core_measure.exe": "df9df797b16239d2fb71707f8a042a1ed956ad30c407d884527cdf18d600e785", + "find_bar_test.exe": "030733a2396ca9b31bbd029c610f1b838ab52394338c08410274501747dd9982", + "history_test.exe": "035507366facfd6de00e0c2762775c8d3816f605da3e55d498995a74a3f447d2", + "ime_context_test.exe": "be0d71ca72aee3dbd1565c9ad2314f81f0cd0c5511ec54cb623bbd39eede9974", + "ime_input_expectation_test.exe": "a5ea4532a06b893d955299793b4859cb9ccf221fab64e51949e1af2ee6ba5d0b", + "keyboard_test.exe": "18a35c2b2ab8a6316e0c938d8c36d0b82bcc131989d683205888b08bf4d33e19", + "layout_state_test.exe": "307519003536ce16d7d6fc552b3a25e9de25356d50a80c2de0c01168a10784a9", + "paste_test.exe": "47e9a5ce33335370b6fb199b0ff11adc19e2ab55bf64657061a13c1c020a24b0", + "presentation_probe.exe": "b7043cace46f65b22c7295df2fc06b214f060c2fd6fe18ac5ff27e13d943e096", + "raw_console_receiver_test.exe": "9c05cdb80d87ff264b3275387eb01dabc8f57640adbc7ee3910b0fc44f378224", + "real_app_capture.exe": "011efaad94da74ce182e30a3ff8abb0c1e1f58235bc77fa8c347ec3d9dcb822e", + "receive.exe": "ef316e11ddcc764ddac57426fc37b8b69f599ddb28a0ffedf5c2e85a3004a9d4", + "recovery_probe.exe": "c84e7b1b1792773b993f2758d5cafa59b80495451c01d194c3afd6cc653f0344", + "renderer_metrics_test.exe": "4cebad62798ff0f8eac42641a1119c7b9725728dd5fd31befcdf7e1ecb686cfd", + "replay.exe": "674f96ebbf00497576951a6780a5cf5195e3b80cc4acdb7f296fa8910a6203b7", + "resize_test.exe": "f566c56a1fa34e2a8ff480900ac5ae5059e2ac6872554208d5dbf0e24673dde0", + "runtime_observation_test.exe": "dfd04533d35d78401da75ad7d0965d923d7b7e95ad304775367b6088acc341ed", + "scenario_tick_gate_test.exe": "06cd4e813f1034d1a8c7fea592979f49c3ef89117c97fc6636cdae5012017ce8", + "search_test.exe": "0f29f3ea3147cc45eb2e500e683f3bcc1db04f820470b2ff473fffcb31cdb4f4", + "selection_test.exe": "104576787b62c2c4bb2428e0786c7742e63a23ceb766df293c88a5ccc6a1b836", + "sender_fence_pipe_test.exe": "6a94ac84631434a81ae1098932813d7ceeb81f2bb33a2e4b2456834bd8972e92", + "sender_fence_test.exe": "ab4af3b0f148f6e6377e70c98936c6c34d0be0d3cee4b17b3f8554c39b2d3e52", + "sent_message_wait_test.exe": "bc3cff14f60e3f1b17b3fd6255ff1c5b507f506d897d528802efa9666be74dcf", + "shell_clipboard_reader.exe": "bacc4bff465ca644fae61f9d26184a7adc22df9793470feca647af1d823fece8", + "shell_ime_client.exe": "d787ebf702cf5895e1ad0d71f895a51b3dead34d02953b5e7deff086c2bf8eb7", + "shell_input_client.exe": "850c82fb8bb58de8170bf096cc6dd4f8ba34d9ba11dbd2addc41508cddc31d8c", + "shell_launch_test.exe": "ace9b63148848bf7b405edb4b8818ca23d52699ac2ce8ca03a90c5bc1e32622d", + "shell_paste_probe.exe": "1370c6381b990270dfd816f53758e5aa57c63deba050fa7cf0dbd0d5cbf4f315", + "shell_query_client.exe": "71419f7918bc58f4ee47d14f8e6de35aa1828ac838a73ed607797fc120f56886", + "shell_queue_probe.exe": "7f34d6ff66b3e00d56798e22a480fb20a5afa083cff65a9d689dcbca44dbe12d", + "shell_selection_text_client.exe": "dbad81a22ecce4508eada90ae445f9a75abfe1effd2571776ef31b32144c8ac4", + "shell_size_client.exe": "5394d9863df9a589012f0d9a31f7e4167e7bc4ea23e93f9711c0a67c540651f6", + "shell_test_launcher.exe": "dbde4249dc08c7df80120398ffd252aa5e4958e4ef640cc161ea4c2d28b9f291", + "shell_text_client.exe": "9485b03424e421a4018596cc9487e7feeb33c26d30820985aa45843fdcf315d9", + "termforge_conpty_probe.exe": "7dd59bc8d0309ad5b131cde1c3ed98819139b6bb70f505347c98aabe8396f618", + "termforge_ime_probe.exe": "788a186b5fafb6d155eeab74f78d4f7cb992a599937b3aa48c5efcf49affe993", + "termforge_shell.exe": "650ea74ba3ad39b91ab4773c72af3ee70e59bc9d63e76249ea8fa6745a367081", + "terminal_trace.exe": "40e869753f4c00515ee0990f3732eac04f965fe2c3070f1bf772717476269f3d", + "text_action_policy_test.exe": "535b469c9aa0da7e77670578f75d04956d98e9f912d5c9a6c310ab796ab58d4f", + "transport_completion_test.exe": "9f63a2f8a08ddcd459d422f69bfbeae9ceaee9527edc0198c7e4fbd07bff7dc4", + "workflow_fixture_test.exe": "a6624a6b1536c6f445f92e05ff72a5318ece47d455500f6adc467d94f9f04222", + "workspace_state_test.exe": "ac3fbc8a56d33efda33cc9040c731c183e0a8666e23fce48d368c1868797714d" + }, + "vim_sha256": "2e0fda63a89171adfc46c9417d5105cc39ed778cc69a890b83a4eabc34e7646a", + "vim_version": [ + "VIM - Vi IMproved 9.1 (2024 Jan 02, compiled Jul 09 2024 07:07:42)", + "Included patches: 1-532", + "Compiled by " + ], + "cmake_cache_sha256": "d652393042e1195908894a592dda1ebf0c8e1e8ccd3e05ecacec2760b41bc2ff", + "returncode": 8, + "completed_utc": "2026-10-26T16:44:34.597552+00:00", + "log_sha256": "2e0a4fd1afa9234461cb2598a6d52063115edcce3510017644d026125c7d37a7", + "last_test_sha256": "4da7c00a9422b9911c25cf4b6aba315e7e723e758132f61e285e5ca61bc0cf11", + "tests": [ + { + "name": "shell_launch", + "status": "run", + "seconds": 0.0119766, + "failed": false, + "skipped": false + }, + { + "name": "candidate_title", + "status": "run", + "seconds": 0.679326, + "failed": false, + "skipped": false + }, + { + "name": "candidate_reply_close", + "status": "run", + "seconds": 0.331894, + "failed": false, + "skipped": false + }, + { + "name": "runtime_observation", + "status": "run", + "seconds": 1.42167, + "failed": false, + "skipped": false + }, + { + "name": "ime_input_expectation", + "status": "run", + "seconds": 0.0101662, + "failed": false, + "skipped": false + }, + { + "name": "sent_message_wait", + "status": "run", + "seconds": 0.272669, + "failed": false, + "skipped": false + }, + { + "name": "find_bar", + "status": "run", + "seconds": 0.372583, + "failed": false, + "skipped": false + }, + { + "name": "renderer_metrics", + "status": "run", + "seconds": 0.89513, + "failed": false, + "skipped": false + }, + { + "name": "ime_context", + "status": "run", + "seconds": 0.333653, + "failed": false, + "skipped": false + }, + { + "name": "layout_state", + "status": "run", + "seconds": 0.123253, + "failed": false, + "skipped": false + }, + { + "name": "workspace_state", + "status": "run", + "seconds": 0.31827, + "failed": false, + "skipped": false + }, + { + "name": "transport_completion", + "status": "run", + "seconds": 0.0096818, + "failed": false, + "skipped": false + }, + { + "name": "scenario_tick_gate", + "status": "run", + "seconds": 0.0094621, + "failed": false, + "skipped": false + }, + { + "name": "candidate_core", + "status": "run", + "seconds": 1.12604, + "failed": false, + "skipped": false + }, + { + "name": "resize_core", + "status": "run", + "seconds": 0.0141228, + "failed": false, + "skipped": false + }, + { + "name": "history_core", + "status": "run", + "seconds": 0.0160041, + "failed": false, + "skipped": false + }, + { + "name": "selection_core", + "status": "run", + "seconds": 0.0736148, + "failed": false, + "skipped": false + }, + { + "name": "search_core", + "status": "run", + "seconds": 0.104065, + "failed": false, + "skipped": false + }, + { + "name": "paste", + "status": "run", + "seconds": 0.0100795, + "failed": false, + "skipped": false + }, + { + "name": "sender_fence", + "status": "run", + "seconds": 1.01974, + "failed": false, + "skipped": false + }, + { + "name": "sender_fence_pipe", + "status": "run", + "seconds": 0.377036, + "failed": false, + "skipped": false + }, + { + "name": "clipboard_policy", + "status": "run", + "seconds": 0.0080975, + "failed": false, + "skipped": false + }, + { + "name": "keyboard", + "status": "run", + "seconds": 0.0083753, + "failed": false, + "skipped": false + }, + { + "name": "text_action_policy", + "status": "run", + "seconds": 0.0075863, + "failed": false, + "skipped": false + }, + { + "name": "candidate_resize_replay", + "status": "run", + "seconds": 0.456575, + "failed": false, + "skipped": false + }, + { + "name": "candidate_shell_tui", + "status": "fail", + "seconds": 30.2581, + "failed": true, + "skipped": false + }, + { + "name": "core", + "status": "run", + "seconds": 5.70024, + "failed": false, + "skipped": false + }, + { + "name": "recovery", + "status": "run", + "seconds": 8.93909, + "failed": false, + "skipped": false + }, + { + "name": "measure", + "status": "run", + "seconds": 3.92379, + "failed": false, + "skipped": false + }, + { + "name": "binary_paths", + "status": "run", + "seconds": 0.190192, + "failed": false, + "skipped": false + }, + { + "name": "conpty_margin_contract", + "status": "run", + "seconds": 0.292098, + "failed": false, + "skipped": false + }, + { + "name": "benchmark_tools", + "status": "run", + "seconds": 5.29884, + "failed": false, + "skipped": false + }, + { + "name": "differential", + "status": "run", + "seconds": 2.9914, + "failed": false, + "skipped": false + }, + { + "name": "ime_inventory", + "status": "run", + "seconds": 48.3912, + "failed": false, + "skipped": false + }, + { + "name": "text_actions", + "status": "run", + "seconds": 5.26478, + "failed": false, + "skipped": false + }, + { + "name": "workflow_fixture", + "status": "run", + "seconds": 22.4382, + "failed": false, + "skipped": false + }, + { + "name": "workflow_sessions", + "status": "run", + "seconds": 73.5678, + "failed": false, + "skipped": false + }, + { + "name": "workflow_resources", + "status": "run", + "seconds": 0.473082, + "failed": false, + "skipped": false + }, + { + "name": "workflow_resource_phases", + "status": "run", + "seconds": 4.20935, + "failed": false, + "skipped": false + }, + { + "name": "workflow_system_content", + "status": "run", + "seconds": 0.139848, + "failed": false, + "skipped": false + }, + { + "name": "workflow_system_runner", + "status": "run", + "seconds": 0.59471, + "failed": false, + "skipped": false + }, + { + "name": "copy_error_frame", + "status": "run", + "seconds": 0.122081, + "failed": false, + "skipped": false + }, + { + "name": "paste_fence_evidence", + "status": "run", + "seconds": 0.101017, + "failed": false, + "skipped": false + }, + { + "name": "resize_trace", + "status": "run", + "seconds": 0.115742, + "failed": false, + "skipped": false + }, + { + "name": "research_guards", + "status": "run", + "seconds": 4.75846, + "failed": false, + "skipped": false + }, + { + "name": "receive", + "status": "run", + "seconds": 0.195176, + "failed": false, + "skipped": false + }, + { + "name": "conpty", + "status": "run", + "seconds": 23.2193, + "failed": false, + "skipped": false + }, + { + "name": "conpty_ctrl_c", + "status": "run", + "seconds": 4.26167, + "failed": false, + "skipped": false + }, + { + "name": "conpty_margin", + "status": "run", + "seconds": 0.348728, + "failed": false, + "skipped": false + }, + { + "name": "conpty_backend", + "status": "run", + "seconds": 1.13411, + "failed": false, + "skipped": false + }, + { + "name": "presentation", + "status": "run", + "seconds": 4.02108, + "failed": false, + "skipped": false + }, + { + "name": "shell", + "status": "fail", + "seconds": 174.653, + "failed": true, + "skipped": false + }, + { + "name": "selection_bytes", + "status": "run", + "seconds": 3.80834, + "failed": false, + "skipped": false + }, + { + "name": "selection_context", + "status": "run", + "seconds": 3.77349, + "failed": false, + "skipped": false + }, + { + "name": "raw_console_receiver", + "status": "run", + "seconds": 0.364619, + "failed": false, + "skipped": false + }, + { + "name": "paste_system", + "status": "run", + "seconds": 7.74685, + "failed": false, + "skipped": false + } + ], + "internal_skips": [ + { + "test": "setUpClass (test_candidate_compare.CandidateComparisonTests)", + "reason": "optional Alacritty binary is not built; core-candidate workflow runs these checks" + }, + { + "test": "setUpClass (test_capability_matrix.CapabilityMatrixTests)", + "reason": "optional Alacritty binary is not built; core-candidate workflow runs these checks" + }, + { + "test": "setUpClass (test_fuzz_matrix.FuzzMatrixTests)", + "reason": "optional Alacritty binary is not built; core-candidate workflow runs these checks" + }, + { + "test": "setUpClass (test_real_app_matrix.RealApplicationMatrixTests)", + "reason": "optional real application capture dependencies are not built" + }, + { + "test": "test_actual_system_copy_paste_and_shortcuts_twice (experiments.shell.test_actions.ActionWindowTest.test_actual_system_copy_paste_and_shortcuts_twice)", + "reason": "actual system Copy/Paste requires a disposable hosted VM" + }, + { + "test": "test_suspended_target_is_reclaimed_if_job_assignment_fails (test_ui_r1.EvidenceBoundaryTests.test_suspended_target_is_reclaimed_if_job_assignment_fails)", + "reason": "opt-in pinned reference failure injection" + }, + { + "test": "test_mouse_selection_to_real_system_clipboard (experiments.shell.test_shell.ShellTests.test_mouse_selection_to_real_system_clipboard)", + "reason": "system copy UI gate requires a disposable hosted VM" + }, + { + "test": "test_system_clipboard_product_read_errors_cancel_and_close (experiments.shell.test_shell.ShellTests.test_system_clipboard_product_read_errors_cancel_and_close)", + "reason": "product clipboard read gate requires a disposable hosted VM" + }, + { + "test": "test_system_clipboard_shortcut_to_window_confirmation_and_receiver (experiments.shell.test_shell.ShellTests.test_system_clipboard_shortcut_to_window_confirmation_and_receiver)", + "reason": "real system clipboard UI gate requires a disposable hosted VM" + }, + { + "test": "test_real_system_copy_shortcuts_for_styled_fixture_twice (experiments.shell.test_selection_bytes.SelectionBytesWindowTest.test_real_system_copy_shortcuts_for_styled_fixture_twice)", + "reason": "system CF requires a disposable hosted VM" + }, + { + "test": "test_real_system_copy_and_edit_context_twice (experiments.shell.test_selection_context.SelectionContextWindowTest.test_real_system_copy_and_edit_context_twice)", + "reason": "real CF/EDIT Copy requires a disposable hosted VM" + }, + { + "test": "test_real_system_clipboard (experiments.shell.test_paste.PasteTests.test_real_system_clipboard)", + "reason": "Private window station OpenClipboard denied (5); system API gate remains unverified." + } + ], + "failed_methods": [ + "test_real_fullscreen_editor_and_cursor_reply", + "test_close_while_resizing_continuous_output", + "test_main_and_bottom_sessions_focus_geometry_and_cleanup", + "test_resize_child_dimensions_and_interrupt", + "test_workspace_sessions_resize_and_cleanup" + ], + "observed_failures": [ + { + "case": "candidate-tui-0", + "sample": { + "mode": "candidate-tui", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 7, + "terminated": 0 + }, + "desktop_gone": true + }, + "stage": 59, + "raw_sample_sha256": "556fb95b611df35afd43c36b79c5ecd471b4fc524addcff9568b1178972bb265" + }, + { + "case": "main-2", + "sample": { + "mode": "ui-main", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 16, + "terminated": 0 + }, + "desktop_gone": true + }, + "stage": 7, + "raw_sample_sha256": "3958d53e4a69819bd3aa9db04c2fe09d26b78aba22d76db904102b257ea59340" + }, + { + "case": "resize-0", + "sample": { + "mode": "resize", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "desktop_gone": true + }, + "stage": 43, + "raw_sample_sha256": "eab4ad23688907b4cfe66756203e088ccfcfbc251d271e2497f64ee9375ac043" + }, + { + "case": "resize-close-0", + "sample": { + "mode": "resize-close", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "desktop_gone": true + }, + "stage": 43, + "raw_sample_sha256": "24ce02899ca5110cc20fabc847725d28ea73da6866f9b2a387e7620760829700" + }, + { + "case": "ui-2", + "sample": { + "mode": "ui", + "status": "failed", + "timed_out": false, + "exit_code": 2, + "job_after": { + "active": 0, + "total": 12, + "terminated": 0 + }, + "desktop_gone": true + }, + "stage": 52, + "raw_sample_sha256": "fe0985a95d8c70063e214bebec6476afdb651413f554ade5a199d46d79428d18" + } + ], + "persistence_method_passed": true, + "all_tests_completed": true, + "total_seconds": 449.38, + "limitations": [ + "Candidate/official full regression retains actual failures and internal skips.", + "Standalone persistence passes do not replace the failing aggregate shell suite.", + "No actual presented endpoint, long-run stability or WindTerm performance equivalence." + ] + }, + "ci": { + "source_head": "4daf99250a2740e1943635b6d46293d633427163", + "checkout": "c5d397999fbc00a83dd4055d975d8c12f855af5e", + "workflows": [ + { + "run": 40360427005, + "name": "Build and synthetic regression", + "conclusion": "success", + "windows_job": 121704057921, + "windows_tests": 51, + "windows_failed": 0, + "windows_seconds": 273.64 + }, + { + "run": 40360426973, + "name": "External core candidate", + "conclusion": "success", + "windows_job": 121704056881 + } + ], + "normalized_local_job_logs_sha256": { + "121704057921": "939a15bf59996dd31ce5a90cdefb240af0450060087d5b8e2b712b651bfb9310", + "121704056881": "26b187a507ac46184e0dec9da964e08fb82ffdab0a725c58a5979dd7e37acd7e" + }, + "limitation": "CI source is the experimental stack; a separate main-line patch requires its own merge-checkout validation." + } +}