Skip to content

[R2][回归] 定位 Node 栅格纯夹具在 Windows CI 的原 10 秒超时 #144

Closed as not planned

Description

@JavaZeroo

新诊断能力与结果(Draft,尚未合入)

Draft PR150,当前发布 HEAD 81d50eebbe149cf20cca292e3f076ae682cd99de;唯一正式批次执行源仍为 02aac45ca6e8eaffcbca1d3ef1a80d243159ec46。整合 main4d7 后五项执行源码字节未变;离线出口修正不产生新进程样本。当前等待最终发布增量双轴审查和自动 CI,不据此关闭本项/#38。

  • 正常项 passed/0/23cp;受控挂起 timed_out/99/6cp,保留原10秒 TimeoutExpired 及 Job 强制结束;受控异常 failed/1/11cp。三项根归属/回收与结束 Job active0;CLI0只表示三种预定义结果齐全,不是三项都通过。
  • 三 case 与 CLI 内容及序列化字节、版本/源码/Runtime EXE、trace前缀和完整性经独立 stdlib 核对一致。24项旧原件、三个 false 计划、正式 raw 和旧发布字节保留;本次另冻结并重算58项既有文件,原 CI ZIP/LastTest 原哈希也一致。固定报告。
  • 诊断执行工具的协议尾、Windows/Python版本漂移 P2 分别在 3b74a94 / b809706 用纯反例修正。早期5dde控制测试与02aac正式批次分列;它们不解释旧CI超时。
  • 最终发布预审又发现两处离线出口 P2:normal/throw 的 timeout Job 可夹带任意字段,p3 false 的源码身份未固定。red 5c8bc63 的纯内存 export 反例3项/5失败子例;green 504c0fd 拒绝非超时对象、仅重建三个 Job 整数,并固定全部三 false 的原 SHA256/commit。相关纯普通/-O各15项通过、无跳过。
  • 首次公开 JSON db97e95aa6d56a9bb44553178f788c6f7c33fff9e52441ef343ea63821f98a3d 保留原字节。新导出普通/-O字节一致,SHA de57db6e0f7c3fa57bfe1e588db2fe9587792bd4181f7836797daa8eb144e27b;仅自指的 exporter_sha256 字段变化,真实观测投影不变。公开不含 stderr 栈、PID、本地绝对路径或 raw checkpoint。
  • 新 runner 不接入原 Python/CTest 执行入口,observer 普通路径 no-op;新增 CTest 只注册纯 export/trace 判定和 WIN32 PlanTests,configure/show-only 已核对,不含 OwnedNodeTests。发布修正没有运行 Node/10秒控制场景、完整矩阵、原版、guest 或 CI 重试。

旧CI仍缺Node启动/文件/VM阶段,本次本地正常与受控失败不解释旧事件;根因和整程硬时限保持null。后续若调查CI调度,仍须另行固定源码/宿主/样本/停止条件,不能以重跑绿回填原因。

已观察的失败

PR141 push默认工作流40742071881,attempt1、source 43883022883d382e3dd57bd627e9c735bafe58ca,Windows job 123006018718 的CTest 51/52、303.13s。唯一失败 windterm_raster_style_reference 的 RasterBoundaryTests.test_production_js_native_contract:Python subprocess.run执行 node research/ui/test_raster_native_contract.js 在原 10秒 抛TimeoutExpired。该JS是合成Qt调用的纯夹具,没有Frida/Qt/原版运行。公开堆栈未携带Node启动、读取文件、VM编译/执行或逐case阶段,原因未知。

专用Qt的PR/push和参考工作流均成功;这不能覆盖本次默认失败,也不把它归因于CRT变更。PR141未修改上述两夹具源。未提交同HEAD重试。

原件已本地保存:artifact12840955540 ZIP SHA256 a332cab228750bdcdc5c64c90f14b304ba7a9fe16973d1384f6d5f8619cdc6ed;其LastTest.log 141042B SHA256 ffdea820416494d67ab82081219cb5ec01cf55619664b7de73fd905c45800d56。原job日志也可由GitHub获取。父项#38;与#40 PowerShell AST超时分别保留,不推断共同根因。

