diff --git a/docs/EVIDENCE.md b/docs/EVIDENCE.md index 52600ade..ceb2cd6d 100644 --- a/docs/EVIDENCE.md +++ b/docs/EVIDENCE.md @@ -14,6 +14,8 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分 显式官方后端的旧 `.3` 实现及独立生命期/双 SHA 拒绝记录见[实验合同](research/experimental-conpty-backend.md)与[冻结验证](../experiments/conpty/results/2026-10-26-reviewed-backend/validation.json)。联合源码 `3e5b96d` 的[三配置清单](../experiments/conpty/results/2026-10-26-joint-backend/validation.json)分别记录默认43/45、候选/system 48/48、显式官方46/48(shell套件超时,未完成项仍未知);原resize/Vim各一红一绿、粘贴两红。新恢复/worker/工作区失败由 #61–#63 承接,旧失败不因其他轮成功变成通过。 +后续合并推送的两个独立失败见[原件审计](../experiments/shell/results/2026-10-26-postmerge-ci/validation.json):main `098f9ab` 工作区第二轮保存 stage2 [#72](https://github.com/JavaZeroo/termforge/issues/72),实验分支源码 `af563ba` 的 681 高度选择场景 [#73](https://github.com/JavaZeroo/termforge/issues/73)。两次 CI 实际均为默认自研核心/system;return2、Job0、desktop 已删除,原生退出/EOF 与逐运行 EXE 绑定仍未知。它们不等同已修 #61/#66,另一批 PR 成功不能覆盖这些失败。 + ## 产品能力的限定验收 | 范围 | 结果与复现入口 | 可以支持的结论与限制 | @@ -48,6 +50,8 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分 | 纯 AST 夹具的生命周期记录 | [#40](https://github.com/JavaZeroo/termforge/issues/40)、[计时、进度与回收验证](../research/ime/results/2026-10-26-inventory-lifecycle/validation.json)、[专用 CI 40253727745](https://github.com/JavaZeroo/termforge/actions/runs/40253727745) | 旧 10 秒 AST 夹具及专用 CI 记录启动、AST 和 Job0;原超时根因未确定。诊断增强见 #40 阶段保留,不由一次 CI 成功结项。 | | 原生 margin 逐字段合同与修复候选(#56 仍开放) | [合同、源码与路径](research/conpty-native-margin-path.md)、[独立 oracle](../experiments/conpty/margin_contract.py)、[固定运行](../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/八会话及完整官方矩阵未验收。 | +| 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。夹具强制收尾与产品自然退出分列,未知归属/回收仍失败。 | | 工作区恢复的运输完成端点(#38 夹具修正) | [限定合同](research/workspace-restore-transport-oracle.md)、[原失败及默认/候选验证](../experiments/shell/results/2026-10-26-workspace-transport-oracle/validation.json) | OSC 标题中的重复标记与 column-one CUP 误导旧端点;新判定保留完整 UTF-8、期限、负载及恢复断言。仅修夹具,不宣称修复产品恢复。 | diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 5425f04a..c65269f1 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -12,7 +12,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)推进 R2 新终端能力 | [固定来源](../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)仍开放,现有 completed 观察不能证明部分发送取消通过或产品 Cancel 故障;另有 worker gate [#62](https://github.com/JavaZeroo/termforge/issues/62) 和工作区 [#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)仍开放,现有 completed 观察不能证明部分发送取消通过或产品 Cancel 故障;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` 或实验后端联合配置。 @@ -33,7 +33,7 @@ | Unicode 与文字显示 | **实现中,未验收**:默认自研保留 Unicode 15。显式候选 `.4` 的 [#39 Unicode 17 流式字素合同](research/streaming-graphemes.md)已限定验收:固定 ZWJ/keycap 的单 lead/两列、光标、SGR/查询、原子选择复制、单列 resize 与有界无损分片;实际 ConPTY/DWrite 核对固定样本的单 glyph、字体和网格 | [#30](https://github.com/JavaZeroo/termforge/issues/30) 仍需完整输入/IME 交叉;所有脚本/整形、通用 fallback、所有原生重放、真彩色/更多属性、Powerline 和真实跨屏未验收。分段 helper 的规范数据通过不代表完整终端 Unicode 正确性;[#54](https://github.com/JavaZeroo/termforge/issues/54) 保留已观察的性能成本 | R2 / R4 | | resize 与 reflow | **限定验收**:默认按 ADR-0005 物理行裁剪;候选在[固定 ConPTY 重放](../experiments/core/results/2026-10-26-resize-replay/validation.json)与连续同步中保持行身份、Find/选区和有界历史,淘汰/清空不复活;候选 `.4` 另覆盖主/备用屏缩到单列 | [#29](https://github.com/JavaZeroo/termforge/issues/29) 的完整 resize 交叉未完成;固定事务不等于完整 reflow 或 WindTerm 等价。系统/实验 ConPTY、备用屏/滚动区、真实 DPI、呈现、性能及 #36/#38 分别验收;默认缩窄不可恢复 | R2 | | 本地 shell 选择 | **实现中,未验收**:`ShellLaunch` 分离可执行文件、参数、工作目录及 shell 命令差异;cmd、Windows PowerShell 5.1、PowerShell 7、显式 Ubuntu WSL 各有[两轮真实启动/目录/尺寸/正常退出证据](../experiments/shell/results/2026-10-24-r2-shell-lifecycle/validation.json),无效程序启动错误可见且可关闭后恢复 cmd | 仅声明上述固定入口和隔离目录;任意 profile/参数、通用分屏/排序、全部运行时错误提示及管理员 shell 未完成 | R2;权限场景 R4 | -| 常用 TUI | **实现中,未验收**:显式候选 + 系统 ConPTY 有固定 Vim 进入、编辑、60×12 resize、退出写盘、主屏恢复及光标回复的[产品证据](../experiments/core/CANDIDATE.md);More 尾部 ECH 与捕获端点有[限定修复](research/more-capture-ech.md) | [#28](https://github.com/JavaZeroo/termforge/issues/28) 的更多应用及完整输入/输出模式未完成;PR #50 实验后端的 Vim 失败不能由系统后端结果豁免。headless 比较与自有 DIB 不等于真实呈现,`presented_done=null` | R2 | +| 常用 TUI | **实现中,未验收**:显式候选 + 系统 ConPTY 有固定 Vim 进入、编辑、60×12 resize、退出写盘、主屏恢复及光标回复的[产品证据](../experiments/core/CANDIDATE.md);More 尾部 ECH 与捕获端点有[限定修复](research/more-capture-ech.md) | [#28](https://github.com/JavaZeroo/termforge/issues/28) 的更多应用及完整输入/输出模式未完成;PR #50 实验后端的 GUI Vim [#52](https://github.com/JavaZeroo/termforge/issues/52) 仍有失败;[native 捕获目录复用](research/vim-fixture-isolation.md)已独立定位并修正,不能代替 GUI 或完整 TUI 验收。headless 比较与自有 DIB 不等于真实呈现,`presented_done=null` | R2 | ## 工作区与会话 @@ -66,7 +66,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 纯夹具超时根因与持续复验仍未闭合 | R2 / R4 | +| 自动正确性与构建 | **限定验收**:Windows shell/ConPTY/呈现及 Windows/Linux 核心 CI、差分/恢复/队列/生命周期场景 | 产品打包、干净机器使用、依赖升级、长期回归和更广平台矩阵;#40 的 CI 纯夹具超时,以及后续保存 stage2 #72 / 窄窗口选择 #73 的独立失败仍未闭合 | 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 支持或实测结论 | 各平台 PTY/输入/字体/UI/安装与架构覆盖。Windows 7/8/10、macOS 10.13–12、Linux glibc 2.17+ 和未列出的 ARM/旧新系统等按台账分别验收或保留未知,不能由核心 CI 推断产品支持 | R4 / R5 | | 吞吐、响应、内存与稳定性 | **实现中,未验收**:已有机制实验、连续 CPU 区间校准与合成回归;候选字素改动的受限诊断中 project/interactive 吞吐中位数约下降 16%/9%,由 [#54](https://github.com/JavaZeroo/termforge/issues/54) 跟踪 | 共享宿主、allocator 包装与缺少真实呈现/输入时延端点使该诊断不构成正式预算。仍需同负载/同正确性、无插桩对照、观测开销、长期/多会话公平性和可复核预算;与 WindTerm 的实际差距**待取证** | 持续工作;R4 / R5 收敛 | diff --git a/docs/TRACKING.md b/docs/TRACKING.md index 1055b2aa..6a03f833 100644 --- a/docs/TRACKING.md +++ b/docs/TRACKING.md @@ -35,12 +35,13 @@ | 工作 | 责任任务 | 完成条件的归属 | |---|---|---| | 持续输出中的 Ctrl-C 历史失败 | [原始 ETX 回归 #36](https://github.com/JavaZeroo/termforge/issues/36) | 有界定位历史因果与原生交付;后续通过不回填旧因 | -| 新增实际回归 | [恢复 oracle 修正 #61](https://github.com/JavaZeroo/termforge/issues/61) · [InputPump gate #62](https://github.com/JavaZeroo/termforge/issues/62) · [工作区 stage52 #63](https://github.com/JavaZeroo/termforge/issues/63) · [hosted reverse #66](https://github.com/JavaZeroo/termforge/issues/66) | #61 恢复 oracle、#66 双会话 tick 门槛已按原合同限定闭合;#62/#63 继续开放,不放宽期限、负载或几何断言 | +| 新增实际回归 | [恢复 oracle 修正 #61](https://github.com/JavaZeroo/termforge/issues/61) · [InputPump gate #62](https://github.com/JavaZeroo/termforge/issues/62) · [工作区 stage52 #63](https://github.com/JavaZeroo/termforge/issues/63) · [hosted reverse #66](https://github.com/JavaZeroo/termforge/issues/66) | #61 恢复 oracle、#66 双会话 tick 门槛已按原合同限定闭合;#62 实验夹具已限定闭合,#63 继续开放;#53 的 UI fence 尚未接入,不放宽期限、负载或几何断言 | +| 后续合并推送的新失败 | [保存 stage2 #72](https://github.com/JavaZeroo/termforge/issues/72) · [681 高度选择 #73](https://github.com/JavaZeroo/termforge/issues/73) | 两次均为默认/system;原件已审计,精确阶段/字节与因果另查,不重开不同触发的 #61/#66 | | 原 10 秒纯夹具超时 | [IME inventory 定位 #40](https://github.com/JavaZeroo/termforge/issues/40) | 阶段与清理已补齐;下一步是固定源码/宿主的有界原因定位 | | controller 自然退出 | [close 前退出 #44](https://github.com/JavaZeroo/termforge/issues/44) | 保留 send/wait/pre-close 与清理差异;不能以 close 后结果当自然退出 | | 旧 normal-1 未知异常 | [事件转换边界 #57](https://github.com/JavaZeroo/termforge/issues/57) | 独立于已修合法空标题 #45;原事件 kind/载荷未知,不能回填根因 | -| Windows 工作流可靠性 | [回归汇总 #38](https://github.com/JavaZeroo/termforge/issues/38) | #40/#44/#57;已闭合切片和旧失败保留在该总项,不再排入当前队列 | -| 显式官方 ConPTY 整合 | [后端汇总 #47](https://github.com/JavaZeroo/termforge/issues/47) | #51/#52/#53/#62/#63;#55 已固定实验联合基线,实验可选不等于产品默认或日常验收 | +| Windows 工作流可靠性 | [回归汇总 #38](https://github.com/JavaZeroo/termforge/issues/38) | #40/#44/#57/#72/#73;已闭合切片和旧失败保留在该总项,不再排入当前队列 | +| 显式官方 ConPTY 整合 | [后端汇总 #47](https://github.com/JavaZeroo/termforge/issues/47) | #51/#52(GUI)/#53/#63;#62 worker 夹具与 #52 native 捕获已独立修正,#55 已固定实验联合基线,实验可选不等于产品默认或日常验收 | | 每缓冲区 margin 端到端合同 | [margin 汇总 #41](https://github.com/JavaZeroo/termforge/issues/41) | #47/#56;原生 API、transport 和末端分别验证 | | 产品 GUI/平台与核心边界 | [架构定案 #34](https://github.com/JavaZeroo/termforge/issues/34) | #28–#31/#54,结合已验 #23/#26/#32/#33;维护正式 ADR | | 最终 Windows 开发版 | [产物与持续运行 #35](https://github.com/JavaZeroo/termforge/issues/35) | #27–#34/#36/#38;在最终产物上执行完整合同后核对 #7 出口 | diff --git a/docs/milestones/R2-local-terminal.md b/docs/milestones/R2-local-terminal.md index 327004f7..94e7e187 100644 --- a/docs/milestones/R2-local-terminal.md +++ b/docs/milestones/R2-local-terminal.md @@ -42,7 +42,7 @@ flowchart LR ## 下一批的任务边界 -1. **优先完成联合基线。** 从主线与 Draft 的明确身份整合,不在旧配置上连续堆修补丁。#51–#53 可以用原冻结输入独立定位,但最终修复验收必须回到联合基线;不会因一次未复现自动获得“已修复”的因果结论。 +1. **在已冻结基线上逐项闭合后端回归。** #55 已交付含红的真实基线;接续 #51–#53 与 #63 的独立失败。#62 的[真实 writer 持块、取消与停止夹具](../research/sender-fence.md)不降低原 4MiB/16KiB/期限,下一步把默认关闭的 fence 接到 #53 原 UI/3MB/八会话入口;这不代表这些 UI 路径已通过。#51–#53 可以用原冻结输入独立定位,最终修复验收须在联合配置重建;一次未复现不自动构成因果修复。 2. **并行处理平台语义与性能。** [原生语义处理路径 #56](https://github.com/JavaZeroo/termforge/issues/56)先明确 #41 原合同需要什么、哪些路径可支持;保留必要的上游或独立实现工作,不用“平台不同”豁免缺口。#54 现在就冻结重复方法、完成端点和预算决定程序,再定位吞吐成本;不等到 #34 才补性能。 3. **在主线推进独立行为合同。** #29 核对极窄/极短、软硬行、历史/淘汰、选择/Find、连续 resize 和 child ack;#30 核对 IME 组合/提交/取消与输出/resize/切换、应用键盘/粘贴接收、实际复制及同次八会话。已验收的 #39 只提供首批字素基础,最终配置的交叉验收仍需执行。 4. **补终端模式和应用矩阵。** #27 明确 DECOM/DECAWM、pending-wrap、保存恢复、异常序列与 margin×resize;#28 先固定应用版本/入口/动作及协议字节预期,再逐应用完成进入、操作、resize、退出、主屏恢复。Vim 的一个修复不替代完整 TUI 验收。 @@ -61,7 +61,7 @@ flowchart LR | 门槛与责任项 | 验收必须证明什么 | 不能代替验收的结果 | |---|---|---| -| 回归可靠性:#36、#38(含 #40、#44) | 持续输出中断、controller 子进程到 shell 的正常退出、原 10 秒纯夹具失败路径均有明确阶段、字节、退出和自有 Job 回收证据;修复对应真实失败,最终声明配置的完整回归通过 | 多次重跑绿不能回填旧失败原因;close 后的退出码不能冒充自然退出;增加超时或跳过不能解除阻塞 | +| 回归可靠性:#36、#38(含 #40、#44、#57、#72、#73) | 持续输出中断、controller 子进程到 shell 的正常退出、原 10 秒纯夹具及新保存/选择失败路径均有明确阶段、字节、退出和自有 Job 回收证据;修复对应真实失败,最终声明配置的完整回归通过 | 多次重跑绿不能回填旧失败原因;close 后的退出码不能冒充自然退出;增加超时或跳过不能解除阻塞 | | 终端模式:#27、#41 | 候选核心主/备用屏、各自滚动区域、origin/wrap、光标/样式、历史隔离及 resize 交叉符合固定合同;真实 ConPTY 路径保留实现这些语义所需的信息 | 独立核心 feed 正确不能补足宿主已经丢失的信息;不能猜测补发原运输中不存在的 VT,或用“已知平台差异”自行关闭功能缺口 | | resize 与真实 TUI:#29、#28 | 逻辑/物理行、宽字符、历史与淘汰有明确策略;窗口、核心和真实子进程尺寸一致;固定应用逐一完成进入、操作、resize、退出、主屏恢复;回复、输入模式和 bracketed paste 字节经独立预期验证 | 离线回放、单独 Vim 成功或默认核心通过,不能代表整个候选产品矩阵;未声明应用不计完成 | | 复杂文字与输入:#30(复用已验 #39) | 保留首批字素合同,在最终配置核对原始标量、宽度/光标、实际 glyph、复制与子进程接收;完成固定 IME 与同次八会话交叉回归 | #39 的字素与单列 resize 成功不代表完整 IME、应用模式或 R1 系统输入组合在另一配置已通过;未知 WindTerm 行为仍保留 | diff --git a/docs/research/sender-fence.md b/docs/research/sender-fence.md new file mode 100644 index 00000000..f48f492b --- /dev/null +++ b/docs/research/sender-fence.md @@ -0,0 +1,63 @@ +# 实际输入 worker 的持块合同与 sender fence + +本合同对应 [#62](https://github.com/JavaZeroo/termforge/issues/62),为 [#53](https://github.com/JavaZeroo/termforge/issues/53)提供可复用的协调机制。**实现属于 `fix/conpty-backend-r47` / [Draft #50](https://github.com/JavaZeroo/termforge/pull/50) 的实验整合,尚未进入 main。** 固定运行源码为 `519a3f37d52983062cd99b7efd805f183961fa4d`;完整 source/tree/blob、实际 EXE、官方后端文件对、原始日志 SHA 和逐字段结果见[验证记录](../../experiments/shell/results/2026-10-26-sender-fence/validation.json)。这是实际 `InputQueue` / `PasteTransfer` / ConPTY worker 的限定验证,不是 UI、VT 或操作系统背压验收。 + +## 修正的夹具假设 + +旧夹具先启动输出洪流并将 reader 持在 gate,再向完全不读输入的 child 发送 4MiB ASCII。它要求观察到 writer 已提交至少 16KiB,但固定官方后端的一次实际拒绝状态是 `sent=5120 / accepted=6144 / in_flight=1024`,未达到原门槛。不能假设所有宿主都能在 child 不读且输出被持住时预接收 16KiB;本批没有测定内核或宿主缓冲容量,也没有证明其是唯一影响因素。 + +原 `af563ba` 的 focus 单测真实失败及只有 EXE 身份的 `2ac023b…` 诊断保留;最终同一 EXE 的 `--ungated-writer-observation` 仍按旧顺序返回 2,并再次给出上述低 sent 状态。**没有把旧顺序改写为已通过。** 首次 Python 准备缺少 `termforge_shell.exe`、运行零项测试,单独归为构建前置失败,不计产品失败。缺少固定源码绑定的早期 WIP 绿色不计最终验证。 + +## 新的明确顺序 + +4MiB 请求、真实 1024B 分块、16KiB 已发送门槛、reader/output gate、resize 与回收检查保留。夹具明确改变交错顺序: + +1. child 用实际控制台读取核对恰好 16KiB `a`,之后不再读输入;只在核对完成后设置独立 primed event。 +2. 原 writer 经真实 `take_chunk()` 领取第 17 块,在 queue 发布 `in_flight=1024` 并解锁后,由 sender fence 持住。此时真实计数为 `sent=16384 / accepted=17408 / total=4194304`。 +3. parent 同时确认 held 状态和 child primed event,再开启原 flood phase、使 reader 进入原输出 gate。 +4. 执行真实 stop、cancel 或 cancel/stop 竞争;继续原 resize generation、child 实际尺寸 102×42、自然退出及自有 Session Job0 检查。 + +sender fence 只能固定达到门槛后的观察,不能使原来在门槛之前阻塞的 OS 写入自行前进。held 表示 writer 拥有一块真实 payload,不表示 `WriteFile` 已进入或被系统阻塞。输出 gate 的记录来自 reader callback 进入;本批没有独立 flood 字节计数或实际呈现端点。 + +## 生命周期与接口 + +`SenderFence` 是绑定单次 transfer 的测试控制面,普通产品 `InputQueue::begin_paste(transfer)` 默认不启用;队列探针显式传入 fence。构造时固定 transfer 身份、非零 generation 和绝对 deadline,`begin_paste(transfer, fence)` 在通知 writer 前完成单次 admission。绑定不同 transfer、重复 admission、错误 ticket、未 held 就 release、重复 release 和过期 release 均被拒绝。 + +- `snapshot(ticket)` 按值读取 held 状态及真实 progress;不读取或复制输入正文。 +- `release(ticket)` 只允许匹配的 held ticket 在 deadline 前继续发送,不生成写确认。 +- `InputQueue::cancel_paste()` 先调用真实 `PasteTransfer::cancel()`,再通知 fence;已领取块继续原 `Session::send → WriteFile → acknowledge_written → finish_chunk`,最终取消保持 `sent==accepted`。 +- `InputQueue::stop()` 先发布 stopping 并唤醒 fence,再沿原取消同步 I/O 与 join 路径退出。writer 醒来后重新检查 stopping;尚未提交的持块由原 writer failure 清理,不能伪造 ack 或直接当作已发送。 +- `abort(ticket, control_eof)` 将控制面中止表现为失败;本批 EOF 仅是纯协议中的方法调用模拟,没有执行实际 IPC EOF。 + +等待 fence 时不持 queue mutex;cancel/stop 在释放 queue mutex 后通知 fence,防止与 join 形成锁环。`CancelSynchronousIo` 本身不能唤醒 condition-variable wait。fence 强持有绑定 transfer,writer 和 queue 持有 fence 到等待/退出结束。 + +达到持块、child primed、reader gate 及取消完成的观察共同使用原 3 秒绝对期限;没有每阶段重新延长该观察期限。其他既有 ready、resize、child 尺寸及退出等待分别保留 3 秒,原 Python probe 进程外层仍为 10 秒。纯协议缺 GO 使用 1 秒绝对 deadline,单独证明有限等待;这些带同步的运行不是性能样本。 + +## 固定结果与计数 + +最终原始批次有**两种后端各两次 probe 进程运行,每次实际执行三个 worker 动作,共 12 条逐字段审计记录**。原始 launcher 标签 `held-stop-0/1` 不表示只运行 stop。另有两种配置各一次原 focus Python 单测通过,单独记录,不重复并入上述 12 条矩阵。两种配置的 `paste` / `sender_fence` CTest 各 2/2。 + +| 动作 | 动作前 sent / accepted / in_flight | 动作后 sent / accepted / in_flight | 实际状态与回收 | +|---|---|---|---| +| stop | 16384 / 17408 / 1024 | 16384 / 17408 / 0 | failed,retained capacity 15,Job0 | +| cancel | 16384 / 17408 / 1024 | 17408 / 17408 / 0 | cancelled,retained capacity 15,Job0 | +| cancel/stop 竞争 | 16384 / 17408 / 1024 | 本批为 16384 / 17408 / 0 | 本批均由 stop 获胜、failed、Job0;不能宣称两个交错都被实际观测 | + +所有正例保持 input join、resize working/pending/completed generation 1/3/3 和 child 102×42;这些 generation 字段属于 **resize worker**,不是 sender ticket 的独立运行日志。官方配置的构建定义及固定包选择 Console flags24,系统配置 flags0;worker JSON 没有独立输出 flags,证据来源在验证记录中分列。 + +`shell_queue_probe` 没有链接候选 VT 核心。构建目录叫 `candidate` / `candidate-system`,以及适配开关为 ON,均不能把该结果扩大为候选 VT、Unicode 或 TUI 验收。 + +## 复验与剩余边界 + +在已经明确配置并按贡献指南完成构建的目录运行: + +```powershell +cmake --build build/candidate --config Release --target shell_queue_probe paste_test sender_fence_test +ctest --test-dir build/candidate -C Release -R '^(paste|sender_fence)$' --no-tests=error --output-on-failure +$env:TERMFORGE_BIN_DIR = (Resolve-Path build/candidate/bin/Release).Path +python -m unittest experiments.shell.test_shell.ShellTests.test_queues_apply_bounded_backpressure_and_reject_input -v +``` + +系统配置单独使用对应构建目录,不能复用另一 EXE 的身份。旧顺序诊断使用 `shell_queue_probe --ungated-writer-observation`,由 10 秒 subprocess 监督,保留预期 return2 与具体进度;不能将它作为需要重跑取绿的产品测试。 + +#53 的真实 UI cancel/close、原 3,000,000B 汉字负载、768B receiver checkpoint、真实 flood、完整输入前缀及同次八会话尚未由本批验收。后续必须在发送前预绑定 fence,并让真实 UI 取消进入 queue 的取消通知入口;不能把本夹具额外读取 16KiB 的 priming 原样移到必须保持 768B checkpoint 的 #53。完整官方回归、长期资源、呈现、平台和 WindTerm 性能差距继续独立处理。 diff --git a/docs/research/vim-fixture-isolation.md b/docs/research/vim-fixture-isolation.md new file mode 100644 index 00000000..9766b333 --- /dev/null +++ b/docs/research/vim-fixture-isolation.md @@ -0,0 +1,29 @@ +# Vim 捕获的运行目录隔离 + +[#52](https://github.com/JavaZeroo/termforge/issues/52) 的 native `new-buffer` 和 GUI stage59 是两条独立入口。本页只解释 native 捕获复用旧文件的原因;GUI 仍有真实失败,不能由本修正关闭 #52。实现通过 [PR #70](https://github.com/JavaZeroo/termforge/pull/70) 合入 `fix/conpty-backend-r47` 实验分支,尚未进入 main。 + +## native 反例与修正 + +原 `real_app_capture` 在新建输出目录的父目录运行应用。连续两个兄弟 capture 因而共享 `editor.txt`、`editor-startup.txt` 和 `editor-insert.txt`。第一轮 Vim 写盘后,第二轮打开已有的 12 字节文件,实际输出为 `"editor.txt" [unix] 1L, 12B`,原 `[New]` 断言必然失败。旧联合基线失败原件也具有这段输出。失败诊断中的 `editor_exit=91` 来自随后清理,不是 Vim 自然退出故障的证明。 + +同一旧 EXE、官方 `1.25.260930003`、Console width flags24、同一父目录的两次完整 cmd/More/Vim 捕获已复现第一绿、第二红 `new-buffer`;每次独立父目录的对照均绿。因此,这条失败来自夹具路径复用,不能认定为 Console width 兼容缺陷。 + +修正将应用工作目录设为本轮刚新建的 capture 目录。相对文件名、事件文件握手、输入字节、`[New]`、写盘内容、退出、真实 reader EOF 与外层 Job 检查均保留。兄弟运行和父目录已有文件不再影响本轮,也不会删除或覆盖父目录的文件。 + +新增真实回归在父目录预置旧编辑文件和 READY/INSERT,然后执行两个兄弟 capture,检查各自新文件、事件及父目录原件未变。该回归对旧 EXE 真实失败,对本树重建的修正 EXE 通过;完整真实应用模块 9 项通过。详细身份、原期限、原件哈希和回收结果见[脱敏证据](../../experiments/conpty/results/2026-10-26-vim-fixture-isolation/validation.json)。 + +## 复验 + +先在上述实验分支构建 `real_app_capture`,在当前进程 PATH 提供固定 Vim;设置 `TERMFORGE_REAL_APP_CAPTURE` 指向所验配置的实际 EXE。 + +```powershell +python -m unittest discover -s experiments/differential -p test_real_app_matrix.py -v +``` + +完整模块另需按 differential README 构建两方核心 trace。不要用系统 ConPTY 的成功代替显式官方配置。 + +## 尚未闭合 + +原 GUI `candidate-tui` 两轮本批仍为一绿一红;红例在 resize 后没有产生 InsertLeave,`:call writefile(...)` 成为插入内容,stage59 到原期限失败。两轮都回收为 Job0、私有 desktop 消失。目录隔离不影响此入口,尚无根因或修复结论。历史冻结基线、完整 TUI、呈现端点和后端整体回归仍分别保留。 + +有停止条件的 GUI 探针也未形成修复:strace 包装的两次运行在 Vim 启动时触发另一种 `c0000005`,不计原症状;临时观察真实 WriteFile 成功字节的三轮均绿,其中两轮 Ctrl-O 命令先于 CPR,否定了“这个先后关系必然导致红例”的假设。观察代码已移除,重新构建的原入口两轮均绿,事件/写盘/回复原检查保持;这仍不能解释已保存的真实 stage59 红例。探针二进制未在还原前记录哈希,证据明确保留该身份缺口并排除为验收。下一次需定位真实控制台输入到 Vim resize/按键处理的边界,不能用这批绿例关闭 GUI 问题。 diff --git a/experiments/conpty/results/2026-10-26-vim-fixture-isolation/validation.json b/experiments/conpty/results/2026-10-26-vim-fixture-isolation/validation.json new file mode 100644 index 00000000..27de94ff --- /dev/null +++ b/experiments/conpty/results/2026-10-26-vim-fixture-isolation/validation.json @@ -0,0 +1,347 @@ +{ + "schema": "termforge-vim-fixture-isolation-v1", + "scope": "native capture fixture isolation only; GUI stage59 remains open", + "base_source": "af563ba15aa5abf90a09ca55eb9c177ac873ecf0", + "fixed_source": "aa5fbe5f61d771b5ac7716ce4e77cb143baec3ef", + "backend": { + "identity": "reviewed-side-by-side-1.25.260930003", + "flags": 24 + }, + "application": { + "version": "Git for Windows MSYS Vim 9.1 patches 1-532 compiled 2024-07-09", + "exe_sha256": "2e0fda63a89171adfc46c9417d5105cc39ed778cc69a890b83a4eabc34e7646a" + }, + "binary_sha256": { + "old_capture": "6203c2a5ddaebf756d959456265aa64d21f9286c59730123709211120dee7941", + "fixed_capture": "9d0d8d186f024993915465fc52d4f9e4cba34a014baee831a96d5611b0c7e10d", + "gui_original": "54105cbfc5ac7ab34fb6d18ba2672d06ed5c187bebeaee803322084e323a9c72" + }, + "source_files": { + "experiments/conpty/real_app_capture.cpp": "14579e51ab1f11967634e491b0e430f4cb29d370e2be6d6a67d7f3bc77655075", + "experiments/differential/test_real_app_matrix.py": "7182266c031682f422529a851726ac653b85ef6f9ca05aaab3cd21559e2764fb" + }, + "unchanged_contract": { + "capture_outer_seconds": 60, + "gate": "GO newline after Job assignment", + "real_cmd_more_vim": true, + "new_buffer_marker": "[New]", + "editor_text": "TF_VIM_REAL", + "reader_eof_required": 109, + "editor_normal_exit_required": 0, + "startup_milliseconds": 10000, + "new_buffer_milliseconds": 10000, + "insert_milliseconds": 10000, + "editor_exit_milliseconds": 15000 + }, + "same_parent_original": [ + { + "supervision": { + "timed_out": false, + "returncode": 0, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "cleanup_errors": [] + }, + "editor.bin": { + "bytes": 2099, + "sha256": "698a05e6e3d717fac41e72e7af4a0eb85ba946faa35c030e5e54b7687cf97e2c" + }, + "shell.bin": { + "bytes": 64, + "sha256": "9c74f9134043ae20a6dccb278951365f8f65e4d13c2eef491737b5095da4538c" + }, + "pager.bin": { + "bytes": 508, + "sha256": "f51912329ea7e8f696057afc48703ceced3d2e8d582f891239ebfcc2b08b1dc0" + }, + "pager-lifecycle.json": { + "bytes": 287, + "sha256": "5f9cb64fee5d7f5edcf86005ab1c73c04f4dedd9a4e8975f61495235cf40c7ef" + }, + "manifest.json": { + "bytes": 244, + "sha256": "dbd4eb828fa17de859963fd736d529d888aec64510b9d6523dd684d8852d3e61" + } + }, + { + "supervision": { + "timed_out": false, + "returncode": 1, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "cleanup_errors": [] + }, + "editor.bin": { + "bytes": 1999, + "sha256": "93adf25f57b7b31eacf242fe3229786b47e5148741c8074b74e775d43254f215" + }, + "shell.bin": { + "bytes": 64, + "sha256": "9c74f9134043ae20a6dccb278951365f8f65e4d13c2eef491737b5095da4538c" + }, + "pager.bin": { + "bytes": 508, + "sha256": "f51912329ea7e8f696057afc48703ceced3d2e8d582f891239ebfcc2b08b1dc0" + }, + "pager-lifecycle.json": { + "bytes": 287, + "sha256": "5f9cb64fee5d7f5edcf86005ab1c73c04f4dedd9a4e8975f61495235cf40c7ef" + }, + "editor-failure.json": { + "bytes": 270, + "sha256": "a2a39c3f6e40ee1b56a44a2b352abd725676727d56bbe176958ff0550fc699b4" + }, + "failure": { + "stage": "new-buffer", + "error": "editor new buffer was not displayed", + "editor_exit": 91, + "child_signaled": true, + "editor_bytes": 1999, + "active_children": 0, + "cleanup_complete": true, + "capture_overflow": false + } + } + ], + "same_parent_fixed_with_stale_parent_fixtures": [ + { + "supervision": { + "timed_out": false, + "returncode": 0, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "cleanup_errors": [] + }, + "editor.bin": { + "bytes": 2099, + "sha256": "698a05e6e3d717fac41e72e7af4a0eb85ba946faa35c030e5e54b7687cf97e2c" + }, + "shell.bin": { + "bytes": 64, + "sha256": "9c74f9134043ae20a6dccb278951365f8f65e4d13c2eef491737b5095da4538c" + }, + "pager.bin": { + "bytes": 508, + "sha256": "f51912329ea7e8f696057afc48703ceced3d2e8d582f891239ebfcc2b08b1dc0" + }, + "pager-lifecycle.json": { + "bytes": 287, + "sha256": "5f9cb64fee5d7f5edcf86005ab1c73c04f4dedd9a4e8975f61495235cf40c7ef" + }, + "manifest.json": { + "bytes": 244, + "sha256": "dbd4eb828fa17de859963fd736d529d888aec64510b9d6523dd684d8852d3e61" + } + }, + { + "supervision": { + "timed_out": false, + "returncode": 0, + "job_after": { + "active": 0, + "total": 8, + "terminated": 0 + }, + "cleanup_errors": [] + }, + "editor.bin": { + "bytes": 2099, + "sha256": "698a05e6e3d717fac41e72e7af4a0eb85ba946faa35c030e5e54b7687cf97e2c" + }, + "shell.bin": { + "bytes": 64, + "sha256": "9c74f9134043ae20a6dccb278951365f8f65e4d13c2eef491737b5095da4538c" + }, + "pager.bin": { + "bytes": 508, + "sha256": "f51912329ea7e8f696057afc48703ceced3d2e8d582f891239ebfcc2b08b1dc0" + }, + "pager-lifecycle.json": { + "bytes": 287, + "sha256": "5f9cb64fee5d7f5edcf86005ab1c73c04f4dedd9a4e8975f61495235cf40c7ef" + }, + "manifest.json": { + "bytes": 244, + "sha256": "dbd4eb828fa17de859963fd736d529d888aec64510b9d6523dd684d8852d3e61" + } + } + ], + "regression_test": { + "original_binary": "failed RuntimeError real application capture failed in 10.561s", + "fixed_binary": "passed in 0.688s", + "native_gate_module": "2 tests passed in 0.784s", + "full_real_app_matrix_module": "9 tests passed in 11.994s", + "full_real_app_log_sha256": "f721167b7bfd5f971b11396fa7bda3d0e2694142682c835bd17a91b35b2f152b" + }, + "gui_original_two_runs": [ + { + "passed": true, + "outer_timeout": false, + "job_after": { + "active": 0, + "total": 9, + "terminated": 0 + }, + "desktop_gone": true, + "evidence_sha256": { + "candidate-output.bin": "c8b801ffa250aa2360d19cb671feb6540d6f652a47e3801f50f7ed1ae23c9f60", + "candidate-insert-log.txt": "3d07108bcc44f0831b31530265fac711c1d1e69194aa9309897e4440c26de65a", + "candidate-resize-log.txt": "2d3db728e657a0e1ab99b23acb6b2d08c586c4eaba6e65a66ab65e7fb47693b7", + "candidate-startup-log.txt": "3dfa3fb239f56c778a1e9b33eb31328349edd155a95806dac4378904e88527e5" + } + }, + { + "passed": false, + "outer_timeout": false, + "job_after": { + "active": 0, + "total": 7, + "terminated": 0 + }, + "desktop_gone": true, + "evidence_sha256": { + "candidate-output.bin": "fc43e5c356005f9c32847476d4bdba5fabaf51439083d8ac4e530d3e8bb5c883", + "candidate-insert-log.txt": "e6de4daeba1841783e7e22f81dbf87154f341c309dc5b54405e5fc2c2f3550a6", + "candidate-resize-log.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "candidate-startup-log.txt": "3dfa3fb239f56c778a1e9b33eb31328349edd155a95806dac4378904e88527e5" + } + } + ], + "limitations": [ + "GUI stage59 has a fresh genuine red and is not fixed by fixture-directory isolation", + "Historical frozen joint baseline is unchanged", + "Capture exit_code91 is forced cleanup after new-buffer assertion failed; it is not a natural Vim exit", + "No full current official CTest matrix, actual presentation or complete TUI acceptance is claimed" + ], + "full_real_app_matrix": { + "candidate": "alacritty_terminal", + "version": "0.26.1-dev+termforge.4", + "capture_sha256": "9d0d8d186f024993915465fc52d4f9e4cba34a014baee831a96d5611b0c7e10d", + "core_trace_sha256": "44265fcaf1d54103eff1731c5c49cd5cca39c635ff303f2a6659c6b4ac63048e", + "candidate_trace_sha256": "9fd9c962e9837f2e764d91973f192f8ad77110020656d44350a9329d521828b4", + "runs": 3, + "counts": { + "match": 3 + }, + "execution_passed": true, + "real_application_covered": true, + "semantic_acceptance": false, + "presented_done": null, + "summary_sha256": "cced694562a16395e0d25cbad4a70ea639aabc9df49188351cae782f05d20c47" + }, + "gui_after_native_fixture_fix": { + "runtime_source": "aa5fbe5f61d771b5ac7716ce4e77cb143baec3ef", + "binary_sha256": "ac7998c5c6b89f251e1fc83a773dcad31d63b55c10f69f04408dc1e4b2b97499", + "temporary_instrumentation_removed": true, + "same_runtime_as_gui_original_except_native_capture_fix": true, + "runs": [ + { + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 9, + "terminated": 0 + }, + "desktop_gone": true, + "raw_sha256": { + "candidate-output.bin": "7976fddf498096e0fa1ce90318ec6fb618d6d267ddbf1e89503bfd717471e832", + "candidate-insert-log.txt": "3d07108bcc44f0831b31530265fac711c1d1e69194aa9309897e4440c26de65a", + "candidate-resize-log.txt": "2d3db728e657a0e1ab99b23acb6b2d08c586c4eaba6e65a66ab65e7fb47693b7", + "candidate-startup-log.txt": "3dfa3fb239f56c778a1e9b33eb31328349edd155a95806dac4378904e88527e5" + } + }, + { + "status": "passed", + "timed_out": false, + "exit_code": 0, + "job_after": { + "active": 0, + "total": 9, + "terminated": 0 + }, + "desktop_gone": true, + "raw_sha256": { + "candidate-output.bin": "4b415c29f16225a8c9df5d1fec37a128dfd91f405bf42878fdbd2d08bdeaa027", + "candidate-insert-log.txt": "3d07108bcc44f0831b31530265fac711c1d1e69194aa9309897e4440c26de65a", + "candidate-resize-log.txt": "2d3db728e657a0e1ab99b23acb6b2d08c586c4eaba6e65a66ab65e7fb47693b7", + "candidate-startup-log.txt": "3dfa3fb239f56c778a1e9b33eb31328349edd155a95806dac4378904e88527e5" + } + } + ], + "interpretation": "two current passes do not explain or fix the original genuine stage59 failure" + }, + "bounded_gui_diagnostics": { + "accepted_as_fix": false, + "strace_wrapper": { + "runs": 2, + "failure": "different startup crash c0000005, GUI stage50, not original stage59", + "real_input_version_and_oracle_retained": true + }, + "temporary_WriteFile_observer": { + "runs": [ + { + "status": "passed", + "actual_write_order": [ + [ + "cursor-position-reply", + 89 + ], + [ + "resize-command", + 90 + ] + ], + "all_reported_writes_successful": true, + "write_trace_sha256": "edcc9fe614bff32d753da8ab212362cf1101a5648ffbfe1fb701199688517a31" + }, + { + "status": "passed", + "actual_write_order": [ + [ + "resize-command", + 89 + ], + [ + "cursor-position-reply", + 90 + ] + ], + "all_reported_writes_successful": true, + "write_trace_sha256": "7738ce6719efc0f08b82117118e8efce118702132aa40f939774b0e09fdca0ba" + }, + { + "status": "passed", + "actual_write_order": [ + [ + "resize-command", + 89 + ], + [ + "cursor-position-reply", + 90 + ] + ], + "all_reported_writes_successful": true, + "write_trace_sha256": "cad8e5598daf7dc1ad1110b56ef675d6c5d1e21033d2b7ed02146dcd7bf5e9c2" + } + ], + "binary_sha256": null, + "binary_identity_limitation": "probe executable not hashed before restoring original source; excluded from acceptance", + "local_patch_sha256": "1b6da35b9be9ff84babecb60e36c46588306eac6df10ac2fe54ccb3dc2d87bb8", + "falsified_hypothesis": "Ctrl-O preceding CPR necessarily causes stage59 failure", + "remaining_unknown": "Where between console host input processing and Vim resize/key processing Ctrl-O ceased to act in the original failure" + }, + "cleanup": "temporary source edits removed; final working tree rebuilt without observers" + } +} diff --git a/experiments/shell/results/2026-10-26-postmerge-ci/validation.json b/experiments/shell/results/2026-10-26-postmerge-ci/validation.json new file mode 100644 index 00000000..f4208db6 --- /dev/null +++ b/experiments/shell/results/2026-10-26-postmerge-ci/validation.json @@ -0,0 +1,216 @@ +{ + "schema": "postmerge-real-failures-audit-v1", + "scope": "Artifact/source audit and issue tracking only; no UI/CI reruns or source changes", + "downloads": [ + { + "label": "main-098f9ab", + "artifact_id": 12645808266, + "zip_sha256": "aba0043a887d91b759c04ce1e7fc88011f33184f9493efcc0404a4727fbb387f", + "download_count": 1, + "archive_bytes": 4737426, + "extracted_files": 10, + "selected_expanded_bytes": 311810, + "extraction_policy": "target failure plus small logs and identities", + "initial_full_extraction_rejected_above_128MiB": true + }, + { + "label": "backend-af563ba", + "artifact_id": 12646521226, + "zip_sha256": "b1a22a58edd44278bd16aa0b5bb76d2908f81dded0a11900c6db8109a5c9f2cc", + "download_count": 1, + "archive_bytes": 4709004, + "extracted_files": 9, + "selected_expanded_bytes": 318382, + "extraction_policy": "target failure plus small logs and identities", + "initial_full_extraction_rejected_above_128MiB": true + } + ], + "failures": [ + { + "issue": 72, + "run": 40313671258, + "windows_job": 121540798389, + "source_commit": "098f9ab9ecd3994da2ecc30c8880ce6494371e56", + "checkout_equals_source": true, + "configuration": "default self-written C++ core and system ConPTY; branch name is not backend selection", + "configure": "cmake -S . -B build -DCMAKE_BUILD_TYPE=Release", + "source_git_blobs": { + "experiments/shell/test_shell.py": "09782b1cae5afc938a67a6fbb783e6a103f0333f", + "experiments/shell/run.py": "271d8ac7b937027dd668dee0b3c3c66fc572aec5", + "experiments/shell/workspace_persistence_scenario.hpp": "f7f73dbd771f559384d9b4e569d815d2ef0792da", + "experiments/shell/transport_completion.hpp": "cc56ce3abfe642aae66f5b3c21863a8c3901f75a" + }, + "host": { + "os": "Windows Server 2025 Datacenter 10.0.26100", + "runner": "2.338.0", + "image": "windows-2025-vs2026", + "image_version": "20261021.278.1" + }, + "mode": "ui-workspace-save", + "collector_status": "failed", + "process_exit": 2, + "outer_timed_out": false, + "native_deadline_seconds": 30, + "outer_deadline_seconds": 40, + "job_after": { + "active": 0, + "total": 11, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 11, + "terminated": 0 + }, + "desktop_gone": true, + "native_child_exit": null, + "reader_eof": null, + "native_forced_cleanup": null, + "private_files_sha256": { + "persistence-failure.json": "71b9a860f70cbee2e8b52501bb0877ee8e218c8962f580321df40e215f4d6f4a", + "sample.json": "4dfbf947d338ed9b88aab150d3481403f37d16b55e49958ab248f5dfb620106c", + "workspace.layout": "e6aabc95590fcd35f1075f4ea1dc7bceea9a68161cdbf65be28005543a2f4482" + }, + "related_same_job_identities": [ + { + "record_sha256": "4a865639f4f322970ebf2972523764d181970e5388ab446084f02ac69d2715e0", + "binaries": { + "termforge_shell.exe": "385df22fcc17c8af4dffe2cfcb9063e2b49026644f5c01d7e58a5058818a6cf9", + "shell_test_launcher.exe": "67e70a9b5762310f0d6243c06d2dbfda43acc964b9ef8d96b53943285ed269a2", + "shell_text_client.exe": "6c129afdc0edea9e0f4baab45cf3e8c20bf3103b7f34325ff529e6648938e26a", + "shell_clipboard_reader.exe": "a00a994e9833dd0bc07032db1283248bacdc2cc949961bb72bdc63b9776a6f87" + } + }, + { + "record_sha256": "e09c8545b2f329c4284efb19b5540833daad22fcf4ccf6f832d8ff1839619aff", + "binaries": { + "termforge_shell": "385df22fcc17c8af4dffe2cfcb9063e2b49026644f5c01d7e58a5058818a6cf9", + "shell_test_launcher": "67e70a9b5762310f0d6243c06d2dbfda43acc964b9ef8d96b53943285ed269a2", + "shell_text_client": "6c129afdc0edea9e0f4baab45cf3e8c20bf3103b7f34325ff529e6648938e26a", + "shell_input_client": "1ac0962e126d6aff3ec1f97de654ed420be9cbd6a942481de413c96c23990d36" + } + }, + { + "record_sha256": "e4c0d6dff349f36b5f6ca1444da1f405ea95da3bcd43a8e01010cc1ab9cc5093", + "binaries": { + "termforge_shell": "385df22fcc17c8af4dffe2cfcb9063e2b49026644f5c01d7e58a5058818a6cf9", + "shell_test_launcher": "67e70a9b5762310f0d6243c06d2dbfda43acc964b9ef8d96b53943285ed269a2", + "shell_text_client": "6c129afdc0edea9e0f4baab45cf3e8c20bf3103b7f34325ff529e6648938e26a", + "shell_input_client": "1ac0962e126d6aff3ec1f97de654ed420be9cbd6a942481de413c96c23990d36" + } + } + ], + "binary_identity_limitation": "No per-run binary SHA; related same-job manifests are not source-to-binary proof", + "presented_done": null, + "stage": 2, + "repeat": 1, + "all_sessions_ready": true, + "powershell_prefix_bare_cr": true, + "powershell_bs_count": 0, + "hypothesis": "Pre-output bare CR is rejected by completion oracle; same-byte executable causal replay still required", + "distinct_from": [ + 61, + 63, + 66, + 40, + 44, + 57 + ] + }, + { + "issue": 73, + "run": 40313695853, + "windows_job": 121540875868, + "source_commit": "af563ba15aa5abf90a09ca55eb9c177ac873ecf0", + "checkout_equals_source": true, + "configuration": "default self-written C++ core and system ConPTY; branch name is not backend selection", + "configure": "cmake -S . -B build -DCMAKE_BUILD_TYPE=Release", + "source_git_blobs": { + "experiments/shell/test_shell.py": "09782b1cae5afc938a67a6fbb783e6a103f0333f", + "experiments/shell/run.py": "bbd4dfc05012c55956973d7e2c69be717b48b1a9", + "experiments/shell/workspace_selection_scenario.hpp": "20862a8813150ece38bbc50f489fce7a44f2dc93", + "experiments/shell/transport_completion.hpp": "cc56ce3abfe642aae66f5b3c21863a8c3901f75a" + }, + "host": { + "os": "Windows Server 2025 Datacenter 10.0.26100", + "runner": "2.338.0", + "image": "windows-2025-vs2026", + "image_version": "20261021.278.1" + }, + "mode": "ui-selection", + "collector_status": "failed", + "process_exit": 2, + "outer_timed_out": false, + "native_deadline_seconds": 30, + "outer_deadline_seconds": 40, + "job_after": { + "active": 0, + "total": 9, + "terminated": 0 + }, + "job_after_cleanup": { + "active": 0, + "total": 9, + "terminated": 0 + }, + "desktop_gone": true, + "native_child_exit": null, + "reader_eof": null, + "native_forced_cleanup": null, + "private_files_sha256": { + "sample.json": "22c07bbec736190cda64367e0d67bf8c51349a224e8e202d1e09cef335ecbd24", + "workspace.layout": "a9309ae6634436b4d6defc730ceba468333d8f7052384f7b53e0d6b0e0b13052" + }, + "related_same_job_identities": [ + { + "record_sha256": "54db535f1cf9783556f92a0c4dcb15507241fa1bf236212e63628effe5679356", + "binaries": { + "termforge_shell.exe": "c167582dc096767eeae73de34b4d4e80924e397fbf59e4f47b7698f67c97d5c8", + "shell_test_launcher.exe": "a7a5fb66deb1c9e56131a095253e3c7fc949243f7fc1179cc94d6abf817ba634", + "shell_text_client.exe": "60d9403ea3b809ed6177e16fda308d22fb0225ac43e6ed65ae742b5f883abad1", + "shell_clipboard_reader.exe": "59bc64ca98444ff9fc077a6326da9983ea6cb8cfc67abc56fee7bd7a01b58f5c" + } + }, + { + "record_sha256": "496aa0bf0add4cd1ab5df0c6ccaab1a166099cabded833331c6a3a33384dfebe", + "binaries": { + "termforge_shell": "c167582dc096767eeae73de34b4d4e80924e397fbf59e4f47b7698f67c97d5c8", + "shell_test_launcher": "a7a5fb66deb1c9e56131a095253e3c7fc949243f7fc1179cc94d6abf817ba634", + "shell_text_client": "60d9403ea3b809ed6177e16fda308d22fb0225ac43e6ed65ae742b5f883abad1", + "shell_input_client": "f320e5ea7215646b97423b3aec1a7b53f7d71d087133cad719918e97e47895fe" + } + }, + { + "record_sha256": "04644a7cce23e5bbe25d5d840e21255423e07209d7548cae5f39a9e1ed243662", + "binaries": { + "termforge_shell": "c167582dc096767eeae73de34b4d4e80924e397fbf59e4f47b7698f67c97d5c8", + "shell_test_launcher": "a7a5fb66deb1c9e56131a095253e3c7fc949243f7fc1179cc94d6abf817ba634", + "shell_text_client": "60d9403ea3b809ed6177e16fda308d22fb0225ac43e6ed65ae742b5f883abad1", + "shell_input_client": "f320e5ea7215646b97423b3aec1a7b53f7d71d087133cad719918e97e47895fe" + } + } + ], + "binary_identity_limitation": "No per-run binary SHA; related same-job manifests are not source-to-binary proof", + "presented_done": null, + "stage": null, + "client_height": 681, + "first_record_retained": false, + "first_progress_or_final_files_present": false, + "hypothesis": "A pre-first-record stage0/1/2 readiness/settled/marker gate failed to advance; exact stage unknown", + "distinct_from": [ + 66, + 61, + 63, + 40, + 44, + 57 + ] + } + ], + "closed_issues_not_reopened": [ + 61, + 66 + ], + "original_failed_runs_preserved": true, + "green_pr_runs_do_not_replace_failed_push": true +} diff --git a/experiments/shell/results/2026-10-26-sender-fence/validation.json b/experiments/shell/results/2026-10-26-sender-fence/validation.json new file mode 100644 index 00000000..f8349890 --- /dev/null +++ b/experiments/shell/results/2026-10-26-sender-fence/validation.json @@ -0,0 +1,811 @@ +{ + "schema": "termforge-sender-fence-validation-v1", + "date": "2026-10-26", + "issues": [ + 62, + 53 + ], + "source_commit": "519a3f37d52983062cd99b7efd805f183961fa4d", + "source_tree_git_sha1": "add42d40b4e1a5bf62bb0fc51fc4396849619d88", + "source_files": { + "CMakeLists.txt": { + "git_blob_sha1": "bed67f32a924786aa497927328194a81acaf4641", + "git_blob_sha256": "e95d1cefe78af2b86c7e8d5619f42cb9f974fcb3783daa6a09d8ad824c5d4027", + "checkout_sha256": "e95d1cefe78af2b86c7e8d5619f42cb9f974fcb3783daa6a09d8ad824c5d4027", + "checkout_relation": "identical" + }, + "cmake/ConptyBackend.cmake": { + "git_blob_sha1": "6b0b9910fb36a31e486f9fbe2b33e906b68b43f0", + "git_blob_sha256": "6a9f9fb69f90a1db7ad5eb970e61d0913ce4ff75a121f267a369468344fffcde", + "checkout_sha256": "6a9f9fb69f90a1db7ad5eb970e61d0913ce4ff75a121f267a369468344fffcde", + "checkout_relation": "identical" + }, + "experiments/shell/queues.hpp": { + "git_blob_sha1": "0cc8379a1f52d061228b3d8c442295974e2c7c2d", + "git_blob_sha256": "eadbfe8b6034cc436327bfc2fc49cf2c4463a52af67a809eb586f42cf1baa389", + "checkout_sha256": "eadbfe8b6034cc436327bfc2fc49cf2c4463a52af67a809eb586f42cf1baa389", + "checkout_relation": "identical" + }, + "experiments/shell/sender_fence.hpp": { + "git_blob_sha1": "f17603ba662551664ee38e0dc0004f89913c3a77", + "git_blob_sha256": "04579e11de96237fafea2da48fd2895a4c97f0d407bc7bebf79848540dd1867c", + "checkout_sha256": "04579e11de96237fafea2da48fd2895a4c97f0d407bc7bebf79848540dd1867c", + "checkout_relation": "identical" + }, + "experiments/shell/sender_fence_test.cpp": { + "git_blob_sha1": "770a6e28809e03be7099eac09870b4763016b4cb", + "git_blob_sha256": "de84629f788768064969eea76baffff980f02090e68c33d36e2523b4e32d094a", + "checkout_sha256": "de84629f788768064969eea76baffff980f02090e68c33d36e2523b4e32d094a", + "checkout_relation": "identical" + }, + "experiments/shell/queue_probe.cpp": { + "git_blob_sha1": "62a3bc0c18285aa092dce9368133ad1e9148d5c0", + "git_blob_sha256": "d635b457f79ae0a1add9b630fc11c5ba5d5993070291fcac939252ea5863c4de", + "checkout_sha256": "d635b457f79ae0a1add9b630fc11c5ba5d5993070291fcac939252ea5863c4de", + "checkout_relation": "identical" + }, + "experiments/shell/paste.hpp": { + "git_blob_sha1": "cc72b93d1e4e3fe4537fe950afd51581bdc1373b", + "git_blob_sha256": "f905a693d840256ca7c6a8ffed2601bff41f74e549413f38822db7aceb1c7c82", + "checkout_sha256": "f905a693d840256ca7c6a8ffed2601bff41f74e549413f38822db7aceb1c7c82", + "checkout_relation": "identical" + }, + "experiments/shell/paste_test.cpp": { + "git_blob_sha1": "e3cd94fcf9f97a511144a899a34a5e7ff8889035", + "git_blob_sha256": "f4e056681ffd175928060191bc20cbfdc889c8d6ffa76843eda2365243dff8c4", + "checkout_sha256": "f4e056681ffd175928060191bc20cbfdc889c8d6ffa76843eda2365243dff8c4", + "checkout_relation": "identical" + }, + "experiments/shell/resize.hpp": { + "git_blob_sha1": "20843d154fffdd982e1a9221984245eb0d4cc654", + "git_blob_sha256": "37d22ba31fc3fee8004a3dd555f53fa55cb398057b6576f5a2d9b5403e2f5cd0", + "checkout_sha256": "37d22ba31fc3fee8004a3dd555f53fa55cb398057b6576f5a2d9b5403e2f5cd0", + "checkout_relation": "identical" + }, + "experiments/conpty/session.hpp": { + "git_blob_sha1": "d44f36661594a5b76b62d1ecb95cf166db22e90a", + "git_blob_sha256": "6945e6ffba1d61e66266f867d3cd124eb63c39da37e27662a5eaf544f60ed96b", + "checkout_sha256": "6945e6ffba1d61e66266f867d3cd124eb63c39da37e27662a5eaf544f60ed96b", + "checkout_relation": "identical" + }, + "experiments/conpty/backend.hpp": { + "git_blob_sha1": "3195dceaefa166b1251839108d29c5fd034aa2fb", + "git_blob_sha256": "5ee3ab95dc4b9aefce23ff7900cda2ecdd9cd09d1b1044074de2f5e572c31489", + "checkout_sha256": "5ee3ab95dc4b9aefce23ff7900cda2ecdd9cd09d1b1044074de2f5e572c31489", + "checkout_relation": "identical" + }, + "experiments/shell/test_shell.py": { + "git_blob_sha1": "e4d01513cf8d1169511c688b9819097c176b7360", + "git_blob_sha256": "ed785bc51b85b1bb47217d0430a8c8e80984140709507515a1132d051e603954", + "checkout_sha256": "ed785bc51b85b1bb47217d0430a8c8e80984140709507515a1132d051e603954", + "checkout_relation": "identical" + }, + "experiments/build_paths.py": { + "git_blob_sha1": "3a2b2503bcee700b3adea8e832a4a619b0e1c29a", + "git_blob_sha256": "1236b17dceacda610ec3d6eb1518742c0165af633c05a317f1d64f361791d7d9", + "checkout_sha256": "1236b17dceacda610ec3d6eb1518742c0165af633c05a317f1d64f361791d7d9", + "checkout_relation": "identical" + }, + "third_party/conpty/manifest.json": { + "git_blob_sha1": "a3f7fb23a92762d8decb196a07893628ac759c63", + "git_blob_sha256": "e75e522a3355c0a66c6d60cafa02413a83d8757262747f650b77c959c09ed439", + "checkout_sha256": "e75e522a3355c0a66c6d60cafa02413a83d8757262747f650b77c959c09ed439", + "checkout_relation": "identical" + }, + "third_party/conpty/LICENSE": { + "git_blob_sha1": "8cb179cdb69492ba3b8285e61a67fc1fbfe82cb2", + "git_blob_sha256": "ad0cf28f3381ca9bb0bf101d127402d44c17bfa0991e1a00bff7ae6679e9dada", + "checkout_sha256": "ad0cf28f3381ca9bb0bf101d127402d44c17bfa0991e1a00bff7ae6679e9dada", + "checkout_relation": "identical" + } + }, + "scope": "Windows actual InputQueue/PasteTransfer/ConPTY worker coordination and corrected fixture, not VT/UI/OS-backpressure acceptance", + "configurations": { + "official-console-width": { + "raw_build_directory_label": "candidate", + "configuration": "Release", + "architecture": "x64", + "probe_binaries_sha256": { + "shell_queue_probe.exe": "d12a1c20f9398c48047f0173294772f1d4c0364f17590990a45906fb53849377", + "sender_fence_test.exe": "74235824777afc99616147c24c9860aa737ca3c99f6e86df5c7e8a74e305edfc", + "paste_test.exe": "5138c2a5371f27735cd18002790cb36abebfe34ba948e235ca5bb0f383063806" + }, + "probe_links_candidate_vt_core": false, + "configured_creation_flags": 24, + "flags_evidence": "fixed backend.hpp/configured(), package manifest and per-target build definition; JSON worker records do not independently print backend flags", + "runtime_flags_field_in_worker_json": null, + "official_pair_sha256": { + "conpty.dll": "feeef341d891643c62d30b6b07800bc70f0bc148f44cb8c3bee84aa557ae805a", + "OpenConsole.exe": "3d66b23d0a71bb8eed2b77edc8b9df9bf54ce6c8fb74c863a30e760997f80586" + }, + "cmake_cache_sha256": "339b01918f5cc2864cca3ca6342d83d7add9e781fcdcd923a42ebaa7db77b16e", + "probe_project_sha256": "65ac79d7794f612f60828d2883a0bd83d3558b036fa7a7dd60d064e50729fd6c", + "candidate_adapter_build_option": "ON", + "candidate_adapter_option_is_not_probe_vt_coverage": true + }, + "system": { + "raw_build_directory_label": "candidate-system", + "configuration": "Release", + "architecture": "x64", + "probe_binaries_sha256": { + "shell_queue_probe.exe": "9df846bd32afdc5df45fdf6422cb998dd496f85f027f5d4dc76d3925a115c73c", + "sender_fence_test.exe": "e57b18ac11e83b36141436be02907d76276cf5431de22a2637d475c8612288ef", + "paste_test.exe": "56e40c363f2287b9a9e5b3b530037c5a5428e37a2b165e7857f74cb5f85dd910" + }, + "probe_links_candidate_vt_core": false, + "configured_creation_flags": 0, + "flags_evidence": "fixed backend.hpp/configured(), package manifest and per-target build definition; JSON worker records do not independently print backend flags", + "runtime_flags_field_in_worker_json": null, + "official_pair_sha256": null, + "cmake_cache_sha256": "9691f5adb31684c5fe1433e9187b58dacf4956f9baffcac61932078aa60ed354", + "probe_project_sha256": "a9d786a5f72e3b084f20eccabb98ea4875873320e5afe5dc9257097f6adfc43f", + "candidate_adapter_build_option": "ON", + "candidate_adapter_option_is_not_probe_vt_coverage": true + } + }, + "official_package": { + "schema": "termforge-conpty-package-v1", + "name": "Microsoft.Windows.Console.ConPTY", + "version": "1.25.260930003", + "architecture": "win-x64", + "license": "MIT", + "source_commit": "dc8ae365847d41f62d1ebca93815bb00959bc12f", + "source_tag": "v1.25.2733.0", + "license_source_url": "https://raw.githubusercontent.com/microsoft/terminal/dc8ae365847d41f62d1ebca93815bb00959bc12f/LICENSE", + "license_source_sha256": "5d177f23ecfeb0ea8e050b6a5a16355e1ae9a0b286436ca8f83ed08b3795be6b", + "bundled_license_sha256": "ad0cf28f3381ca9bb0bf101d127402d44c17bfa0991e1a00bff7ae6679e9dada", + "license_normalization": "CRLF to LF only; complete text verified equal", + "package_url": "https://github.com/microsoft/terminal/releases/download/v1.25.2733.0/Microsoft.Windows.Console.ConPTY.1.25.260930003.nupkg", + "package_bytes": 1750533, + "package_sha256": "6d6f8b008c655d814c498d8205d4012dcd4d0b6dfc1096461d0a185d1e3caf03", + "files": { + "conpty.dll": "feeef341d891643c62d30b6b07800bc70f0bc148f44cb8c3bee84aa557ae805a", + "OpenConsole.exe": "3d66b23d0a71bb8eed2b77edc8b9df9bf54ce6c8fb74c863a30e760997f80586" + }, + "package_members": { + "conpty.dll": "runtimes/win-x64/native/conpty.dll", + "OpenConsole.exe": "build/native/runtimes/x64/OpenConsole.exe" + }, + "experimental": true, + "configured_creation_flags": 24, + "configured_glyph_width": "PSEUDOCONSOLE_GLYPH_WIDTH_CONSOLE", + "default_backend": false, + "supported_client_platforms_verified": false + }, + "workload": { + "request_bytes": 4194304, + "request_content": "ASCII a repeated 4194304 times", + "request_sha256": "299285fc41a44cdb038b9fdaf494c76ca9d0c866672b2b266c1a0c17dda60a05", + "write_chunk_limit_bytes": 1024, + "unchanged_minimum_sent_bytes": 16384, + "verified_child_prefix_bytes": 16384, + "verified_child_prefix_sha256": "f3336bea752b5a28743033dd2c844a4a63fba08871aaee2586a2bf2d69be83a2", + "held_claimed_chunk_ordinal_one_based": 17, + "output_read_chunk_limit_bytes": 65536, + "output_queue_capacity_bytes": 262144, + "input_queue_capacity_bytes": 16384 + }, + "fixture_ordering": { + "original": "child never reads; output reader gate held before input transfer", + "corrected": "child really reads and checks exactly 16KiB ASCII then stops reading; actual writer holds the next claimed chunk after 16KiB sent; child prefix event is observed; original flood and reader output gate start; real stop/cancel/race follows", + "ordering_changed": true, + "original_os_backpressure_fixed_claim": false, + "fence_is_not_os_write_block": true, + "actual_transfer_or_ack_replaced": false, + "default_product_fence_enabled": false, + "queue_probe_default_uses_explicit_fence": true + }, + "deadlines_seconds": { + "absolute_input_observation": 3, + "child_ready_wait": 3, + "child_flood_phase_wait": 3, + "resize_gate_wait": 3, + "resize_settle_wait": 3, + "child_size_query_wait": 3, + "natural_exit_wait": 3, + "outer_probe_process": 10, + "pure_missing_go_fence": 1, + "pure_missing_go_future_check": 2, + "sender_fence_ctest": 10 + }, + "runs": [ + { + "configuration": "official-console-width", + "raw_configuration_label": "candidate", + "raw_mode_label": "ungated", + "process_exit": 2, + "outer_timeout_seconds": 10, + "observed_elapsed_seconds": 3.1399999998975545, + "probe_exe_sha256": "d12a1c20f9398c48047f0173294772f1d4c0364f17590990a45906fb53849377", + "stdout_sha256": "6c7b8d3e6e5c826e51f177bd11aaf91f636a86d3616470f9ec61ef0a546c642f", + "stderr_sha256": "10a9ae7cd1bcd8d7bfd7a78282b2afc62e8977127eda8f11c76b191b9afe2007", + "actual_json_records": [ + { + "case": "bounded", + "output_high_water": 262144, + "input_high_water": 16384, + "rejected": 2 + }, + { + "case": "lifecycle-edges", + "stopped_uncompleted_generation": 3, + "input_error_preserved": true, + "resize_error_preserved": true + } + ], + "scenario": "original never-read/output-first ordering", + "verdict": "original observation rejected at unchanged floor", + "actual_stderr_json_records": [ + { + "case": "writer-observation-rejected", + "total": 4194304, + "accepted": 6144, + "sent": 5120, + "paste_in_flight": 1024, + "queue_in_flight": 1024, + "state": 1, + "reader_entered": 1, + "reader_released": 0 + } + ], + "error": "real input writer holds a chunk", + "job_active_after": null, + "job_cleanup_reported_in_this_raw_record": false + }, + { + "configuration": "official-console-width", + "raw_configuration_label": "candidate", + "raw_mode_label": "held-stop-0", + "process_exit": 0, + "outer_timeout_seconds": 10, + "observed_elapsed_seconds": 2.4060000001918525, + "probe_exe_sha256": "d12a1c20f9398c48047f0173294772f1d4c0364f17590990a45906fb53849377", + "stdout_sha256": "7695b76d6631cd239a878a348e5c369e220fdc9a4a95e36f2386550c6f441687", + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "actual_json_records": [ + { + "case": "bounded", + "output_high_water": 262144, + "input_high_water": 16384, + "rejected": 2 + }, + { + "case": "lifecycle-edges", + "stopped_uncompleted_generation": 3, + "input_error_preserved": true, + "resize_error_preserved": true + }, + { + "case": "real-workers", + "action": "stop", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 17408, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 4, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel-stop-race", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + } + ], + "scenario": "verified prefix then pre-send held block, flood/output gate, real action", + "verdict": "passed", + "audited_worker_records": 3 + }, + { + "configuration": "official-console-width", + "raw_configuration_label": "candidate", + "raw_mode_label": "held-stop-1", + "process_exit": 0, + "outer_timeout_seconds": 10, + "observed_elapsed_seconds": 2.4840000001713634, + "probe_exe_sha256": "d12a1c20f9398c48047f0173294772f1d4c0364f17590990a45906fb53849377", + "stdout_sha256": "7695b76d6631cd239a878a348e5c369e220fdc9a4a95e36f2386550c6f441687", + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "actual_json_records": [ + { + "case": "bounded", + "output_high_water": 262144, + "input_high_water": 16384, + "rejected": 2 + }, + { + "case": "lifecycle-edges", + "stopped_uncompleted_generation": 3, + "input_error_preserved": true, + "resize_error_preserved": true + }, + { + "case": "real-workers", + "action": "stop", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 17408, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 4, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel-stop-race", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + } + ], + "scenario": "verified prefix then pre-send held block, flood/output gate, real action", + "verdict": "passed", + "audited_worker_records": 3 + }, + { + "configuration": "system", + "raw_configuration_label": "candidate-system", + "raw_mode_label": "held-stop-0", + "process_exit": 0, + "outer_timeout_seconds": 10, + "observed_elapsed_seconds": 0.9840000001713634, + "probe_exe_sha256": "9df846bd32afdc5df45fdf6422cb998dd496f85f027f5d4dc76d3925a115c73c", + "stdout_sha256": "7695b76d6631cd239a878a348e5c369e220fdc9a4a95e36f2386550c6f441687", + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "actual_json_records": [ + { + "case": "bounded", + "output_high_water": 262144, + "input_high_water": 16384, + "rejected": 2 + }, + { + "case": "lifecycle-edges", + "stopped_uncompleted_generation": 3, + "input_error_preserved": true, + "resize_error_preserved": true + }, + { + "case": "real-workers", + "action": "stop", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 17408, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 4, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel-stop-race", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + } + ], + "scenario": "verified prefix then pre-send held block, flood/output gate, real action", + "verdict": "passed", + "audited_worker_records": 3 + }, + { + "configuration": "system", + "raw_configuration_label": "candidate-system", + "raw_mode_label": "held-stop-1", + "process_exit": 0, + "outer_timeout_seconds": 10, + "observed_elapsed_seconds": 1.031999999890104, + "probe_exe_sha256": "9df846bd32afdc5df45fdf6422cb998dd496f85f027f5d4dc76d3925a115c73c", + "stdout_sha256": "7695b76d6631cd239a878a348e5c369e220fdc9a4a95e36f2386550c6f441687", + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "actual_json_records": [ + { + "case": "bounded", + "output_high_water": 262144, + "input_high_water": 16384, + "rejected": 2 + }, + { + "case": "lifecycle-edges", + "stopped_uncompleted_generation": 3, + "input_error_preserved": true, + "resize_error_preserved": true + }, + { + "case": "real-workers", + "action": "stop", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 17408, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 4, + "job_active_after": 0 + }, + { + "case": "real-workers", + "action": "cancel-stop-race", + "input_queued": 0, + "input_in_flight": 1024, + "input_joined": true, + "working_generation": 1, + "pending_generation": 3, + "completed_generation": 3, + "child_columns": 102, + "child_rows": 42, + "input_submitted_before_stop": 16384, + "input_accepted_before_stop": 17408, + "paste_in_flight_before_stop": 1024, + "total": 4194304, + "child_prefix_read": 16384, + "sender_fence_held": true, + "sent_after": 16384, + "accepted_after": 17408, + "in_flight_after": 0, + "retained_capacity_after": 15, + "state_after": 5, + "job_active_after": 0 + } + ], + "scenario": "verified prefix then pre-send held block, flood/output gate, real action", + "verdict": "passed", + "audited_worker_records": 3 + } + ], + "counts": { + "audited_raw_positive_probe_processes": 4, + "positive_probe_processes_per_configuration": 2, + "real_worker_records_per_positive_process": 3, + "audited_raw_positive_worker_records": 12, + "raw_official_original_order_negative_probe_processes": 1, + "focused_original_python_test_processes": 2, + "focused_python_passes_per_configuration": 1, + "focused_ctest_cases_per_configuration": 2, + "focused_ctest_passes_per_configuration": 2, + "focus_reexecutions_not_merged_into_raw_worker_matrix": true + }, + "raw_mode_label_note": "held-stop-0/held-stop-1 are launcher labels; each positive process actually executes stop, cancel and cancel-stop-race. working/pending/completed_generation fields are resize worker generations, not sender-fence ticket generations.", + "state_enum_from_fixed_source": { + "sending": 1, + "cancelled": 4, + "failed": 5 + }, + "historical_evidence": { + "original_focus_red": { + "declared_source_commit": "af563ba15aa5abf90a09ca55eb9c177ac873ecf0", + "artifact": "original-af563-official.log", + "tests": 1, + "failures": 1, + "probe_exit": 2, + "elapsed_seconds": 3.156, + "error": "real input writer holds a chunk", + "old_probe_exe_sha256": null, + "binary_identity_gap_preserved": true + }, + "diagnostic_red": { + "artifact": "diagnostic-ungated.json", + "exe_sha256": "2ac023b60cab1f9576deb023524dfc35d7a5382c742a0afdb1460557f4f314d3", + "source_commit": null, + "source_blob_binding_recorded": false, + "verdict": "diagnostic only; same low-sent state independently reproduced by the frozen final-source ungated mode" + }, + "preparation_error": { + "artifact": "12bce48-unittest-official.log", + "tests_run": 0, + "category": "missing build prerequisite termforge_shell during Python setUpClass", + "product_failure": false + }, + "excluded_wip_green_artifacts": [ + "fenced-official-first.json", + "fenced-official-second.json" + ], + "excluded_wip_reason": "No fixed tested source/blob manifest; retained hashes only and not counted as final validation." + }, + "pure_protocol_coverage": { + "named_ctest": "sender_fence", + "cases": [ + "transfer/generation identity", + "single admission", + "release before held rejected", + "wrong generation release rejected", + "duplicate release rejected", + "unchanged sent floor", + "cancel before wait and during wait", + "stop abort wakes waiter", + "control EOF simulated by abort(control_eof)", + "missing GO absolute deadline", + "accepted==total rejected" + ], + "transport_submission_claim": false, + "control_eof_test_is_actual_ipc_eof": false, + "synthetic_acknowledgements_used_only_for_unit_state_preparation": true + }, + "raw_artifacts": { + "519a3f3-actual.json": { + "bytes": 10117, + "sha256": "b2a97b94d2b7f23abb1fdb9ee68dfd7790c3c2c7922e9938cb5d38c10d31c692" + }, + "519a3f3-ctest-official.log": { + "bytes": 431, + "sha256": "68b9733ddd7de3dce29a28d5f84c43740b6d116b2b89bd52be2edc74dce962db" + }, + "519a3f3-ctest-system.log": { + "bytes": 445, + "sha256": "ff6f170436ad8b1af865dadd90232a20e79edfa1106697b08957268be6ca6707" + }, + "519a3f3-unittest-official.log": { + "bytes": 264, + "sha256": "5830aaf8d029050b7a70038e11edbaad47ed6822244f11ebd7b021701d904f3b" + }, + "519a3f3-unittest-system.log": { + "bytes": 264, + "sha256": "ddc73cb2e99d0a726194666dd0404b50589cd3f1b2041fd85ff988e4b3ce6ea2" + }, + "original-af563-official.log": { + "bytes": 901, + "sha256": "6bec80326dc29f217d2cd675587e4b9eedfb66b3fe290e1d1029f6237775895e" + }, + "diagnostic-ungated.json": { + "bytes": 641, + "sha256": "857b52ebb4fe6941bc05087066b5cf95c579ea0dcf181895b1ebd1856a733386" + }, + "12bce48-unittest-official.log": { + "bytes": 1009, + "sha256": "7fe1fd6a52955471838beb59a40b6b2b40d312aa508a26ab1c377e23cfe4944d" + }, + "fenced-official-first.json": { + "bytes": 446, + "sha256": "fd6c97429175e8fa1702b2a86c8a3e187945329f8b0de0b2d9663ebeb595dbb1" + }, + "fenced-official-second.json": { + "bytes": 905, + "sha256": "15004e8ec93a44edbcd86db9723f772dbd41323b2618ef5c091436052a27e21a" + }, + "final-focused-build.log": { + "bytes": 1002, + "sha256": "a0a67f9e7d8801adb5792d2657100cb56633e431532903f6609f139a79d4e727" + }, + "focused-system-build.log": { + "bytes": 945, + "sha256": "831b74495e8d074d1235df6c0bd14c74b2af6ac4775492ff8ddbfc4968d77371" + }, + "integrated-official-build.log": { + "bytes": 5688, + "sha256": "eb2dfd3ff41e0c46eb630d95cee43eea857ec4a174e049f8525a88fdac45cd53" + }, + "integrated-system-build.log": { + "bytes": 1128, + "sha256": "2a02506ab66b1c40f67be7d1d92ccbbad3a414eb1b38d0267bc93878aed4829c" + }, + "race-official-build.log": { + "bytes": 224, + "sha256": "4fca76e212d24f44c36174d9ad29ef8113d897a92f452b81f57bf1b4c00b2d9c" + }, + "race-system-build.log": { + "bytes": 895, + "sha256": "607ed7488a999b0b06e664b7543c9b16804dbb7543c3ddd37a940ed66b5ff3d7" + } + }, + "environment": { + "proof_host_platform_observed": "Windows-11-10.0.26200-SP0", + "per_run_cpu_power_or_idle_identity": null, + "known_shared_host": true, + "performance_claim": false, + "observed_elapsed_is_not_performance_sample": true + }, + "limitations": [ + "Queue probe does not link candidate VT core; candidate build directory labels do not constitute candidate terminal validation.", + "Fixture ordering is deliberately corrected; original never-read/output-first rejection remains reproducible with the same final EXE.", + "Original ungated rejection does not report post-cleanup Job count; null is retained rather than inferred from later successful runs.", + "Each positive worker JSON reports own Session Job zero; outer supervisor Job/desktop creation or recovery is not established by these direct subprocess runs.", + "No new UI cancel/close, 3000000-byte Han request, 768-byte checkpoint, system clipboard, eight-session workflow or full official regression matrix acceptance.", + "Pure control EOF is simulated through the in-process abort API; no actual IPC EOF regression is claimed.", + "The inspected sample set observes stop winning all cancel-stop races; assertions permit either bounded valid interleaving, but these runs do not prove both schedules occurred.", + "Ticket and flags behavior is supported by fixed source/build definitions and scoped protocol tests; worker JSON does not independently log sender ticket identity or flags.", + "No performance timing, long-run resource, portability, kernel buffer size or WindTerm equivalence conclusion." + ], + "privacy": "Published run objects are parsed synthetic JSON fields only; raw test paths, desktop names, process identities, unfiltered stdout/stderr and environment variables remain local.", + "r53_ui_accepted": false, + "r2_accepted": false +}