Skip to content

fix: serialize state-file dead-owner recovery attempts - #29

Open
imxyanua wants to merge 13 commits into
EvoMap:mainfrom
imxyanua:codex/fix-state-lock-recovery
Open

imxyanua wants to merge 13 commits into
EvoMap:mainfrom
imxyanua:codex/fix-state-lock-recovery

Conversation

@imxyanua

@imxyanua imxyanua commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Stacked on #28. The additional state-file fix is commit 35ba6cc; its delta is only acquisition/updateState and a new state-lock regression file. Review #28's admission protocol first.

A dead-owner reclaimer can move a fresh state-file lock aside; a third process then enters while its legitimate owner is still mutating. The existing rename/check/restore sequence does not preserve exclusivity.

short atomic admission
  → create owner OR inspect/reclaim dead owner
  → release admission
exclusive state-file token → read / mutate / replace → release token

Serialize every acquisition attempt, including creation, through the shared admission protocol. Keep legacy token files. Retry transient sharing denial within the existing two-second deadline; failed admission never calls the mutator. The strict no-token ELOCKED contract also matches #19's state-safety change.

Evidence

  • Before: a public updateState A/B/C-process reproducer observes two mutators concurrently and loses one of three increments, before the wait-timeout fallback.

  • After: every increment survives. New regressions also refuse unguarded mutation, recover dead owners, retry a single sharing denial, preserve state on fatal/setup denial, and bound repeated reclaim failure.

  • After rebasing onto final fix: keep stale worker-lock recovery exclusive #28 head 71f98f8: combined state/worker/file-store tests 27/27 passed on Windows Node 24. Earlier state tests also passed on Node 22 before that parent refresh.

  • The existing four-process ×25-update workload is unchanged. All eight hosts pack. No real account/Proxy/Hub calls; final CI runs full Node 22/26.

  • Final head 35ba6cc passed GitHub CI run 76. External combined PR19–29 validation passed full 757/757 and packing all nine hosts on Linux Node 22 and 26.

  • Integration with feat: add native MiniMax Code host support #19 overlaps in acquire(): the tested external copy uses this commit's exact acquisition function and retains feat: add native MiniMax Code host support #19's readState/writeState/release changes. No Git merge was performed. That composition and its source hash are recorded; future branch integration must rerun CI.

  • Final combined validation (immutable source SHA256 1333f0491d643b2fed2188e6c553d0007cf9bdfd88db0d4235c9f50a2e13b610): Linux Node 22/26 full 757/757 each, pack nine hosts; Windows Node 26 scoped 394 passed / 9 existing skips, pack nine hosts. Windows Node 22 scoped 393 passed / 1 after-hook cleanup failure / 1 cancellation / 9 skips; packing was not run after that failure. The MiniMax body saved its draft and settled its candidate, and report delivery later settled, but cleanup exceeded its unchanged 20s wait. Cause remains unclassified; no rerun, assertion or timeout relaxation. All 388 source files kept their hashes after all four cells. This is a local acceptance gap, separate from each PR's successful CI.

Merge Danger

Door: two-way

The state-file token format and data schema are unchanged. Failed access reports ELOCKED instead of running an unlocked mutator.

Blast Radius: persistence

Affects settings, candidates, drafts and session updates across hosts. Updated cooperating callers participate in admission; restart older hosts after updating. This PR contains #28 as its parent dependency and should not be merged independently of that review.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

审核覆盖提示: 2 个 hunk/条目缺少完整输入;它们不作为 bug 报告。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=29、head_sha="35ba6cc32a282b03d91a09e498504c3fad84f979",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 35ba6cc32a28

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 准入锁释放异常会丢失已获取的锁句柄并永久阻塞状态入口 — admitted() 已执行完 mutate()、创建真实锁后,会在 finally 中调用 releaseAdmission()。若该清�...(truncated) · lib/runtime/store/file-lock.js · advisory_cb983e418783dc3853b030a6
  • [P3] 竞态测试失败时可能永久等待子进程 — 主测试的 until 最多等待 10 秒后抛错,但 t.after 随即无超时地执行 await Promise.all(children)...(truncated) · test/runtime/state-lock.test.js · advisory_a3f0a55dd73f1ebb414d777f

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 35ba6cc32a28

