Skip to content

fix(test): 修复 CI build 恒红——sandbox 测试按运行时 bwrap 能力门控 + 更新 grant 陈旧断言 - #700

Merged
deepcoldy merged 1 commit into
masterfrom
fix/ci-sandbox-test-guards
Aug 2, 2026
Merged

fix(test): 修复 CI build 恒红——sandbox 测试按运行时 bwrap 能力门控 + 更新 grant 陈旧断言#700
deepcoldy merged 1 commit into
masterfrom
fix/ci-sandbox-test-guards

Conversation

@deepcoldy

Copy link
Copy Markdown
Owner

背景

master 的 CI build job(跑 pnpm test长期失败(最近多次 run 均红)。排查后确认 3 个失败测试文件与被测代码/依赖无关,是测试自身的环境门控/陈旧断言问题:

问题 1:sandbox 测试环境门控不足(2 个文件)

test/plugin-mcp-sandbox.test.tstest/v3-distillation-runner.test.ts 里跑真实 bwrap 的用例,skip 判断只看 process.platform === 'linux'(+ 有无 dist/cli.js)。但 GitHub Actions runner 禁用了非特权 user namespace,bwrap 一起就死:

bwrap: setting up uid map: Permission denied

于是用例不 skip、反而 fail(plugin-mcp-sandbox ×3、v3-distillation-runner PID namespace 用例 ×1)。

修法:复用 worker 生产同款运行时探针 probeHostCredentialIsolationMechanism()(内部实跑一次 --unshare-user … -- /bin/true)判断 bwrap 是否真的可用,无能力的 runner 上 skip、有能力的主机照常真跑。与仓库里 test/fs-policy-bwrap.e2e.test.ts 既有的 bwrapUsable 门控是同一思路(DRY:直接用生产探针,不另造一份)。

问题 2:card-handler-grant-partial 陈旧断言(1 个文件)

「部分成功」用例断言 expect(deleteMock).toHaveBeenCalledWith('h1', 'om_card')(撤回原卡)。但 2d1faa4(2026-07-31,fix(grant): 授权成功就地更新原卡(正文@被授权人),不再发通知卡+撤回原卡)已把行为改成就地 patch 原卡为终态、不再撤卡。断言未同步 → 自那以后恒 fail

修法:改为断言 handleCardAction 返回就地更新的终态卡(config.update_multi === true + header.template === 'green')、且 deleteMock 未被调用——对齐同文件「全部失败」用例已有的 expect(deleteMock).not.toHaveBeenCalled() 风格。

验证

场景 结果
本机(bwrap 可用) 3 文件 38 测试全绿,sandbox 用例真跑未 skip
模拟 runner(PATH 塞入失败的 bwrap stub) plugin-mcp-sandbox 整块 skip、v3-distillation PID 用例 skip,0 失败 = CI 应得的绿
tsc --noEmit 干净
相邻套件 card-handler-grant / sandbox / fs-policy-bwrap 47 测试全绿

影响面

纯测试文件改动,不动任何 src 运行时逻辑;跨平台 / 跨 CLI / 跨后端均无影响。

关联

修复本 PR 后,CI build 将转绿,同时也会解除 #699(Dependabot 安全修复)等其它 PR 因 master 既有 CI 红而误判失败的问题。建议本 PR 先行合入。

🤖 Generated with Claude Code

master 的 CI `build`(pnpm test) 长期失败,3 个测试文件的失败与代码/依赖无关:

## 1. plugin-mcp-sandbox / v3-distillation-runner:环境门控不足
这两个文件的真实 bwrap 用例只用 `process.platform === 'linux'`(+ 有无 bwrap 二进制)
做 skip 判断,但 GitHub Actions runner 禁用了非特权 user namespace,bwrap 起不来
(`bwrap: setting up uid map: Permission denied`)→ 用例不 skip 反而 fail。

改为复用 worker 生产同款运行时探针 `probeHostCredentialIsolationMechanism()`
(内部 `--unshare-user … -- /bin/true` 实跑一次)判断 bwrap 是否真的可用,
无能力的 runner 上 skip、有能力的主机(本机)照常真跑。这与
test/fs-policy-bwrap.e2e.test.ts 既有的 `bwrapUsable` 门控是同一思路。

## 2. card-handler-grant-partial:陈旧断言
「部分成功」用例断言 `deleteMock).toHaveBeenCalledWith('h1','om_card')`(撤回原卡),
但 2d1faa4(2026-07-31「授权成功就地更新原卡,不再发通知卡+撤回原卡」)已把行为
改成就地 patch 原卡为终态、不再撤卡。断言未同步更新 → 自那以后恒 fail。
改为断言:handleCardAction 返回就地更新的终态卡(update_multi + 绿头)、且 deleteMock
未被调用(对齐同文件「全部失败」用例的 `deleteMock).not.toHaveBeenCalled()` 风格)。

## 验证
- 本机(bwrap 可用):3 文件 38 测试全跑全绿(sandbox 用例真跑未 skip)
- 模拟 runner(PATH 塞入失败的 bwrap stub):plugin-mcp-sandbox 整块 skip、
  v3-distillation PID 用例 skip,0 失败——即 CI 应得的绿
- tsc --noEmit 干净;相邻 card-handler-grant / sandbox / fs-policy-bwrap 套件 47 测试全绿

## 影响面
纯测试文件改动,不动任何 src 运行时逻辑;跨平台/CLI/后端均无影响。

Co-Authored-By: Claude <noreply@anthropic.com>
@deepcoldy
deepcoldy merged commit fe594fc into master Aug 2, 2026
6 of 7 checks passed
deepcoldy added a commit that referenced this pull request Aug 2, 2026
机器过载告警从 per-bot 迁到全局设置,选一个通知 Bot 由它 daemon 采样整机 load/内存发私信(其余 no-op);纯函数抽 computeOverloadThresholds/isOverloadAlertTarget;幂等迁移旧 per-bot 开关。codex 三轮复审全过。

附带修申晗 live 测时报的 3 个 dashboard UI bug(纯前端 style.css + icon-tooltip.ts):
- 异形屏 sidebar 不能滚(.sidebar 改 flex column + nav flex:1/min-height:0)
- 全局设置瀑布流窄屏溢出重叠(column-count:3 → columns:300px 3 自适应 + 窄列 field-row 单列堆叠)
- 详情 dialog 内图标按钮 tooltip 被遮(icon-tooltip 复用 floatingPortalHost 挂 dialog[open] 进 top layer)

codex ✅ 复审 delta。已 rebase 到最新 master(含 #700/#706),build 绿 + CI 全绿。
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown

🚀 Released in v3.8.0

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