Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
56acc84
research: prepare owned Node contract deadline diagnostics (#144)
JavaZeroo Oct 28, 2026
5ddecd4
research: preserve Node startup errors and freeze diagnostic boundari…
JavaZeroo Oct 28, 2026
66a0391
test: reproduce passing Node verdict after invalid trace tail (#144)
JavaZeroo Oct 28, 2026
3b74a94
fix(research): reject Node protocol errors after complete prefix (#144)
JavaZeroo Oct 28, 2026
0949ac6
docs: record Node protocol verdict red and green source identities (#…
JavaZeroo Oct 28, 2026
cebc530
test: reject Node diagnostic runtime version drift before attempt (#144)
JavaZeroo Oct 28, 2026
b809706
fix(research): verify Node diagnostic host versions before attempt (#…
JavaZeroo Oct 28, 2026
02aac45
docs: record Node diagnostic version gate validation source (#144)
JavaZeroo Oct 28, 2026
05062c7
Merge commit '4d7bd8a7c822135b1fdee5935262af3205ee565f' into research…
JavaZeroo Oct 28, 2026
d697518
research: add offline whitelist export for fixed Node diagnostic (#144)
JavaZeroo Oct 28, 2026
099f5c1
fix(research): retain Windows marker bytes in offline audit (#144)
JavaZeroo Oct 28, 2026
c52125b
research: bind unchanged Node reference sources in whitelist (#144)
JavaZeroo Oct 28, 2026
30da569
docs(research): publish bounded Node diagnostic observations (#144)
JavaZeroo Oct 28, 2026
5c8bc63
test: reproduce offline Node export whitelist gaps
JavaZeroo Oct 28, 2026
504c0fd
fix: enforce fixed Node export whitelist identities
JavaZeroo Oct 28, 2026
81d50ee
docs: preserve Node publication and record export guard validation
JavaZeroo Oct 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,11 @@ if(BUILD_TESTING)
termforge_add_python_test(windterm_alternate_export -m unittest research.ui.test_export_alternate_reference -v)
termforge_add_python_test(windterm_alternate_style_reference -m unittest research.ui.test_export_alternate_style_reference research.ui.test_alternate_style_peer -v)
termforge_add_python_test(windterm_raster_style_reference -m unittest research.ui.test_raster_style_reference -v)
# Pure offline regressions only; OwnedNodeTests and frozen batches are never launched here.
termforge_add_python_test(node_contract_export -m unittest research.ui.test_export_node_contract_deadline research.ui.test_node_contract_deadline.CheckpointTests research.ui.test_node_contract_deadline.LauncherVerdictTests -v)
if(WIN32)
termforge_add_python_test(node_contract_plan -m unittest research.ui.test_node_contract_deadline.PlanTests -v)
endif()
termforge_add_python_test(windterm_raster_selection_proposal -m unittest research.ui.test_raster_selection_reference -v)
termforge_add_python_test(windterm_raster_raw_proposal -m unittest research.ui.test_raster_raw_reference -v)
termforge_add_python_test(differential -m unittest discover -s experiments/differential -p test_*.py -v)
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分
| 持续输出中断的原失败记录 | [#36](https://github.com/JavaZeroo/termforge/issues/36)、[ConPTY 输入机制研究](research/conpty-ctrl-c-input.md)、[原 R1 历史证据](../experiments/shell/results/2026-10-23-r1-foundations/validation.json) | 原 Windows 11 回归中的 normal/resize 超时与 ETW/插桩观察;调试扰动及管道读完成缺口保留。不是当前全套结果,后续未复现不能抹去此失败。 |
| controller B 正常结束后 cmd 退出未验收(#44) | [原失败脱敏记录](../experiments/shell/results/2026-10-26-controller-exit/validation.json)、[新退出诊断及有界重放](../experiments/shell/results/2026-10-26-controller-exit-observation/validation.json)、[关闭合同](https://github.com/JavaZeroo/termforge/issues/44) | 原 child 收完 32B、退出 0/join/Job0;cmd 只留下 close 后 0xC000013A,close 前未知。新观察分列输入、wait、pre-close 与清理;多轮未复现不构成历史修复,继续阻塞 #38。 |
| 原 10 秒纯夹具超时的阶段保留(#40 未关闭) | [限定合同](research/inventory-timeout-checkpoints.md)、[正常与受控超时对照](../research/ime/results/2026-10-26-inventory-timeout-checkpoints/validation.json) | 保持原 10 秒期限;超时后保留有界阶段、原异常和回收。受控挂起对照已通过,但历史 CI 的阶段/根因仍未知,#40 不因此关闭。 |
| Node 纯夹具阶段与失败判定(#144 未关闭) | [工具合同](research/node-contract-deadline.md)、[固定三 case 与身份](../research/ui/results/2026-10-29-node-contract-deadline/README.md) | 固定02aac源码的一次正式批次:正常passed0/23cp、受控挂起timed_out99/6cp、受控异常failed1/11cp,均根回收/Job0;CLI0只表示预定义结果齐全。协议尾、版本漂移及离线出口白名单P2的纯反例分列;出口普通/-O各15项纯测试,原件和旧公开字节保留。旧CI根因/整程硬界仍null,不接原CI执行入口,新增CTest仅注册纯数据回归,不关闭#144/#38。 |
| 纯 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 联合整合通过。 |
Expand Down
61 changes: 61 additions & 0 deletions docs/research/node-contract-deadline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Node 栅格纯夹具的有界阶段诊断

对应 [#144](https://github.com/JavaZeroo/termforge/issues/144)。旧 Windows CI 在 `test_raster_native_contract.js` 的原 10 秒等待中超时,没有 Node 阶段记录。这里提供后续有限调查的工具,**没有解释或修复旧超时**;新源码、新宿主或受控挂起的结果不能补写旧样本。

新工具在冻结源码 `02aac45` 上完成了[一次正式三 case 诊断](../../research/ui/results/2026-10-29-node-contract-deadline/README.md):正常通过、受控挂起超时和受控异常失败分别保留。CLI0仅表示预定义诊断结果齐全,原超时根因仍未知;原始记录留私有目录,公开只投影白名单标量、阶段和哈希。

## 执行与证据边界

这是 Windows 专用、纯合成的诊断入口,不启动 WindTerm、Qt、ConPTY 或输入法,也不访问个人桌面。现有 CTest 仍按原入口执行该 JS;本工具没有自动接入或重试失败的 CI。

`test_raster_native_contract.js` 的原合成输入、七种生命周期情形及断言保留,只添加可选 observer;普通执行时 observer 为 no-op。`raster_style_reference.js` 等原版生产探针、旧计划与旧证据不改动。专用 bootstrap 在加载被测 JS 前等待 `GO`,宿主先将根进程加入新的 kill-on-close Job,再通过保留的根句柄核对归属,最后释放 `GO`。

固定 checkpoint 区分 Node 首次记录、GO、夹具加载、原文件读取、VM helpers、纯检查及七个 lifecycle case 的开始/结束。stderr 使用同步短记录;首条记录之前仍包含 Node 启动和内建 `fs` 加载的未知区间,不能将“未见首条”直接归因于进程创建。Node 单调时钟与宿主时间分别保存,不混作已校准的性能端点。观测开销未校准。

执行预算为原 **10 秒**;进程创建返回后的 Job/GO 设置占用同一预算,不另加等待。同步进程创建本身和准备/哈希不具备整程硬时限,所以 `whole_lifecycle_bound_seconds=null`。超时保留 `TimeoutExpired`、已收到的 stdout/stderr 和最后有效 checkpoint;截断或非法的下一条记录不删除此前有效前缀。检查点的数量、顺序、PID、字段和单调时钟不合约时,不能报告完整成功。

即使全部23个必需 checkpoint 已出现,后续多余或非法记录仍使 `trace.complete=false`,子记录判为 `failed`;正常 stdout、exit0 和 Job 回收不能覆盖协议错误。状态判定也独立拒绝带有 `protocol_error` 的旧完整标记,前缀仍保留供诊断。

回收使用独立、共享的 **5 秒**预算,验证根已回收及自有 Job active=0;不能验证时不派发下一 case。Job 仅约束该可信、无外部代理调用的自包含测试进程及正常继承成员,不是通用沙箱或外部服务回收证明。原错误、退出码、是否强杀与回收结果分别保留;清理成功不会把超时或异常变成通过。

## 固定计划

先提交工具源码,再在新的 `local/` 路径准备不可复用的离线提案:

```powershell
python -B -X utf8 -m research.ui.node_contract_deadline prepare-plan --plan local/node-144-proposal.json --out local/node-144-proposed-output
```

提案默认 `execution_authorized=false`,`run-plan` 在创建 attempt marker 或子进程前拒绝。计划固定 Git HEAD、五个实际源码文件、Node/Python EXE 哈希、实际 `windows_version` / `python_version`、预算和三个顺序 case。`run-plan` 在 attempt marker 前重新读取并严格比较两个版本字符串,漂移时不创建 marker 或输出目录。批次记录使用该次实际读取值,各子观察再记录当时实际读取值,不把计划请求值当实际身份。这仅是两项版本核对,不是完整机器指纹;旧 CI 的实际 Node 身份和缺失阶段仍未知。只在独立审查后,依据既有授权用新的路径准备 `--execution-authorized` 计划;保留原 false 提案,不编辑它。

三个 case 为正常执行、在 VM helpers 开始处受控挂起、在 grab case 开始处受控异常。每份计划最多尝试一次;独占 `.attempted` marker 在成功或失败后均保留,输出目录须不存在。控制异常和挂起仅检验诊断及清理能力,不能证明旧原因相同。

`run-plan --plan <新计划>` 将原始合成记录写入该计划的私有输出目录。正常 case 只有完整检查点、原 stdout、自然 exit0 和回收均成立才通过;另两 case 分别仍为 `timed_out`、`failed`。CLI 只有观察到三种预先固定的诊断结果才返回0,汇总名为 `expected_diagnostic_observations`,不是产品成功或旧缺陷修复。

## 针对性验证

公开边界为计划/launcher 和 checkpoint 记录。`research.ui.test_node_contract_deadline` 检查前缀保留、顺序/PID/字段/时钟拒绝、假 final、false/漂移计划拒绝,以及 Windows OwnedJob 中正常、受控挂起和异常三条独立路径。后两条不能因 Job 清空而转为通过。

原件、环境路径和 stderr 栈留 `local/`;[正式批次的白名单结果](../../research/ui/results/2026-10-29-node-contract-deadline/validation.json)经离线核对后另行发布,不为旧超时填写根因。#144、#38 和 R2 继续开放。

离线出口的公开 seam 是 `export_node_contract_deadline.export`。纯内存回归替换文件字节读取,不启动 Node,也不修改真实原件;normal/throw 的 timeout Job 非空、hang Job 任意额外字段/非整数,以及任一 false 提案的源码或字节漂移必须拒绝。固定批次出口钉住三份 false 原 SHA256/commit,所有 Job 都只投影三项计数;版本、commit、hash、阶段与状态分别受类型、格式或枚举约束。CTest 的 `node_contract_export` 只含纯出口和 trace/launcher 判定类,`node_contract_plan` 仅在 WIN32 注册纯计划类;不注册 `OwnedNodeTests`,不自动运行授权批次。

## 预审发现与限定修正

`5ddecd4` 预审发现:完整23条前缀后追加非法/多余 checkpoint 时,解析错误保留完整前缀,原子状态判定却只检查前缀的 `complete`,可能误报 `passed`。批次层已有拒绝仍不足以保证子记录正确。该缺陷属于新诊断工具,与旧 CI 的10秒超时没有因果关系。

公开 trace-data/launcher 判定边界的两个负例在 `66a0391` 均实际失败:正常 stdout、exit0、清理成功时,非法 JSON 尾和额外事件仍被旧子判定返回 `passed`。修正同时清除错误轨迹的完整标记、在子判定直接拒绝协议错误,并保留23条有效前缀;测试另保留完整合法对照及带错误的旧 `complete=true` 输入。相关纯测试的普通/`-O` 运行身份与原始记录留新的 `local/node-deadline-p2/`,不重跑此前的 Node/受控10秒挂起观察,也不改写旧计划或原件。

实际修正验证源为 `3b74a947f09880d67d12eececa6907b7278e7640`:普通与 `-O` 各8项纯边界测试通过、无跳过。此前的 Node/受控进程观察仍仅属于 `5ddecd4`,不转记为新源码的执行结果;该阶段末尾只补说明和准备新 false 提案,正式有限批次当时尚待审查。

## 版本漂移的预审修正

`0949ac6` 预审发现,计划虽记录 Windows/Python 版本字符串,执行前却只复验了 EXE 哈希,没有核对这两个已声明值。公开计划边界的受控反例在 `cebc530` 将 `platform.version()`、`sys.version` 分别替换为不同字符串,两案均实际到达 attempt gate;测试在该文件边界拦截,未创建 marker、输出或 Node 进程。这不是实际操作系统版本改变,也不能解释旧 CI 超时。

修正将两个当前版本的严格比较放在 marker 前,并在新批次和新子观察中记录实际值。相关纯计划测试的源码身份和日志保留在新的 `local/node-deadline-p3/`;此前 false 提案、原始观察和首次 P2 的纯日志保持原字节,不重新运行 Node 或10秒受控场景。

实际修正验证源为 `b8097064df229e5f6363be5c08a4acb31cd26554`:相关3项纯计划测试在普通与 `-O` 均通过、无跳过;两种漂移均在 marker 前拒绝。此次没有执行新的 Node 或正式诊断批次,也不把先前8/10项验证转记为这一源码的进程观察结果。

## 白名单出口的发布预审修正

`30da569` 的真实公开文件没有泄漏;纯内存恶意输入表明,未校验的非超时 `job_at_timeout` 和未固定身份的 p3 false 源码字段可被公开。red `5c8bc63` 的3项测试有5个失败子例;green `504c0fd` 在公开离线 export seam 拒绝注入,普通与 `-O` 各15项相关纯测试通过。三份 false 的原 SHA256、commit 和未执行状态均固定,非超时项只能缺失/null,超时 Job 只重建三个计数。旧原件、执行五源、旧公开 `db97e95…` 不改;新[派生结果与出口验证](../../research/ui/results/2026-10-29-node-contract-deadline/README.md#离线出口的发布预审修正)只有导出器源码哈希变化。此次不重跑 Node/10秒控制场景、原版、guest 或 CI;这些是新出口缺陷的修复,与旧 CI 超时原因分列。
Loading
Loading