## 当前执行结果(已合入main) [PR167](https://github.com/JavaZeroo/termforge/pull/167)已以 `3aa78f068154387851ce6776a35077ec02da029e` 合入main;发布源343261e、整合源5637f86,最终main tree与CI preview ef0f1b5相同;collector实际执行源e8455b8,复用6e67构建PE,原五源/3秒/首次判据不变。两轴审查0遗留,新整合HEAD六个push/PR首次工作流success;PR默认Windows61/61、Linux41/41、Qt3/3。CI未执行opt-in诊断,原生结果单列。 修订后一次固定两case机械完成:第二handle正对照首次可打开、释放后四probe均gone;原watchdog3秒/99/ready/Job0/6/0满足,本机first gone,未复现原CI。postexit image31明确unknown,原sample完整;外层自然exit0、Job0/18/0。目标offset0/50/250/1000的实际值0/47/250/1000原样保留,不当精确调度或性能验收。[固定报告](https://github.com/JavaZeroo/termforge/blob/343261e4adfbf11de4f0d9023d3752daaf00da0a/experiments/shell/results/2026-10-29-watchdog-desktop/README.md)。 旧collector一次观察被补充image-query31污染的原sample不补写;纯AST旧2RED、新普通及-O各19/19分列。生产监督器未改、原CI原因未知,**#160保持开放**。 ## 固定失败 [PR157 Windows PR job123121553707](https://github.com/JavaZeroo/termforge/actions/runs/40774909044/job/123121553707),HEAD01a979da926c05c8e6c34e3f5e5ed7b8d6916de1,默认自主C++/system ConPTY/Win32原型。完整58/60、283.98s,另origin-wrap新纯夹具失败由#151修复,本项只负责 `ShellTests.test_watchdog_contains_real_shell_tree`。 原watchdog timeout=3秒,实际timed_out=true/exit99/stdout恰为watchdog_ready:true、stderr空;deadline时Job active5/total6/terminated0,终止后及异常收尾Job active0/total6/terminated0。`OwnedTestDesktop.close`成功关闭父handle后,紧接OpenDesktop仍返回可关闭handle,desktop_gone=false,报owned desktop remained。此为该时点确实可重新打开,不证明永久泄漏;未记录再次检查、持有者或错误阶段,不能用Job为空冒充desktop删除或所有child自然退出。 同job normal-0/1/2各exit0、Job0/6/0、desktop_gone=true。原三秒期限、模式和清理未变,没有重跑。该样本与#145的startup-normal尺寸ACK失败不同,也不直接归于#36/#44/#73;根因未知。 ## 原件与后续 artifact12854726855(4794486B)SHA256 `05392812a79a0b38d48384b47905c85c9f46285cbedcf0b4afa2275550c9efbb`、LastTest167717B SHA `02830475404963817d9aaa240e1f859f9aff322101b6477a6fc1854110507afd`已下载核对,原sample/log仅私有保留。 - [x] 离线复核固定launcher/desktop/Job/句柄边界和源码/EXE身份,确认哪些阶段可证明,未知不补造。 - [x] 预声明有限诊断,区分已signaled但对象引用延后、存活持有者和清理遗漏;仅操作精确自有Job/desktop/进程,禁止全局结束输入服务或改用户设置,不以无界sleep/retry取得绿。 - [ ] 有同类red后做最小修复,保留原3秒watchdog要求、真实shell树、正常回收/异常回收负例及desktop删除合同;不能仅删除断言或把unknown记true。 父项#38,R2/#35保持开放。调查可独立开始;已完成独立诊断工具和一次修订后本机观察;原CI原因仍未知,不认定永久泄漏、同因或已修复。
Activity
JavaZeroo commentedon Oct 29, 2026
main push 回归新增一次同项观察(保留为真实失败,不改产品行为):
6bb123b(PR core: 封存行存储、结构只经 owner 发布 (#169) #172 合并提交)。shell(69.15s):experiments.shell.test_shell.ShellTests.test_watchdog_contains_real_shell_tree→ValueError: owned desktop remained;同次另有 1 条内部 skip。8924478)在同一项上通过;两条结果分别保留,不用 PR 绿覆盖 push 红,也不重跑取绿。preparation_guard失败(早于 CTest),与本次shell失败分列。#160保持开放:owned desktop 在 Job 归零后仍可打开的原失败与本次同类现象并存,机制/根因仍未知。JavaZeroo commentedon Oct 29, 2026
新的同形样本(复现作业 run 40932322420 的
shell测试,2026-10-29):test_watchdog_contains_real_shell_tree→ValueError: owned desktop remained;shell/run-*/watchdog/sample.json:{"mode":"watchdog","status":"failed","timed_out":true, "job_at_timeout":{"active":5,"total":6,"terminated":0}, "exit_code":99,"desktop_gone":false,"error":"owned desktop remained", "job_after":{"active":0,"total":6,"terminated":0}}要点:
terminated: 0——watchdog 没有真正终止任何后代;active归零(说明 Job 关闭有效),但 desktop 仍存在;{"watchdog_ready":true},output.bin仅 369 B——场景在宣告就绪后几乎没有再产生输出。与本项标题描述一致:"清空 Job 之后 owned desktop 仍可打开"。这条样本把两个阶段分开了:Job 清理成功(active 0),desktop 关闭失败。
下一步(有界):在 watchdog 超时路径上记录
CloseDesktop的返回码与调用时刻,并核对 desktop 句柄是否在 Job 清理前被其它路径复用/泄漏——需要新的诊断字段,仍不改行为。Merge pull request #199 from JavaZeroo/diag/desktop-settle
Merge pull request #201 from JavaZeroo/ci/repeat-five
Merge pull request #203 from JavaZeroo/research/trace-analyzer-settle
Merge pull request #214 from JavaZeroo/fix/desktop-settle-time
JavaZeroo commentedon Oct 30, 2026
沉降诊断(
desktop_close_settle)产物盘点:目前没有数据1. 结论
local/repeat6、repeat7、repeat13、repeat14、repeat15、repeat16合计 68 个run-*目录、1674 份sample.json,含desktop_close_settle的为 0 份。repeat2–repeat5、repeat8–repeat12、repeat-evidence:全部 16 批、3295 份sample.json,desktop_close_settle仍为 0 份。owned desktop remained仅命中 1 份:repeat7\shell\run-8jb29grs\watchdog\sample.json(desktop_gone:false),该样本 不含desktop_close_settle——写入该字段的诊断当时还不存在。repeat11\shell\run-5rnoc54k\watchdog\sample.json,error: name 'time' is not defined。它说明沉降路径确实被走到过,但因缺import time当场崩溃,同样没有 elapsed_ms。即:目前不存在带沉降序列的产物,没有可引用的 elapsed_ms 值,也没有“重试 N 次后看到 desktop gone”的记录。 不作为沉降是否有效的依据。
2. 逐批扫描结果
desktop_close_settleowned desktop remained(“其余 10 批”合计里的 1 failed 即第 1 节提到的 repeat11 样本,其错误是
name 'time' is not defined,不是owned desktop remained,故未计入第 4 列。)3. 时间线:为什么是 0
owned desktop remained,desktop_gone:false)46c49ea沉降诊断落地,desktop_close_settle自此才可能被写入import time未补;watchdog 均 passed,未进入沉降路径name 'time' is not defined——唯一进入沉降路径的样本697a26b补上import timedesktop_gone均为 true,沉降未触发两个失败样本恰好卡在诊断两端:repeat7 早于诊断 112 秒(字段还不存在),repeat11 早于修复 31 秒(字段存在但路径崩溃)。修复之后没有任何一次同类 red,所以数组一直没有生成。
4. 代码现状(已读
experiments/shell/run.py,HEAD350c158)import time在第 14 行;OwnedTestDesktop.close(record)在第 406–427 行。CloseDesktop成功后先查一次desktop_gone;若已 gone(或record is None)直接返回,成功路径不写任何新字段。attempts以{"elapsed_ms":0,"gone":false}起头,随后 10 次 × 50 ms(≤500 ms),每次记录elapsed_ms与gone,一旦 gone 立即 break。record["desktop_close_settle"];随后execute在第 480–482 行据此抛ValueError("owned desktop remained")。因此“repeat12–16 全绿”与“没有该字段”是同一件事的两面,不能读作诊断失效;同时也说明这批绿批客观上无法产出 elapsed_ms。
5. 唯一已有的时序证据(不同诊断,勿混用)
experiments/shell/results/2026-10-29-watchdog-desktop/validation.json(collectore8455b8,executable6e67be5)的retained-second-handle用例:first_desktop_gone:false,随后外部 probe:这是
diagnose_watchdog_desktop.py的外部 probe,粒度与close()内部沉降序列不同,不能当作desktop_close_settle的数据,也不用于推算沉降时长。6. 拿数据的前置条件(不改产品代码)
close()是否被调用、是否在第 412 行提前返回,而不是先怀疑沉降时长。边界
sample.json不含 run id,产物本身无法确认来源;mtime 只能说明先后顺序。diag(shell): record the first desktop check on success too refs #160
Merge pull request #279 from JavaZeroo/diag/desktop-settle-success
JavaZeroo commentedon Oct 31, 2026
沉降记录缺口已补:425 条样本全部有数据
PR #279 之前,
desktop_close_settle只在失败路径写入,因此 3295 个样本里一条记录都没有——"没有数据"与"没跑过"无法区分。现在统计 run 41200844601 的
actions-repeat-evidenceartifact(430 个sample.json):desktop_close_settle所有 425 条的形态完全一致:
[{"elapsed_ms": 0, "gone": true}]即:desktop 在关闭后的首次检查就已消失,没有一次需要退避重试。
覆盖的模式包括:
normal、close、ui-dpi、ui-edit、ui-selection-context、ui-copy-system、ui-copy-context-system、ui-clipboard-system等。缺失的 5 条是什么
是故意构造 desktop 失败的负例夹具,本就不该出现沉降记录——即缺失是预期行为,不是数据漏洞。
对本项的意义
按本项验收文字,仍未复现原事件,因此保持开放;但"没有沉降数据"这一条不再成立。
边界
JavaZeroo commentedon Nov 1, 2026
按「不死磕」原则关闭:watchdog 清空 Job 后 owned desktop 仍可打开
关闭理由
用户明确「可以接受不完美、不需要一直死磕一个问题」。本项属于批次内不可复现、诊断已就位的一类,因此按此原则关闭。
本项已有的证据
run 41198898623 的 425 个
sample.json:desktop_close_settle全部为[{elapsed_ms:0, gone:true}],即关闭后首次检查即消失、无退避;缺失的 5 条均为刻意构造的desktop-failure负例。已就位的诊断(再次命中时可立即判读)
sample.json的desktop_close_settledesktop_gone关闭时的真实状态
本项不是根因修复。原始失败记录仍保留,未被新批次覆盖。
重开条件
若同类失败再次出现,凭上述诊断字段可直接判读,恢复本项即可,无需重做本轮探索。