@forrestlinfeng forrestlinfeng left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review — changes requested

Good that this reuses #28's admission rather than building a second mechanism. But it inherits #28's unrecoverable-guard flaw and widens its blast radius.

Blocker

  • With every updateState now going through admission and throwing ELOCKED instead of running unguarded, a stranded state admission (PID reuse, or failed release under our own PID — see the #28 review) makes every update to that file (settings, sessions, drafts, candidates) throw forever until someone deletes the guard by hand. Before this PR the worst case was one unguarded write. Needs the same age fallback as #28.

Major

  • Lock lost when admission release fails right after acquire (file-lock.js ~L85-100): mutate writes lockPath and returns acquired, then releaseAdmission throws ELOCKED (not in the retry list) and acquire returns null. The token stays with our live PID, so all later updates from every process see busy → ELOCKED. Unlink our token before rethrowing.
  • Dead move-aside code + stale comment (~L59-75): reclaim() still moves the lock aside, re-checks and linkSyncs it back, guarding a race that full admission now rules out. The comment at ~L59-60 describes that race and is now wrong. Replace with a plain unlink; update the A-moved-fresh test accordingly.

Minor

  • ELOCKED now propagates to every stores.*.update caller (file-stores.js). legacy.js swallows it; the other call sites, especially hook paths that must never block a session, need an audit.
  • if (token) at ~L124 can no longer be false.
  • The three-state status object plus null is more protocol than needed: return the token, null, or throw.
  • One test waits the real 2 s timeout; the spawn/marker harness is a third copy (see #28).

Also: the description notes acquire() overlaps #19 — that combination needs a real merge + CI run.

@cursor

cursor Bot commented Nov 3, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 5 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

审核覆盖提示: 4 个 hunk/条目缺少完整输入;它们不作为 bug 报告。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=29、head_sha="68fab84ae688b9bfa7fa2ff4aff280c4b58cbaeb",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 68fab84ae688

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 5 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P2] 竞态回归可能让测试清理永久等待子进程 — 两个竞态测试的前台轮询都有 10 秒截止时间,但 teardown 仅写入 marker,随后无超时地 await P...(truncated) · test/runtime/file-lock.test.js·advisory_07c132de1183bf280c0a62b8`
  • [P2] 进程身份检查依赖环境解析外部可执行文件 — POSIX 分支以裸名称 ps 调用 spawnSync(),会按继承的 PATH 查找可执行文件;Windows 分支虽然...(truncated) · lib/runtime/store/file-lock.js · advisory_a1a8d355f9821c8adbfc2440
  • [P3] 竞态测试清理仍可能无限等待子进程 — t.after 会写入若干 marker,但随后直接 await Promise.all(children),没有超时、强制终止或对仍�...(truncated) · test/runtime/state-lock.test.js · advisory_9d08a8d31c6b68b7c68158ef
  • [P3] 补偿清理失败会遗留当前进程不可回收的状态锁 — 新增 admission 清理失败时,acquire() 会尝试删除刚取得的真实锁;但该删除同样只重试三次�...(truncated) · lib/runtime/store/file-lock.js · advisory_f52d22c9a6fa9ff8cd4da630
  • [P3] 锁操作可通过 PATH/SystemRoot 劫持执行外部程序 — Unix 上新增代码以裸命令名 ps 调用 spawnSync(),会按继承的 PATH 搜索可执行文件;Windows �...(truncated) · lib/runtime/store/file-lock.js · advisory_678a4f2b63a9e2329367056a

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 68fab84ae688

@forrestlinfeng forrestlinfeng left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 — not yet

Fixed: the state token is now cleaned up when admission release fails (new test at test/runtime/state-lock.test.js:22-38), and the always-true if (token) is gone. 24/24 tests pass over 3 runs.

Blocking

  • Inherits #28's open major (subprocess spawn on every process's first lock) — every updateState goes through admission, so every hook pays it. Needs #28's fix first.
  • Dead move-aside code is still there — lib/runtime/store/file-lock.js:77-93 reclaim() still renames the lock aside, re-checks and linkSyncs it back. With all creation/reclaim serialized by admission that race can't happen any more. Please replace it with a plain unlink and remove the now-impossible A-moved-fresh branch in state-lock.test.js (~L189, ~L247).

Still open (should fix)

  • The status object plus null from acquire (~L104-124) — return the token, null, or throw.
  • Shared test harness with #28; the test that waits the real 2 s timeout.
  • ELOCKED propagation: the hook path is safe (lib/agent/driver.js catches), but other stores.*.update callers weren't audited.

Note: the full suite at this head hung once in test/hosts/antigravity/hooks.test.js and grok's session end took 1604 ms vs its 1.5 s budget; main passed the same files twice. The extra spawn latency makes timing-bound hook tests worse, so please check CI after the #28 fix.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 5 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=29、head_sha="db07038a989e4293db24cf17d12565d6629e73ec",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 db07038a989e

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 5 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 竞态测试的子进程清理可能无限等待 — children 只保存子进程关闭 Promise,没有保留 ChildProcess 句柄。正常路径和 t.after 都无超��...(truncated) · test/runtime/state-lock.test.js · advisory_4ad6951f8d38450894bb3dca
  • [P3] 工作失败叠加释放失败会隐藏锁泄漏并阻断重试 — 当工作和释放同时失败时,新增的 workFailed 分支只重新抛出工作错误并吞掉释放错误。锁�...(truncated) · lib/runtime/store/file-lock.js · advisory_c8d1fe742cd64b521ca26b29
  • [P3] 竞态回归测试的清理可能永久等待子进程 — 清理函数仅创建恢复/释放 marker,随后无期限等待所有子进程的 close;若某子进程卡在 wit...(truncated) · test/runtime/file-lock.test.js·advisory_5934879b4b648ee4aa18fa19`
  • [P3] 进程身份检查可被环境变量劫持执行外部程序 — 新增的 processBirth() 使用 spawnSync() 执行外部进程身份查询。POSIX 路径使用裸命令名 ps,�...(truncated) · lib/runtime/store/file-lock.js · advisory_564a7cbc3e5643fe0c173082
  • [P3] 进程身份检查依赖可被环境覆盖的外部可执行文件 — POSIX 分支把裸命令名 ps 交给 spawnSync(),Windows 分支信任任意绝对的 SystemRoot。若高权限 ...(truncated) · lib/runtime/store/file-lock.js · advisory_87164f7c0fad00e382f65eea

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 db07038a989e

@cursor

cursor Bot commented Nov 3, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 5 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=29、head_sha="8015ec5a68ff9f99618a89dfeb9be9246f2389ee",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 8015ec5a68ff

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 5 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P2] Windows 准入锁回收可通过 SystemRoot 劫持外部程序 — 新代码仅要求 SystemRoot 是绝对路径,随后将其用于确定 powershell.exe。若宿主进程启动环��...(truncated) · lib/runtime/process/owner.js · advisory_bc362df801fe781e017297e0
  • [P3] 测试错误地期望回收当前进程仍持有的锁 — 测试先让当前进程成功创建锁,再让释放阶段持续无法读取 owner,因此锁目录和当前进程 ...(truncated) · test/runtime/file-lock.test.js · advisory_ffeef8d601c0073b4839ec56
  • [P3] Windows 进程探测仍信任可覆盖的 SystemRoot — 代码只确认 SystemRoot 是绝对路径,没有确认其指向可信的 Windows 系统目录。如果低信任入�...(truncated) · lib/runtime/process/owner.js · advisory_f42659c44411f6b1d65db599
  • [P3] reset/clear 后可能缺少 in-flight completion 防护 — 状态链探针:reset/clear path touches async state but no abort/generation fence is visible for in-flight completion...(truncated) · lib/runtime/store/admission.js · slice:release_integrity_01:state_chain_11c554fecb0b8815
  • [P3] reset/clear 后可能缺少 in-flight completion 防护 — 状态链探针:reset/clear path touches async state but no abort/generation fence is visible for in-flight completion...(truncated) · test/helpers/lock-contenders.js · slice:tests_01:state_chain_02236084a6cc60ba

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 8015ec5a68ff

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,并发现 1 个已核验问题。

