Repository navigation
Conversation
|
Sentinel 已审核此变更,并发现 1 个已核验问题。 GitHub CI 未通过。 此状态来自当前 CI gate,不是 Sentinel finding;请以最新 CI attempt 的日志为准。 另有 34 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 aafc954c44c8 |
|
Sentinel 保留了 34 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 aafc954c44c8 |
| 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'] }); |
There was a problem hiding this comment.
Hook 超时仅在进程退出后检查,死锁会导致测试与 CI 一直挂起
🟠 严重程度:中(P2)
run() 只监听子进程的 error 和 close,没有计时器、取消信号或进程树终止逻辑。handler.timeout 仅在 await run() 返回后才通过耗时断言检查,因此无法处理真正的挂起;使用 shell: true 时还会多出 shell/实际命令两级进程,外层测试取消也未确保清理整棵进程树。
Finding:finding_b3e5a29e395eaffce41cf652
Bugbot is paused — on-demand spend limit reachedBugbot 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. |
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 另有 34 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 7acad49cebcc |
|
Sentinel 保留了 34 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 7acad49cebcc |
|
Sentinel 正在审核此变更,尚未形成最终结论。 大 PR 拆片审核中
开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 50c741f4920e |
|
Sentinel 已审核此变更,并发现 4 个已核验问题。 无法定位到 diff 的已核验问题工作已完成后 admission 释放失败会把成功结果改报为失败🔴 严重程度:高(P1) Finding: 释放失败会遗留当前进程永远无法回收的锁🔴 严重程度:高(P1) Finding: status 与 update 的预检查绕过安装锁,可观察到包和注册表的中间状态🟠 严重程度:中(P2) Finding: 状态锁释放超时被静默吞掉,存活进程无法再次更新🟠 严重程度:中(P2) Finding: 当前为 另有 29 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 d8d51771bc47 |
|
Sentinel 保留了 29 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 d8d51771bc47 |
|
Sentinel 已审核此变更,并发现 3 个已核验问题。 无法定位到 diff 的已核验问题工作锁已释放却向调用方报告失败,重试会重复执行任务🔴 严重程度:高(P1) Finding: 当前为 另有 30 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 ed9e802e41d4 |
|
Sentinel 保留了 30 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 ed9e802e41d4 |
| return token; | ||
| attempt = admitted(lockPath, () => { | ||
| try { | ||
| fs.writeFileSync(lockPath, token, { mode: 0o600, flag: 'wx' }); |
There was a problem hiding this comment.
admission 释放失败时仍可能遗留当前进程持有的主锁
🔴 严重程度:高(P1)
主锁写入成功后,releaseAdmission() 若连续重试失败,admitted() 执行回滚;但回滚对主锁的读取或删除同样可能失败并抛出。acquire() 此时丢弃已取得的 token 并返回失败,而主锁文件保留当前仍存活的 PID。后续调用既不能持有该 token 来释放锁,也不会将其视为死进程锁回收,直到宿主进程退出。
Finding:finding_a5ce73178c4d6352afd22263
| 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); |
There was a problem hiding this comment.
remove 在锁外使用旧快照,可能跳过并发完成的安装
🟠 严重程度:中(P2)
registry、own 和 previous 都在 .evolver-plugin-install 锁外读取;remove 只有旧快照中的 own 为真时才进入锁并重新检查。若读取时尚未注册,而并发 install 随后提交注册,remove 会完全跳过加锁及当前状态检查,却返回 installed: false, registered: false。
Finding:finding_b1d69b87adee09290cf11502
|
Sentinel 已审核此变更,并发现 1 个已核验问题。 另有 29 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 397a7038b9f6 |
|
Sentinel 保留了 29 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 397a7038b9f6 |
| // 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+)*/; |
There was a problem hiding this comment.
带引号的可执行文件不再被识别为验证命令
🟠 严重程度:中(P2)
新增的 SHELL_DATA 会将整个单引号或双引号段替换为 __data__。当引号包围的是命令本身时,后续命令识别收到的是 __data__ test,而不是 npm test,因此返回非验证命令。
Finding:finding_9f068c69dcc138f62ab1342f
Bugbot is paused — on-demand spend limit reachedBugbot 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. |
|
Sentinel 正在审核此变更,尚未形成最终结论。 大 PR 拆片审核中
开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 1d4cec3359c3 |
Bugbot is paused — on-demand spend limit reachedBugbot 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. |
|
Sentinel 已审核此变更,并发现 1 个已核验问题。 另有 23 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 30ef90b0f649 |
|
Sentinel 保留了 23 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 30ef90b0f649 |
| // The guard is released when its unique owner is gone. An empty directory can be reclaimed. | ||
| try { retryLockAccess(() => fs.rmdirSync(admission)); } catch {} | ||
| } | ||
|
|
There was a problem hiding this comment.
释放失败的 admission 只能由原进程回收
🔴 严重程度:高(P1)
releaseAdmission() 删除 owner 失败后仅将残留 owner 记录在当前进程内存的 abandonedAdmissions。若调用方未提供 rollback,admitted() 吞掉该失败并返回成功;其他进程无法获知该标记,且 owner PID 仍存活时不会回收该 admission,直到原进程退出。
Finding:finding_324f8e26cffc50324a72e33a
(cherry picked from commit a0e143e)
|
Sentinel 已审核此变更,并发现 3 个已核验问题。 无法定位到 diff 的已核验问题Windows 缺失系统环境变量的回归测试实际未覆盖目标条件🟠 严重程度:中(P2) Finding: 孤儿工作目录清理只检查根 PID,可能遗漏仍存活的后代进程🟠 严重程度:中(P2) Finding: 当前为 另有 30 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 016cc978aa6b |
|
Sentinel 保留了 30 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 016cc978aa6b |
| 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; |
There was a problem hiding this comment.
中断更新留下的备份无法被恢复
🟠 严重程度:中(P2)
recoverPackage() 只有在暂存目录同时存在 previous 和 package 时才恢复旧包;但激活后 package 已被移动到目标目录,回滚又会先删除该目标。因此最需要恢复的“只剩 previous”状态被直接忽略。后续重试读取不到 target,也无法找到保留的有效备份。
Finding:finding_20e0c0afcfc6982eb8243f7c
|
Sentinel 已审核此变更,并发现 7 个已核验问题。 无法定位到 diff 的已核验问题不可读 owner 恢复测试的后续断言与 fixture 状态矛盾🔴 严重程度:高(P1) Finding: Windows 上更新已有状态文件会持续重试后失败🔴 严重程度:高(P1) Finding: 事实批次受限时监控器提前退出,可能遗留未决 turn🟠 严重程度:中(P2) Finding: 带引号的验证命令可被错误漏判🟠 严重程度:中(P2) Finding: 首次 Native Prompt 可能因缺少 session 记录被静默丢弃🟠 严重程度:中(P2) Finding: 当前为 另有 37 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 34d272dded7e |
|
Sentinel 保留了 37 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 34d272dded7e |
| 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'); } |
There was a problem hiding this comment.
缺失 child 收据的孤儿目录会永久阻断模型执行
🔴 严重程度:高(P1)
OWNER_FILE 在 fork() 前写入。若宿主在 guardian 生成 CHILD_FILE 前退出,后续清理确认 owner PID 已消失后,会因 child 收据不存在而抛出 ModelUnavailable('unsafe_runtime')。该分支既不删除也不隔离目录;每次后续调用都会重新命中同一目录并失败。
Finding:finding_a51027049ac2d9ca770b1658
| ({ 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 } : {}) }; |
There was a problem hiding this comment.
状态与更新预检可观察安装事务的中间态
🟠 严重程度:中(P2)
包激活和 registry 更新由安装锁保护,但初始 installationOf() 及 status 返回、update 的 installed 预检发生在锁外。新安装中,包已移动到目标但 registry 尚未登记时,status 会报告未安装;更新过程中也可能返回尚未提交、随后仍可能回滚的新版本。
Finding:finding_4be05e5c27c9cff5a3b8f4f4
(cherry picked from commit 0490c99)
|
Sentinel 已审核此变更,并发现 3 个已核验问题。 无法定位到 diff 的已核验问题Windows 环境变量回归测试实际没有移除目标变量🟠 严重程度:低(P3) Finding: 当前为 另有 41 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 审核覆盖提示: 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 84e2d57c2d15 |
|
Sentinel 保留了 41 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
另有 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 84e2d57c2d15 |
| }, | ||
| get error() { return error; }, get nativeResult() { return nativeResult; }, get guardianResult() { return guardianResult; }, | ||
| async dispose(sessionId) { | ||
| signal?.removeEventListener('abort', abort); |
There was a problem hiding this comment.
清理阶段移除取消监听,允许已取消请求成功完成
🟠 严重程度:中(P2)
dispose() 一开始就移除 signal 的 abort listener,之后仍会等待 session/close、原生进程退出、facts 读取与校验以及 guardian release。若外部信号在此期间取消,abort() 不再执行,也没有结束前的 signal.aborted 棐查;因此本应失效的旧 completion 仍会返回 { answer, usage },调用方可能把它写入已经取消或重置后的会话状态。
Finding:finding_206603a7af226a7cc40e104a
| 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__'); |
There was a problem hiding this comment.
带引号的验证命令会被漏判
🟠 严重程度:中(P2)
新增的 SHELL_DATA 将完整引号内容替换成 __data__;若引号包住命令的可执行文件,命令名会在匹配前消失,后续无法匹配 VERIFICATION_COMMANDS。
Finding:finding_8cae37db07f2be497dd9f7a5
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.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
npm run test:kimiandnpm run packpassed on the isolated branch. The Windows Node 26 and Linux matrices are in CI.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.