fix(ci): distinguish infrastructure cancellation from lane failure in verify - #954
fix(ci): distinguish infrastructure cancellation from lane failure in verify#954allyblockcast[bot] wants to merge 5 commits into
Conversation
|
🔗 Paperclip issue: BLO-20867 |
1 similar comment
|
🔗 Paperclip issue: BLO-20867 |
|
Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention: Missing or incomplete:
Once updated, push a new commit and these checks will re-run automatically. — commitperclip |
2 similar comments
|
Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention: Missing or incomplete:
Once updated, push a new commit and these checks will re-run automatically. — commitperclip |
|
Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention: Missing or incomplete:
Once updated, push a new commit and these checks will re-run automatically. — commitperclip |
Ally — Consolidated PR ReviewLenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex. Important Issues (1)
Strengths
Recommended Action
The PR author is |
… verify (BLO-20867) pr.yml's `verify` gate collapsed every non-success upstream result into an identical failing required check. When ARC runner-scale-set infrastructure interrupts a lane mid-run (observed: listener pod churn on arc-default/ arc-dind correlated with a fleet-wide cancellation spike), authors saw a plain red "failure" and reasonably assumed their own diff broke something. Split cancelled from failed and annotate which one actually happened.
… logic The guard asserted a literal test "$WORKTREE_INSTALL_RESULT" = "success" string in pr.yml, which the prior commit replaced with a lane_results map. Assert the map wiring instead, preserving the actual guarantee (a non-success worktree_install result still gates verify).
… gate No code change. The commitperclip-review workflow only fires on opened/synchronize/reopened, so editing the PR description alone (to satisfy the linked-issue-or-description gate) does not re-run it.
…nked-issue.mjs
The prior body edit used inline bold labels ("**What happened?** text..."),
but check-pr-linked-issue.mjs requires each template field label alone on
its own line (heading or bold). Reformatted as ### headings per field and
verified locally against the actual checkLinkedIssue() function before
pushing.
…0867) Three findings from the 12:07Z consolidated review on #964: - Stop asserting a cancelled lane IS an infrastructure interruption — a manual cancel or another cause looks identical from this job's vantage point. State it as a possible cause, not a diagnosis. - Classify `skipped` explicitly instead of falling into the generic failure bucket. A lane skips when a dependency it needs (typically `policy`) didn't succeed — that's not a defect in the skipped lane, and telling an author to inspect its logs sends them to a job that never ran. - Extend the extracted-script test to cover skipped lanes, the failure > skipped > cancelled precedence when a run has more than one bad lane, and an unrecognized state name.
9110c56 to
1418bdc
Compare
Ally — Consolidated PR ReviewLenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex. Prior Findings Dispositioned (1)
Looks good. No Critical or Important issues remain. Strengths
The PR author is |
|
Closing as a duplicate of #964 — same fix (verify job cancelled-vs-failed lane classification, BLO-20867), opened independently by an earlier heartbeat of mine before I'd noticed #964 already existed with an active Ally review thread. #964 now has the more complete version (handles |
|
Duplicate of #964. |
Thinking Path
Linked Issues or Issue Description
No GitHub issue exists in this repo for the underlying incident — it's tracked in Paperclip's internal issue tracker as BLO-20867 (
PR CI runs are being cancelled fleet-wide), which isn't a GitHub-repo issue so it can't be tagged withFixes #/Closes #. Describing inline per the bug report template instead:What happened?
pr.yml'sverifyjob (the legacy required-check name that gates merge) runs a bashtest "$X_RESULT" = "success"per upstream lane. When a lane's result iscancelled— which is currently happening fleet-wide due to ARCruns-on: defaultlistener-pod churn interrupting jobs mid-run, unrelated to any PR's diff —verifyfails exactly the same way as when a lane genuinely fails a test. The PR author sees one plain red "failure" either way and cannot tell an infra outage from a real regression without digging intogh run viewjob timings themselves.Expected behavior
verifyshould surface which outcome actually happened — a distinct annotation (or, ideally, a distinct check conclusion) for "an upstream lane was cancelled by infrastructure" versus "an upstream lane failed because of this PR's code" — so authors don't misattribute infra noise to their own diff.Steps to reproduce
Blockcast/paperclipwhile the ARCarc-default/arc-dindrunner-scale-set listener is churning (see BLO-20867 for the live incident evidence: k8s events showing the listener pod killed/rescheduled to a different node twice within ~2 minutes, exactly correlated with a fleet-wide mass-cancellation window).runs-on: defaultjob (typecheck_release_registry,general_tests,worktree_install,build) get cancelled mid-run with no test having actually failed.verifyrequired check reports a plainfailure, indistinguishable in the GitHub UI from a real test failure.Paperclip version or commit
This repo at
masteras of 2026-08-02 (base commit3250910c4).Deployment mode
Self-hosted server (GitHub Actions on this repo's own self-hosted ARC runners, not a local/dev concern).
What Changed
.github/workflows/pr.yml: theverifyjob's "Fail if any split verify lane failed" step now buckets each upstream lane result intocancelledvs everything-else-non-success, and emits a distinct::error title=verify: infrastructure cancellation::vs::error title=verify: lane failure::annotation before exiting non-zero. A run with both a real failure and a cancellation reports as a failure (the real problem takes priority).scripts/__tests__/pr-verify-lane-outcome.test.mjs: extracts the actualrun:shell script out ofpr.ymland executes it under bash for four scenarios (all-success, one cancelled, one failed, mixed) — asserts exit code and which annotation is emitted, so the logic is verified by more than eyeballing YAML.policy's existingnode --testlist inpr.yml, next to the siblingrelease-verify-workflow.test.mjscheck.scripts/__tests__/npmrc-devdeps-guard.test.mjs: updated an existing assertion that matched the old literaltest "$WORKTREE_INSTALL_RESULT" = "success"string (this PR's own CI run caught this — the guard broke on first push). Now asserts the newlane_resultsmap still wires inworktree_install, preserving the actual guarantee (a non-successworktree_installresult still gatesverify) without depending on the removed literal.Verification
node --test ./scripts/__tests__/pr-verify-lane-outcome.test.mjs ./scripts/__tests__/npmrc-devdeps-guard.test.mjs— all pass locally (verified both before and after the guard-test fix above).run:block for indentation/whitespace (no tabs, consistent block-scalar indent) since I could not run a full YAML parser in this environment (nopyyaml/js-yamlinstalled and no networkpip/npminstall available in my worktree) — the extraction-and-execute test exercises the real script text, which also guards against a syntax error in the block silently no-oping.npmrc-devdeps-guardtest) and thepolicyjob is green on the follow-up push — see run history on this PR.Risks
verifystill fails on any non-success lane (same net effect as before), just possibly with a less accurate annotation.pr.ymlitself is unreliable right now — this repository is mid-incident (BLO-20867: 0/60 successfulpr.ymlruns in the trailing ~5.5h at time of writing, cause: ARCarc-default/arc-dindlistener pod churn). I can't guarantee a fully green run on this PR before merge for reasons unrelated to this diff.verifyitself runs onarc-light(the pool BLO-20867's findings say is not the one churning), so it should be able to complete even mid-incident, but I can't promise that from here.Model Used
Claude Sonnet 5 (claude-sonnet-5[1m]), Claude Code / Agent SDK, agent role PlatformSREEngineer. Standard (non-extended) reasoning mode, tool use (bash, k8s read-only MCP, GitHub MCP) for the underlying BLO-20867 investigation that motivated this change.
Checklist
verifystep)Fixes: #/Closes #/Refs #OR (b) described the issue in-PR following the relevant issue templatepr.ymlcancellation incident (BLO-20867)