无法定位到 diff 的已核验问题

释放失败仅记录在进程内,其他进程无法回收已放弃的锁

🟠 严重程度:中(P2)
release() 失败后只把 token 写入当前进程的 abandonedState。其他进程看不到该标记,而锁 token 中的 PID 仍然存活,因此 acquire() 既不会删除锁,也不再像旧实现那样降级执行;每次重试最终都会抛出 ...(truncated)

Finding:finding_92b7356f0f6c0586aa32d462 · 文件:lib/runtime/store/file-lock.js · 详情:/api/v1/aiqa/findings/finding_92b7356f0f6c0586aa32d462

当前为 advisory 仓库:这些 item 会逐条保留,但不阻塞合并。

另有 12 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=29、head_sha="b815a6db297bd45db533616eb2efe3028b67ab93",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 b815a6db297b

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 12 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] Windows 进程探测可被 SystemRoot 环境变量劫持 — processStartTime() 使用 process.env.SystemRoot 拼接并执行 powershell.exe,仅检查该路径是否为绝��...(truncated) · lib/runtime/process/owner.js · advisory_b3c20cc45162b8416eb3de56
  • [P3] 当前进程持有的锁被错误断言为可立即重试 — 测试在当前进程成功取得锁后,持续阻断 owner 读取,使释放阶段返回 ELOCKED,但随后没��...(truncated) · test/runtime/file-lock.test.js · advisory_c072e6c9b5701fab90461e62
  • [P3] Windows 进程身份探测信任可覆盖的 SystemRoot — processStartTime 仅检查 SystemRoot 是否为绝对路径,然后拼接并执行 ${SystemRoot}\System32\WindowsP...(truncated) · ``lib/runtime/process/owner.js`` · advisory_4410b4eac8b57a5911c7e960`
  • [P3] admission 清理失败后错误地断言同一进程可立即重新获取 — 测试阻断 ${lock}.admission 下 owner 文件的删除,模拟 acquire 补偿清理失败。随后测试明确断��...(truncated) · test/runtime/file-lock.test.js · advisory_a53dcd285261120465a07415
  • [P3] 竞态测试在启动阶段可能因写入 undefined 直接失败 — 测试将 updateState 当作创建启动 marker 的方法,但 mutator 返回 undefined。如果状态写入按 JSO...(truncated) · test/runtime/state-lock.test.js · advisory_9c60151852a21a71caaf55ba
  • [P3] 释放失败后测试错误地回收当前进程仍持有的锁 — 测试在 withLock() 的工作回调中先读取当前进程创建的 owner,随后持续让该 owner 文件读取�...(truncated) · test/runtime/file-lock.test.js · advisory_fc44e851e2b35678951abec0
  • [P3] Windows owner 探测的可信边界可能被环境变量绕过 — Windows 进程身份探测若使用可覆盖的 SystemRoot 拼接系统命令路径,调用方可让 owner 探测执�...(truncated) · lib/runtime/process/owner.js · advisory_29325f75bcda45e0d764dd25
  • [P3] reset/clear 可能被旧的异步完成结果反向污染 — 若 reset/clear 只清除当前缓存或登记状态,没有代次、取消令牌或完成时身份校验,清理�...(truncated) · lib/runtime/store/admission.js · advisory_e7c61954c732e987744c3304
  • [P3] reset/clear 后可能缺少 in-flight completion 防护 — 状态链探针:reset/clear path touches async state but no abort/generation fence is visible for in-flight completion...(truncated) · lib/runtime/store/admission.js · slice:release_integrity_01:state_chain_11c554fecb0b8815
  • [P3] reset/clear 后可能缺少 in-flight completion 防护 — 状态链探针:reset/clear path touches async state but no abort/generation fence is visible for in-flight completion...(truncated) · test/helpers/lock-contenders.js · slice:tests_01:state_chain_02236084a6cc60ba
  • [P3] 释放失败后的锁状态在进程内外不一致 — 释放失败只在当前进程内被标记为“已放弃”或允许重试,但持久化锁仍记录当前存活 PID��...(truncated) · lib/runtime/store/file-lock.js · advisory_897e7a0f79abff434eb3f520
  • [P3] 锁释放失败后测试错误地期望同一进程立即重新获取存活锁 — 测试在第一次 updateState() 的 mutator 中强制让 ${target}.lock 的 unlinkSync 失败。第一次写入��...(truncated) · test/runtime/state-lock.test.js · advisory_3fa933e0368928b0fa4d51ae

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 b815a6db297b

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,并发现 1 个已核验问题。

无法定位到 diff 的已核验问题

新增文件末尾缺少 test() 闭合,测试套件无法解析

🔴 严重程度:高(P1)
文件最后一个 test('a delayed dead-admission reclaimer ...') 回调在 assert.ok(outcomes.every(...)); 后没有补上 });。新增文件因此以未闭合的调用结束,Node 在解析阶段直接抛出 SyntaxError: Unexpected end of input,��...(truncated)

Finding:finding_715605dd73201afe358d73cd · 文件:test/runtime/file-lock.test.js · 详情:/api/v1/aiqa/findings/finding_715605dd73201afe358d73cd

当前为 advisory 仓库:这些 item 会逐条保留,但不阻塞合并。

另有 16 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=29、head_sha="41aee5e853d22ab82cf7ca5c4835a36ccc3f669a",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 41aee5e853d2

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 16 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P2] Windows 进程身份探测信任可覆盖的 SystemRoot — 新增代码仅验证 SystemRoot 是绝对路径,随后便从该目录启动 PowerShell,并向子进程传递完��...(truncated) · lib/runtime/process/owner.js · advisory_deb3888908e2db60c7955ea9
  • [P3] 清理失败后测试错误地要求同一进程立即回收仍存活的锁 — 测试在当前进程成功创建 state lock 后,故意阻断该 lock 及 admission owner 的删除;恢复 fs.unlin...(truncated) · ``test/runtime/state-lock.test.js`` · advisory_e1f4c3cadac841d64692e21b`
  • [P3] 状态锁释放失败时会丢失原始更新错误,并遗留当前进程 owner — updateState() 使用 finally 调用 release()。当 mutate() 或 writeState() 已经抛出原始错误,而 ...(truncated) · ``lib/runtime/store/file-lock.js`` · advisory_2070cd68a2d8c502330d566c`
  • [P3] 释放失败后错误地断言同一存活进程可立即重获锁 — 测试故意使释放阶段无法读取 owner,随后恢复读取权限,却没有删除锁目录、使锁过期或�...(truncated) · test/runtime/file-lock.test.js · advisory_92331d987e4ed1c318fd87ca
  • [P3] 竞态测试用 undefined 写入状态文件,启动阶段即失败 — 子进程用 updateState(marker(role + '-startup.json'), {}, () => undefined) 创建启动 marker。updateState 的 ...(truncated) · test/runtime/state-lock.test.js · advisory_eadeb50dabb31702038bd2a7
  • [P3] 工作失败时会吞掉锁释放失败,导致其他进程长期无法获取锁 — lock.release() 失败时会把锁标记到当前进程内存中的 abandonedWork,但 withLock 仅在工作成功...(truncated) · lib/runtime/store/file-lock.js · advisory_df286af9559be93f66ed2efa
  • [P3] 持有当前进程锁时错误地断言可立即重新获取 — 测试在 owner 仍属于当前存活进程、且没有将锁标记为 stale 或清除 owner 的情况下,断言下一...(truncated) · test/runtime/file-lock.test.js · advisory_09cf0fa7094716b5d0daa3ce
  • [P3] 释放失败后的测试错误地把仍由当前进程持有的锁当作可回收锁 — 测试在 withLock 回调中创建当前进程持有的锁,并持续让 owner 文件读取返回 EIO/EBUSY/EPER...(truncated) · ``test/runtime/file-lock.test.js`` · advisory_50b22e84b16b7a8165a54075`
  • [P3] 释放失败后,同一进程被错误地断言可以立即重新获取 admission 锁 — 测试通过当前进程创建 admission owner,随后故意让释放阶段的 unlinkSync 失败。失败恢复后,...(truncated) · test/runtime/file-lock.test.js · advisory_7c5865f20ae5f42c98f40a68
  • [P3] reset/clear 与异步完成回调之间缺少生命周期屏障 — 多个分片独立指出 reset/clear 后可能仍有 in-flight completion。若清理操作已经重置 owner、状态...(truncated) · ``lib/runtime/store/admission.js, lib/runtime/store/file-lock.js`, `test/helpers/lock-contenders.js...(truncated)` · `advisory_96e460c188b75e8005518ec6`
  • [P3] reset/clear 后可能缺少 in-flight completion 防护 — 状态链探针:reset/clear path touches async state but no abort/generation fence is visible for in-flight completion...(truncated) · lib/runtime/store/admission.js · slice:release_integrity_01:state_chain_11c554fecb0b8815
  • [P3] reset/clear 后可能缺少 in-flight completion 防护 — 状态链探针:reset/clear path touches async state but no abort/generation fence is visible for in-flight completion...(truncated) · test/helpers/lock-contenders.js · slice:tests_01:state_chain_02236084a6cc60ba
  • [P3] 并发测试失败路径可能无限等待子进程,watchdog 只杀单个子进程 — 测试通过 lockContenders(...) 启动多个子进程,并在 results() 等待它们全部结束;当前文件只...(truncated) · test/runtime/state-lock.test.js · advisory_3068764b0ca4e4a7f99276e3
  • [P3] 新增锁测试缺少 test() 闭合,导致测试套件无法解析 — release_integrity_02 已确认新增文件末尾缺少 test() 闭合。该文件同时被 api_contract_01 和 rel...(truncated) · ``test/runtime/file-lock.test.js`` · advisory_e92112800e6642b25bdb7ce4`
  • [P3] 竞态测试的状态输入与子进程 watchdog 契约不匹配 — 状态锁测试使用 undefined 写入状态文件,可能在启动阶段直接失败;并发测试失败路径又��...(truncated) · test/runtime/state-lock.test.js`, `test/helpers/lock-contenders.js · advisory_15ae2a88385d65b7da88b2c7
  • [P3] 锁释放失败后的实现语义与测试恢复语义不一致 — 实现分片报告释放失败时可能保留当前进程 owner、吞掉释放错误,甚至丢失原始更新错误;...(truncated) · ``lib/runtime/process/owner.js, lib/runtime/store/admission.js`, `lib/runtime/store/file-lock.js`, ...(truncated)` · `advisory_6494a63d040642a54b954d17`

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 41aee5e853d2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants