Skip to content

feat: support Kimi Code CLI and Desktop on Windows - #31

Draft
imxyanua wants to merge 17 commits into
EvoMap:mainfrom
imxyanua:codex/kimi-code-windows
Draft

imxyanua wants to merge 17 commits into
EvoMap:mainfrom
imxyanua:codex/kimi-code-windows

Conversation

@imxyanua

@imxyanua imxyanua commented Nov 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Add one Windows plugin for local sessions in Kimi Code CLI 2.4.1 and Desktop 1.2.1. Install it once with node scripts/install-kimi.mjs install, then start a new Kimi session. Keep Kimi CLI and Node.js 22.13+ available for draft creation.

Kimi Code CLI or Desktop
  → recall a Recipe into the prompt
  → reconcile native edits and checks
  → distill a verified turn through isolated Kimi CLI ACP
  → review the private draft with evolver-drafts

The shared changes render Capsule steps as case evidence and keep private drafts in the plugin's review list. A separate explicit publish command still requires Proxy verification.

Evidence

  • Before: Kimi had no registered host. A Recipe with required Capsule steps could fall back to a single strategy, and a Proxy-stored result could be absent from the draft list.
  • After: Windows CLI acceptance covered Recipe recall through a live Proxy and Hub, a passing check, and one private draft using an API provider. Windows Desktop acceptance used the native app with fixture services and covered the same flow, including process ownership and ACP cleanup.
  • Windows Node 22 npm run test:kimi and npm run pack passed on the isolated branch. The Windows Node 26 and Linux matrices are in CI.
  • Scope: local Windows CLI and Desktop sessions with API providers. Live Desktop backend, managed OAuth inference and macOS acceptance remain pending.

Merge Danger

Door: Two-way. The installer can unregister the plugin while retaining user data.

Blast Radius: Shared. Recipe recall, draft handling, native evidence and Windows runtime changes merit review alongside the Kimi integration.

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

GitHub CI 未通过。 此状态来自当前 CI gate,不是 Sentinel finding;请以最新 CI attempt 的日志为准。

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

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

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

由 Sentinel 审核 · 目标提交 aafc954c44c8

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 强杀 guardian 时可能遗留 native 子进程并永久阻塞后续调用 — 兜底仅对 guardian 的 PID 调用 child.kill('SIGKILL'),不会执行 guardian 的回收逻辑,也没有向其��...(truncated) · lib/runtime/acp-model.js · advisory_56cd503ffceafac9b3919f88
  • [P1] Windows 所有者探针永久复用首次进程快照 — windows ??= windowsAncestorsOf(process.ppid) 将首次 CIM 结果永久保存在 ownerProbeOf 闭包中。后续生�...(truncated) · lib/runtime/process/owner.js · advisory_719c5703548faae716f012a3
  • [P2] Windows 非 shim 进程超时后可能继续运行 — 本次修改让 taskkill() 在模块初始化得到 SYSTEM32 === null 时静默跳过。runProcess() 的缺失检�...(truncated) · lib/runtime/process/spawn.js · advisory_2b4e80da42986e2f752b9932
  • [P2] 草稿发布协议升级缺少 Proxy 版本协商与兼容回退 — 本 PR 将发布协议同时升级为新端点 /asset/reverify 和新的 publish_receipt 请求字段,但调用前...(truncated) · lib/app/commands/drafts.js · advisory_5c3e9a47a15fa7108c241814
  • [P2] Windows shim 的含空格可执行路径未被引用,导致启动失败 — 新增的 cmdLine() 直接把 command 拼入 cmd.exe 命令行,只转义元字符而不对可执行文件路径�...(truncated) · lib/runtime/process/spawn.js · advisory_8a30292b6c9b9880eca00fa5
  • [P2] pending 终局候选绕过最终化屏障 — reconcileNativeTurn 会把此类 completed record 标记为 native.pending=true,表示检查尚未结束;但 ac...(truncated) · lib/app/native-turn.js·advisory_0ced260029c2dead1398e873`
  • [P2] native 恢复或读取失败会跳过当前生命周期事件 — 新增的 recoverNativeTurns、reconcileNativeTurn 和 ports.native.read 都在当前事件处理器之前被直��...(truncated) · lib/agent/driver.js · advisory_1fafa71bb57529068b251fb8
  • [P2] 未验证 receipt 可直接绕过发布前重新验证 — 新增门槛仅在 publishable === false 或 receipt 缺失时调用 /asset/reverify。因此,带任意 truthy rec...(truncated) · lib/app/commands/drafts.js · advisory_d9b395a9a1b30f7e0124d090
  • [P3] Windows 作业辅助文件未清理,后续启动会失败或被误取消 — 启动时以 flag: 'wx' 创建固定文件名 .evolver-job.ps1 与 .evolver-job.json,但成功、失败和取消...(truncated) · lib/runtime/process/windows-job.js · advisory_d7f6260c549281a4f8943dd0
  • [P3] stdin 关闭五秒后会强制终止仍在运行的原生命令 — Ingress() 在 wrapper stdin EOF 时设置 eof;主循环将 EOF 视为最多五秒的关闭宽限期,随后设为...(truncated) · lib/runtime/process/windows-job.js · advisory_a9b329176db5cf4c28690724
  • [P2] 长时间 native monitor 会阻塞同批后续任务 — 旧实现把完整任务数组一次交给 runTasks(tasks);新实现逐项串行执行,并等待 monitorNativeTur...(truncated) · lib/channels/worker/runner.js·advisory_3cdb7de62896a8015e127125`
  • [P3] 含 # 的普通参数会遮蔽后续验证命令 — 新增的 SHELL_DATA 将任意位置开始的 # 及其后所有字符都当作注释替换;但 POSIX shell 中,...(truncated) · lib/verification.js·advisory_e6c166b7827d50fbaea7302c`
  • [P3] 会话结束竞态会把未完成的 native finalization 永久标记为已完成 — endedSession() 保留 native、turn 和 pid,但清除顶层 turnId。如果 session-end 发生在 reconcile ...(truncated) · lib/app/native-turn.js · advisory_dd3c68cdfe9b423de9cc0fac
  • [P3] 完成协调后返回过期的 native 状态 — session 更新已经把 authoritative native 写成 settled: true、设置最新 pending/candidateMade,但返回...(truncated) · lib/app/native-turn.js · advisory_854289b9cdca4623b3c971e6
  • [P3] 崩溃后带 finalizationPending 的候选永久无法恢复 — 该标记同时阻止当前会话认领、将候选排除在 leftover 判断之外,且没有 TTL 清理路径;进程...(truncated) · lib/distill/candidate.js · advisory_fce3cb88a111450f8d0d92ee
  • [P3] 监控器在事实批次受限时直接退出,无法读取后续终态记录 — recordsOf() 将读取限制为 MAX_BATCH,并通过 mark 支持继续读取;但监控器看到 facts.limited ...(truncated) · lib/runtime/native-monitor.js · advisory_b3162b937d55003f82297053
  • [P3] 运行期间配置损坏后仍沿用已启用的内存状态 — configure 重新读取配置失败时只抛出 INVALID,没有把返回对象的 recall、autoDistill 和 erro...(truncated) · lib/runtime/settings.js·advisory_f0ed46716706a02ae6677535`
  • [P3] 可伪造的临时目录标记可能误判为 headless 运行 — 新增回退仅校验目录名称、父目录、文件类型、长度和固定内容,没有验证目录由 markHeadle...(truncated) · ``lib/runtime/headless.js`` · advisory_b1c2087c1577a86ff9de2dba`
  • [P3] Windows 子进程清理与所有权判断可能形成永久阻塞 — 非 shim 进程超时后可能继续运行,强杀 guardian 也可能遗留 native 子进程;与此同时所有者探...(truncated) · ``lib/runtime/process/windows.js, lib/runtime/process/owner.js`, `lib/runtime/process/windows-job.j...(truncated)` · `advisory_8b0c6a7c85159370b0318da9`
  • [P3] native finalization 的屏障可被上下游共同绕过 — monitor 在事实批次达到上限时可能未读到终态便退出;driver/worker 的恢复、读取或监控异常��...(truncated) · ``lib/runtime/native-monitor.js, lib/agent/driver.js`, `lib/channels/worker/runner.js`, `lib/app/na...(truncated)` · `advisory_b76a533a683cf105cf92c406`

另有 14 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 aafc954c44c8

Comment thread test/hosts/kimi/packed-hooks.test.js Outdated
import { closeProxyWhenSettled, fakeProxy } from '../../helpers/fake-proxy.js';

async function run(command, args, { env, cwd, input = '', shell = false }) {
const child = spawn(command, args, { env, cwd, shell, windowsHide: true, stdio: ['pipe', 'pipe', 'pipe'] });

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hook 超时仅在进程退出后检查,死锁会导致测试与 CI 一直挂起

🟠 严重程度:中(P2)
run() 只监听子进程的 error 和 close,没有计时器、取消信号或进程树终止逻辑。handler.timeout 仅在 await run() 返回后才通过耗时断言检查,因此无法处理真正的挂起;使用 shell: true 时还会多出 shell/实际命令两级进程,外层测试取消也未确保清理整棵进程树。

Finding:finding_b3e5a29e395eaffce41cf652

@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 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

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

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

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

由 Sentinel 审核 · 目标提交 7acad49cebcc

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] admission 释放失败会遗留调用方无法释放的活锁 — admitted() 先完成主锁创建,再在 finally 中调用 releaseAdmission()。若后者重试后抛错,调用...(truncated) · lib/runtime/store/file-lock.js · advisory_5d89d977fe70b72c30182e61
  • [P1] 强杀 guardian 未终止原生子进程,重试可能产生重复执行 — 兜底只向 guardian PID 发送 SIGKILL,没有终止其原生子进程或整个进程组。POSIX 上杀死父进程...(truncated) · lib/runtime/acp-model.js · advisory_fabdeaf2d71c569afb141381
  • [P1] Windows Job 停止失败后的兜底只终止 helper — native 进程已经由 startWindowsJob() 启动后,terminate() 的异常兜底仅执行 child.kill('SIGKILL')。...(truncated) · lib/runtime/process/acp-child.js · advisory_2301a08438528d086933a4aa
  • [P2] 新发布协议缺少 Proxy 能力门禁与兼容路径 — 本 PR 强制无收据草稿调用新增的 /asset/reverify,并在提交时新增 publish_receipt 字段,但发�...(truncated) · lib/app/commands/drafts.js · advisory_1a2cb43d64429fd1824e34e1
  • [P2] 未决检查仍会提前激活候选 — pending 为 true 时,会话仍被写成 settled: true, pending: true, candidateMade: true;activateCandidate() ...(truncated) · lib/app/native-turn.js · advisory_22945beeed0cfc974dae68cf
  • [P2] 缺少 SystemRoot 时非 shim 进程超时后仍继续运行 — 本次修改让 taskkill() 在模块初始化得到 SYSTEM32 === null 时静默跳过,但启动前的缺失检查�...(truncated) · lib/runtime/process/spawn.js · advisory_2d48f851bc8f68a86a3ee5d8
  • [P2] 重试关闭未捕获异步 close() 的瞬时失败 — try { return proxy.close(); } 未 await 该 Promise;异步 rejection 会在函数返回后直接向调用方传播...(truncated) · test/helpers/fake-proxy.js · advisory_03ba56a4f763f424b87241ab
  • [P2] 监控器将可继续读取的分批状态当作终态退出 — nativeFactsOf() 在仍有后续记录时返回 limited: true 和可续读的 mark,但监控器看到 facts.limi...(truncated) · lib/runtime/native-monitor.js·advisory_a6d3d8d8e3d6e69eed45caa6`
  • [P2] 结算失败后同一进程无法重新领取候选任务 — 本次修改把“其他活进程持有”收紧为“任意活进程持有”。领取成功后若 settle() 的 cand...(truncated) · lib/distill/candidate.js·advisory_e022ef1f9128c834b9f15afb`
  • [P3] 收据替换失败注入缺少环境变量,测试会失去覆盖能力 — preload 只在 to === process.env.FIXTURE_RECEIPT 且第二次替换时抛出 EPERM,但测试从未设置 FIXTURE...(truncated) · ``test/runtime/acp-receipt.test.js`` · advisory_4b9806214aacc43e74cc649a`
  • [P2] 候选激活可能遗漏并发写入的会话关闭状态 — activateCandidate() 先读取 sessions,之后跨越异步边界更新独立的 candidates 存储,并使用此�...(truncated) · lib/app/native-turn.js · advisory_7a318fab2324194e16a7d5b8
  • [P3] Windows 所有者探针无法从首次快照失败中恢复 — windows ??= windowsAncestorsOf(process.ppid) 将首次 CIM 结果永久保存在探针闭包中。首次超时、Power...(truncated) · lib/runtime/process/owner.js · advisory_6fa928d96eb06c3f97a5e09f
  • [P3] 受限事实文件存在检查后到打开前的符号链接竞态 — confined() 先验证路径各段没有符号链接并返回字符串路径;之后 jsonOf() 和 recordsOf() 再��...(truncated) · lib/runtime/native-facts.js · advisory_f2e734fb27411680b64b1bc2
  • [P3] 部分转录错误地采用会话末尾的模型配置 — 代码已经计算了目标 turn 开始时有效的 boundModelHint,但 partial 分支返回 { ...empty, status: 'pa...(truncated) · hosts/kimi/transcript.js·advisory_b27fa7d8ff40e1710319d409`
  • [P3] Windows 门禁验证的并非最终发布产物 — windows-kimi 生成的 dist 没有通过 artifact 上传/下载传给 publish;后者只依赖其成功状态,�...(truncated) · .github/workflows/release.yml · advisory_d75fd40a378a125a39e71660
  • [P3] headless 工作目录标记从未写入,环境变量被剥离时会失效 — 新增的 isHeadlessRun() 会读取工作目录中的 .evolver-headless 作为环境变量的后备判定,但本 P...(truncated) · lib/runtime/headless.js · advisory_5e0a17e775c36954706dd68e
  • [P3] 关闭 turn 后的失败重试会跳过尚未提交的报告与留存写入 — turnEnded() 首先通过 closeTurn() 持久化关闭状态,随后才依次执行报告入队、留存、notes/edit...(truncated) · lib/app/native-turn.js · advisory_c6cb009e54a1ae701f2a2199
  • [P3] 初始化文件部分写入后会永久阻塞同目录重试 — startWindowsJob() 使用两个独立的 writeFileSync(..., { flag: 'wx' }) 依次创建脚本和配置。若第二��...(truncated) · lib/runtime/process/windows-job.js · advisory_d588b1be48572f8d40180640
  • [P3] 原生模型子进程可通过完成结果回传 API 密钥 — 新实现将密钥放入子进程环境,但只阻止密钥进入准备文件、额外环境值和命令参数;对子...(truncated) · lib/runtime/acp-model.js · advisory_6c6b574a169bbae5169ba746
  • [P3] 发布协议升级缺少 Proxy 版本协商与旧协议回退 — 当前发布流程要求无收据草稿调用新增的 /asset/reverify,并在 /asset/submit 请求中发送新增�...(truncated) · lib/app/commands/drafts.js · advisory_8c949e85e5afc639e93a06da

另有 14 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 7acad49cebcc

@evomap-aiqa-bot

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

Copy link
Copy Markdown

Sentinel 正在审核此变更,尚未形成最终结论。

大 PR 拆片审核中

  • Sentinel 判断这个 PR 规模较大,已经拆成多个 slice 分别审核,所以会比普通 PR 花更久。
  • 当前 check 会保持进行中;这不是绿色通过,也不是红色阻塞。
  • Sentinel 会继续完成 slice review、Cross-Slice Verifier 和聚合;如果后续发现红区问题,会更新本 head 的审核结论。
  • 规模等级: huge
  • Slice 数量: 25

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

由 Sentinel 审核 · 目标提交 50c741f4920e

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

工作已完成后 admission 释放失败会把成功结果改报为失败

🔴 严重程度:高(P1)
releaseWorkLock() 已删除 lockDir 后,admitted() 才释放 admission;若此时删除 admission owner 持续得到 EACCES、EPERM 或 EBUSY,releaseAdmission() 抛错并穿透 withLock() 的 finally。因此任务副作用已经提交��...(truncated)

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

释放失败会遗留当前进程永远无法回收的锁

🔴 严重程度:高(P1)
release() 重试到截止时间后直接返回,既不抛错,也不记录待回收锁。锁内容包含当前仍存活的 PID,而 acquire() 只回收 PID 已退出的锁,因此同一进程后续更新始终把它视为有效占用,直到进程退�...(truncated)

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

status 与 update 的预检查绕过安装锁,可观察到包和注册表的中间状态

🟠 严重程度:中(P2)
registryOf()、ownEntry() 和 packageOf(target) 在 underInstallLock() 之前执行。更新事务先移动包目录、后写注册表,因此并发读取可组合出“注册表仍已注册、包目录暂时不存在”的非事务快照。status �...(truncated)

Finding:finding_457fc67ef68d0ac4ed4d6cf8 · 文件:scripts/install-kimi.mjs · 详情:/api/v1/aiqa/findings/finding_457fc67ef68d0ac4ed4d6cf8

状态锁释放超时被静默吞掉,存活进程无法再次更新

🟠 严重程度:中(P2)
新 release() 在删除锁文件持续失败并超过 deadline 后直接 return,updateState() 因而仍报告成功。遗留锁包含当前存活 PID;同一进程的后续 acquire() 不会把它视为死 owner,最终只能抛出 ELOCKED。

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

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

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

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

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

由 Sentinel 审核 · 目标提交 d8d51771bc47

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 清理超时后允许旧模型调用与重试并行执行 — POSIX 兜底在没有收到 nativeResult.treeClosed、也没有确认 guardian 已退出时,仅断开 IPC 并 unref...(truncated) · lib/runtime/acp-model.js·advisory_8455ff4780e01696da33d21a`
  • [P1] Windows 所有者探针永久复用首次进程快照 — windows ??= windowsAncestorsOf(process.ppid) 把第一次 CIM 快照永久保存在 ownerProbeOf() 的闭包中。��...(truncated) · lib/runtime/process/owner.js · advisory_f10cb4d2784417552f1b28c6
  • [P1] 缺少 SystemRoot 时超时取消不会终止非 shim 子进程 — 本次修改让 taskkill() 在 SYSTEM32 为空时静默跳过,但启动前的 ENOENT 防护只覆盖 shim: true...(truncated) · lib/runtime/process/spawn.js·advisory_174325dcb32a275067047d03`
  • [P1] Windows Job 停止失败时仅强杀 helper,可能遗留原生进程 — Windows 下 child 是 Job helper;job.stop() 抛错后兜底只执行 child.kill('SIGKILL')。代码已持有 re...(truncated) · lib/runtime/process/acp-child.js·advisory_89c9415ca8fc75257d25aae8`
  • [P2] 新发布协议缺少 Proxy 能力门禁与兼容路径 — 本 PR 对无收据或 publishable === false 的草稿强制调用新增的 POST /asset/reverify,并在后续 /as...(truncated) · lib/app/commands/drafts.js·advisory_c2ba3ec885eb8b24343881d1`
  • [P1] 崩溃时 finalizationPending 候选将永久不可恢复 — 新增逻辑同时禁止领取 finalizationPending 候选,并将其排除在“遗留候选”和 TTL 清理之外��...(truncated) · lib/distill/candidate.js · advisory_92e5d1a75b6e3bbb71d4d61d
  • [P2] 未决检查会提前激活候选并可能导致最终候选丢失 — waitingOn() 判定检查仍未决时,会话仍被写成 settled: true, pending: true, candidateMade: true;但 a...(truncated) · lib/app/native-turn.js·advisory_8ccca7ecdbcf70b61e0b6c88`
  • [P2] 仅凭收据字段存在即可跳过发布前可信复核 — 新增门禁使用 draft.publishable === false || !draft.publish_receipt 决定是否调用 /asset/reverify,而不...(truncated) · lib/app/commands/drafts.js · advisory_92a8a867ba03756f8709e54c
  • [P2] native monitor 抛错会中断整个 worker 任务批次 — native 分支直接等待 monitorNativeTurn(),没有把异常折叠进 clean。monitor 因 bridge、持久化或��...(truncated) · lib/channels/worker/runner.js · advisory_83e8d19f31ac62ff1772df9f
  • [P3] Windows 门禁未验证最终发布的带版本 Kimi 包 — Windows 门禁生成并检查的是默认版本包,而实际发布任务随后在另一平台重新生成带标签版�...(truncated) · .github/workflows/release.yml · advisory_93897e0abf650048648676c7
  • [P3] 模型输出缺少凭据泄漏检查 — 本 PR 将 selected.secret 注入原生进程的 EVOLVER_MODEL_API_KEY,并禁止配置文件、参数及额外环�...(truncated) · lib/runtime/acp-model.js · advisory_f24aeb8d1a04912a8c627578
  • [P3] Windows Job 输入队列瞬时满载会直接终止正在执行的任务 — bridge 使用容量仅为 4 的 BlockingCollection,但 Ingress() 对每行调用立即返回的 TryAdd(),队��...(truncated) · lib/runtime/process/windows-job.js · advisory_25eb14c041b43bffdf0edc75
  • [P3] selectedConfig 返回值重复暴露 API Key — credentialOf() 已将 API Key 提取为 secret,但 selectedConfig() 仍通过 { ...selected } 原样返回 se...(truncated) · ``lib/runtime/native-config.js`` · advisory_a2128bb187bcb5ae790d69b2`
  • [P3] || 短路分支中的未执行测试会被判定为验证通过 — 新逻辑按 [;&|\r\n]+ 拆分 shell 命令,却不保留 &&、|| 的控制流语义,因此会把 || 右侧��...(truncated) · lib/verification.js · advisory_0ea642057639e3166b70fe91
  • [P3] settle 持久化失败会留下同进程无法重新领取的活 claim — 本次修改把“仅阻止其他存活 PID”改成“阻止任意存活 claimedBy”。如果领取已持久化,但 ...(truncated) · lib/distill/candidate.js · advisory_ba762e809e774637378697a7
  • [P3] 事件批次达到上限时监控器停止追赶,终态可能永远无法对账 — native-facts.js 将超过 MAX_BATCH 的正常分页读取标记为 limited,但监控器把它当作不可恢复�...(truncated) · lib/runtime/native-monitor.js · advisory_db693dd002f53c46a56e4140
  • [P3] 发布版本盖章会把 vendored smol-toml 伪装成插件版本 — 新代码把 lib/vendor/smol-toml/package.json 加入闭包,而 isManifest() 仍把任意路径下的 package.jso...(truncated) · scripts/pack.mjs·advisory_8e2a7ed6540fa33091a7e1e2`
  • [P3] 完成证据未绑定到同一轮请求 — completionFacts() 仅要求唯一的 turn.prompt 与最后一条 turn.ended 对应,却未要求最后一条 llm...(truncated) · hosts/kimi/model.js·advisory_3f0ed5a46fef57aee3bee4f0`
  • [P3] 模型配置解除后,blocked 候选仍无法重试 — candidate.model 为空且存在 model.capture 时,任务直接返回 blocked/route_unresolved;后续重试仍�...(truncated) · lib/app/distill-session.js · advisory_f077acfa63ee54e4d997f5dd
  • [P3] 模型默认思考级别被丢弃并转换为 null — 对支持 thinking 的模型,若路由 hint 没有显式 effort,新增代码把 route.effort 设为 null,而...(truncated) · hosts/kimi/model.js · advisory_09a81c420a9aa4992f719421

另有 9 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 d8d51771bc47

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

工作锁已释放却向调用方报告失败,重试会重复执行任务

🔴 严重程度:高(P1)
releaseWorkLock() 先在 admitted() 的 mutate 中删除主工作锁目录;随后 releaseAdmission() 若失败,admitted() 使用默认空回滚并抛出 ELOCKED。因此任务及主锁释放均已成功,withLock() 却从 finally 抛错而...(truncated)

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

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

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

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

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

由 Sentinel 审核 · 目标提交 ed9e802e41d4

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 缺少 SystemRoot 时非 shim 进程超时后仍继续执行 — 新版 taskkill() 在 SYSTEM32 不可用时静默不执行;启动前的 ENOENT 防护却只覆盖 shim: true��...(truncated) · lib/runtime/process/spawn.js · advisory_4de4d8aeb47d92efa3364053
  • [P1] Windows Job 停止失败后仅强杀 helper,可能遗留原生进程 — Windows 下 child 是 Job helper。job.stop() 抛错后的兜底只执行 child.kill('SIGKILL'),没有使用已�...(truncated) · lib/runtime/process/acp-child.js · advisory_a1510a98e4ce92bd3facf030
  • [P1] Windows 所有者探针永久复用首次进程快照 — windows ??= windowsAncestorsOf(process.ppid) 将首次 CIM 快照永久保存在探针闭包中。后续检查不再��...(truncated) · lib/runtime/process/owner.js · advisory_ad6814c3302cbd19332f1f18
  • [P2] 带引号的验证命令可被误判为非验证命令 — 新增的 SHELL_DATA 会把整个双引号或单引号字符串替换为 __data__;当可执行文件本身被引��...(truncated) · lib/verification.js · advisory_40b833bc2aee649dda3fc418
  • [P2] 未决检查仍会激活尚未完成最终确认的候选 — reconcileNativeTurn() 将会话写成 settled: true, pending: true, candidateMade: true,随后调用 activateCand...(truncated) · lib/app/native-turn.js·advisory_f514931f6b56d9879c358b9d`
  • [P3] 收据替换失败测试未注入触发条件,实际没有覆盖目标回归 — preload 只有在 to === process.env.FIXTURE_RECEIPT 且第二次替换时才抛出 EPERM,但测试从未设置 F...(truncated) · ``test/runtime/acp-receipt.test.js`` · advisory_11b3da517bed12e40ace50dc`
  • [P3] 清理超时后旧模型进程仍可继续执行 — POSIX 兜底在没有收到 nativeResult.treeClosed、也没有确认 guardian 退出时,仅断开 IPC 并放任 det...(truncated) · lib/runtime/acp-model.js · advisory_1d841ecf63b8aab1ceab4ad1
  • [P3] 未提供 effort 时所有思考模型都会被拒绝 — thinking 为真时,effort 被设置为 null;随后条件要求 enabledEfforts.includes(effort),而 enable...(truncated) · hosts/kimi/model.js·advisory_0f4549848e78abb60631e202`
  • [P3] 取消或清理超时后,旧 native 模型进程仍可能继续执行 — dispose() 在未收到 nativeResult 或 guardian close 时进入兜底。Windows 路径只执行 child.kill('SIGK...(truncated) · ``lib/runtime/acp-model.js`` · advisory_ecb3cd4f3668a3293af66071`
  • [P3] 事实日志超过 4 MiB 时未继续分页对账 — recordsOf() 在剩余日志超过 4 MiB 时返回可继续读取的 mark 并设置 limited: true,但监控器看...(truncated) · lib/runtime/native-monitor.js · advisory_4441349e862b37c35f3158be
  • [P3] 取消无法覆盖 Job 创建前启动的编译器子进程 — stop() 只创建停止文件,而该文件要等 Add-Type 完成并进入 EvolverJob.Run() 后才会检查。代�...(truncated) · lib/runtime/process/windows-job.js · advisory_b648f054564db0d657079c2b
  • [P3] 托管 OAuth 路由被准备阶段丢弃,隔离 ACP 可能无法使用已选择的账号凭据 — managedAccess() 返回的托管凭据包含 tokenFile 和 deviceIdFile,但 prepareRoute() 完全没有读取 ...(truncated) · hosts/kimi/model.js·advisory_7c18f20b6f55baa3f0598754`
  • [P3] 状态命令误报仍可蒸馏的候选 — candidateLine() 直接用 Object.keys(pending).length 统计候选,但 claimedOwn() 明确跳过 finalizationPe...(truncated) · ``lib/app/commands/status.js`` · advisory_1de0cfb35b88a4731a823fe9`
  • [P3] 纠正路径复用旧会话快照,可能覆盖并发重判结果 — sessions.update() 返回的 feedbackSession 在删除候选前被捕获;等待 candidates.update() 期间,re-j...(truncated) · lib/app/prompt.js · advisory_ee6833194b7749c5382a40c9
  • [P3] 重复 prompt 记录会让已完成 turn 退化为未终态 — unique 用 turnId:promptId 去重时保留最后一条 prompt,随后以该记录的索引作为 turn 起点。如�...(truncated) · hosts/kimi/transcript.js · advisory_1519f93c1350f27a7a40cdc3
  • [P3] 默认安装可能静默复用过期的预构建 Kimi 包 — 安装器仅凭 dist/kimi 存在就复制该预构建包;packageOf(BUNDLE) 只检查标记、插件名、版本格...(truncated) · scripts/install-kimi.mjs · advisory_d21d1e0f88d24a5eeb991160
  • [P3] 路径校验与文件打开之间存在目录替换竞态,可越过读取根目录 — confined() 先通过逐级 lstatSync 和 realpathSync 确认文件位于 root,随后返回字符串路径;��...(truncated) · lib/runtime/native-facts.js · advisory_3f806e8cc352c5a9e07b531a
  • [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/acp-model.js · slice:release_integrity_03:state_chain_9e84061dbb91d8c8
  • [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/process/acp-child.js · slice:release_integrity_04:state_chain_a2ee1ee83c312e2e
  • [P3] reset/clear 后旧模型仍可完成并覆盖新状态 — release_integrity_03 指出清理超时后旧 ACP/native 模型进程仍可继续执行;release_integrity_04 指��...(truncated) · lib/runtime/acp-model.js · advisory_a0187d9a46ddcd6ec3f8a12c

另有 10 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 ed9e802e41d4

return token;
attempt = admitted(lockPath, () => {
try {
fs.writeFileSync(lockPath, token, { mode: 0o600, flag: 'wx' });

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

admission 释放失败时仍可能遗留当前进程持有的主锁

🔴 严重程度:高(P1)
主锁写入成功后,releaseAdmission() 若连续重试失败,admitted() 执行回滚;但回滚对主锁的读取或删除同样可能失败并抛出。acquire() 此时丢弃已取得的 token 并返回失败,而主锁文件保留当前仍存活的 PID。后续调用既不能持有该 token 来释放锁,也不会将其视为死进程锁回收,直到宿主进程退出。

Finding:finding_a5ce73178c4d6352afd22263

Comment thread scripts/install-kimi.mjs Outdated
if (dryRun) return { operation, path: target, dryRun: true };
if (operation === 'remove') {
if (own) underInstallLock(plugins, () => updateState(registryFile, { version: 1, plugins: [] }, current => {
validRegistry(current); ownEntry(current, target);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

remove 在锁外使用旧快照,可能跳过并发完成的安装

🟠 严重程度:中(P2)
registry、own 和 previous 都在 .evolver-plugin-install 锁外读取;remove 只有旧快照中的 own 为真时才进入锁并重新检查。若读取时尚未注册,而并发 install 随后提交注册,remove 会完全跳过加锁及当前状态检查,却返回 installed: false, registered: false。

Finding:finding_b1d69b87adee09290cf11502

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

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

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

由 Sentinel 审核 · 目标提交 397a7038b9f6

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 终态释放失败会遗留只有原进程才能回收的 admission — releaseAdmission() 失败时把 owner 仅记录在当前进程的 abandonedAdmissions 中;admitted() 在没有 r...(truncated) · lib/runtime/store/admission.js · advisory_80d11a10aa03eb25e10885ec
  • [P1] Windows Job 停止失败时只终止 helper,无法保证原生进程树退出 — Windows 下 child 是 Job helper;job.stop() 抛错后的兜底仅调用 child.kill('SIGKILL')。代码虽然已�...(truncated) · lib/runtime/process/acp-child.js · advisory_608fc09861c2703eed3b75fd
  • [P1] 未决检查仍会提前激活候选 — reconcileNativeTurn() 在 waitingOn(facts.record) 为真时,将会话写成 settled: true, pending: true, candida...(truncated) · lib/app/native-turn.js·advisory_ed4648704c014c38ff469ffd`
  • [P1] 缺少 SystemRoot 时超时与取消不会终止非 shim 子进程 — 本次修改使 taskkill() 在 SYSTEM32 为空时静默跳过,但启动前的 ENOENT 防护仅覆盖 shim: true...(truncated) · lib/runtime/process/spawn.js·advisory_c4aa58ee5de3083e5d7ea24f`
  • [P1] Kimi 会话 ID 未使用项目作用域,可能发生跨项目会话串线 — profile 将 native.sessionId 配置为 nativeSessionIdOf,而不是同文件已定义的 sessionIdOf。后者会�...(truncated) · hosts/kimi/profile.js · advisory_649beaec5f0e11eb746017e9
  • [P3] POSIX 清理超时后未终止 guardian 及原生进程树 — dispose() 等待原生进程关闭失败后,POSIX 分支只断开 guardian 的 IPC、执行 unref() 并销毁输��...(truncated) · lib/runtime/acp-model.js · advisory_af5a86d340ff24636f59acf0
  • [P3] 受限原生事实文件仍可在校验后被替换为外部符号链接 — confined() 完成路径逐段 lstat 和 realpath 校验后,调用方仍按原路径再次 statSync/openSync,...(truncated) · lib/runtime/native-facts.js · advisory_e2dfa81027aa0f2c51dcf8f9
  • [P2] 会话状态先提交、监控任务后入队,调度失败时无法及时收敛 — 新逻辑先持久化 native turn,再单独调用 scheduler,二者没有原子性、回滚或同事件内重试。��...(truncated) · lib/agent/driver.js · advisory_7b8f4e242bddaa253d23eee0
  • [P3] 不可读 owner 恢复测试错误地期待仍存活的锁可被获取 — 测试恢复文件访问后没有将锁目录标记为 stale,也没有结束当前 owner 进程;第二次获取仍��...(truncated) · test/runtime/file-lock.test.js · advisory_28ef1f29c17c10fb616bd904
  • [P3] 取消完成后仍可能遗留持有模型凭据的原生进程 — POSIX 兜底仅断开 guardian IPC、执行 unref() 并销毁输出流,没有终止 guardian、原生进程组或等...(truncated) · lib/runtime/acp-model.js · advisory_bd7bd7e5827b1da6a11f98d2
  • [P3] 收据替换失败测试没有注入触发条件,可能始终未覆盖目标回归 — preload 只有在 process.env.FIXTURE_RECEIPT 等于 receipt 路径时,才会在第二次替换触发 EPERM。��...(truncated) · test/runtime/acp-receipt.test.js · advisory_23ac0313ccb9734681fda6e6
  • [P3] 游标越过尚未落盘的任务后不会再次读取该任务 — wire 记录已经被解析时,若对应 task 文件暂时返回 ENOENT,代码会忽略错误,但仍返回越过�...(truncated) · lib/runtime/native-facts.js · advisory_2159685dfeea9607de4936c6
  • [P3] Headless 工作目录标记没有生产写入入口 — PR 新增 markHeadlessWorkdir() 和文件标记识别,以应对宿主删除环境变量,但当前完整 diff 中��...(truncated) · lib/runtime/headless.js · advisory_15af891a4d5e786866afca08
  • [P3] Windows owner 进程表快照永久缓存,失败后无法恢复 — readProcess 通过 windows ??= windowsAncestorsOf(process.ppid) 只读取一次进程表并永久复用结果。首�...(truncated) · lib/runtime/process/owner.js · advisory_ce133e87224f8e34fefd6c52
  • [P3] 修复配置文件后旧 settings 实例仍永久保留错误 — 初次读取失败后,error 被闭包永久缓存;configure() 在重新读取文件之前先执行 if (error) t...(truncated) · lib/runtime/settings.js·advisory_6232e8326d1e4dfff3ca1146`
  • [P3] 同一 turn 的重写会清除 finalizationPending — withCandidate() 只拒绝 pending[sessionId].turn > candidate.turn,同一 turn 仍会直接覆盖旧候选。当...(truncated) · lib/distill/candidate.js · advisory_0a3420fdde8d614625e29432
  • [P3] 成功对账返回的是终态写入前的原生状态快照 — 成功路径先把 session 更新为 settled: true 并写入 pending/candidateMade/nativeCursor,但返回的 nati...(truncated) · lib/app/native-turn.js·advisory_356541a4cd08c79b3e763fba`
  • [P3] 更新中断会丢失当前包并阻断后续更新 — 更新先将当前 target 重命名到随机临时目录中的 backup,再激活新包并提交注册表。若进��...(truncated) · scripts/install-kimi.mjs · advisory_0857851afbe1f6c777fb25a4
  • [P3] 目标文件已存在时可能永久重试 rename 而不写入 — 旧实现针对 fs.renameSync(temporary, target) 的 EEXIST 或 EPERM 会删除旧目标后重命名;新实现��...(truncated) · lib/runtime/store/file-lock.js · advisory_b68a0445c6c2474e1456672d
  • [P3] 设置已写入却因锁释放失败向调用方报告失败 — work() 成功后,withLock() 在 finally 中等待释放工作锁;若删除锁目录时报 EACCES、EPERM �...(truncated) · lib/runtime/store/file-lock.js · advisory_a597fe396f1195f61ad241e7

另有 9 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 397a7038b9f6

Comment thread lib/verification.js
// Keep separators inside strings, backticks and comments out of the command scan. A name in an argument is no
// check. This recognises direct commands and known wrappers; it does not evaluate arbitrary shell control flow.
const SHELL_DATA = /\\[\s\S]|`[^`]*(?:`|$)|'(?:''|[^'])*(?:'|$)|"(?:\\[\s\S]|`[\s\S]|[^"\\`])*(?:"|$)|#[^\r\n]*/g;
const ENVIRONMENT = /^(?:env\s+)?(?:[A-Za-z_]\w*=\S*\s+)*/;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

带引号的可执行文件不再被识别为验证命令

🟠 严重程度:中(P2)
新增的 SHELL_DATA 会将整个单引号或双引号段替换为 __data__。当引号包围的是命令本身时,后续命令识别收到的是 __data__ test,而不是 npm test,因此返回非验证命令。

Finding:finding_9f068c69dcc138f62ab1342f

@cursor

cursor Bot commented Nov 4, 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 4, 2026 •

Copy link
Copy Markdown

Sentinel 正在审核此变更,尚未形成最终结论。

大 PR 拆片审核中

  • Sentinel 判断这个 PR 规模较大,已经拆成多个 slice 分别审核,所以会比普通 PR 花更久。
  • 当前 check 会保持进行中;这不是绿色通过,也不是红色阻塞。
  • Sentinel 会继续完成 slice review、Cross-Slice Verifier 和聚合;如果后续发现红区问题,会更新本 head 的审核结论。
  • 规模等级: huge
  • Slice 数量: 27

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

由 Sentinel 审核 · 目标提交 1d4cec3359c3

@cursor

cursor Bot commented Nov 4, 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 4, 2026 •

Copy link
Copy Markdown

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

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

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

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

由 Sentinel 审核 · 目标提交 30ef90b0f649

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P2] 带引号的验证可执行文件会被漏判 — 新增的 SHELL_DATA 会把完整单引号或双引号片段替换为 __data__。当引号包住的是可执行文��...(truncated) · lib/verification.js · advisory_8619a35f6d54141b57bd14ea
  • [P2] route_unresolved 候选在配置修复后仍无法恢复 — 当候选的快照字段 candidate.model 为空且 runner 支持 capture 时,新增分支直接返回 blocked: ro...(truncated) · lib/app/distill-session.js·advisory_72784a37bd67faf23699f40f`
  • [P3] Windows Job 停止失败时没有按 native PID 终止或确认原生进程树 — Windows 分支在 job.stop() 抛异常后只调用 child.kill('SIGKILL'),这里的 child 是 Job helper,不是...(truncated) · lib/runtime/process/acp-child.js · advisory_60947ceafa45253a28b17fe7
  • [P3] 收据替换失败回归测试未设置触发条件,实际不会覆盖声明的异常路径 — preload 仅在 to === process.env.FIXTURE_RECEIPT 且第二次替换时抛出 EPERM。当前测试没有设置 FIXT...(truncated) · ``test/runtime/acp-receipt.test.js`` · advisory_b7e34651f9eacdf5eda58d31`
  • [P3] Kimi 会话键丢失项目作用域,可能串写不同项目状态 — hosts/kimi/paths.js 已定义 sessionIdOf(payload, context),会将 nativeScope 与原始 session_id 组合成�...(truncated) · hosts/kimi/profile.js · advisory_8bb0d3da1e1a7f8fe1cc3775
  • [P3] Windows owner 探针永久复用首次进程快照 — 当前实现把 windowsAncestorsOf(process.ppid) 的结果存入闭包变量 windows,只在首次读取时初始��...(truncated) · lib/runtime/process/owner.js · advisory_26c434a94b28e9b466e414b6
  • [P3] 取消或清理超时后,旧 native 模型进程可能继续运行并持有凭据 — dispose() 在等待 nativeClosed 和 guardian 关闭超时后,POSIX 路径只执行 child.disconnect()、child....(truncated) · ``lib/runtime/acp-model.js`` · advisory_7c2e3330a53dfe17f177c6e5`
  • [P3] 未决检查仍会提前激活候选 — pending 根据 waitingOn(facts.record) 被设置为 true,并写入 session.native.pending: true。同时 turn...(truncated) · ``lib/app/native-turn.js`` · advisory_5c7699ad3bbbe7807bad4310`
  • [P3] 未指定 effort 时拒绝所有支持 thinking 的模型 — thinking 为真且 hint.effort 缺失时,代码将 effort 设为 null;随后将其视为非 off 值,要�...(truncated) · hosts/kimi/model.js · advisory_15f8fc97a81de533c6720ff3
  • [P3] 受限路径检查与实际打开之间存在符号链接竞态,可越界读取文件 — confined() 先通过 lstatSync、realpathSync 检查路径位于声明的 root 内,但随后 jsonOf() 和 rec...(truncated) · ``lib/runtime/native-facts.js`` · advisory_f6b586319dca5e8355aef239`
  • [P3] 终止超时后 guardian 仍无限等待子进程关闭 — terminate() 对 stopped 只等待最多 3 秒,但 guard() 随后无条件执行 await stopped。如果 child �...(truncated) · lib/runtime/process/acp-child.js · advisory_df755ff90a87978ae695e5b7
  • [P3] writeState() 对持续 EEXIST 不再有替换路径 — 新代码把 EEXIST 作为可重试错误,但循环中不改变目标文件状态。相同的重命名请求会持��...(truncated) · lib/runtime/store/file-lock.js · advisory_84b57091e24e265641a060c4
  • [P3] 仅保留 WINDIR 时 taskkill 缺少其必需的 SystemRoot — SYSTEM32 可由 WINDIR 构造,但 taskkill() 只在 SYSTEM32 为空、改用 loader 回退时补充 SystemRoo...(truncated) · lib/runtime/process/spawn.js·advisory_794b4e878b31f50f6159abbb`
  • [P3] 工作锁终态释放失败会遗留仅本进程可恢复的锁 — 释放失败仅将 token 写入当前进程内的 abandonedWork。其他进程没有该 Map 记录;即使目录过��...(truncated) · lib/runtime/store/file-lock.js · advisory_a3fa2cccd15c6f82882439f5
  • [P3] 托管 OAuth 路由被接受后,私有 Kimi 配置丢失认证信息 — selectRoute() 对托管 OAuth 返回了 { kind: 'oauth-access', tokenFile, deviceIdFile },但 prepareRoute() 生...(truncated) · hosts/kimi/model.js · advisory_3e0675ae6c224cbde84d54e3
  • [P3] 首次 Native Prompt 可能因读取不存在的会话而被静默丢弃 — 新增逻辑在调用 promptSubmitted() 创建或更新会话之前,直接执行 ports.sessions.read(sessionId) ��...(truncated) · lib/agent/driver.js · advisory_b1a4b966a585e4822bb100f1
  • [P3] Windows shim 命令路径包含空格时未被引用 — 新增的 cmdLine() 只对 command 做元字符转义,没有像参数一样进行引用;随后该字符串作为...(truncated) · lib/runtime/process/spawn.js · advisory_1fb3c5c4bf8080f16b5f9ead
  • [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/acp-model.js · slice:release_integrity_03:state_chain_9e84061dbb91d8c8
  • [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/process/acp-child.js · slice:release_integrity_04:state_chain_a2ee1ee83c312e2e
  • [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

另有 3 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 30ef90b0f649

// The guard is released when its unique owner is gone. An empty directory can be reclaimed.
try { retryLockAccess(() => fs.rmdirSync(admission)); } catch {}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

释放失败的 admission 只能由原进程回收

🔴 严重程度:高(P1)
releaseAdmission() 删除 owner 失败后仅将残留 owner 记录在当前进程内存的 abandonedAdmissions。若调用方未提供 rollback,admitted() 吞掉该失败并返回成功;其他进程无法获知该标记,且 owner PID 仍存活时不会回收该 admission,直到原进程退出。

Finding:finding_324f8e26cffc50324a72e33a

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

Windows 缺失系统环境变量的回归测试实际未覆盖目标条件

🟠 严重程度:中(P2)
测试先复制完整的 process.env 到 env,随后只删除当前测试进程的环境变量,但最终把未修改的 env 传给 runProcess。因此被测子进程仍然拥有 SystemRoot、WINDIR、COMSPEC,测试不会覆盖标题所声明...(truncated)

Finding:finding_52ab140283577b8138bffd23 · 文件:test/runtime/process.test.js · 详情:/api/v1/aiqa/findings/finding_52ab140283577b8138bffd23

孤儿工作目录清理只检查根 PID,可能遗漏仍存活的后代进程

🟠 严重程度:中(P2)
cleanOrphans() 只对 guardianPid、nativePid,以及 Windows 下的 helperPid 调用 pidGone()。当 native 进程已经退出但它启动的子进程仍存活时,所有记录的 PID 都可能被判定为已结束,随后直接 `rmSync(home, { r...(truncated)

Finding:finding_64a1100798fe8856c762a1be · 文件:lib/runtime/acp-model.js · 详情:/api/v1/aiqa/findings/finding_64a1100798fe8856c762a1be

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

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

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

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

由 Sentinel 审核 · 目标提交 016cc978aa6b

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 释放与放弃标记同时失败会遗留不可跨进程回收的 admission — owner 删除失败后,代码尝试写入跨进程可见的 abandoned marker;若该写入也失败,只把 owner 记...(truncated) · lib/runtime/store/admission.js · advisory_3ce281a12fad8c55800d2c5b
  • [P2] 被引号包围的验证可执行文件会被漏判 — 新增 SHELL_DATA 会把整个单引号或双引号片段替换为 __data__。当引号包含的是命令位置上��...(truncated) · lib/verification.js · advisory_6cb6eb35a0a1e81f7812521b
  • [P2] 迟到的重复终态可反转已结算的检查结果 — calls 会永久保留 callId 对应的检查索引;已知调用的每一个 running: false note 都会无条件�...(truncated) · lib/turn/record.js · advisory_2c0d850008f094bba7e7ccc2
  • [P2] 首次进程表读取失败后,所有者探针无法恢复 — windows ??= windowsAncestorsOf(process.ppid) 将首次结果永久保存在闭包中。若首次查询失败并返回�...(truncated) · lib/runtime/process/owner.js · advisory_85d68b6baea119c24d546cb4
  • [P2] limited 事实批次会终止监控并遗留未决 turn — native-facts.js 将每批读取限制为 4 MiB,并通过 mark 支持继续读取,但监控器看到 facts.limit...(truncated) · lib/runtime/native-monitor.js·advisory_12475e14ffb9b13f61a4e421`
  • [P3] Admission 释放失败时可能永久阻塞其他进程 — releaseAdmission() 失败后,admitted() 调用 abandonAdmission(),但该函数在写入持久化 abandoned-*...(truncated) · lib/runtime/store/admission.js · advisory_423e0552417658c2067c06c2
  • [P3] 收据替换失败回归测试未设置实际触发条件 — preload 仅在 to === process.env.FIXTURE_RECEIPT 且第二次 renameSync 时抛出 EPERM,但该测试没有设�...(truncated) · test/runtime/acp-receipt.test.js · advisory_dc16675f45aa6d6ecbe59d4a
  • [P3] Kimi 会话键丢失项目作用域,可能串写不同项目的生命周期状态 — hosts/kimi/paths.js 已实现 sessionIdOf(payload, context),会将 nativeScope 与原始 session_id 组合成�...(truncated) · hosts/kimi/profile.js · advisory_e5ef9c49cb9802da219b86c8
  • [P3] Windows Job 终止失败时可能遗留原生模型进程 — terminate() 的 Windows 分支在 job.stop() 失败时仅执行 child.kill('SIGKILL')。此处的 child 是 Job ...(truncated) · lib/runtime/process/acp-child.js · advisory_7f5445d25e0bb4c7ee0ae182
  • [P3] route_unresolved 候选没有恢复或清理路径,会永久阻塞重试队列 — 当前分支在 claimed.candidate.model 缺失时直接返回 { status: 'blocked', reason: 'route_unresolved' },��...(truncated) · lib/app/distill-session.js · advisory_6c54ddd5b09d801582627f5b
  • [P3] 任务记录缺失时,已结束的后台命令仍被判定为运行中 — notesOf() 只在 tasks 中存在唯一匹配记录时读取终态;否则,只要原始 Bash 输出包含 task_id...(truncated) · hosts/kimi/transcript.js·advisory_89636b44e1735caa652db811`
  • [P3] native facts 文件检查存在符号链接竞态,可越过限定根目录读取文件 — confined() 先通过 lstatSync、realpathSync 验证路径位于 root 内,但返回后 jsonOf() 和 recordsOf...(truncated) · ``lib/runtime/native-facts.js`` · advisory_828c520cc4e2c83d7ff88f41`
  • [P3] 原生桥接读取失败会跳过会话生命周期处理 — 新增的原生对账和读取发生在 HANDLERS[event] 之前,却与整个事件处理共用最外层静默 catch...(truncated) · lib/agent/driver.js · advisory_953b6f1cd14dad1df008fee1
  • [P3] 未完成检查时提前激活候选 — 代码已将该回合标记为 native.pending: true,但仍无条件执行 activateCandidate();后者只要看到...(truncated) · lib/app/native-turn.js · advisory_3a29a103c4d658a61491075e
  • [P3] 缺少 thinking effort 时生成无法表示的 TOML null — 对支持 thinking 的模型,缺少 hint.effort 会把 route.effort 设为 null;prepareRoute() 使用 route...(truncated) · hosts/kimi/model.js·advisory_ad0af68fbcdfdb83ae3d281b`
  • [P3] 被阻塞的最新候选会阻塞更早的可处理候选 — 新增的 blocked 候选仍保留在 pending 中,而状态文案明确说明 /evolver-distill 会选择最新候...(truncated) · lib/app/commands/status.js · advisory_75496d3da62c1193d22e7d12
  • [P3] Windows Job 初始化期间同步回调可能触发尚未初始化的停止 Promise — remember() 可能在 stopped Promise 的 executor 尚未完成、外层 const stopped 尚未初始化时调用 te...(truncated) · ``lib/runtime/process/acp-child.js`` · advisory_9e628e44bc0dd2976dcdfa17`
  • [P3] Windows 清理超时只终止 guardian helper,无法证明原生模型进程已退出 — dispose() 在等待 nativeClosed 和 guardian 关闭后,Windows 分支只执行 child.kill('SIGKILL')。这里��...(truncated) · lib/runtime/acp-model.js · advisory_4a2fb8f6e22f3a973eb0b319
  • [P3] 工作锁目录创建成功但 owner 写入失败时会遗留不可立即回收的锁 — tryLock() 先创建锁目录,再写入 owner 文件。fs.writeFileSync(path.join(lockDir, 'owner'), token) 失败�...(truncated) · lib/runtime/store/file-lock.js · advisory_247161c7819f983b7c642c61
  • [P3] 打包器对 smol-toml 的 exports 结构校验过于严格,可能导致所有打包失败 — vendorManifest() 只接受 manifest.exports?.import === './dist/index.js'。但 Node 包的 exports 合法形态��...(truncated) · scripts/pack.mjs · advisory_59af929bfb22a221d24ef688

另有 10 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 016cc978aa6b

Comment thread scripts/install-kimi.mjs
const stage = join(root, entry.name);
ordinaryDirectory(stage);
const backup = join(stage, 'previous'), prepared = join(stage, 'package');
if (!fs.existsSync(backup) || !fs.existsSync(prepared)) continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

中断更新留下的备份无法被恢复

🟠 严重程度:中(P2)
recoverPackage() 只有在暂存目录同时存在 previous 和 package 时才恢复旧包;但激活后 package 已被移动到目标目录,回滚又会先删除该目标。因此最需要恢复的“只剩 previous”状态被直接忽略。后续重试读取不到 target,也无法找到保留的有效备份。

Finding:finding_20e0c0afcfc6982eb8243f7c

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

不可读 owner 恢复测试的后续断言与 fixture 状态矛盾

🔴 严重程度:高(P1)
测试在第一次调用中保留了当前进程创建的 lock 和 owner 文件;恢复文件读取后,owner 仍属于存活的当前进程、lock mtime 也未被标记为 stale。第二次 withLock 应继续拒绝进入,但断言却要求返回 true�...(truncated)

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

Windows 上更新已有状态文件会持续重试后失败

🔴 严重程度:高(P1)
当前 PR 删除了旧实现中在 EEXIST/EPERM 后移除目标文件的逻辑。Windows 上将临时文件重命名为已有目标文件可能返回 EEXIST 或 EPERM;新代码只等待并重复同一个 rename,从不替换已有目标,最终抛�...(truncated)

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

事实批次受限时监控器提前退出,可能遗留未决 turn

🟠 严重程度:中(P2)
native-facts.js 支持通过 mark 和 context.after 分批读取超过 MAX_BATCH 的日志,但监控器在看到 result?.facts?.limited 后直接 return。此时不会刷新锁、等待下一轮,也不会再次调用 reconcile 读取下一批...(truncated)

Finding:finding_9bdba5e1ba422f032eee0d3e · 文件:lib/runtime/native-monitor.js · 详情:/api/v1/aiqa/findings/finding_9bdba5e1ba422f032eee0d3e

带引号的验证命令可被错误漏判

🟠 严重程度:中(P2)
SHELL_DATA 在匹配命令前会把完整的单引号或双引号片段替换为 __data__,包括位于命令首部、实际承担可执行文件作用的引号内容。因此合法的带引号命令名会被删除,无法命中验证命令正则。

Finding:finding_97678453c0247313ebbef553 · 文件:lib/verification.js · 详情:/api/v1/aiqa/findings/finding_97678453c0247313ebbef553

首次 Native Prompt 可能因缺少 session 记录被静默丢弃

🟠 严重程度:中(P2)
新增逻辑在进入 HANDLERS.PROMPT、调用 promptSubmitted() 创建或更新 session 之前,先执行 await ports.sessions.read(sessionId),随后直接读取 session.nativeCursor。当 read() 返回 undefined 或 null 时会抛出 `TypeEr...(truncated)

Finding:finding_e441b724dbc3d0a6b5e84e5e · 文件:lib/agent/driver.js · 详情:/api/v1/aiqa/findings/finding_e441b724dbc3d0a6b5e84e5e

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

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

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

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

由 Sentinel 审核 · 目标提交 34d272dded7e

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 释放与放弃标记同时失败会遗留不可跨进程回收的 admission — owner 删除失败后,代码尝试创建跨进程可见的 abandoned marker;若 marker 写入也失败,只在当��...(truncated) · lib/runtime/store/admission.js · advisory_f7acc3f0c40c9a6dc6827033
  • [P1] 已持久化的 native 游标不会用于后续读取 — readFacts() 总是优先以仍保留在 native.mark 中的初始标记作为 after 参数;本次代码虽然将�...(truncated) · lib/app/native-turn.js · advisory_6e7455a7b805f0d4f08dcbc4
  • [P2] Kimi 会话键未包含 workspace 作用域,可能串写生命周期状态 — hosts/kimi/paths.js 已定义 sessionIdOf(payload, context),会将 nativeScope 与 session_id 组合成隔离�...(truncated) · hosts/kimi/profile.js · advisory_3dfd300f8d85ba72cfd752f8
  • [P2] 纠正反馈使用并发重判前的旧会话快照 — feedbackSession 在写入 corrected 标记时就被固定,随后代码等待 candidates.update();若并发重判...(truncated) · lib/app/prompt.js · advisory_3bb4ae12eb0c2d65abfb3864
  • [P3] 收据替换失败测试实际不会触发 EPERM — preload 只有在 to === process.env.FIXTURE_RECEIPT 且这是第 2 次 renameSync 时才抛出 EPERM。当前测�...(truncated) · test/runtime/acp-receipt.test.js · advisory_dc0cc50d622b155d9c529cee
  • [P3] Windows 缺失系统环境变量的超时测试实际没有覆盖目标路径 — 测试先执行 const env = { ...process.env },再从 process.env 删除 SystemRoot、WINDIR 和 COMSPEC;�...(truncated) · test/runtime/process.test.js · advisory_b6187f7d9cea739c6d72ec66
  • [P3] route_unresolved 候选无法在配置修复后恢复 — 当 claimed.candidate.model 为空且 ports.model.capture 存在时,新增分支直接返回 blocked,但没有...(truncated) · lib/app/distill-session.js · advisory_4cee3a6dc0966c59a6b9c9cf
  • [P3] 同一检查的迟到终态仍可反转已结算结果 — calls 会永久保存 callId -> check index。第一次终态写入 record.checks[known] 后,后续所有同 ca...(truncated) · ``lib/turn/record.js`` · advisory_ccfc0c6581b61841fa4ded84`
  • [P3] 释放失败仅记录在进程内,其他进程无法回收活 PID 遗留锁 — release() 删除锁失败后只把 token 写入当前进程的 abandonedState。其他进程拥有独立的空 Map��...(truncated) · lib/runtime/store/file-lock.js · advisory_415c11d41930189814e6d521
  • [P3] limited 批次测试可能把未决 turn 提前退出固化为正确行为 — 新增测试明确要求监控器只读取一次并立即结束;如果实现错误地把“本批读取受限”当成...(truncated) · test/runtime/native-monitor.test.js · advisory_542518a931d16a8bbb9c2dec
  • [P3] 测试 fixture 使用了格式不完整的 admission owner 名称 — holdAdmission() 生成的文件名是 owner-${pid}-deadbeef,只有 PID 和一个 token;但同一测试文件后�...(truncated) · test/runtime/file-lock.test.js · advisory_2010bcb50ed9ab57e9f9edbe
  • [P3] closeProxyWhenSettled 不会重试异步 close() 失败 — try/catch 只捕获同步抛出的异常。若 proxy.close() 返回 Promise 并以 ENOTEMPTY、EPERM 或 EBUSY...(truncated) · test/helpers/fake-proxy.js · advisory_1db931f7844813e4c4a13b2c
  • [P3] Prompt 在创建/恢复会话前解引用缺失状态 — 新增逻辑在调用原本负责处理 Prompt 的 promptSubmitted() 之前执行 ports.sessions.read(sessionId),�...(truncated) · lib/agent/driver.js · advisory_136d529292ad4367ca7b035e
  • [P3] Unix 清理超时后可能遗留 guardian 和原生模型进程 — 在 Unix 分支中,dispose() 在等待关闭超时后只断开 IPC、unref() 并销毁 stdout/stderr,没有终��...(truncated) · lib/runtime/acp-model.js · advisory_2dd090411288c74b531e745c
  • [P3] Windows Job 停止失败时未终止 native 进程树 — job.stop() 失败后,兜底只调用 child.kill('SIGKILL'),但这里的 child 是 Job helper,不是 receipt...(truncated) · ``lib/runtime/process/acp-child.js`` · advisory_cc4ed98cc88763c20180c35f`
  • [P3] Windows 所有者探针缓存首次快照,进程退出或查询失败后无法恢复 — readProcess 在 Windows 分支中通过 windows ??= windowsAncestorsOf(process.ppid) 只读取一次进程表,并�...(truncated) · lib/runtime/process/owner.js · advisory_845383fd54b3ba3dfe1c3583
  • [P3] native facts 文件读取存在路径替换竞态 — confined() 只在检查时验证路径未穿越 root、组件不是符号链接且 realpath 位于 root 内;随后...(truncated) · lib/runtime/native-facts.js · advisory_f1aeaf9c31d5f1b2b28382b8
  • [P3] 后台命令启动失败被永久标记为仍在运行 — 未匹配到 task 时,pending 只要看到请求参数 run_in_background === true 就恒为真,完全忽略已��...(truncated) · hosts/kimi/transcript.js · advisory_72bb89b37e0de55d2967bf70
  • [P3] 思考模型未提供显式 effort 时忽略 default_effort 并判定路由不可用 — selectRoute 把缺失的 hint.effort 转为 null,随后要求该值必须存在于 support_efforts(或默认...(truncated) · hosts/kimi/model.js · advisory_7cc8d8da39c22a4333831120
  • [P3] 托管 OAuth 凭据未注入隔离的 Kimi ACP 配置 — selectRoute() 通过 managedAccess() 返回了宿主 Kimi 凭据文件路径,但 prepareRoute() 完全没有使�...(truncated) · hosts/kimi/model.js · advisory_ba66d05912c4b9cf162b9062

另有 17 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 34d272dded7e

Comment thread lib/runtime/acp-model.js
if (uid !== undefined && childStat.uid !== uid) continue;
child = JSON.parse(readFileSync(childFile, 'utf8'));
if (child.nonce !== owner.nonce || ![child.guardianPid, child.nativePid].every(pid => Number.isSafeInteger(pid) && pid > 0)) throw new ModelUnavailable('unsafe_runtime');
} catch { throw new ModelUnavailable('unsafe_runtime'); }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

缺失 child 收据的孤儿目录会永久阻断模型执行

🔴 严重程度:高(P1)
OWNER_FILE 在 fork() 前写入。若宿主在 guardian 生成 CHILD_FILE 前退出,后续清理确认 owner PID 已消失后,会因 child 收据不存在而抛出 ModelUnavailable('unsafe_runtime')。该分支既不删除也不隔离目录;每次后续调用都会重新命中同一目录并失败。

Finding:finding_a51027049ac2d9ca770b1658

Comment thread scripts/install-kimi.mjs
({ own, previous } = underInstallLock(plugins, () => installationOf(root, target, registryFile, true)));
}
const registered = Boolean(own), installed = registered && Boolean(previous);
if (operation === 'status') return { installed, registered, path: target, ...(previous ? { version: previous.version } : {}), ...(own ? { enabled: own.enabled !== false } : {}) };

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

状态与更新预检可观察安装事务的中间态

🟠 严重程度:中(P2)
包激活和 registry 更新由安装锁保护,但初始 installationOf() 及 status 返回、update 的 installed 预检发生在锁外。新安装中,包已移动到目标但 registry 尚未登记时,status 会报告未安装;更新过程中也可能返回尚未提交、随后仍可能回滚的新版本。

Finding:finding_4be05e5c27c9cff5a3b8f4f4

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

Windows 环境变量回归测试实际没有移除目标变量

🟠 严重程度:低(P3)
测试复制了 process.env 到 env,但循环删除的是全局 process.env 中的键;随后传给 runProcess 的仍是包含 SYSTEMROOT、WINDIR、COMSPEC 的旧 env。因此该测试不会覆盖声明的“缺少系统目录环境变量��...(truncated)

Finding:finding_0a95c4d691da612659ea0f8c · 文件:test/runtime/process.test.js · 详情:/api/v1/aiqa/findings/finding_0a95c4d691da612659ea0f8c

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

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

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

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

由 Sentinel 审核 · 目标提交 84e2d57c2d15

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P2] 剥离 Windows 环境变量时禁止启动所有 shim 命令 — 模块仅根据加载时的 process.env.SystemRoot/WINDIR 初始化 SYSTEM32。两者缺失时,即使 windowsSyst...(truncated) · lib/runtime/process/spawn.js·advisory_7df9903734edacc4ea8dd477`
  • [P2] 超限事实会让仍处于 waiting 的 turn 永久失去监控 — 新增测试要求超限时只读取一次、不得轮询,也不得产生 terminal verdict。此时 reconcile 明确��...(truncated) · test/runtime/native-monitor.test.js · advisory_9c9bf6dd07a07fd0eadd0d2b
  • [P3] 事实批次受限时监控器提前退出,未继续消费后续数据 — native-facts.js 将单次读取限制为 4 MiB,并返回 limited 与可继续使用的 mark。但监控器收到...(truncated) · lib/runtime/native-monitor.js · advisory_6192502f9158beef4b0ab760
  • [P3] 收据替换失败回归测试未实际触发 EPERM — preload 只有在 to === process.env.FIXTURE_RECEIPT 且当前是第 2 次 renameSync 时才抛出 EPERM。当前�...(truncated) · test/runtime/acp-receipt.test.js · advisory_0ca43be2286de3c054dbdc99
  • [P3] 释放失败且 abandoned marker 写入失败时,admission 可能永久阻塞其他进程 — releaseAdmission() 删除 owner 失败后进入 abandonAdmission()。如果 marker 写入也失败,代码只把 ad...(truncated) · lib/runtime/store/admission.js · advisory_6fe3a58b6c826bbe99cbeb7f
  • [P3] Windows shim 启动未引用带空格的 command 路径 — 新增 cmdLine() 只对 command 做元字符转义,没有对包含空格的可执行文件路径加引号;随后...(truncated) · lib/runtime/process/spawn.js · advisory_0d04d02d32ff0cc43e8e6f81
  • [P3] route_unresolved 候选会永久阻塞且无法通过配置修复恢复 — 当 ports.model.capture 存在但候选没有 model 时,distillClaimed() 固定返回 { status: 'blocked', reas...(truncated) · ``lib/app/distill-session.js`` · advisory_95b708a84999f239af4bb407`
  • [P3] 回滚中断后的备份无法被自动恢复 — recoverPackage() 只接受同时包含 previous 和 package 的 staging 目录;但回滚开始时 package 已�...(truncated) · scripts/install-kimi.mjs · advisory_23c2ee73de7e265c7d45d08f
  • [P3] 托管 OAuth 路由信息在私有配置生成时被丢弃 — managedAccess() 返回了 kind: 'oauth-access'、tokenFile 和 deviceIdFile,但 prepareRoute() 只读取 se...(truncated) · ``hosts/kimi/model.js`` · advisory_716b1ea0c31c98f11e053937`
  • [P3] 纠正反馈使用过期会话快照,可能丢失并发重判结果 — 当前实现把 sessions.update() 的返回值保存到 feedbackSession,之后直接基于该旧快照计算 due...(truncated) · lib/app/prompt.js · advisory_b6f04d74e332426e18621748
  • [P3] 重复终态或复用 callId 会覆盖检查结果 — calls 永久保存 callId -> check index。任何后续带同一 callId 且 running: false 的 note 都会无条...(truncated) · lib/turn/record.js · advisory_cac405b6a85428078bfdbf3a
  • [P3] Windows Job 停止失败时只终止 guardian/helper,未按 native PID 清理原生进程树 — Windows 分支中 child = job.child,而真正的 native PID 保存在 receipt.nativePid。当 job.stop() 抛异�...(truncated) · lib/runtime/process/acp-child.js · advisory_63a954c4185ab484bcfcd65c
  • [P3] holdAdmission 生成的 owner 标识缺少进程启动时间字段 — helper 创建的文件名是 owner-${pid}-deadbeef,而同一测试文件后续显式构造和解析的 owner 格式�...(truncated) · test/runtime/file-lock.test.js · advisory_78d98d34815073f79889fb7f
  • [P3] native admission 缺失超时后,monitor 静默退出并留下未决 turn — native admission 持续缺失 30 秒后,函数直接返回,没有调用 abort()、写入失败状态或关闭逻��...(truncated) · lib/runtime/native-monitor.js · advisory_683d92234c5087bd5dde006e
  • [P3] 死锁回收并发测试错误地禁止合法竞争者进入 — A 只完成了对旧 lock 的读取,还没有创建 admission、取得锁或写入任何共享占用标记。此时 B ...(truncated) · test/runtime/state-lock.test.js · advisory_e7dfbbfe3310f4b13cf94e6b
  • [P3] 测试将 oversized native turn 的未决状态错误固定为“停止监控” — 测试把“事实读取被截断但回合仍在等待”断言为监控器应立即退出,并且断言不会再次 s...(truncated) · ``test/runtime/native-monitor.test.js`` · advisory_9bc093cafbf9124996b62e72`
  • [P3] 输入队列饱和会直接终止仍可正常处理的 Windows Job — Ingress() 持续读取父进程输入,但容量为 4 的 BlockingCollection 使用无等待的 TryAdd();队列...(truncated) · lib/runtime/process/windows-job.js · advisory_e98e1e7f9f619bb05fb970fb
  • [P3] Kimi 会话键未包含 workspace 作用域 — profile 配置使用 nativeSessionIdOf,只返回原始 payload.session_id,没有包含 workspace 对应的 cont...(truncated) · ``hosts/kimi/profile.js`` · advisory_7f3b294bec919eeefee44a63`
  • [P3] Windows owner 进程表首次失败后永久使用空快照 — windowsAncestorsOf(process.ppid) 的结果通过 windows ??= 只初始化一次并永久缓存。首次读取失败�...(truncated) · lib/runtime/process/owner.js · advisory_ba2e187e0336382bd65d7a95
  • [P3] Windows 上更新已有状态文件会因目标已存在而持续失败 — writeState() 在目标文件已存在时直接调用 fs.renameSync(temporary, target);对 Windows,重命名到��...(truncated) · lib/runtime/store/file-lock.js · advisory_f39f39e86cd13124cfdd96c9

另有 21 条候选未在评论中展开;可通过下方 Sentinel PR review context 查询全部条目。

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

由 Sentinel 审核 · 目标提交 84e2d57c2d15

Comment thread lib/runtime/acp-model.js
},
get error() { return error; }, get nativeResult() { return nativeResult; }, get guardianResult() { return guardianResult; },
async dispose(sessionId) {
signal?.removeEventListener('abort', abort);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

清理阶段移除取消监听,允许已取消请求成功完成

🟠 严重程度:中(P2)
dispose() 一开始就移除 signal 的 abort listener,之后仍会等待 session/close、原生进程退出、facts 读取与校验以及 guardian release。若外部信号在此期间取消,abort() 不再执行,也没有结束前的 signal.aborted 棐查;因此本应失效的旧 completion 仍会返回 { answer, usage },调用方可能把它写入已经取消或重置后的会话状态。

Finding:finding_206603a7af226a7cc40e104a

Comment thread lib/verification.js
export function isVerificationCommand(command) {
return typeof command === 'string' && VERIFICATION_COMMANDS.some((pattern) => pattern.test(withoutHeredocBodies(command)));
if (typeof command !== 'string') return false;
const shell = withoutHeredocBodies(command).replace(SHELL_DATA, '__data__');

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

带引号的验证命令会被漏判

🟠 严重程度:中(P2)
新增的 SHELL_DATA 将完整引号内容替换成 __data__;若引号包住命令的可执行文件,命令名会在匹配前消失,后续无法匹配 VERIFICATION_COMMANDS。

Finding:finding_8cae37db07f2be497dd9f7a5

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.

1 participant