fix(ci): retry transient sandbox:none E2E shard failures once (#10566) - #10572
Conversation
E2E report — issue #10566 (Main CI failed: E2E Tests on 3aa1b14)BackgroundWorkflow run 33317457036 failed on InvestigationWhich job failed. The public jobs API shows exactly one failing job: The failure is a recurring class, not this commit. The two previous main E2E runs failed the exact same leg at the exact same step on two other hosts and two other commits ( Local reproduction. A full surrogate of the failing leg at Root-cause analysis of the signature. "Exit 1 with zero vitest Change madeOne bounded retry for the Honest limits: without authenticated log access the exact internal vitest path of each death cannot be named, and the retry is a mitigation for a transient environment class, not a patch of vitest internals — the same shape of mitigation this file already carries for the image build. The final gate is the E2E lane itself turning green on main. Verification
中文说明E2E 报告 — issue #10566(Main CI failed: E2E Tests on 3aa1b14)背景Workflow 运行 33317457036 在 调查哪个任务失败。 公开的 jobs API 显示恰好一个失败任务:池运行器 失败是复发的失败类别,而非本提交引入。 此前两次 main E2E 运行在另外两台主机、另外两个提交上以完全相同的通道、完全相同的步骤失败( 本地复现。 在 签名层面的根因分析。 "退出码 1 且零条 vitest 所做变更在 诚实的边界:在没有认证日志访问的情况下,无法点名每次死亡所处的 vitest 内部具体路径;该重试是对瞬时环境类别的缓解,而非对 vitest 内部的修补——这与该文件中镜像构建重试的缓解形态相同。最终门槛是 main 上的 E2E 通道本身变绿。 验证
🧠 Handled by Qwen Code · model/模型 |
|
Thanks for the PR! Template looks good ✓ Problem: observed, with evidence — workflow run 33317457036 died at the Direction: aligned — this is the same shape of mitigation the workflow already carries for the sandbox image build (#10355), and consistent with the just-merged #10552. CI stability is squarely in-repo remit; no product-surface concerns. Size: not applicable — no core paths touched. The whole diff is 17 production lines in the workflow file plus 32 lines of witness tests. Approach: the scope feels right. One bounded retry, scoped to the leg that has actually been failing; a deterministic failure still fails both attempts and keeps the job red; the docker leg is left alone because two ~30-minute attempts would outrun the job timeout. Witness tests pin both the retry and the docker-no-retry invariants. Risk: no elevated risk signals (no high-risk paths matched). Moving on to code review. 🔍 中文说明感谢贡献! 模板完整 ✓ 问题:已观测到,且有证据——运行 33317457036 在 方向:对齐——与本 workflow 中沙箱镜像构建已有的重试(#10355)是同一形态的缓解,也与刚合并的 #10552 一致。CI 稳定性完全属于仓库职责范围,无产品面顾虑。 规模:不适用——未触及核心路径。整个 diff 是 workflow 文件 17 行生产改动加 32 行见证测试。 方案:范围合理。一次有界重试,且限定在实际失败的支路;确定性失败在两次尝试中都会失败、任务保持红色;docker 支路不动,因为两次约 30 分钟的尝试会超出任务超时。见证测试同时固定了"重试"与"docker 不重试"两个不变量。 风险:无升级风险信号(未命中高风险路径)。 进入代码审查 🔍 — Qwen Code · qwen3.8-max Reviewed at |
Code reviewReviewed the diff at the commit below. No blockers.
CI test evidenceFrom the PR's own CI on the reviewed commit (fetched via API; nothing PR-derived was executed here):
The three skips are by design, not caused by this PR: One honest limit: the retry shape is pinned by the witness tests and the exit-status semantics are statically verifiable, but the live absorption effect only manifests the next time a real transient shard death hits the post-merge lane. That is environmental by definition for any retry mitigation — same profile as the already-merged #10355 build retry — and no sandboxed lane ( Real-scenario testing: N/A — CI-harness change with nothing user-visible, and this is an unattended CI run. 中文说明代码审查在上文记录的提交上审阅了 diff,无阻塞问题。
CI 测试证据来自该提交上 PR 自身的 CI(经 API 获取;此处未执行任何 PR 派生代码)。表中三个跳过项均为设计使然、与本 PR 无关: 诚实的边界:重试形态由见证测试固定、退出状态语义可静态验证,但实际吸收效果要等下一次真实的瞬时死亡发生在合并后通道上才会显现。对任何重试缓解而言这都是环境使然——与已合并的 #10355 构建重试同一形态——且没有任何沙箱通道( 真实场景测试:N/A——CI 基础设施变更、无用户可见行为,且本次为无人值守 CI 运行。 — Qwen Code · qwen3.8-max Reviewed at |
|
Confidence: 5/5 — minimal, well-evidenced mitigation that matches the repo's existing retry precedent; the only open item is the CI run still in flight. My independent proposal for this problem — wrap the failing shard command and retry it once, warn between attempts, let the final attempt's exit status decide, pin the shape with witness tests, leave the docker leg alone — is essentially what this PR does, and I did not find a simpler path it missed. A step-level retry in the #10355 style would have duplicated the whole env/TMPDIR block for more YAML, and a marketplace retry action would trade an in-file pattern for an external dependency in privileged CI. On the bigger picture: this is the twentieth "Main CI failed" open issue of this shape in ~36 hours, three consecutive main runs died at the same leg and step on three different hosts, and the shard passes on re-run — the problem is real and bleeding maintainer attention, and a bounded retry is the same mitigation already accepted for the sandbox build in this exact file. Nothing in the diff weakens a real failure signal: two attempts both fail → the job stays red. Every line in the diff serves the stated goal; the comments carry the run IDs a future maintainer will want. Approval is deferred only because 中文说明我针对此问题的独立方案——包住失败的分片命令并重试一次、两次尝试之间告警、以最后一次尝试的退出状态为准、用见证测试固定形态、不动 docker 支路——与本 PR 基本一致,且我没有找到它遗漏的更简路径。采用 #10355 的步骤级重试会把整个 env/TMPDIR 块复制一遍、产生更多 YAML;用市场重试 action 则是以特权 CI 中的外部依赖换掉文件内模式。 全局来看:约 36 小时内已有第 20 个同形态的 "Main CI failed" 开放 issue,连续三次 main 运行在三台不同主机上死于同一支路与步骤,而该分片重跑即通过——问题真实存在且持续消耗维护者精力,有界重试正是同一文件中沙箱构建已被接受的缓解形态。diff 没有削弱任何真实失败信号:两次尝试都失败时任务依旧红色。每一行改动都服务于既定目标;注释中保留了未来维护者需要的运行 ID。 暂缓批准仅因 — Qwen Code · qwen3.8-max Reviewed at |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not explored to full depth (tool budget reached): "agent 3c": executing scripts/tests/e2e-workflow.test.js — the review worktree has no node_modules (no vitest, no yaml package) and a full install exceeds the tool bu….
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
未探索到全部深度(达到工具调用预算):"agent 3c":executing scripts/tests/e2e-workflow.test.js — the review worktree has no node_modules (no vitest, no yaml package) and a full install exceeds the tool bu…。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max via Qwen Code /review (v0.22.3)
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
🤖 Addressed the latest review feedback (round 1/10). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/10 轮)。改动内容与我反驳保留之处如下: Review round summary — PR #10572 (issue #10566)All 6 findings from the automated review (1 Critical, 5 Suggestions) are resolved in code in commit The review body Findings and dispositionsR1-1 [Critical] — unconditional retry can outrun
|
| Probe | Mutation | Tests that went red |
|---|---|---|
| P1 | Budget gate removed (pre-round unconditional retry restored) | fails fast when the remaining job budget cannot fit a retried shard (bash witness), gates the retry on the remaining job budget |
| P2 | Record job start epoch step removed |
records the job start epoch before the expensive setup steps |
| P3 | Retry run_shard moved after the ` |
|
| P4 | || true appended to the brace group |
keeps the step red when the shard fails both attempts (bash witness), retries the sandbox:none shard exactly once |
| P5 | Shard/exclude arguments stripped from run_shard() body |
retries the full shard command, shard and excludes included |
| P6 | Docker command wrapped in a function called twice | does not retry the docker leg |
| P7 | continue-on-error: true added to Run E2E tests |
keeps the run step red when the shard stays red |
All seven mutants were caught, and the suite returned to 19/19 green after restoring the fix. P1 also doubles as proof that the Critical's witness tests fail against the pre-round code.
Failed checks noted in the feedback
Test (ubuntu-latest Node 22.x): CANCELLED— a cancellation, not a test failure; consistent with concurrency cancelling the previous push's run on this branch. Re-runs with the new push; nothing to fix in code.Post Coverage Comment: FAILURE— downstream of the cancelled Test lane; same treatment.
Verification
npm run build— passed (exit 0)npm run typecheck— passed (exit 0). A first attempt exited 2 withTS6305"output file has not been built" errors while a concurrentnpm run buildwas still writingdist/; re-run sequentially after the build completed and passed cleanly — that failure was a concurrency artifact, not a code defect.npm run lint— passed (exit 0, zero errors/warnings from both eslint invocations)- Focused Vitest (touched files):
npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/e2e-workflow.test.js scripts/tests/e2e-shard-retry.test.js— 19/19 passed (re-run green after the probes and after the stash round-trip) npm run test:scripts(full scripts suite) — 1971/1974 runnable tests pass in the final sequential run; the 3 remaining failures are all outside this PR's footprint and each is evidenced as not caused by this change:no-config-object-create-config.test.jsandqwen-autofix-workflow.test.jsfail only under full-suite load (30s timeouts on shared-host contention) and pass when run in isolation (isolated re-run: 252/253, the one failure below).verify-capture.test.js > renders 256-colour and truecolor via the default-grey fallbackfails deterministically in isolation, and reproduces identically with this change stashed (base treed8e833b1aa) — a pre-existing librsvg/rendering environment issue on this pool runner, not introduced by this commit.
- yamllint — the
yamllintbinary is not installed on this runner and installing it is out of scope for allowed commands; the YAML edits follow the file's existing quoting/indentation conventions and CI'snode scripts/lint.js --yamllintstep remains the authority. - Integration tests after
npm run bundle— not applicable: the changed behavior is CI workflow YAML and its script-test witnesses, which are not exercised through the bundled CLI or the integration harness.
中文说明
评审轮次总结 — PR #10572(issue #10566)
自动评审的全部 6 条发现(1 条 Critical、5 条 Suggestion)已在提交 4140912b34 中以代码解决。本轮未报告冲突(--conflict false),也未执行任何合并。
评审主体 [rv:5061654349] 本身不含可执行的发现——它报告的是评审者自身的工具预算耗尽(在没有 node_modules 的 worktree 中无法执行 scripts/tests/e2e-workflow.test.js),以及一项无法运行的 actionlint 内嵌 shell 检查。其可执行内容就是下面六条内联发现,均已处理。
发现与处置
R1-1 [Critical] — 无条件重试可能超出 timeout-minutes: 60 — 已解决(rc:3890261023)
该论断与 workflow 相符:timeout-minutes: 60 是整个任务共享的预算,而重试会无条件从零重跑整个分片——在三次动机运行中的两次(33293739505、33302550436)里,分片死亡时任务只剩约 10–12 分钟,不足一个分片时长(实测 17–21 分钟),重试只会在进行中被任务超时取消。
修复采用该发现建议的任务级耗时方案(步骤级方案不可行:安装耗时在约 10–29 分钟之间浮动,没有任何静态的步骤级阈值能区分这三次运行):
- 新增首个步骤
Record job start epoch,向GITHUB_ENV导出E2E_JOB_START_EPOCH=$(date +%s),使门控能看到整个任务的消耗,而不仅是测试步骤的消耗。 - 在
|| { … }组内,重试现在位于elapsed=$(( $(date +%s) - ${E2E_JOB_START_EPOCH:-0} ))/if (( elapsed > 2100 ))之后:任务耗时超过 2100 秒(3600 秒预算减去 25 分钟预留——实测最差分片约 21 分钟加上余量)时,步骤以::error::注解快速失败,而不是启动一次不可能完成的重试。若 epoch 缺失,算术上失败即关闭(elapsed ≈ 当前时间戳 > 2100 → 不重试)。 - 按该发现的约束,未上调
timeout-minutes: 60。
对三次动机运行逐一核对:33302550436(重试将在任务第 ~49.7 分钟开始)→ 拒绝;33293739505(~47.8)→ 拒绝;33317457036(~19.5)→ 允许,且 19.5 + 25 分钟预留 ≤ 60,放得下。
R1-2 [Suggestion] — 未固定"重试是有条件的"(末尾锚定)— 已解决(rc:3890261025)
在 retries the sandbox:none shard exactly once 中加入末尾锚定断言 expect(runStep.run).toMatch(/run_shard\s*\n\s*\}\s*\n\s*fi\s*$/),把被重试的 run_shard 固定为组的最后一条命令、且组是脚本的最后一条语句。该模式能容忍 ${RUNNER_NAME:-this runner} 内的字面 },因为它锚定在末尾的 run_shard 上,而非按作用域匹配。探针 P3(把重试移到组外)使其变红。
R1-3 [Suggestion] — 没有断言固定"第二次尝试失败会让步骤失败" — 已解决(rc:3890261026)
在新文件 scripts/tests/e2e-shard-retry.test.js 中加入 bash 执行见证:提取 runStep.run,把 ${{ matrix.sandbox }} 替换为 sandbox:none、${{ matrix.shard }} 替换为 1/3,用可按调用次序控制退出码的桩替换 npm,并在与运行器完全相同的 bash -e -o pipefail 下执行脚本。断言:(a) 失败一次后成功的桩以退出码 0 结束、npm 被调用两次;(b) 总是失败的桩以非零退出、npm 被调用两次。探针 P4(给大括号组追加 || true)使 (b) 变红。新文件已加入 scripts/tests/vitest.config.ts 的 win32 排除列表(与其他 bash 驱动套件并列),test_windows 与 windows-runner-smoke.yml 通道保持绿色;纯 YAML 解析的 e2e-workflow.test.js 仍继续在 Windows 上运行。
R1-4 [Suggestion] — 未固定被重试命令的参数列表 — 已解决(rc:3890261031)
新增 retries the full shard command, shard and excludes included,逐字固定完整调用,包括两个 --exclude 参数与 --shard='${{ matrix.shard }}'。探针 P5(把 run_shard() 函数体简化为裸脚本名)使其变红。
R1-5 [Suggestion] — does not retry the docker leg 固定的是计数而非结构 — 已解决(rc:3890261034)
在既有测试中补充结构断言 expect(runStep.run).not.toMatch(/[A-Za-z_]+\(\)\s*\{[^}]*QWEN_SANDBOX=docker/s),把 docker 命令固定为不位于任何函数体内。它对当前未包裹的单条命令仍然通过;探针 P6(把 docker 命令包进函数并调用两次)使其变红。
R1-6 [Suggestion] — 没有任何断言阻止给 Run E2E tests 加 continue-on-error: true — 已解决(rc:3890261039)
新增 keeps the run step red when the shard stays red,断言 expect(runStep['continue-on-error']).toBeUndefined(),与姊妹块的固定方式一致。它只针对 run 步骤——sandbox 镜像构建步骤上有意保留的 continue-on-error: true 不受影响。探针 P7(加上该键)使其变红。
变异探针(逐一应用、跑红后还原)
| 探针 | 变异 | 变红的测试 |
|---|---|---|
| P1 | 移除预算门控(恢复轮次前的无条件重试) | fails fast when the remaining job budget cannot fit a retried shard(bash 见证)、gates the retry on the remaining job budget |
| P2 | 移除 Record job start epoch 步骤 |
records the job start epoch before the expensive setup steps |
| P3 | 把重试的 run_shard 移到 || { … } 组之后 |
retries the sandbox:none shard exactly once(末尾锚定)、gates the retry on the remaining job budget |
| P4 | 给大括号组追加 || true |
keeps the step red when the shard fails both attempts(bash 见证)、retries the sandbox:none shard exactly once |
| P5 | 从 run_shard() 函数体中移除分片/排除参数 |
retries the full shard command, shard and excludes included |
| P6 | 把 docker 命令包进函数并调用两次 | does not retry the docker leg |
| P7 | 给 Run E2E tests 加 continue-on-error: true |
keeps the run step red when the shard stays red |
七个变异体全部被捕获;还原修复后套件恢复 19/19 全绿。P1 同时证明 Critical 的见证测试在轮次前代码上会失败。
反馈中提到的失败检查
Test (ubuntu-latest Node 22.x): CANCELLED— 这是取消而非测试失败;与本分支上新一次推送触发的并发取消一致。新推送后会重新运行,代码层面无需修复。Post Coverage Comment: FAILURE— 是被取消的 Test 通道的下游结果,同样处理。
验证
npm run build— 通过(退出码 0)npm run typecheck— 通过(退出码 0)。首次尝试以退出码 2 失败,报TS6305"output file has not been built" 错误,原因是并发的npm run build当时仍在写dist/;在构建完成后按顺序重跑即干净通过——该失败是并发伪影,不是代码缺陷。npm run lint— 通过(退出码 0,两次 eslint 调用均零错误零警告)- 聚焦 Vitest(触及文件):
npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/e2e-workflow.test.js scripts/tests/e2e-shard-retry.test.js— 19/19 通过(探针之后与 stash 往返之后均复跑为绿) npm run test:scripts(完整脚本套件)— 最终按序运行 1971/1974 个可运行测试通过;其余 3 个失败都在本 PR 足迹之外,且各有证据证明与本变更无关:no-config-object-create-config.test.js与qwen-autofix-workflow.test.js只在完整套件负载下失败(共享主机争用下的 30 秒超时),单独运行时通过(隔离复跑:252/253,唯一失败见下条)。verify-capture.test.js > renders 256-colour and truecolor via the default-grey fallback在隔离运行时确定性失败,且在 stash 掉本变更后(基线树d8e833b1aa)同样复现——是该池运行器上既有的 librsvg/渲染环境问题,非本提交引入。
- yamllint — 本运行器未安装
yamllint二进制,安装不属于允许的命令范围;YAML 改动遵循该文件既有的引号/缩进惯例,以 CI 的node scripts/lint.js --yamllint步骤为准。 npm run bundle后的集成测试 — 不适用:本变更的行为是 CI workflow YAML 及其脚本测试见证,不经过打包后的 CLI 或集成测试框架执行。
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。
🧵 Resolved all 6 selected review thread(s). · 已关闭全部选中的 6 条评审线程。
Re-review when you have a moment. After round 10 this bot stops and leaves the PR for a human. · 有空请复审;第 10 轮后本 bot 停止并将 PR 交给人工。
🧠 Handled by Qwen Code · model/模型 qwen3.8-max
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline.
Not explored to full depth (tool budget reached): "agent 3b": could not execute scripts/tests/e2e-shard-retry.test.js / scripts/tests/e2e-workflow.test.js — no node_modules exists in the review worktree or the main c….
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
已审查。 建议见行内评论。
未探索到全部深度(达到工具调用预算):"agent 3b":could not execute scripts/tests/e2e-shard-retry.test.js / scripts/tests/e2e-workflow.test.js — no node_modules exists in the review worktree or the main c…。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max via Qwen Code /review (v0.22.3)
…10566) Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
🤖 Addressed the latest review feedback (round 2/10). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/10 轮)。改动内容与我反驳保留之处如下: Autofix review round — PR #10572 (issue #10566)Round outcome: all 4 inline findings addressed in code (commit Feedback points and decisions
Mutation probes (every new witness verified against its own mutant)
Each probe failed exactly one test — the intended witness — with the rest of the suite green; Failed checks triage
Verification
中文说明Autofix 审查轮次 — PR #10572(issue #10566)本轮结果:4 条行内发现全部在代码中处理完毕(提交 反馈点与处理决定
变异探测(每个新见证都针对其自身变异体验证)
每个探测恰好只有一个测试失败——正是预期的见证——套件其余部分保持绿色;每次探测后 失败检查的分诊
验证(Verification)
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧵 Resolved all 4 selected review thread(s). · 已关闭全部选中的 4 条评审线程。 Re-review when you have a moment. After round 10 this bot stops and leaves the PR for a human. · 有空请复审;第 10 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed. Suggestions are inline.
Not reviewed: reverse audit — stopped before round 1 by the review time budget.
Deferred under the convergence posture (round 3, not a blocker) — recorded, not requested in this round:
scripts/tests/e2e-shard-retry.test.js:94 — [probe] No execution witness for the green first-attempt path — an unconditional pre-gate side effect (e.g. a spurious ::warning:: before run_shard || { ) ships with every witness greenscripts/tests/e2e-workflow.test.js:180 — [probe] Docker-leg anti-retry pin [^}]* cannot see through an inner } — a function-wrapped docker double invocation (folding the e2e.yml:85 preflight into it) ships with every witness green
Convergence: round 3 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 4 (4 new). Findings keep coming back to the same files: scripts/tests/e2e-shard-retry.test.js (findings in round 1; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)
中文说明
仅完成部分审查,审查缺口已披露。 建议见行内评论。
未审查:反向审计——评审时间预算不足,未能开始第 1 轮。
收敛姿态下延后(第 3 轮,非阻断)——已记录,本轮不要求修改:共 2 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 3 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 4 条(其中 4 条首次提出)。发现反复回到同一批文件:scripts/tests/e2e-shard-retry.test.js(第 1 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)
— qwen3.8-max via Qwen Code /review (v0.22.3)
|
🤖 Addressed the latest review feedback (round 3/10). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/10 轮)。改动内容与我反驳保留之处如下: Autofix review round — PR #10572 (issue #10566)Round scope: one inline Suggestion plus the two deferred probe findings recorded by the reviewer's convergence posture. All three were confirmed witness gaps in the tests this PR adds; all three were reproduced by mutation probe before any change, then closed with minimal pins. The round is test-only — Feedback points and decisions[rc:3891260591] R1-3 (fix-induced): shell-fidelity premise unpinned — RESOLVED (implemented)Claim: the round-2 execution harness runs the 'Run E2E tests' script under Reproduced before changing anything: step-level Fix as proposed: new
The pin never sweeps jobs or workflows that deliberately set a shell: Mutation proof, as requested by the finding:
Deferred probe 1 (review rv:5062616507): no execution witness for the green first-attempt path — RESOLVED (implemented early)The review recorded this as not requested in this round; it was closed anyway because it is a confirmed witness gap in a test this PR adds, inside the same footprint — closing the whole cluster in one round, as the review's cluster observation suggested. Reproduced: an unconditional Deferred probe 2 (review rv:5062616507): docker anti-retry pin cannot see through an inner
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline.
Not explored to full depth (tool budget reached): "agent 6a": none — I did not run the actual vitest suite (no node_modules in the shared worktree), but the hand-rolled bash probe above covers the same semantics, so I am n….
Convergence: round 4 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 1 (1 new). The rate of new findings is not falling. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)
中文说明
已审查。 建议见行内评论。
未探索到全部深度(达到工具调用预算):"agent 6a":none — I did not run the actual vitest suite (no node_modules in the shared worktree), but the hand-rolled bash probe above covers the same semantics, so I am n…。
收敛情况:第 4 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 1 条(其中 1 条首次提出)。新发现的产出速度没有下降。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。本轮没有未决的 Critical,因此"合入后把剩余 Suggestion 线程转到后续 issue"是一个可选的结束方式——已合入的 PR 不会继续发散。(仅为观察——本轮评审未因此扣留任何内容。)
— qwen3.8-max via Qwen Code /review (v0.22.3)
|
🔀 Base updated: red check(s) [Post Coverage Comment (ubuntu-latest, 22.x)] pass on current main — merged current main via update-branch; CI will re-run. 中文说明🔀 已更新 base:红色检查 [Post Coverage Comment (ubuntu-latest, 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。 |
|
🤖 Addressed the latest review feedback (round 4/10). What changed, and what I pushed back on: · 已处理最新评审反馈(第 4/10 轮)。改动内容与我反驳保留之处如下: Round summary — PR #10572 (issue #10566)One inline suggestion and two red-check defects addressed; all resolved in code with mutation proofs. One commit: Feedback points[rc:3892988046] R4-1 — shell-premise pin misses job-level Mutation proof, as requested by the finding:
Failed check: Test (ubuntu-latest Node 22.x) — FIXED (two deterministic failures introduced by the merge of main into this branch, both reproduced locally)
[rv:5064665064] review body (COMMENTED) — no action items beyond the inline suggestion above; the convergence observation is a workflow-side note. Local-only flakes observed under full-suite parallel load on this shared runner (different subset each run: eslint-config integration tests, lint archive download, upload timing, verify-capture colour render, qwen-fleet-shepherd/qwen-autofix workflow parses) all pass in isolation on the committed tree; none touch a file this PR changes. They are the transient shared-host pressure class this PR exists to absorb, not deterministic failures. Conflict notesNone ( Verification
中文说明本轮总结 — PR #10572(issue #10566)处理了一条行内建议与两项红色检查缺陷;全部在代码中解决,并附变异证明。单次提交: 反馈项[rc:3892988046] R4-1 — shell 前提固定遗漏任务级 按该发现的要求完成变异证明:
失败检查:Test (ubuntu-latest Node 22.x) — 已修复(将 main 合入本分支后引入的两处确定性失败,均已在本地复现)
[rv:5064665064] 评审主体(COMMENTED) — 除上述行内建议外没有其他行动项;收敛性观察属于工作流侧备注。 在共享 runner 上以全套件并行负载观察到的仅本地偶发失败(每轮子集不同:eslint-config 集成测试、lint 归档下载、上传计时、verify-capture 颜色渲染、qwen-fleet-shepherd/qwen-autofix workflow 解析)在提交后的树上单独运行时全部通过;均未涉及本 PR 修改的文件。它们属于本 PR 正要吸收的共享主机压力类瞬时失败,并非确定性失败。 冲突说明无( 验证
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧵 Resolved all 1 selected review thread(s). · 已关闭全部选中的 1 条评审线程。 Re-review when you have a moment. After round 10 this bot stops and leaves the PR for a human. · 有空请复审;第 10 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
Code Coverage Summary
CLI Package - Full Text ReportCore Package - Full Text ReportFor detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run. |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
No blocking issues. LGTM! ✅
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 5, not a blocker) — recorded, not requested in this round:
.github/workflows/e2e.yml:283 — [probe] Budget gate's unset-epoch fallback lacks an execution witness
中文说明
无阻断问题。LGTM!✅
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 5 轮,非阻断)——已记录,本轮不要求修改:共 1 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.22.3)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max via Qwen Code /review (v0.22.3)
|
🤖 AutoFix ran out of time before finishing (timeout (7200000ms)) (attempt 5/10) — it will retry on the next scan. What I found before stopping: See the Qwen Autofix agent step logs for model/tool output. 中文说明🤖 AutoFix 在完成前耗尽了时间(timeout (7200000ms))(第 5/10 次尝试)—— 将在下次扫描时重试。 Run log: https://github.com/QwenLM/qwen-code/actions/runs/33463003729 🧠 Handled by Qwen Code · model/模型 |
|
🤖 AutoFix updated a stale base — the fix did not pass verification, but this PR was behind What I found before stopping: Round blocked: red CI checks on PR #10572 are not attributable to the PR diffBlockerThis round's only actionable feedback is two failed checks on run 33454756719:
Every locally verifiable surface of this PR is green (evidence below), and there is no in-scope, evidence-backed change available to turn these checks green: the failing job ran on the shared self-hosted pool, the failure signature matches the shared-host pressure class this PR exists for, and the job logs are unreachable from this environment (no GitHub credentials; Why the second check is derivative
Evidence: the PR surface is green
中文说明🤖 AutoFix 更新了一个过期的 base —— 修复未通过验证,但本 PR 落后于 停止前我了解到的情况: 本轮受阻:PR #10572 的红色 CI 检查无法归因于该 PR 的改动阻塞点本轮唯一可执行的反馈是运行 33454756719 中两个失败的检查:
本 PR 所有可在本地验证的面均为绿色(证据见下),并且不存在任何"范围内且有证据支撑"的改动能把这两个检查变绿:失败的 job 运行在共享自托管 runner 池上,失败特征与本 PR 要解决的共享主机压力问题属于同一类,而该 job 的日志在本环境中无法获取(没有 GitHub 凭据; 为什么第二个检查是衍生失败
证据:PR 自身的面全部为绿色
证据:Test 失败无法归因于本 PR
Run log: https://github.com/QwenLM/qwen-code/actions/runs/33471581722 🧠 Handled by Qwen Code · model/模型 |
qqqys
left a comment
There was a problem hiding this comment.
Verification: no Critical found; approving per the CI-green + bot-approved posture.
Reviewed the full diff at head 14099ccc60 (one bounded retry for the sandbox:none E2E shard, budget-gated on job-elapsed time).
What I checked (correctness of the retry semantics, not style):
- Exit-code contract: the retried
run_shardis the last command of the|| { ... }group, which is the script's last statement, under GitHub's defaultbash -e {0}step shell. The step (and job) conclusion still equals the second attempt's exit code — a deterministic failure fails both attempts and keeps the shard red; there is no|| true/continue-on-erroranywhere on the path. - Budget gate:
elapsed > 2100refuses the retry with::error::+exit 1, so a retry can only start when a full shard-time fits inside the 60-minutetimeout-minutes. The${E2E_JOB_START_EPOCH:-0}fallback errs closed (refuses the retry), and the un-skipped,if:-free epoch step runs before the expensive setup so setup spend counts toward the budget (the motivating runs died with setup eating ~29 of 60 minutes). - Scope: the docker leg keeps no retry (two ~30min attempts would outrun the job timeout); matrix substitutions (
sandbox,shard) are single-expansion into the function body; excludes are carried verbatim into both attempts. - Test evidence is not copy-pasted shape:
e2e-shard-retry.test.jsparsese2e.ymlat run time and executes the extracted script under realbash -ewith stubbednpm/date— green-path quietness, single retry, red-both-attempts, exact 2100/2101 boundary, and fail-fast at 3000s are all witnessed by bash. The new workflow test pins the contract this harness assumes (noshell:override, nodefaults:block, nocontinue-on-error, epoch step placement and lack ofif:).
Local run at head: extracted pull/10572/head (14099ccc60) via codeload tarball and executed scripts/tests/e2e-workflow.test.js + scripts/tests/e2e-shard-retry.test.js against that tree with an isolated vitest config → 25/25 green (19 workflow witnesses incl. the 11 new retry-shape pins, 6 bash-execution cases), exit 0.
CI at head: all completed lanes success (Test ubuntu, Integration no-AK, Desktop Shell ×2, Typecheck, Secret scan, CVE audit), remainder skipped. qwen-code-ci-bot's round-5 review is an APPROVE with an empty findings ledger ("No blocking issues. LGTM"), and its round-6 re-check of the following merge state recorded 0 findings too (downgraded to COMMENTED only because CI was still running then); its standing note — actionlint embedded-shell source mapping — is self-declared as a tool limitation, not a blocker.
tmux e2e: not applicable — the change only affects CI workflow execution and is covered above by the bash-execution harness.
中文说明
验证结论:未发现 Critical;按 CI 全绿 + bot 已在同一 head 批准的状态,予以 Approve。
已在 head 14099ccc60 审阅全量 diff(sandbox:none E2E 分片的一次有界重试,按作业已用时长做预算门控)。重点核对:重试后退出码契约保持(第二次尝试的退出码即步骤结论,两次皆红则保持失败,无 || true/continue-on-error);预算门 elapsed > 2100 拒绝重试并 exit 1(宁保守拒重试,不中途被 timeout 取消),缺 epoch 时的 :-0 回退同样 fail-closed;计时步骤无 if: 且置于昂贵的 setup 之前,使 setup 耗时计入预算(正是三起失败案例中占用 ~29/60 分钟的来源);docker 分支明确不重试。新增测试直接从 e2e.yml 解析出脚本并用真实 bash -e 执行(npm/date 打桩),绿路径安静、单次重试、双败保持红、2100/2101 边界、3000s 快速失败均由 bash 实证。本地验证(head):通过 codeload tarball 展开 pull/10572/head(14099ccc60),以隔离的 vitest 配置在该树上执行 e2e-workflow.test.js + e2e-shard-retry.test.js → 25/25 全绿(含新增 11 个形状钉住用例与 6 个 bash 实际执行用例),exit 0。head 上所有已完成的 CI 车道均 success;ci-bot 第 5 轮为 APPROVE(findings 为空),第 6 轮复核其后合并态也是 0 findings(仅因当时 CI 未跑完而降级为 COMMENTED);其保留说明(actionlint 无法映射嵌入式 shell)为工具限制、非阻断项。tmux e2e 不适用——仅 CI workflow 变更。
|
🕐 Review received — an automatic review of the current head is still running, so this round is held until it lands (a push now would cancel it and discard its work, #8888). Your feedback stays queued for the next eligible round. 中文说明🕐 已收到评审 —— 当前 head 上仍有一轮自动 review 在运行,本轮暂缓(现在推送会取消该 review 并丢弃其工作,#8888)。反馈保持排队,等待下一次可运行的轮次处理。 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed.
1 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:
- D7-3 unwitnessed fail-closed
:-0fallback (e2e.yml:283) — already recorded in round 5's deferral list (review 5067731765)
Not explored to full depth (tool budget reached): "agent 6c": none — npm ci was not run (no node_modules in the shared worktree), so the vitest suites themselves were not executed; the behavioral probe above replicates….
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 7, not a blocker) — recorded, not requested in this round:
.github/workflows/e2e.yml:283 — [probe] Budget gate's time source $(date +%s) unpinned — a format mutation ( +%M / +%s%N ) flips the gate with every witness green.github/workflows/e2e.yml:283 — [probe] Arithmetic sink on $GITHUB_ENV-carried epoch — an array-subscript payload executes in the OPENAI-secrets step
中文说明
已审查。
本轮确认的 1 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。
未探索到全部深度(达到工具调用预算):"agent 6c":none — npm ci was not run (no node_modules in the shared worktree), so the vitest suites themselves were not executed; the behavioral probe above replicates…。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 7 轮,非阻断)——已记录,本轮不要求修改:共 2 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.22.3)
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Autofix round result: no action takenNo changes were made this round, and nothing was committed. Why
The PR stays at its current head ( 中文说明Autofix 本轮结果:未采取任何操作本轮未做任何改动,也未提交任何内容。 原因
PR 保持在当前 head( Deferred non-Critical feedbackCritical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (
中文说明已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not explored to full depth (tool budget reached): "agent 6a": none — no check was cut short..
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
未探索到全部深度(达到工具调用预算):"agent 6a":none — no check was cut short.。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/e2e.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max via Qwen Code /review (v0.22.3)
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Autofix round result: no action takenNo changes were made this round, and nothing was committed. The PR stays at head What was actionableCritical-only mode is active (5 change-producing rounds are complete in this window), so the workflow excluded all non-Critical feedback; deferred items were left untouched per the brake's rules. All actionable sections were empty except one failed check: Why the cancelled check is not attributable to this PR
There is no in-scope code change that turns this check green: the Test job is ci.yml territory this PR does not own, and what it needs is a re-run once pool pressure eases. Re-running checks is a GitHub write this environment cannot perform; the workflow or a maintainer can trigger it. VerificationCommands actually run this round in the PR checkout at head
中文说明Autofix 本轮结果:未采取任何操作本轮未做任何改动,也未提交任何内容。PR 保持在 head 本轮可执行内容当前处于仅处理 Critical 的模式(本窗口已完成 5 个产生改动的轮次),因此工作流已将全部非 Critical 反馈排除;延后条目遵循刹车规则保持原样未动。除一个失败检查外,所有可执行区域均为空: 为什么该被取消的检查无法归因于本 PR
不存在任何"范围内"的代码改动能让这个检查变绿:Test job 属于本 PR 并不拥有的 ci.yml 领域,它需要的是在池压力缓解后重跑一次。重跑检查属于 GitHub 写操作,本环境无权执行;需由工作流或维护者触发。 验证本轮在 head
Deferred non-Critical feedbackCritical-only mode is active: 5 change-producing rounds are complete. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (
中文说明已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
What this PR does
Gives the
sandbox:noneleg of the post-merge Linux E2E lane one bounded retry at its test step. The shard command is wrapped in a small shell function and, if the first attempt exits non-zero, the step emits a::warning::naming the runner and re-runs the same shard once; the second attempt's exit status is the step's, so a deterministic test failure fails both attempts and keeps the job red. The retry is deliberately scoped to thesandbox:noneleg — two ~30-minutesandbox:dockerattempts would outrun the job'stimeout-minutes— and is pinned by new witness tests next to the existing sandbox-image-build-retry block, including one asserting the docker leg is not retried.Why it's needed
Run 33317457036 failed
E2E Test (Linux) - sandbox:none - shard 2/3at theRun E2E testsstep with exit code 1 and zero vitestFAILlines in the log, which is the class this repo documents in the integration test config: under shared self-hosted pool pressure, vitest's fixed 60-second worker→main RPC budget turns a stalled-but-otherwise-green run red via unhandled-error paths, and the deaths that survive the lane's existing self-hosted exemption sit inside vitest itself, unreachable from repository code. The two previous main E2E runs failed the identical leg and step on two different hosts and commits, while the run between them was fully green and a local reproduction of the exact shard passes — the same transient, pressure-correlated shape the sandbox-image build retry in this same workflow was added for (#10355). Without a retry, one host under pressure exits a whole shard red and files a per-commit "Main CI failed" issue (this one is the twentieth such open issue in ~36 hours); with it, a transient death costs one extra shard attempt and a deterministic failure still reports red.Reviewer Test Plan
How to verify
This is CI-harness behavior plus its witness tests; the retry logic is fully inspectable from the workflow file and was verified three ways. First, the witness block in the scripts suite:
npx vitest run --config ./scripts/tests/vitest.config.ts e2e-workflowpasses 12/12, and removing the retry block from the workflow (or duplicating the docker leg's command) makes the corresponding witness test fail. Second, the bash semantics were simulated underbash -eo pipefail(the Actions default shell) with a stubbed shard command: one failure retries and exits 0, two failures exit 1, and a passing first attempt never retries. Third, the real gate is the lane itself: the next main push should either pass both attempts or, if a genuine test failure exists, report itsFAILlines on the second attempt instead of dying silently.Evidence (Before & After)
N/A — CI-harness change, not user-visible. Before: run 33317457036 (and runs 33302550436, 33293739505) red at
Run E2E testswith zeroFAILlines. After: one bounded retry absorbs a single transient death; deterministic failures stay red on both attempts.Tested on
Environment (optional)
Self-hosted pool machine (the same pool the failing lane runs on): witness suite with mutation probes, functional retry simulation under
bash -eo pipefail,bash -non the generated step script for both matrix legs,npm run build,npm run typecheck,npm run lint,npm run test:scripts, and a full surrogate of the failing shard (test:integration:sandbox:none, shard 2/3, real model credentials) which passes at the failing commit.Risk & Scope
sandbox:noneshard now takes up to one extra shard attempt (~15–20 minutes, still inside the job's 60-minute timeout) before reporting red; transient pressure deaths report green with a::warning::in the log instead of filing another per-commit issue. No test assertion, timeout, or exclusion is weakened anywhere.sandbox:dockerleg keeps no retry because two attempts would not fit the job timeout; the poisoned-host and disk-pressure classes tracked by other issues/PRs (ci: gate heavy jobs on a disk floor and persist pressure samples #10394's disk floor, fix(cli): don't crash startup when the output-language file is unwritable (#10453) #10455's unwritable-home crash sites) are separate and untouched.Linked Issues
Fixes #10566
中文说明
本 PR 做了什么
为合并后 Linux E2E 通道的
sandbox:none支路在其测试步骤上增加一次有界重试。分片命令被包进一个小的 shell 函数,首次尝试非零退出时,步骤输出一条点名运行器的::warning::并将同一分片重跑一次;第二次尝试的退出状态即步骤的状态,因此确定性测试失败会在两次尝试中都失败、保持任务红色。重试刻意限定在sandbox:none支路——两次约 30 分钟的sandbox:docker尝试会超出任务的timeout-minutes——并由紧邻既有"沙箱镜像构建重试"块的新见证测试固定,其中包括一条断言 docker 支路不被重试。为什么需要
运行 33317457036 在
Run E2E tests步骤以退出码 1 失败,且日志中没有任何一条 vitestFAIL行,这正是本仓库在集成测试配置中记录过的类别:在共享自托管池压力下,vitest 固定的 60 秒 worker→main RPC 预算会把一个停滞但本来全绿的运行经由未处理错误路径变红;而在该通道已有的自托管豁免之后仍会发生的那些死亡,位于 vitest 内部,仓库代码无法触及。此前两次 main E2E 运行在不同的主机、不同的提交上以完全相同的支路与步骤失败,夹在中间的一次运行完全绿色,且对同一分片的本地复现通过——与同一 workflow 中沙箱镜像构建重试(#10355)所针对的瞬时、压力相关形态完全一致。没有重试时,一台承压主机就会让整个分片变红并归档一个按提交的 "Main CI failed" issue(本 issue 是约 36 小时内的第 20 个同类开放 issue);有了重试,一次瞬时死亡只多花一次分片尝试,而确定性失败依旧报红。审阅者测试计划
如何验证
这是 CI 基础设施行为及其见证测试;重试逻辑可以直接从 workflow 文件中审阅,并已用三种方式验证。第一,scripts 套件中的见证块:
npx vitest run --config ./scripts/tests/vitest.config.ts e2e-workflow12/12 通过;从 workflow 中移除重试块(或复制 docker 支路的命令)会使对应的见证测试失败。第二,在bash -eo pipefail(Actions 默认 shell)下用桩分片命令模拟了 bash 语义:失败一次会重试并以 0 退出,失败两次以 1 退出,首次通过则绝不重试。第三,真正的门槛是通道本身:下一次 main 推送要么两次尝试都通过,要么在存在真实测试失败时于第二次尝试上报出FAIL行,而不是无声死亡。证据(前后对比)
N/A — CI 基础设施变更,无用户可见行为。之前:运行 33317457036(以及 33302550436、33293739505)在
Run E2E tests变红且零条FAIL行。之后:一次有界重试吸收单次瞬时死亡;确定性失败在两次尝试中保持红色。测试环境
环境(可选)
自托管池机器(与失败通道相同的池):带变异探测的见证套件、
bash -eo pipefail下的重试功能模拟、对两个矩阵支路生成步骤脚本的bash -n、npm run build、npm run typecheck、npm run lint、npm run test:scripts,以及对失败分片的完整替代复现(test:integration:sandbox:none,shard 2/3,真实模型凭证),在失败提交上通过。风险与范围
sandbox:none分片现在最多多花一次分片尝试(约 15–20 分钟,仍在任务 60 分钟超时之内)才报红;瞬时压力死亡会在日志中留下一条::warning::并报绿,而不是再归档一个按提交的 issue。任何测试断言、超时或排除都未被削弱。sandbox:docker支路不加重试,因为两次尝试放不下任务超时;由其他 issue/PR 跟踪的宿主机污染与磁盘压力类别(ci: gate heavy jobs on a disk floor and persist pressure samples #10394 的磁盘下限、fix(cli): don't crash startup when the output-language file is unwritable (#10453) #10455 的不可写主目录崩溃点)是独立问题,未被触及。关联 Issue
Fixes #10566