下一次有界定位

  • 先固定源码/宿主与Node/Python实际身份、输入/样本数、串行/CI调度假设与停止条件;保留原10秒,不先跑绿后选择样本。
  • 区分进程创建/Node首条checkpoint/文件读取/VM构建与各合成case,超时保留已完成阶段、原错误、stdout/stderr和root/自有Job回收,缺失阶段保持unknown。
  • 仅纯夹具执行,不运行WindTerm或修改个人桌面;若需新增观测,记录新源码和开销限制,不能回填旧source阶段。
  • 通过受控挂起/异常负例验证原10秒失败与清理路径,不延长等待、不删case、不以重跑成功宣布原因修复;未复现只给新一批实际结果及下一可证伪假设。

完整#38/#35/R2保持开放;不以此单项独立诊断宣称产品长期稳定通过。

Activity

  1. added
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    research有明确问题与出口的证据调查
    on Oct 28, 2026
  2. JavaZeroo commented on Oct 28, 2026

    @JavaZeroo
    OwnerAuthor

    新诊断工具已完成执行前双轴审查与两项P2修正:协议坏尾不能借完整23条前缀误报成功;计划在attempt前复验Windows/Python版本。最终源02aac45ca6e8eaffcbca1d3ef1a80d243159ec46,source tree干净,旧false/24原件不变。

    root随后仅执行新的冻结单次三case计划(SHA87a0518c23b65f050d3991557b6b58aca334c8d80dc939fab601d3fae01f0fc8):normal 23检查点/final/自然exit0;受控hang 6检查点止vm-helpers-start,仍为原10s TimeoutExpired/exit99/强制Job回收;受控throw 11检查点止case-start:grab,仍failed/exit1。三者根句柄归属与回收验证true、Job active0/total2。CLI exit0只表示三种预定义诊断结果均观察到,非三个case都成功,更非旧CI已修。

    所有新记录/日志留私有目录待脱敏审计,尚未push/合入main;旧超时根因继续null,本项/#38开放。没有同HEAD重跑原CI、没有原版或guest操作。

  3. JavaZeroo commented on Oct 28, 2026

    @JavaZeroo
    OwnerAuthor

    PR #150 已以 b919698ab4f8769f520340380eb9a18fee967b1d 合入 main,已核对实际执行源02aac45、出口修正504c0fd及发布81d50ee均为main祖先。交付仅为有界阶段诊断、严格离线出口与纯回归;受控hang/throw仍分别是timed_out/failed,CLI0只表示预期诊断齐全。PR默认Windows58/58、Linux38/38与Qt/参考4条CI成功;push/default的PS51准备超时已独立记#81,未重跑。旧Node超时根因仍unknown,#144/#38/#35/R2均保持开放。

  4. JavaZeroo commented on Oct 28, 2026

    @JavaZeroo
    OwnerAuthor

    新增独立CI失败样本:PR154 push/default run40769220998/job123101546682,HEAD/checkout58fee280…,test_production_js_native_contract 的现有Node test_raster_native_contract.js 原10s再次TimeoutExpired;该CTest项总15.23s,11个Python项中此项error,未记录Node内部stage。本PR未自动运行02aac的诊断批次,不用旧normal/hang/throw样本回填此次原因。完整CTest56/59、332.37s,另两失败分别#73/#156。artifact12851572745 SHAea38ca1099f6f52420d77bee16796d04e986eab02c8912a692e013bf4d12282a、LastTest162003B SHA6ec38d3f098ade5f683f7c1fa0368843c642eb068aabb0cfa76ff8e0e7fe4a22已核对,未重跑;根因仍unknown,#144保持开放。

  5. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    本项的原失败签名在今天的一次 push 运行中再次出现(同命令、同 10 秒、同测试):

    这意味着原失败不是一次性事件,且与特定源码改动无关——更支持"该 Node 纯夹具在 hosted Windows 上的启动/解析偶发超过 10 秒预算"这一假设,但与 #141 当时的 CRT 变更无因果证据。

    下一步仍按本项合同:先在 hosted 同镜像上对同一命令做有界重复计时(每次新进程),记录耗时分布与失败率;若确认存在接近/超过 10 秒的尾部,再讨论这是夹具预算问题还是宿主抖动,不以延长等待直接取绿。

  6. added 2 commits that reference this issue on Oct 29, 2026
  7. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    已对该纯夹具做有界计时并合入结果(PR #179 → main ccb6f6f),未改夹具、期限或原失败。

    测量:dispatch-only 作业,命令与失败测试完全一致(node research/ui/test_raster_native_contract.js),hosted windows-2025、Node v22.23.4;顺序 60 次 + 20 批 × 4 并发,共 140 次,每次新进程、原 10 秒超时。

    结果:

    指标 值
    顺序 p50 / p90 0.063 s / 0.078 s
    顺序最大 1.469 s(第 1 次,冷启动)
    并发批次最大 0.125 s
    超时 0 / 140

    含义:10 秒预算相对 warm 约 130 倍余量、相对冷启动约 7 倍;两次已记录的 timed out after 10 seconds(PR141、PR #178 push)远离该分布,不能用夹具计算成本解释。更像宿主级停顿(首次执行的安全软件扫描、VM 调度/存储短暂阻塞),但空闲镜像上未复现,根因仍 unknown。

    下一步假设(有界):固定"失败时同机是否有其它作业/扫描活动"这一变量——例如在 dispatch 作业里叠加可控并行负载后再测同一命令,看能否把单次推近或超过 10 秒;若仍不能,则按 #38 的"hosted 低频未知"处理,不以延长预算取绿。

    证据:固定结果、validation.json。#144/#38 保持开放。

  8. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    又一次原签名复现(PR #189,改动只涉及诊断字段与 CI 作业):

    • run 40899735246、job 123538408686,head 5f4b4f1;
    • CTest 62/63,唯一失败 windterm_raster_style_reference(12.36s):test_production_js_native_contract → 同一 10 秒超时;
    • 同分支的 PR 检查里其它 Windows 作业通过;本次改动不触及该夹具。

    与 #144 已有结论一致:该夹具 warm 约 63–78ms、冷启动约 1.47s,10 秒超时与夹具成本不符,属宿主级停顿。保留红例、不重跑取绿。

  9. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    又一次原签名复现(PR #198,只改诊断字段):

    • run 40929408711、job 123643531939;
    • CTest 62/63,唯一失败 windterm_raster_style_reference:test_production_js_native_contract ERROR(同一 10 秒 TimeoutExpired);
    • 同分支其它作业通过;本改动只增加输出轨迹字段。

    与已有结论一致:夹具 warm ~63ms、冷启动 ~1.47s,10 秒超时不能用夹具成本解释;保留红例、不重跑取绿。

  10. 7 remaining items

  11. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    第二次命中:仍是「preload 从未写入」

    PR #235 的 Windows 回归(job 123905344942、2026-10-30T05:18:53Z)再次失败,文案与上次一致:

    AssertionError: node fixture exceeded its ten second limit; preload checkpoint never written
    

    两次独立命中的共同点:

    观测 首次(run 41000726748) 本次(job 123905344942)
    超时 10 s 是 是
    preload 检查点 未写入 未写入
    结论 Node 未进入 JS 执行 同上

    因此「超时发生在进程创建/加载阶段、而非夹具逻辑」这一判读得到两次独立样本支持。

    仍缺的观测

    preload never written 无法区分是进程根本没有创建、创建后被阻塞、还是被安全软件拦在映射阶段。要分离这三者,需要父进程侧的创建耗时(CreateProcess 返回时间)与子进程首次用户态执行时间的对照。

    边界

    • 两次都是单点样本,未做单变量对照;
    • 不据此关闭本项。
  12. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    第三次命中(同一文案,检查点已生效)

    PR #237 的 Windows 回归(job 123910433345)在 windterm_raster_style_reference 再次失败:

    AssertionError: node fixture exceeded its ten second limit; preload checkpoint never written
    

    三次独立命中的分布:

    # 时间(UTC) 载体 结果
    1 04:07 PR #229 回归 10 s 超时,preload 未写入
    2 05:18 PR #235 回归 同上
    3 05:36 PR #237 回归 同上

    三次都落在同一台托管 runner 的相同时间窗(约 90 分钟内)。这一点值得注意:如果要判断"是否与该宿主机当时的负载/状态相关",现有三次样本都集中在同一时段,不足以分离"宿主机状态"与"本项目路径"。

    仍缺的观测(不变)

    preload never written 无法区分:进程从未创建 / 创建后被阻塞 / 在映射阶段被拦。需要父进程侧 CreateProcess 返回耗时与子进程首次用户态执行时间的对照。

    边界

    • 三次都是单点样本,且时间窗重叠,不构成独立的环境对照;
    • 不据此关闭本项。
  13. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    决定性证据:同一作业里三种运行时同时停摆

    PR #239 的 Windows 回归(job 123912416780)在 05:43–05:52 UTC 的约 9 分钟内失败了三项测试,而它们用的是不同的运行时可执行体:

    测试 子进程 失败形态
    windterm_alternate_export python3 -O research/ui/export_alternate_... subprocess.TimeoutExpired
    windterm_raster_style_reference node --require <checkpoint> ... TimeoutExpired + preload checkpoint never written
    ime_inventory powershell.exe 夹具 夹具超时(worker contract)
    (同 job 更早) termforge-hosted-shell-preparation-v1 failure_code: preparation_guard

    判读:

    • 三种互不相关的运行时(Python / Node / PowerShell)在同一台 runner、同一时间窗里都出现启动或执行级别的超时;
    • Node 侧还有检查点旁证:preload 从未写入,即进程没有进入 JS 执行;
    • 这排除了"某个夹具自身的逻辑问题",把原因指向宿主机的进程创建/执行被阻塞;
    • 也与先前三次 [R2][回归] 定位 Node 栅格纯夹具在 Windows CI 的原 10 秒超时 #144 单点(04:07、05:18、05:36)落在同一时段一致。

    仍不能确定的

    • 是宿主机的资源竞争(如并行 job 抢占)、镜像层的扫描/EDR,还是存储抖动;
    • 缺乏同时段的宿主机级指标(CPU/IO/进程创建延迟),只有本项目侧的失败时间戳。

    边界

  14. added a commit that references this issue on Oct 30, 2026
  15. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    采样作业本身也停在同一步骤

    派发的两次 actions-repeat 采样(run 41012639592 / 41012649280)在 06:11:39Z / 06:11:45Z 启动后,都停在同一个步骤:

    job 步骤 开始时间 观察时已持续
    123921743529 Repeat the actions scenarios 06:14:35Z ≈33 分钟
    123921774106 Repeat the actions scenarios 06:15:11Z ≈33 分钟

    该步骤正常约 8–11 分钟(对照:run 41011380665 的同一作业 05:58:34→06:09:48 共 11 分 14 秒,其中该步骤 7 分 35 秒)。

    与本项既有证据的关系

    同一时间窗(约 04:07–06:50 UTC)内已经观察到:

    1. 三次 Node 夹具超时(preload checkpoint never written);
    2. 一次作业内 Python / Node / PowerShell 三种运行时同时失败;
    3. 现在两次采样作业同时在同一长步骤停滞。

    三者共同指向"该宿主机/该时段进程执行被大幅拖慢",而不是某个夹具或某段代码的问题。

    观测说明(重要)

    • 本条记录的是观察时的 in-progress 状态;作业若最终完成,我会补上 completed_at 与真实耗时;
    • 曾出现过 GitHub 状态接口滞后(先报 in_progress、随后显示早已完成),因此最终以 started_at/completed_at 为准。

    边界

    • 未取得宿主机侧指标(CPU/IO/进程创建延迟);
    • 不据此关闭本项。
  16. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    更正:上一条"采样作业停滞 33 分钟"的判断不成立

    我按最终时间戳复核了两个作业,结果与上一条记录相反:

    job 上一条的说法 实际时间戳
    123921743529 在 Repeat the actions scenarios 停了 ≈33 分钟 06:11:39 → 06:22:32,共 10 分 53 秒(正常)
    123921774106 同上 该步骤已完成(剩余步骤为 8/15/16),并非卡在步骤 7

    也就是说,我当时看到的 in_progress 是状态接口滞后,不是作业真的停滞。

    教训(对本项方法的影响)

    • 在本环境里,actions/jobs 的 status 字段会明显滞后;不能用它推断"作业卡住";
    • 判断时长必须用 started_at / completed_at 与步骤级时间戳;
    • 因此本项此前"作业时长异常"的观测都应以时间戳复核为准,不接受 status 单点读数。

    仍未受影响的部分

    三次 Node 超时与"一个作业内三种运行时同时失败"都有步骤级时间戳与失败文案支撑,不依赖 status 轮询,仍然成立。

    边界

  17. JavaZeroo commented on Oct 30, 2026

    @JavaZeroo
    OwnerAuthor

    补一条:job 123921774106 现已给出最终时间戳——06:11:45 → 06:23:03,共 11 分 18 秒,同样正常。

    因此两个采样作业都在约 11 分钟内完成,上一条"停滞"的判断对两者都不成立;状态接口的滞后在本环境约达 20 分钟以上。

  18. JavaZeroo commented on Oct 31, 2026

    @JavaZeroo
    OwnerAuthor

    两个新超时样本(都带 f1f4cd0 新字段):进程创建只要 0.22–0.25 s,停顿在 node 自己的启动里

    先说明:本项此前评论里的 preload checkpoint never written 都没有 spawn_seconds / pid / exit_at_timeout(这三个字段来自 f1f4cd0,2026-10-30T05:56Z 才进 main)。下面两条是我在 10-30 与 10-31 的 regression (windows-2025) 失败里读到的、第一次带齐新字段的样本,其中一条首次证明 preload 真的执行过。

    1. 两个样本

    样本 C 样本 D
    run / job 41023497851 / 123956094380(push feat/sgr-underline-reverse) 41161663808 / 124420335370(push ci/2022-record-handles)
    head_sha 22f7535 75535d3
    失败时刻(UTC) 2026-10-30T08:04:11Z 2026-10-31T02:53:10Z
    失败文案 AssertionError: node fixture exceeded its ten second limit; preload checkpoint never written; pid=2700 spawn_seconds=0.219 exit_at_timeout=None partial_stdout_bytes=0 AssertionError: node fixture exceeded its ten second limit; {"started":1793415189496,"version":"v22.23.4"}; pid=9108 spawn_seconds=0.25 exit_at_timeout=None partial_stdout_bytes=0
    CTest 同 run 失败项 core / windterm_raster_style_reference / ime_inventory / presentation 共 4 项 仅 windterm_raster_style_reference 1 项

    源码身份:两个 head_sha 的 research/ui/test_raster_style_reference.py 与 research/ui/test_raster_native_contract.js 的 git blob 与当前 HEAD 完全相同(逐个 rev-parse 比对过),所以这三处不是"另一个版本的夹具"。

    2. 证明了什么

    字段 读法(位置) 判读
    spawn_seconds=0.219 / 0.25 time.monotonic() 到 Popen() 返回(research/ui/test_raster_style_reference.py:93–99) CreateProcess 本身不是停顿:两次都只要 0.22–0.25 s
    exit_at_timeout=None 期限瞬间 process.poll()(同文件:108) 两次子进程都还活着,不属于"进程已退出、管道没排干"那一类
    partial_stdout_bytes=0 len(expired.output or '')(:109) 该 JS 夹具全文只有 observe 钩子、无 console.log(research/ui/test_raster_native_contract.js:1–28),0 字节不含信息量
    样本 C 的 checkpoint 文件不存在(:105) 10 秒内 node 没执行到第一行 JS
    样本 D 的 checkpoint {"started":1793415189496,"version":"v22.23.4"} node 的 JS 引擎确实起来了,并给出运行时版本

    样本 D 可以算出停顿时段(runner 同一时钟:日志行时间 ↔ 子进程 Date.now(),误差约 ±0.05 s):

    • started = 2026-10-31T02:53:09.496Z;
    • 失败行 02:53:10.672 = 10 秒 communicate 期限,故 communicate 起点 ≈ 02:53:00.672 ≈ Popen 返回;
    • 于是 CreateProcess 返回到 preload 执行之间空了约 8.82 s,只剩 约 1.18 s 给夹具本体。

    用同一镜像的既有计时对账(research/ui/results/2026-10-29-node-contract-timing/validation.json:18–25:first_sample_s=1.469、sequential_p50_s=0.063):1.18 s < 冷启动首样本 1.469 s。样本 D 因此不需要再假设"启动后卡住"——node 自己的启动吃掉了 8.8 s,剩下的时间不够跑完冷路径;样本 C 更极端,连 JS 都没进。

    一句话:这两条同时排除了"纯夹具成本"和"CreateProcess 成本",剩下的窗口是 node.exe 从创建到执行首行 JS,长度 ≥8.8 s(样本 C ≥10 s)。

    3. 附带发现(只记录,不改变判读)

    • 样本 D 的日志在同一 run 的下一个测试行出现 ResourceWarning: subprocess 9108 is still running,pid 与 pid=9108 一致 → 超时分支(:102–109)只 self.fail(),不终止子进程,那个 node 在测试结束后仍活着。只影响夹具卫生。
    • 样本 C 所在 job 里 core / presentation 也红,但该分支是 SGR 改动的 WIP;我没有核对它们是否与本项同因,故不作为本项证据,也不据此推断"整 job 停顿"。

    4. 可关闭吗

    不可关闭。验收原文(「下一次有界定位」第 4 条):

    不延长等待、不删case、不以重跑成功宣布原因修复;未复现只给新一批实际结果及下一可证伪假设。

    以及第 1 条:

    先固定源码/宿主与Node/Python实际身份、输入/样本数、串行/CI调度假设与停止条件;保留原10秒,不先跑绿后选择样本。

    现在拿到的正是"实际结果 + 假设收窄",原因仍未知:没有单变量对照,也没有 red→green。按"不能以重跑绿回填原因",这不足以关闭。

    5. 下一次单观测

    不需要新语义、不需要改期限:research/ui/test_raster_native_contract.js 已经内建 observe('before-file-read'/'file-read'/'vm-helpers-start'/'vm-helpers-ready'/'pure-checks-done') 调用点(:5–8、:17–19、:28),普通执行时是 no-op(:5 取不到 global.__termforgeNodeContractObserve 就退回空函数)。单次观测 = 在现有 preload 里定义这个全局函数,把 {stage, Date.now()} 追加进同一份 checkpoint 文件(不碰夹具本体、不动 10 秒),跑一个批次即可把窗口切成 "node bootstrap(已证 ≥8.8 s) / 读文件 / VM 构建 / 各 case",正好对齐本项第 2 条要求的分段。

    边界

    • 只读:读过 research/ui/test_raster_style_reference.py:84–111、research/ui/test_raster_native_contract.js:1–40、research/ui/results/2026-10-29-node-contract-timing/validation.json:1–34,以及两个 job 的 CI 日志原文与 gh run list/run view/actions-jobs 的 job、step 级结论;未改代码、夹具、期限或工作流,未重跑、未 dispatch、未关闭 issue。
    • 两条样本只读日志文本,未下载 artifact ZIP、未做哈希比对,原件哈希未核对。
    • 8.82 s 依赖"日志行时间戳 = 期限到期时刻"与"子进程 Date.now() 与 runner 同一时钟"两个假设,误差约 ±0.05 s;未独立取证 runner 时钟。
    • partial_stdout_bytes=0 在本夹具里不可用于"夹具没产出"的判断(夹具本就不打印 stdout)。
    • hosted 镜像的具体版本/build 未取证(只有 windows-2025 标签与 checkpoint 里的 Node v22.23.4)。
    • 同 job 其它失败项(core/presentation)未核对,混入结论属越界。
    • 未在本地复跑这两个 job 的上下文;本机(Windows 11 / Node v24.22.2)与样本的 Node v22.23.4 不可互推。
  19. added a commit that references this issue on Oct 31, 2026
  20. JavaZeroo commented on Oct 31, 2026

    @JavaZeroo
    OwnerAuthor

    又一个样本,这次带上了新字段

    job 124510378193(windows-2025 回归):

    AssertionError: node fixture exceeded its ten second limit; preload checkpoint never written;
      pid=3740 spawn_seconds=0.156 exit_at_timeout=None partial_stdout_bytes=0
    
    字段 读数 含义
    spawn_seconds 0.156 s CreateProcess 本身很快
    preload checkpoint never written — 10 秒内没有执行到 JS 第一行
    exit_at_timeout None 期限瞬间进程仍在运行
    partial_stdout_bytes 0 没有写出任何字节

    这与之前的样本 C 同型(连 JS 都没进),与样本 D(进了 JS 但晚了 8.82 s)一起构成两种形态:

    形态 表现
    C 型 checkpoint 未写入 → 进程未进入 JS 执行
    D 型 checkpoint 写入但延迟 8.82 s → 进入了执行但极慢

    两者都不支持"夹具逻辑慢"或"CreateProcess 慢",指向 Node 自身启动路径。

    下一步(不变)

    等一次 D 型命中,用新加的 js_start_after_create_ms 直接读出间隔;若长期只有 C 型,则需要在父进程侧记录 CreateProcess 返回前后的时间戳来分离"创建"与"执行"。

    边界

    • 单次样本;
    • 不据此关闭本项。
  21. JavaZeroo commented on Oct 31, 2026

    @JavaZeroo
    OwnerAuthor

    又有一次干净批次:60 次顺序 + 20 次并发,0 超时

    来源:run 41198898623 的 node-contract-timing-r144 artifact(hosted Windows 2025,Node v22.23.4)。

    配置 样本 最小 中位数 最大 超时
    顺序 60 0.046 s 0.062 s 1.969 s 0
    并发(max_concurrent=20) 20 — — 0.235 s 0

    值得注意的两点

    1. 顺序批次的第一次是 1.969 s,其余都在 0.046–0.063 s——这正是本项讨论的"冷启动"效应:首个 Node 进程要付出一次性成本,之后稳定。
    2. 并发 20 次的最大值只有 0.235 s,说明并发本身不引发长尾。

    与既有样本的关系

    之前命中的失败样本形态是:

    形态 表现
    C 型 10 秒内连 JS 都没进(checkpoint 未写入)
    D 型 进了 JS,但比期限晚 8.82 s

    而本批 80 次运行的最大值是 1.969 s(且是冷启动首例)。即:在宿主状态正常时,即使冷启动也远低于 10 秒期限。这与"失败窗口内 Node 启动整体被拖慢"的解释一致,但本批没有复现该窗口。

    边界

    • 单一 run、单一批次;
    • 不构成性能声明(探针的 performance_claim: false 约定同样适用);
    • 未复现,因此本项保持开放。
  22. JavaZeroo commented on Nov 1, 2026

    @JavaZeroo
    OwnerAuthor

    按「不死磕」原则关闭:Node 栅格纯夹具的 10 秒超时

    关闭理由

    用户明确「可以接受不完美、不需要一直死磕一个问题」。本项属于批次内不可复现、诊断已就位的一类,因此按此原则关闭。

    本项已有的证据

    run 41198898623 的 node-contract-timing-r144 artifact:顺序 60 次(最小 0.046 s、中位 0.062 s、最大 1.969 s,冷启动首例)+并发 20 次(最大 0.235 s),超时 0。

    已就位的诊断(再次命中时可立即判读)

    观测 位置
    CreateProcess 耗时 超时信息里的 spawn_seconds
    到首行 JS 的间隔 超时信息里的 js_start_after_create_ms
    期限瞬间子进程状态 exit_at_timeout、partial_stdout_bytes

    关闭时的真实状态

    本项不是根因修复。原始失败记录仍保留,未被新批次覆盖。

    重开条件

    若同类失败再次出现,凭上述诊断字段可直接判读,恢复本项即可,无需重做本轮探索。

  23. removed
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    on Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    research有明确问题与出口的证据调查

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions