Skip to content

feat: support Kimi Code CLI on Windows - #31

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

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

Conversation

@imxyanua

@imxyanua imxyanua commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Add local Windows support for Kimi Code CLI 2.4.1. Run node scripts/install-kimi.mjs install, then start a new CLI session. Desktop follow-up #56

Kimi CLI prompt → Recipe context
  → native edit and check evidence
  → isolated Kimi CLI ACP
  → private draft

The CLI layer accepts the local CLI client and its Windows process owner. It uses one managed package and preserves the selected Kimi profile, preferences and drafts. Private distillation uses the captured route. Publishing remains an explicit command with Proxy verification.

Evidence

  • The packed-hook tests cover CLI recalled context, turn verification, and rejection of Desktop events at this layer. The installed Windows Kimi 2.4.1 executable resolved to kimi.exe.
  • The CLI profile suite passed 4/4 on Windows Node 22 and 26 on this head. The full Windows suite passed 633 tests per version during the split. See the upstream test and pack run on this head. The split retains the cross-shell calibration fixture from upstream test(distill): 校准测试的模型命令改为 sh 与 cmd.exe 通用的写法 #55.
  • Earlier Windows CLI acceptance covered Recipe recall through a live Proxy and Hub, a passing check, and a private draft with an API provider. Managed OAuth inference and macOS remain unverified.

Merge Danger

Two-way. The installer can unregister the plugin while retaining user data. The native-turn, ACP and distill integration remains in the CLI base for review. See the earlier maintainer review.

@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

Comment thread lib/runtime/store/file-lock.js Outdated
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 Outdated
// 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.

Retain admitted unresolved native turns across the next prompt. Finalize from their original identity and evidence, without consuming the newer turn notes or replacing its model route. Keep pending entries recoverable until reports and candidate work have settled.
@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 8, 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="dc096ad1691ec530cc017c4d3008e16bbd1c551b",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 dc096ad1691e

Leave a turn to native recovery when its snapshot overlaps the next prompt. Keep the newer range intact when an older turn falls outside the retained window.
@cursor

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

Copy link
Copy Markdown

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

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

任务身份校验测试被前一个拒绝 decoder 状态污染

🔴 严重程度:高(P1)
测试先将同一个 f.declaration.decode 替换为始终返回 { status: 'unsupported' } 的函数,并验证一次 decoder 拒绝。随后测试创建任务文件并再次调用 nativeFactsOf(f.declaration).read(f.payload),但没有恢复 decoder��...(truncated)

Finding:finding_efea4e57a6bcbb03320b3e6b · 文件:test/runtime/native-facts.test.js · 详情:/api/v1/aiqa/findings/finding_efea4e57a6bcbb03320b3e6b

固定的 Job 状态文件未在结束后删除,第二次启动必然失败

🔴 严重程度:高(P1)
启动时以排他创建方式写入固定名称的脚本和配置文件,但返回的控制对象、PowerShell helper 及所有完成/失败/取消路径均不删除它们。首次运行后,下一次启动会在 spawn() 前对已有 .evolver-job.ps1 ��...(truncated)

Finding:finding_4a1990c5f0c61955ee393c4f · 文件:lib/runtime/process/windows-job.js · 详情:/api/v1/aiqa/findings/finding_4a1990c5f0c61955ee393c4f

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

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

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

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

由 Sentinel 审核 · 目标提交 26e5fd46a6bb

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P2] 事实分页超限后停止唯一监控器,后续终态可能被永久遗漏 — 新增测试明确要求遇到 limited: true 时只读取一次、不继续轮询,同时仍声明 waiting: true ��...(truncated) · test/runtime/native-monitor.test.js · advisory_4f1522b97b959d34c1e48c58
  • [P2] 待终态的 deferred turn 达到上限后被静默丢弃 — deferNativeTurn() 将仍在等待终态的 turn 放入 deferredNativeTurns,随后无条件执行 .slice(-MAX_TURN...(truncated) · lib/session/state.js·advisory_f29fdea5caa5b67b193abd6e`
  • [P2] 更正的三阶段写入失败后会留下不一致状态 — correctedTurnOf() 依次更新 session 的 correctedSession、写入 draft correction mark、更新 candidate range�...(truncated) · lib/app/prompt.js · advisory_65fb2fbdccfee5c7b564223a
  • [P2] 缺少可信终止回执时,同一配置没有自动恢复路径 — 新增契约要求缺失、损坏、nonce 不匹配或缺少 Windows jobEmpty 证明的 orphan 一律返回 MODEL_UNA...(truncated) · test/runtime/acp-model.test.js·advisory_e7cc767d45c4d0de8f31be17`
  • [P3] 下一轮开启后,延迟 native 终态仍被 rejudgeWorkTurn 拒绝 — 本次改动通过 deferredNativeTurns 保存上一轮 native 状态,但 turnEnded() 在 closeTurn() 因当前 s...(truncated) · lib/app/turn-end.js · advisory_b52e6b0a8fd23be35c0ddadf
  • [P3] 事实分页后监控器提前退出,终态可能永久无法收敛 — nativeFactsOf() 在批量读取达到 MAX_BATCH 时返回 facts.limited = true 和续读游标 mark。但监控�...(truncated) · lib/runtime/native-monitor.js · advisory_55717b40e79c47a1ecddef6b
  • [P3] 收据替换失败测试未注入触发条件,实际未覆盖回归场景 — preload 仅在 to === process.env.FIXTURE_RECEIPT 且第二次替换时抛出 EPERM,但当前测试从未设置 p...(truncated) · ``test/runtime/acp-receipt.test.js`` · advisory_9236a7c6794e118c2bf11db8`
  • [P3] 首次事实读取失败后,后续成功读取会因空 mark 崩溃 — capturePrompt() 在首次读取非 ok 时将 stored.native.mark 写为 null;后续 reconcileNativeTurn() 已...(truncated) · lib/app/native-turn.js · advisory_99fc2b0562469b976cefac4d
  • [P3] postAgentGene 的提前返回跳过结果确认 — 当前新增分支使用 return (outcome = ...) 直接从 try 返回。虽然 finally 仍会执行 settle,但�...(truncated) · lib/app/distill-session.js · advisory_3c5c1d6ff5fc52aaf5cb9359
  • [P3] 响应丢失后释放 claim,可能重复提交已被 Proxy 接受的蒸馏结果 — 本次修改让 run() 无论 distillClaimed() 是否成功都在 finally 中执行 settle()。如果 Proxy 已��...(truncated) · lib/app/distill-session.js · advisory_7a985f139f4817d57ff187c6
  • [P3] 思考模型未传 effort 时忽略 default_effort 并拒绝路由 — hint.effort 缺失时,思考模型把 effort 设为 null,随后因 enabledEfforts.includes(null) 为假而��...(truncated) · hosts/kimi/model.js · advisory_63f714406df365c8d3cc215b
  • [P3] 模型输出未执行凭据泄漏检查 — privateEnv() 将 API 密钥交给原生客户端,配置文件、参数和附加环境变量都显式禁止包含该�...(truncated) · lib/runtime/acp-model.js · advisory_40495c1e54c824fb1a0a6795
  • [P3] 记录 Git 基线时使用了未归一化的 session epoch — rememberTurnHead() 的更新条件直接读取 stored.sessionEpoch,但同文件其余 session 更新均先经 ses...(truncated) · lib/app/prompt.js·advisory_4b96a24635c944cbb28cc4a3`
  • [P3] 默认更新可能复用陈旧 bundle 并降级已安装插件 — 默认安装/更新只要发现 dist/kimi 就直接复制该目录,仅验证其 manifest 结构和版本格式,不...(truncated) · scripts/install-kimi.mjs · advisory_48f262a20bf1c28f1cc92f8d
  • [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_05: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_06:state_chain_a2ee1ee83c312e2e
  • [P3] reset/clear 后旧 completion 可能写入新生命周期 — 模型执行层与监控层均可能在 reset/clear 后保留 in-flight completion。若缺少 generation、scope toke...(truncated) · lib/runtime/acp-model.js`, `lib/runtime/native-monitor.js · advisory_ba3ed8016a0f9224537b7914
  • [P3] 事实分页截断会同时终止唯一监控链路 — native-turn 在事实读取达到分页或大小上限后停止继续观察,而 native-monitor 也把该截断当�...(truncated) · lib/app/native-turn.js`, `lib/runtime/native-monitor.js · advisory_3dba98e730082f7e8d6e5fe7
  • [P3] 事实读取达到分页/大小上限后可能停止继续观察,导致终态无法收敛 — readFacts() 每次只调用一次 ports.native.read(),虽然传入了 after 游标,但 reconcileNativeTurn()...(truncated) · lib/app/native-turn.js · advisory_1c6031a67d3f0da7be7a7ed1
  • [P3] 元数据尚未完整的 native turn 在打开下一轮后变成不可检索状态 — deferNativeTurn() 仅迁移满足 awaitsNativeTerminal() 完整性条件的 native turn。条件不满足时,open...(truncated) · lib/session/state.js·advisory_b292da8e987eee9afd4848e0`

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

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

由 Sentinel 审核 · 目标提交 26e5fd46a6bb

Comment thread lib/distill/range.js Outdated
const model = modelIsCurrent ? range.model : null;
const base = range.turns[0] === removedTurn ? turns[0].head ?? null : range.base;
const problem = rangeRouteProblem(range);
return { ...pending, [sessionId]: { ...range, turns, base, project: null, model, changedAt: changedAtAfter(range, now), ...(problem && { routeConflict: problem }) } };

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

移除路由冲突来源后仍永久保留 routeConflict

🟠 严重程度:中(P2)
withoutWorkTurn() 删除 turn 后,仍对删除前的 range 调用 rangeRouteProblem(range);该函数又优先返回已有的 range.routeConflict。返回对象通过 ...range 同时保留旧 routeConflict 和 blocked。即使冲突 turn 已删除、base 已推进且剩余 turn 的 binding 完全一致,该范围仍被 isRouteBlocked() 判定为阻塞,只能等 TTL 后整体删除。

Finding:finding_05fc5c847c83045e6f4b3267

Comment thread lib/agent/profile.js
if (!Array.isArray(profile.legacy)) problems.push('legacy must be a list of leftovers to adopt');
if (profile.settingsFile !== undefined && !isFunction(profile.settingsFile)) problems.push('settingsFile must be a function of the environment');
if (profile.modelRecord !== undefined && (!isFunction(profile.modelRecord.file) || typeof profile.modelRecord.query !== 'string')) problems.push('modelRecord requires file(env) and a fixed query');
if (profile.turnEnd.statusRecord !== undefined && (!isFunction(profile.turnEnd.statusRecord.file) || typeof profile.turnEnd.statusRecord.query !== 'string')) problems.push('turnEnd.statusRecord requires file(env) and a fixed query');

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Profile 校验会重复报告同一配置错误

🟠 严重程度:低(P3)
本次新增代码重复执行了已存在的 turnEnd.statusRecord 和 commands.background 校验;每项无效配置都会被加入 problems 两次,导致用户或调用方收到重复诊断。

Finding:finding_ca9c439ce558815cd61d85bf

A worker can exit before fork, leaving an owner marker without a native child receipt. Give the guardian and orphan recovery mutually exclusive claims on the startup marker so recovery can remove a prelaunch directory while keeping claimed scratch without closure proof.
@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

删除或消费 turn 后,routeConflict 与 blocked 会产生相反的不一致状态

🟠 严重程度:中(P2)
withoutWorkTurn() 删除 turn 后仍对删除前的 range 调用 rangeRouteProblem(),而该函数又优先返回旧 routeConflict,因此已经消除冲突的剩余 turns 仍永久保持 blocked。相反,withoutConsumed() 在保留 `routeConflic...(truncated)

Finding:finding_d23109ae6c89df7c63c14735 · 文件:lib/distill/range.js · 详情:/api/v1/aiqa/findings/finding_d23109ae6c89df7c63c14735

session/task ID 校验会将非字符串值隐式转换后接受

🟠 严重程度:中(P2)
RegExp.prototype.test() 会先把参数转换为字符串;因此 ID.test(undefined) 实际校验的是字符串 "undefined",ID.test(123) 校验的是 "123"。非字符串 ID 可能通过校验并参与路径拼接。

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

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

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

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

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

由 Sentinel 审核 · 目标提交 9cbfbf63d06e

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 新增测试文件缺少外层测试与夹具定义 — 新文件从测试体中段的 const running = ... 开始,但没有对应的 test(..., async () => {、导入及��...(truncated) · test/app/native-turn.test.js · advisory_d3f6434156c5e9a465d55c04
  • [P1] 标签发布不运行也不等待 Kimi Windows 验证 — 新增契约明确要求 windows-kimi 仅在 pull_request 或 workflow_dispatch 时运行,标签发布使用的 ...(truncated) · test/release.test.js · advisory_76fca1706f5cbca70b0e4827
  • [P2] 分页未完成时监控器直接退出,迟到终态可能永久遗漏 — native-facts.js 为分页读取返回了可续读的 mark,但监控器在 facts.limited 时无条件结束,即...(truncated) · lib/runtime/native-monitor.js · advisory_d20573c654aee6591fe3c7e6
  • [P2] 更正写入忽略 epoch 校验结果,并可能留下三套不一致状态 — correctedTurnOf() 依次更新 session、更正标记和 candidate range,但没有检查 sessions.update() 中 epo...(truncated) · lib/app/prompt.js · advisory_476b63943c4310c9d7f010d2
  • [P2] 未收敛的 deferred turn 达到容量上限后被静默淘汰 — deferNativeTurn() 将仍等待终态的 turn 加入 deferredNativeTurns 后无条件执行 .slice(-MAX_TURN_IDS)��...(truncated) · lib/session/state.js · advisory_e9152f326e0bf532164c0db0
  • [P2] 命令任务获得了完整的模型端口能力 — cancellable() 原先只向命令执行器暴露经过取消信号包装的 model.complete;本次改为先展开 ....(truncated) · lib/app/background.js·advisory_e3cd1b2aefcf8b401f797017`
  • [P2] 会话 ID 未使用作用域隔离,可能串联不同工作区的状态 — profile 将 native.sessionId 配置为未经作用域组合的 nativeSessionIdOf,因此只按原始 payload.sessi...(truncated) · hosts/kimi/profile.js·advisory_185489a38b89a3141911f455`
  • [P2] native 绑定失败未补偿已打开的逻辑 turn — 新流程先由 promptSubmitted()提交 session/turn 状态,再调用异步 attach()绑定 native 边界。若后�...(truncated) · lib/agent/driver.js · advisory_753f05c92a4ee97201e83544
  • [P3] Windows Job 控制文件未清理,重试会被旧配置或取消状态阻断 — startWindowsJob() 使用固定的 .evolver-job.ps1、.evolver-job.json 和 .evolver-job-stop,前两个文件��...(truncated) · lib/runtime/process/windows-job.js · advisory_622f7fd6c82bac647ff7aed4
  • [P3] 任务身份校验测试复用了已拒绝的 decoder,导致断言必然失败 — 测试先将 f.declaration.decode 替换为始终返回 { status: 'unsupported' } 的函数,并完成 decoder 拒�...(truncated) · test/runtime/native-facts.test.js · advisory_fa91e1f5a4331c1fe9fc5389
  • [P3] 发布标签未执行或等待 Kimi Windows 验证 — 新增的 windows-kimi job 被限制为仅在 pull_request 和 workflow_dispatch 时运行;标签发布属于 p...(truncated) · ``.github/workflows/release.yml`` · advisory_cb595f3cb9d8286cc6178630`
  • [P3] 托管 OAuth 路由未被带入隔离的 ACP 配置 — selectRoute() 为托管 Kimi 返回的是 { kind: 'oauth-access', tokenFile, deviceIdFile },但 prepareRoute() �...(truncated) · hosts/kimi/model.js · advisory_23de2436bdce3c9c941dcd88
  • [P3] 测试将未完成的受限事实流错误地当作可终止状态 — 新增测试明确要求 limited: true 且仍处于 waiting 时只读取一次就结束监控。若终态事实位��...(truncated) · test/runtime/native-monitor.test.js · advisory_5f5dcb0d472f90cced978485
  • [P3] 瞬时读取失败会使 native turn 永久无法绑定终态 — 初次 facts 非 ok 时,capturePrompt() 把 native.mark 保存为 null。后续读取恢复正常后,当前 ...(truncated) · lib/app/native-turn.js · advisory_5689ce8e6a1d380e379e7976
  • [P3] receipt 替换失败测试未设置注入条件,可能出现假绿 — preload 仅在 to === process.env.FIXTURE_RECEIPT 且第二次替换时抛出 EPERM,但当前测试没有设置 F...(truncated) · ``test/runtime/acp-receipt.test.js`` · advisory_e2d81cb0cff9ea5231934626`
  • [P3] 事实分页超限后停止监控,迟到终态可能永久遗漏 — 新增契约明确要求分页超限时只读取一次且不再轮询,即使该轮仍为 waiting: true。如果 fini...(truncated) · test/runtime/native-monitor.test.js · advisory_b796203c63ec08d1812a3b0c
  • [P3] 写入 turn head 时绕过了 session 状态解包 — 回写时用 stored.sessionEpoch 判断陈旧结果,却用 sessionOf(stored) 生成写入状态。若 session 存�...(truncated) · lib/app/prompt.js · advisory_645044847ea2f2c8fd14c877
  • [P3] 原生模型子进程默认丢弃系统代理边界 — privateEnv() 从原环境只复制固定白名单,明确遗漏 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY 和 NO_PR...(truncated) · lib/runtime/acp-model.js·advisory_d4a43b03081d8e8d79039f35`
  • [P3] 损坏的孤儿状态会持续阻断同一配置 — 新增契约要求每次重试都返回 MODEL_UNAVAILABLE/unsafe_runtime,同时保留匹配当前配置 origin 的��...(truncated) · test/runtime/acp-model.test.js · advisory_343f240da7d5668f3cc34e3c
  • [P3] 新一轮 prompt 可能覆盖上一轮尚未收敛的 native 终态 — capturePrompt() 的 session 更新只校验新一轮的 open、turn、sessionEpoch 和 pid,没有检查旧��...(truncated) · lib/app/native-turn.js · advisory_1fe18e7ecd803a6b4ca97474

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

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

由 Sentinel 审核 · 目标提交 9cbfbf63d06e

Comment thread lib/distill/range.js
if (turns.length > 0) {
const modelIsCurrent = isNativeRange(range)
? turns.at(-1).modelBinding === bindingOf(range.model)
: removedTurn !== range.turns.at(-1);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

路由冲突在冲突 turn 移除后仍永久阻塞范围

🔴 严重程度:高(P1)
withoutWorkTurn() 在生成已删除 turn 的新范围前,仍对旧 range 调用 rangeRouteProblem(range)。旧范围已有 routeConflict 时,该函数立即返回旧冲突;返回对象又通过 { ...range } 保留旧的 routeConflict 和 blocked。即使剩余 turns 已全部使用当前绑定,范围仍被视为路由阻塞,无法再次蒸馏,并会在阻塞 TTL 后被清理。

Finding:finding_ade414a27ef75fd7217fa360

Comment thread lib/app/native-turn.js
const terminal = facts?.terminal;
if (facts?.status !== 'ok' || !facts.schemaSupported || facts.bind?.origin !== 'user'
|| facts.bind.turnId !== native.turnId || facts.bind.promptId !== native.promptId
|| facts.mark?.fileId !== native.mark.fileId || !Number.isSafeInteger(facts.bind.mark)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

初次读取失败的延迟 turn 在后续成功读取时会解引用空 mark

🟠 严重程度:中(P2)
capturePrompt() 明确允许在初次 facts 非 ok 时保存 mark: null。但 reconcileDeferredTurn() 后续处理成功响应时直接读取 native.mark.fileId,没有像当前 turn 路径那样使用 native.mark?.fileId。因此一次“初读失败、迟到响应成功”的合法部分响应序列会抛出 TypeError,且 deferred 状态中的空 mark 不会被修复,重试仍会重复失败。

Finding:finding_bf3a7d331558cd3e5aef76e8

An older dist/kimi can outlive a newer managed installation. Compare the staged and currently installed versions under the activation lock before replacing the package. Keep explicit version requests available for intentional source builds.
Keep the Kimi native monitor wiring and the ledger delivery changes from upstream PR EvoMap#58.
@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

新增 native turn 测试文件无法解析并执行

🔴 严重程度:高(P1)
当前新增文件从 const running = ... 开始,缺少对应的 import、外层 test(...) 和 fixture 初始化,却直接使用 facts、ports、at、older、range、open 等标识符;文件中还存在与当前结构不匹配的 }); ...(truncated)

Finding:finding_54513c896e83405461e7d47f · 文件:test/app/native-turn.test.js · 详情:/api/v1/aiqa/findings/finding_54513c896e83405461e7d47f

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

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

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

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

由 Sentinel 审核 · 目标提交 f3ad91480b38

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 被替换的 decoder 泄漏到任务身份校验场景 — 测试先把 f.declaration.decode 永久替换为返回 { status: 'unsupported' } 的函数,完成首个断言后�...(truncated) · test/runtime/native-facts.test.js · advisory_1d97d1ca6bffceacbc707285
  • [P2] 未完成的 deferred turn 超过容量后被静默淘汰 — deferNativeTurn() 将所有未收敛 turn 放入 deferredNativeTurns,随后无条件执行 .slice(-MAX_TURN_IDS)...(truncated) · lib/session/state.js · advisory_e48deaeb9f4a21c7dbc3b1ff
  • [P2] 读取达到上限后退出监控,后续终态可能永久遗漏 — 新增测试将“仍在等待终态但事实分页已达上限”明确固化为立即退出:只读取一次,不继...(truncated) · test/runtime/native-monitor.test.js · advisory_96e7adeb811b602a9c9df9df
  • [P2] 后台命令启动失败被误判为仍在运行 — run_in_background === true 会无条件令 pending 为真;下一行仅在 !pending 时保留 failed。因此��...(truncated) · hosts/kimi/transcript.js · advisory_2a8144d267e1f695942bbfb7
  • [P2] native 终态永久缺失时关闭重试没有兜底 — closeUnfinishedTurn() 即使已经等待完 settleMs,只要 awaitsNativeTerminal(session) 为真就无条件跳�...(truncated) · lib/app/turn-end.js · advisory_1cc36bc3f239cabfb337c9e6
  • [P3] 回合起始标记读取了不存在的顶层字段 — decodeNativeFacts() 将原生回合起始游标写入 nativeFacts.bind.mark,但 turnStart() 读取的是不存��...(truncated) · hosts/kimi/evidence.js · advisory_65e680503ca33095adc15818
  • [P3] 新一轮 prompt 会覆盖上一轮仍在等待终态的 native 状态 — capturePrompt() 的 session 更新只校验当前 turn、sessionEpoch、pid,随后直接用新的 native 对...(truncated) · lib/app/native-turn.js · advisory_482337379b0c0b7e9178ade0
  • [P3] 移除冲突回合后路由阻塞不会解除 — withoutWorkTurn() 在移除回合后仍以移除前的 range 计算 rangeRouteProblem(range);该函数优先直�...(truncated) · lib/distill/range.js · advisory_96d81c21bd7976e9e59f9614
  • [P3] 首次 native 事实读取失败后,后续恢复会解引用空 mark — capturePrompt() 在 facts.status !== 'ok' 时将 stored.native.mark 写为 null,但后续成功读取 facts ��...(truncated) · lib/app/native-turn.js · advisory_d3ee53510763caf436968afd
  • [P3] profile 校验重复追加错误,破坏错误结果稳定性 — 新增代码再次执行了已经存在的 turnEnd.statusRecord 和 commands.background 校验。非法配置会把�...(truncated) · lib/agent/profile.js · advisory_64b0e2025454bd723b4de4e7
  • [P3] preflight 测试无法证明未启动原生进程 — receipt.json 的不存在状态在进入被测 preflight 前可能已经由 fixture 创建并清理完成,因此 ex...(truncated) · ``test/app/native-distill.test.js`` · advisory_5ef489e5e96a1d675a5c7e7a`
  • [P3] 临时索引时间戳更新失败会中断工作树 diff — 新增的 utimes() 没有错误处理;在不支持或暂时拒绝修改文件时间戳的临时文件系统上,它...(truncated) · lib/runtime/project.js · advisory_c09821955130ac27394c02cb
  • [P3] Windows job scratch 文件没有正常生命周期清理 — startWindowsJob 使用 { flag: 'wx' } 创建固定名称的脚本和配置文件,但返回对象没有清理这些...(truncated) · lib/runtime/process/windows-job.js · advisory_3637cadcbc42d832cc7fb0ab
  • [P3] deferred turn 遇到未知检查结果后会永久停留,且未建立待处理检查 — reconcileDeferredTurn() 对 completed + unknown checks 直接返回 { waiting: false },没有调用 holdPending...(truncated) · ``lib/app/native-turn.js`` · advisory_c5d726bad05df588e2cb9838`
  • [P3] epoch 校验失败后仍继续写入更正标记和候选范围 — ports.sessions.update() 的回调在 current.sessionEpoch !== session.sessionEpoch 或 session 已被替换时返回...(truncated) · lib/app/prompt.js · advisory_b31a8bd7bee32c1f90dfb71a
  • [P3] 下一轮开启后,turnEnded() 的 deferred fallback 仍会被当前 turn 校验拦截 — 当 closeTurn() 因 session 已切换到下一轮而返回空时,turnEnded() 进入 rejudgeWorkTurn()。但 rej...(truncated) · ``lib/app/turn-end.js`` · advisory_7cf56af1f76d3721cb9d0af5`
  • [P3] 伪造 START 标记可绕过已启动子进程的存活校验 — orphanMarker() 固定优先读取 START_FILE,只要该文件存在就不会检查 OWNER_FILE。原生进程与 s...(truncated) · lib/runtime/acp-model.js · advisory_9ef512a603568d710a58bbcc
  • [P3] 原生模型进程继承全部宿主环境密钥 — guardian 将自身完整的 process.env 传给可配置的原生模型命令,而不是只传运行所需变量或当...(truncated) · lib/runtime/process/acp-child.js · advisory_08fe9e68a9140afcf6629d32
  • [P3] 取消或非工作终态不会删除已创建的 native 候选 — rememberWorkTurn() 对非工作终态返回 false,但 finishDeferredNativeTurn() 只返回 isCandidate: false�...(truncated) · lib/app/turn-end.js · advisory_1dd7da97ed3ba7f80f4f8db6
  • [P3] 失败补偿会删除并发完成的同轮候选更新 — rememberWorkTurn() 写入候选后若发现 session 已 corrected 或失效,会执行补偿删除;但 dropWorkTur...(truncated) · lib/app/turn-end.js·advisory_663db738870e3b8be8192f5b`

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

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

由 Sentinel 审核 · 目标提交 f3ad91480b38

Comment thread test/release.test.js
assert.match(workflow, /needs: \[test, windows-minimax\]\n\s+if: startsWith\(github\.ref, 'refs\/tags\/v'\)/);
const windows = workflow.slice(workflow.indexOf(' windows-minimax:'), workflow.indexOf(' publish:'));
assert.match(windows, /if: startsWith\(github\.ref, 'refs\/tags\/v'\)\n\s+runs-on: \[self-hosted, Windows, X64, evox-gcp-win\]/);
assert.match(workflow, /needs: \[test, windows-minimax\]\r?\n\s+if: startsWith\(github\.ref, 'refs\/tags\/v'\)/);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

标签发布不运行也不等待 Kimi Windows 验证

🔴 严重程度:高(P1)
新增契约确认 windows-kimi 只在 pull_request 或 workflow_dispatch 运行,而正式标签发布属于 push;同时 publish.needs 仍只有 [test, windows-minimax]。因此 Kimi 已进入打包及发布清单,但标签发布既不执行也不等待其 Windows 原生 hook 和打包验证。

Finding:finding_5d18ec7de33710e930404a45

if (!observed) return;
// Native terminal wins over owner death; orphan recovery must not turn a completed check into an abort.
const result = await reconcile({ ...at, sessionEpoch: session.sessionEpoch });
if (result?.facts?.limited || ['unreadable', 'unsupported'].includes(result?.facts?.status)) return;

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)
native-facts.js 返回可续读的 mark 并将超限批次标记为 limited,但监控器看到 limited 后立即退出,而不是继续使用该游标轮询。若 finish/fail/cancel 记录位于下一批,当前监控任务不会读取该终态。是否存在另一个可靠恢复入口在给定代码中未得到证明。

Finding:finding_0caf85023cca8930b06ee9a4

Bind only a fresh native TurnStarted matching the submitted prompt, owner, and file anchor when available. Keep the route binding captured at submit rather than selecting current credentials for an older turn.
Reevaluate the captured binding of the remaining work. Omit the old worktree diff for the repaired range and retain only runtime blocks tied to the same binding.
@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

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

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

由 Sentinel 审核 · 目标提交 0624dfbfe0b8

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P1] 标签发布不运行也不等待 Kimi Windows 验证 — 新增契约明确断言 windows-kimi 只在 pull_request 或 workflow_dispatch 上运行,而标签发布由 pu...(truncated) · test/release.test.js·advisory_0de5e8d7b7ce529ed86c70dc`
  • [P2] 事实分页达到上限时终止监控,后续终态可能永远未被消费 — nativeFactsOf() 为分页结果返回可续读的 mark,但监控器看到 limited 后立即释放唯一监控循...(truncated) · lib/runtime/native-monitor.js · advisory_476a1687a24fbf9f9a16eac2
  • [P2] 分页超限会停止未收敛 turn 的监控 — 新增测试明确要求 limited: true 时只读取一次且禁止继续轮询,即使结果仍为 waiting: true、...(truncated) · test/runtime/native-monitor.test.js · advisory_26d2ae56264b71923a882c90
  • [P2] 失败补偿可能删除并发写入的有效候选 — rememberWorkTurn() 写入 candidate 后重新检查 session;若该轮在此期间转成 deferred,旧调用会认��...(truncated) · lib/app/turn-end.js · advisory_4102b0158d00d58ff559fe93
  • [P3] native-turn.test.js 从未定义的测试体中间开始,导致测试文件无法解析 — 新增文件的首段直接使用 facts、ports、at、older、range、open 等变量,并在第 35 行出�...(truncated) · test/app/native-turn.test.js · advisory_dba9e7d7cd525e5fbb21dc72
  • [P3] decoder 拒绝状态泄漏,新增测试必然无法验证任务 ID 不匹配路径 — 测试先将共享的 f.declaration.decode 替换为永久返回 { status: 'unsupported' } 的函数,并立即断�...(truncated) · test/runtime/native-facts.test.js · advisory_b2cb17d67310634857408043
  • [P3] epoch 校验失败后仍继续写入更正标记和候选状态 — ports.sessions.update() 的回调仅在当前 session 的 sessionEpoch 与提交 correction 时读取的 epoch 相��...(truncated) · lib/app/prompt.js · advisory_c23bfa0b577df23f95e325cc
  • [P3] native 终态永久缺失时,关闭重试没有兜底 — closeUnfinishedTurn() 即使已经等待完 settleMs,只要 awaitsNativeTerminal(session) 仍为真就跳过 tu...(truncated) · lib/app/turn-end.js·advisory_f1b8421ecab82c1f1ef78cb2`
  • [P3] 后台命令启动失败被记录为仍在运行 — run_in_background === true 无条件令 pending 为真,随后只有 !pending 时才保留 result.isError。因...(truncated) · hosts/kimi/transcript.js · advisory_20e9cc375cdf725cc7928f36
  • [P3] Windows Job 停止失败时仅杀死 helper,可能遗留 native 子进程 — Windows 路径中 child 是 Job helper,而 remember(nativePid) 明确记录了另一个 native PID。job.stop() ...(truncated) · lib/runtime/process/acp-child.js · advisory_f2854d9c754e024c0d0f8319
  • [P3] partial + limited 响应被当作不可续读终态 — 新增契约要求监控器在响应同时声明“结果不完整”和“仍在等待”时只读取一次并永久退...(truncated) · test/runtime/native-monitor.test.js · advisory_663d4e80ad1c8b4f78127142
  • [P3] provisional 状态阻止 blocked range 的 TTL 过期调度 — dueAtOf() 对所有 blocked range 原本应返回 blockedExpiryAt(range),但新增逻辑在 isProvisional(range)...(truncated) · lib/distill/range.js · advisory_dd98975590d65c6a8ee35125
  • [P3] 多处成功路径把异步 capture() Promise 直接传给 complete() — 同一文件中首个测试明确使用 await runner.capture(...) 后再调用 complete(),而多个后续测试却...(truncated) · test/runtime/acp-model.test.js · advisory_e471c0303e2f35097243306c
  • [P3] 已提交更新遗留的备份可能被当作中断事务复活 — 提交状态只存在于内存变量 committed 中,没有写入 staging。若注册表和新包已提交,但进程...(truncated) · scripts/install-kimi.mjs · advisory_b993f111ae49576351495774
  • [P3] 成功切换后崩溃会遗留无法回收的安装暂存目录 — installationOf() 只有在 packageOf(target) 返回空时才调用 recoverPackage()。如果进程在新包已经�...(truncated) · scripts/install-kimi.mjs · advisory_80349a7705dc8742fbf7966d
  • [P3] 测试固化了事实分页未完成时永久停止监控 — 新增测试明确断言 limited: true 且仍处于 waiting 时只读取一次,并禁止后续 sleep/轮询。��...(truncated) · lib/runtime/native-monitor.js · advisory_838f6a7a6734ca81240d3423
  • [P3] 移除缺失绑定的 turn 后,native range 仍永久保持路由阻塞 — withoutWorkTurn() 先对旧 range 调用 rangeRouteProblem(range),结果会优先返回旧的 range.routeConflict...(truncated) · ``lib/distill/range.js`` · advisory_b9e7165e20b202dabef1e0b5`
  • [P3] 24 小时观察上限到期后未执行任何终态收敛 — 循环仅在 now() - start < MAX_WATCH_MS 时运行;达到 24 小时后函数直接返回,没有 timeout、abort��...(truncated) · lib/runtime/native-monitor.js · advisory_32db91bf3bcd16a3bab1136d
  • [P3] decoder 与新增测试对任务 ID 不匹配路径的契约不一致 — decoder 会拒绝某类状态,导致新增测试无法真正到达并验证“任务 ID 不匹配”路径。测试表...(truncated) · lib/app/native-turn.js`、`test/hosts/kimi/dist.test.js`、`test/runtime/native-facts.test.js · advisory_5525eae24a210bfa4f747d32
  • [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_06:state_chain_9e84061dbb91d8c8

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

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

由 Sentinel 审核 · 目标提交 0624dfbfe0b8

Comment thread lib/session/state.js
const { turn, turnId, sessionEpoch, pid, prompt, turnHead, isCommand, withheld, native } = session;
const deferred = { turn, turnId, sessionEpoch, pid, prompt, turnHead, isCommand, withheld, native, open: false };
return { native: null, deferredNativeTurns: [...(session.deferredNativeTurns ?? []), deferred].slice(-MAX_TURN_IDS) };
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

未收敛的 deferred native turn 会被容量上限静默丢弃

🟠 严重程度:中(P2)
deferNativeTurn() 将仍等待 native 终态的 turn 写入 deferredNativeTurns 后立即执行 .slice(-MAX_TURN_IDS),最旧的未完成 turn 被移出唯一用于延迟终态匹配的状态。其后到达的终态无法再被 observedNativeTurn() 找到,finishDeferredNativeTurn() 的报告和候选收敛路径会拒绝该 turn。

Finding:finding_43ce269bcb11c4f12d4f8629

Comment thread lib/runtime/acp-model.js
if (process.platform === 'win32') {
if (child.jobEmpty !== true || !Number.isSafeInteger(child.helperPid) || child.helperPid <= 0) throw new ModelUnavailable('unsafe_runtime');
pids.push(child.helperPid);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

孤儿目录中的 PID 重用会阻塞后续所有模型调用

🟠 严重程度:中(P2)
恢复逻辑只通过 kill(pid, 0) 判断记录的 PID 是否仍存活,未验证其是否仍是原 guardian/native 进程。PID 被无关进程重用时,清理会抛出 MODEL_UNAVAILABLE,使新的完成请求在创建新隔离目录前失败。

Finding:finding_5845bd95085ca54435ce6756

@evomap-aiqa-bot

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

Copy link
Copy Markdown

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

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

未收敛的 deferred turn 超过容量后被静默淘汰

🟠 严重程度:中(P2)
deferNativeTurn() 将 pending native turn 写入 deferredNativeTurns 后无条件执行 .slice(-MAX_TURN_IDS)。最旧的未收敛 turn 会从 session 的权威状态中丢失;之后 observedNativeTurn() 找不到它,hasDeferredTurn() 返回 fals...(truncated)

Finding:finding_7bc965c30f90513567a05b6f · 文件:lib/session/state.js · 详情:/api/v1/aiqa/findings/finding_7bc965c30f90513567a05b6f

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

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

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

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

由 Sentinel 审核 · 目标提交 526d93e75079

@evomap-aiqa-bot

Copy link
Copy Markdown

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

  • [P2] native 终态缺失时关闭重试永远无法收敛 — 即使已经等待完 settleMs,只要 awaitsNativeTerminal(session) 为真,closeUnfinishedTurn() 就跳过 tu...(truncated) · lib/app/turn-end.js·advisory_ab949b78fab8a2560d1ece10`
  • [P2] 事实分页达到上限后终止监控,后续终态不会被消费 — nativeFactsOf() 在分页受限时返回可续读的 mark,但监控器看到 facts.limited 后立即退出,未...(truncated) · lib/runtime/native-monitor.js · advisory_b88a90e1e56946ba8f20a921
  • [P2] 更正流程忽略 epoch 校验失败,并可能留下三套不一致状态 — correctedTurnOf() 先调用带 epoch guard 的 sessions.update(),但不检查该更新是否因 session reset/reop...(truncated) · lib/app/prompt.js · advisory_3f9b5beb6c660662f888f3cf
  • [P3] decoder 拒绝状态泄漏,导致任务身份校验测试必然失败 — 测试在第一次断言前将 f.declaration.decode 替换为永久返回 { status: 'unsupported' } 的函数。随�...(truncated) · test/runtime/native-facts.test.js · advisory_614b27a8b60db7bc8a641d3c
  • [P3] 后台命令启动失败被当作仍在运行,并在记录归一化时丢失失败状态 — 当后台命令没有匹配到唯一 task 时,pending 无条件因 input.run_in_background === true 变为 true�...(truncated) · hosts/kimi/transcript.js · advisory_1ac7e7c7dc1366145016e09e
  • [P3] 新增 native-turn 测试文件无法解析,阻塞整个测试入口 — 文件从测试体中间的 const running = ... 开始,缺少 imports、测试夹具和外层 test(..., async () =>...(truncated) · ``test/app/native-turn.test.js`` · advisory_a09da9237302e5df8d0ed8d9`
  • [P3] 新建 native range 未保存 sessionEpoch,导致 pending check 永远无法写入 — withWorkTurn() 的文档约定 context 不包含 sessionEpoch,但新建 range 只把 context 展开保存,��...(truncated) · lib/distill/range.js · advisory_812883b4f33909a7bdfdb49e
  • [P3] 标签发布不运行也不等待 Kimi Windows 验证 — 新增 Kimi 打包与发布契约,但 windows-kimi 的条件仅允许 pull_request 或 workflow_dispatch,不��...(truncated) · .github/workflows/release.yml · advisory_b1128d21d857685fa8a91a2a
  • [P3] receipt 拒绝注入未被激活,回归测试可能无条件通过 — preload 中只有在 to === process.env.FIXTURE_RECEIPT 且第二次替换时才抛出 EPERM,但当前测试没有...(truncated) · test/runtime/acp-receipt.test.js · advisory_f3b4b8221515771dacf808cb
  • [P3] ACP 输出未执行凭据检查,可将模型 API Key 写入最终答案 — 新运行器把 selected.secret 以 EVOLVER_MODEL_API_KEY 注入子进程,并明确禁止该秘密出现在配置�...(truncated) · lib/runtime/acp-model.js · advisory_01a6f040fa2a18bca7c6a944
  • [P3] provisional 的阻塞 range 不再安排 TTL 过期 — dueAtOf() 对同时满足 isRouteBlocked() 和 isProvisional() 的 range 直接返回 null,因此不再返回 ...(truncated) · lib/distill/range.js · advisory_865f738014f98f854df06d80
  • [P3] 事实分页达到上限时放弃仍未收敛的 native turn 监控 — 新增契约规定 facts.status === 'partial' && facts.limited === true 时,监控器只读取一次且不再轮询�...(truncated) · test/runtime/native-monitor.test.js · advisory_a5faacfbded0b5253030dd92
  • [P3] 未绑定 mark 的 deferred turn 在追赶终态时直接崩溃 — capturePrompt() 明确允许保存 native.mark = null 并通过 admission 延后建立身份;当前轮的 recon...(truncated) · lib/app/native-turn.js·advisory_142fb57c6d2c839cd8358f28`
  • [P3] 省略 effort 时未使用模型的 default_effort — 对支持 thinking 的模型,未传 hint.effort 时 effort 被设为 null,随后又要求它必须存在于 s...(truncated) · ``hosts/kimi/model.js`` · advisory_70b1be276744f9d3a1ddf4c2`
  • [P3] 默认安装可能静默复用陈旧的 Kimi 构建产物 — 默认路径只验证现有 dist/kimi 的标记、manifest、版本和 hooks,随后直接复制;它不会重新打...(truncated) · scripts/install-kimi.mjs · advisory_401d691160123e8f6a305be9
  • [P3] ACP 输出绕过凭据检查进入最终答案 — ACP 模型输出没有执行凭据检查,但该输出随后由 model executor/distill 链路作为模型结果或最��...(truncated) · lib/runtime/acp-model.js`, `lib/runtime/model-executor.js`, `lib/distill.js · advisory_843c6f66f3f58c3e13139b1e
  • [P3] Native 事实分页会截断终态消费,导致 turn 生命周期无法收敛 — 事实分页达到上限后,monitor 被终止;但 native turn 的终态仍需要通过该 monitor 消费。关闭重...(truncated) · ``lib/runtime/native-facts.js, lib/runtime/native-monitor.js`, `lib/runtime/native-turn.js`, `lib/a...(truncated)` · `advisory_cdd6bf587a7c84bd8e4d0396`
  • [P3] Windows Job 挂载失败时可能遗留已启动的 native 子进程 — startWindowsJob() 在 stopped Promise executor 内调用;该调用抛错后 Promise 直接 rejected,外层 guar...(truncated) · ``lib/runtime/process/acp-child.js`` · advisory_251a7f9a8238d359daa93bdb`
  • [P3] deferred turn 的两条追赶路径对 mark 契约不一致 — ports/deferred turn 可以产生未绑定 mark 的记录,但 native-turn 的终态追赶路径直接使用 mark�...(truncated) · lib/app/native-turn.js`, `lib/app/ports.js`, `lib/app/turn-end.js · advisory_2c928fb88afb23daf4ed6013
  • [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_06:state_chain_9e84061dbb91d8c8

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

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

由 Sentinel 审核 · 目标提交 526d93e75079

Comment thread lib/app/turn-end.js

function dropWorkTurn(ports, sessionId, opened, expected) {
return ports.candidates.update((pending) => {
if (expected && !rangeOf(pending, sessionId)?.turns.some((turn) => turn.turn === opened.turn && turn.sessionEpoch === opened.sessionEpoch)) return undefined;

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)
rememberWorkTurn() 写入 candidate 后重新读取 session;若状态已经转成 deferred,它会调用 dropWorkTurn() 补偿。但删除条件只验证 turn + sessionEpoch 仍存在,没有验证 candidate 的版本、内容或写入者。若 deferred 完成路径已在此期间更新同一 candidate,旧调用会把这个更新后的有效结果删除。rejudgeWorkTurn() 的非 work 删除分支也使用同一个无版本保护的补偿函数。

Finding:finding_3c1c5bd8f183da352a455ffd

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