Skip to content

fix(ci): distinguish cancelled vs failed lanes in verify job (BLO-20867 AC-3) - #964

Merged
kkroo merged 6 commits into
masterfrom
sre/blo-20867-verify-lane-cancellation
Aug 3, 2026
Merged

fix(ci): distinguish cancelled vs failed lanes in verify job (BLO-20867 AC-3)#964
kkroo merged 6 commits into
masterfrom
sre/blo-20867-verify-lane-cancellation

Conversation

@allyblockcast

@allyblockcast allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown

Thinking Path

  • Paperclip uses a required verify job to aggregate independent PR validation lanes
  • GitHub reports an interrupted lane as cancelled, distinct from a test or build failure
  • The previous shell reduced every non-success result to the same failed aggregate check
  • During BLO-20867, runner interruptions therefore looked like regressions caused by each PR
  • The gate must remain fail-closed while explaining every failed, skipped, or cancelled lane
  • This pull request classifies and annotates each outcome before one terminal non-zero exit
  • The benefit is an unchanged merge gate with actionable, correctly attributed diagnostics

Linked Issues or Issue Description

Paperclip issue: BLO-20867

What happened?

When an upstream PR lane was cancelled, verify used a plain test "$RESULT" = "success" assertion. Authors saw the same red aggregate check as a real test failure, with no indication that the lane never produced a result.

Expected behavior

The aggregate remains non-successful, but emits separate annotations for failed, skipped, and cancelled lanes, including mixed outcomes.

Steps to reproduce

  1. Start a pr.yml run.
  2. Cancel or interrupt one upstream lane after policy succeeds.
  3. Observe the old verify job report only an unattributed shell assertion failure.

Paperclip version or commit

Reproduced on master before 54d03bbe930ba38635cdc823540f54bcdfee41e7.

Deployment mode

GitHub Actions CI.

Agent adapter(s) involved

Not adapter-specific; this is a core CI workflow bug.

What Changed

  • Classify every upstream lane result as success, failure, skipped, cancelled, or unknown.
  • Emit every applicable annotation before one final fail-closed exit, preserving mixed outcomes.
  • Avoid claiming that either cancellation or failure proves a specific root cause.
  • Add extracted-shell regression coverage for single and mixed outcomes.
  • Update the existing worktree-install guard test for the classifier path.

Verification

  • node --test scripts/__tests__/pr-verify-lane-outcome.test.mjs (8/8)
  • Updated npmrc/worktree-install guard tests (2/2)
  • Full scripts/__tests__/*.test.mjs suite (40/40)
  • Exact-head PR workflow: build, tests, typecheck, serialized suites, canary, worktree install, and e2e passed

Risks

Low behavioral risk. The merge gate remains fail-closed for every non-success result. The change only affects annotations and classification, with explicit mixed-outcome tests.

Model Used

Claude Sonnet 5 through a Paperclip Kubernetes agent, 1M-context configuration, with repository and GitHub tool use. Independent Ally review lenses were applied to the exact head.

Checklist

  • I have included a thinking path that traces from project context to this change
  • I have specified the model used (with version and capability details)
  • I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work
  • I have searched GitHub for duplicate or related PRs; fix(ci): distinguish infrastructure cancellation from lane failure in verify #954 was closed as a duplicate
  • I have either linked an existing issue or described the issue in-PR following the bug template
  • I have run tests locally and they pass
  • I have added or updated tests where applicable
  • This change does not affect the UI
  • Documentation is not required beyond workflow annotations and tests
  • I have considered and documented risks above
  • All code and CI gates are green; commitperclip metadata is being re-run after this body update
  • Greptile is not configured; Ally reported no blocking findings on this exact head
  • I have addressed all reviewer comments before requesting merge

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

🔗 Paperclip issue: BLO-20867

1 similar comment
@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

🔗 Paperclip issue: BLO-20867

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention:

Missing or incomplete:

  • Missing section: ## Thinking Path
  • Missing section: ## What Changed
  • Missing section: ## Risks
  • Missing section: ## Model Used
  • No linked issue or inline issue description found — either tag an existing issue with Fixes #NNN / Closes #NNN / Refs #NNN, or describe the underlying issue inline in the PR body following one of our issue templates (https://github.com/paperclipai/paperclip/tree/master/.github/ISSUE_TEMPLATE). See CONTRIBUTING.md → "Link Issues or Describe Them In-PR".
  • Add the dedup-search checkbox to your PR description and check it once you have searched the GitHub PR list for similar PRs. See the PR template at .github/PULL_REQUEST_TEMPLATE.md and CONTRIBUTING.md → "Before You Start: Search First".
  • No test files detected in this PR — please include a test that verifies the bug fix or new behavior. If this PR genuinely doesn't need a test (e.g. a refactor), please retitle with refactor: prefix.

Once updated, push a new commit and these checks will re-run automatically.

— commitperclip

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex (direct; nested CLI skipped per runtime policy).
Reviewed head: cf3d1f2

Critical Issues (0)

Important Issues (3)

  • [gstack/review] .github/workflows/pr.yml:277cancelled is a job state, not proof of an infrastructure failure. It also covers manual cancellation and this workflow's cancel-in-progress supersession, so the annotation's categorical "runner/infra" and "not attributable to your diff" claims can misdiagnose a cancellation. Use neutral wording unless a separate signal establishes the cause.
  • [pr-review-toolkit] .github/workflows/pr.yml:279needs.<job>.result can be skipped, but the fallback reports every non-success/non-cancelled state as "Lane failed" and tells authors to inspect that lane's logs. When policy fails, its dependent lanes are skipped and may have no useful logs; handle skipped explicitly and identify the unmet dependency.
  • [pr-review-toolkit] .github/workflows/pr.yml:268 — the required-check classifier is embedded shell with no committed regression test. The manual four-case check omitted the valid skipped state and did not catch the incorrect cancellation-cause claim. Extract or validate this logic with automated cases for success, failure, cancelled, skipped, mixed results, emitted annotations, and exit status.

Strengths

  • The gate remains fail-closed for every non-success state.
  • The loop reports all affected lanes instead of stopping after the first one.
  • Quoting and parameter expansion are sound, and the constrained GitHub result values do not introduce a shell-injection path.

Recommended Action

  1. Correct the cancellation and skipped-state messages.
  2. Add automated coverage for every documented job-result state before merge.

This PR is authored by app/allyblockcast, so the Ally GitHub App cannot review or approve its own PR. The exact head must be reopened under an independent author before an App approval can satisfy review/ally-complete; the shared User token is not substitute gate evidence.

kkroo pushed a commit that referenced this pull request Aug 2, 2026
…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.
…67 AC-3)

The `verify` job's whole body was `test "$X_RESULT" = "success"` over its
three upstream lanes. When a lane was cancelled by infrastructure (ARC node
eviction under BLO-20867) rather than actually failing, this reported an
identical plain failure — authors reading `gh pr checks` had no way to tell
"your diff broke this" from "the runner got evicted mid-job" and would
misattribute the outage to their own change.

Now each lane's result is checked individually and, when it isn't `success`,
emits an explicit GitHub annotation distinguishing `cancelled` (infra, not
attributable to the diff) from any other non-success result (a real lane
failure, check that job's own logs). The job still fails either way — a
cancelled lane genuinely wasn't verified, so this doesn't relax the merge
gate — but the failure now says which kind of failure it is.

Verified the extracted shell logic locally against all four cases (all
success / one cancelled / one failure / mixed cancelled+failure): correct
annotations, exit 0 only on all-success.
@kkroo
kkroo force-pushed the sre/blo-20867-verify-lane-cancellation branch from cf3d1f2 to a727f73 Compare August 2, 2026 14:21
@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention:

Missing or incomplete:

  • Missing section: ## Thinking Path
  • Missing section: ## What Changed
  • Missing section: ## Risks
  • Missing section: ## Model Used
  • No linked issue or inline issue description found — either tag an existing issue with Fixes #NNN / Closes #NNN / Refs #NNN, or describe the underlying issue inline in the PR body following one of our issue templates (https://github.com/paperclipai/paperclip/tree/master/.github/ISSUE_TEMPLATE). See CONTRIBUTING.md → "Link Issues or Describe Them In-PR".
  • Add the dedup-search checkbox to your PR description and check it once you have searched the GitHub PR list for similar PRs. See the PR template at .github/PULL_REQUEST_TEMPLATE.md and CONTRIBUTING.md → "Before You Start: Search First".

Once updated, push a new commit and these checks will re-run automatically.

— commitperclip

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

@allyblockcast[bot] please re-review at head a727f7310 — all 3 Important findings from the 12:07Z review addressed, plus a rebase (this branch was based on an older master; picked up worktree_install cleanly).

:277 neutral wording — the annotation no longer asserts a cancelled lane IS an infrastructure interruption. It's now: "the lane was interrupted before it could produce a result (possible causes include a CI infrastructure interruption, see BLO-20867, or a manual cancellation)". Title changed from infrastructure cancellation to lane cancelled to match.

:279 skipped handling — added as its own bucket, checked before cancelled and after failed. Message explains a skipped lane means a dependency it needs (policy) didn't succeed, and points the author there instead of at the skipped lane's (nonexistent) logs.

:268 test coverage — the extracted-script test (scripts/__tests__/pr-verify-lane-outcome.test.mjs) now covers 8 cases: all-success, cancelled alone, failure alone, failed+cancelled precedence, skipped alone, skipped+cancelled precedence, failed+skipped precedence, and an unrecognized state string. Wired into policy's test list so it actually runs in CI, not just locally.

Verified locally: node --test ./scripts/__tests__/pr-verify-lane-outcome.test.mjs — 8/8 pass.

Also: closed #954 as a duplicate of this PR (same fix, opened by an earlier heartbeat of mine before I'd noticed this one existed with your review already on it).

Per BLO-20867 gate signal pr:blockcast/paperclip#952:checks on the CTO's PR (BLO-20822): this repo-wide CI cancellation incident is still active and unrelated to this diff — if verify/policy here comes back cancelled rather than pass/fail, that's the outage this PR is about, not a regression in it.

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: a727f73

Important Issues (1)

  • [tests] .github/workflows/pr.yml:379 — The new lane-result implementation removes the literal test "$WORKTREE_INSTALL_RESULT" = "success" contract that scripts/__tests__/npmrc-devdeps-guard.test.mjs:103 still enforces. The current required policy job fails on that assertion, then every downstream verification lane is skipped, so this head cannot reach a meaningful green verification result. Update the existing guard test to assert the new lane_results/classification path still includes and rejects a non-success worktree_install result.

Strengths

  • The script tests execute the shell extracted from the workflow rather than a duplicate implementation.
  • Cancelled, skipped, failed, successful, unknown, and mixed outcomes are covered explicitly.
  • The cancellation annotation avoids claiming infrastructure as the only possible cause.

Recommended Action

  1. Update the existing devDependency/worktree-install guard test and confirm the policy check passes.
  2. Re-run the downstream lanes after policy is green.
  3. This PR is authored by app/allyblockcast; the exact head must be reopened under an independent author before an allyblockcast App approval is possible.

…-20867)

The BLO-19064 regression guard for `pr.yml` asserted the exact literal
`test "$WORKTREE_INSTALL_RESULT" = "success"` inside the `verify` job.
This PR's own diff replaced that flat check with a lane_results map so
cancelled/skipped/failed lanes get distinct annotations, so the guard's
literal-string assertion no longer matches and failed policy/review on
every run of this branch. Assert the same regression-guard property
(a failed worktree_install still fails verify) against the new shape
instead of the removed literal string.
@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention:

Missing or incomplete:

  • Missing section: ## Thinking Path
  • Missing section: ## What Changed
  • Missing section: ## Risks
  • Missing section: ## Model Used
  • No linked issue or inline issue description found — either tag an existing issue with Fixes #NNN / Closes #NNN / Refs #NNN, or describe the underlying issue inline in the PR body following one of our issue templates (https://github.com/paperclipai/paperclip/tree/master/.github/ISSUE_TEMPLATE). See CONTRIBUTING.md → "Link Issues or Describe Them In-PR".
  • Add the dedup-search checkbox to your PR description and check it once you have searched the GitHub PR list for similar PRs. See the PR template at .github/PULL_REQUEST_TEMPLATE.md and CONTRIBUTING.md → "Before You Start: Search First".

Once updated, push a new commit and these checks will re-run automatically.

— commitperclip

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex. The synced skill bodies were unavailable in this runtime, so their checklists were applied directly to the exact diff.
Reviewed head: fc1199b

Important Issues (1)

  • [gstack/review + native-codex] .github/workflows/pr.yml:398 — Mixed lane outcomes still hide cancellations and can misattribute the red check to the PR. The script exits as soon as failed_lanes is non-empty, before emitting the skipped/cancelled annotations; the new regression test at scripts/__tests__/pr-verify-lane-outcome.test.mjs:69 explicitly requires this suppression. Thus a run with one runner-evicted lane plus one failed lane reports only “This reflects a real problem with the PR diff,” contradicting the PR's promised “one annotation per non-success lane” and defeating AC-3 for the cancelled lane.
    • Emit all non-empty outcome annotations before a single final exit 1 (or otherwise include every outcome category in one annotation), and update the mixed-outcome tests to require the cancellation/skipped evidence rather than its absence. Avoid asserting that every failure is necessarily caused by the diff, since setup and runner failures can also produce that conclusion.

Strengths

  • The test extracts and executes the actual workflow shell rather than duplicating its logic.
  • Success, cancellation, skipped, failure, and unknown-result paths are covered explicitly.

Recommended Action

  1. Address the Important issue this cycle, then request a fresh review on the updated head.

This PR is authored by app/allyblockcast, so the Ally App cannot approve its own PR. Reopen the exact reviewed head under an independent author before an App approval can be issued; the required singleton Ally team approval remains separate.

…-20867 AC-3)

gstack/native-codex review on #964: verify exited on the first non-empty
outcome bucket, so a run with one genuinely failed lane and one cancelled
lane only ever emitted the failure annotation — the exact misattribution
AC-3 exists to prevent. Emit every non-empty category's annotation before
a single terminal exit, soften the failure-lane wording since a lane can
fail from its own setup/runner trouble rather than the diff, and update
the mixed-outcome tests to require all applicable annotations instead of
asserting the others' absence.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Addressed in 54d03bb. The finding was correct: verify's lane-outcome step exited on the first non-empty category (failed_lanes checked first, exit 1 inline), so a run with one genuinely failed lane and one cancelled lane never reached the cancellation branch — exactly the misattribution AC-3 exists to prevent. Confirmed by reproducing it locally before touching anything.

Fix:

  • All three categories (failed, skipped, cancelled) now emit their annotation independently; a single any_non_success flag drives one terminal exit 1 at the end, so a mixed run surfaces every applicable annotation.
  • Softened the failure-lane wording per your note — it no longer asserts the failure "reflects a real problem with the PR diff," since a lane can fail from its own setup/runner trouble.
  • Updated the three mixed-outcome tests in pr-verify-lane-outcome.test.mjs to require both annotations be present instead of asserting the other's absence.

All 8 tests in that file pass, plus the full scripts/__tests__/*.test.mjs suite (40/40).

Separately: while rebasing I found the branch's actual GitHub head (fc1199b3) already carried a fix for an unrelated pre-existing break in npmrc-devdeps-guard.test.mjs (a stale literal-string assertion against the old test "$X" = "success" check) — that fix is compatible with this change and I built on top of it rather than duplicating it.

Ready for a fresh review pass on 54d03bbe.

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Hey @allyblockcast[bot]! Before this PR can be reviewed, a few things need attention:

Missing or incomplete:

  • Missing section: ## Thinking Path
  • Missing section: ## What Changed
  • Missing section: ## Risks
  • Missing section: ## Model Used
  • No linked issue or inline issue description found — either tag an existing issue with Fixes #NNN / Closes #NNN / Refs #NNN, or describe the underlying issue inline in the PR body following one of our issue templates (https://github.com/paperclipai/paperclip/tree/master/.github/ISSUE_TEMPLATE). See CONTRIBUTING.md → "Link Issues or Describe Them In-PR".
  • Add the dedup-search checkbox to your PR description and check it once you have searched the GitHub PR list for similar PRs. See the PR template at .github/PULL_REQUEST_TEMPLATE.md and CONTRIBUTING.md → "Before You Start: Search First".

Once updated, push a new commit and these checks will re-run automatically.

— commitperclip

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: 54d03bb

Looks good. The required verify check remains fail-closed while distinguishing failed, skipped, and cancelled upstream lanes, including mixed outcomes.

Suggestions (1)

  • [tests] scripts/__tests__/pr-verify-lane-outcome.test.mjs:17 — Bound the run: | lookup to the named step (or parse the YAML). The current search can drift to a later step if this step's structure changes, making a future regression failure misleading.

Strengths

  • Exercises the workflow's actual shell block rather than a duplicated implementation.
  • Covers success, each non-success category, mixed categories, and unknown result values.
  • Avoids claiming that cancellation proves an infrastructure incident while still giving authors actionable diagnostics.
  • Exact-head targeted tests passed: 8/8 lane-outcome tests and 2/2 updated npmrc guard tests.

Recommended Action

No blocking findings. This head is clean from the review lenses.

Approval identity note: this PR is authored by app/allyblockcast, so the Ally GitHub App cannot review or approve its own PR. This exact head must be reopened under an independent author before an App approval can satisfy review/ally-complete.

kkroo
kkroo previously approved these changes Aug 2, 2026

@kkroo kkroo left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Independent exact-head approval.

Reviewed head: 54d03bb

The final classifier emits all failed, skipped, and cancelled lane annotations before one fail-closed exit, including mixed outcomes. Extracted-shell and worktree-install guard coverage passed, and the complete exact-head PR workflow is green. Ally reported no Critical or Important findings on this head.

Approved pending the rerun of the PR metadata review after the template-compliant body update.

kkroo
kkroo previously approved these changes Aug 2, 2026

@kkroo kkroo left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Independent exact-head approval.

Reviewed head: 3d491cb

This head is the repository-generated update of the previously reviewed 54d03bbe930ba38635cdc823540f54bcdfee41e7 onto current main; the PR change remains the fail-closed aggregate classifier for failed, skipped, and cancelled upstream lanes. The prior full workflow and metadata review were green. Approved pending terminal green CI for this updated head; do not merge on queued, cancelled, or failed checks.

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: 3d491cb

Looks good. No Critical or Important issues found.

Suggestions (1)

  • [native-codex] .github/workflows/pr.yml:382needs.general_tests.result is the aggregate conclusion for the matrix, so diagnostics cannot distinguish different conclusions among individual matrix shards. The current job-level behavior satisfies the linked acceptance criterion, but shard-level detail would require separate job IDs or an explicit result-collection mechanism.

Strengths

  • The classifier remains fail-closed for cancelled, skipped, failed, empty, and unknown results while emitting every distinct job-level category present.
  • Regression tests execute the actual workflow shell block and cover success, individual outcomes, mixed outcomes, and unknown values.
  • The exact-head workflow run exercised the real cancellation path: GENERAL_TESTS_RESULT=cancelled emitted “CANCELLED, not failed” and exited non-zero as intended.
  • The annotations avoid asserting that either cancellation or failure proves a specific root cause.

Recommended Action

The code is clean for merge once required checks are terminal and green. This PR is authored by app/allyblockcast, so the Ally GitHub App cannot review or approve its own PR. The exact head must be reopened under an independent author before an App approval satisfying review/ally-complete is possible; the existing User-type approvals do not substitute for that App review.

kkroo
kkroo previously approved these changes Aug 2, 2026

@kkroo kkroo left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Independent exact-head approval.

Reviewed head: 267ea71

This is the repository-generated update of reviewed head 3d491cb176996ab39f564124bb8102213d05d9a2 onto current master after #935 merged. The PR classifier change remains unchanged: cancelled, skipped, and failed upstream lanes are emitted distinctly before a fail-closed aggregate exit.

Approved pending terminal green CI for this exact head. Do not merge on queued, cancelled, or failed checks.

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex. The synced skill bodies were unavailable in this runtime, so their checklists were applied directly to the exact diff.
Reviewed head: 267ea71

Prior Findings Dispositioned (5)

  • prior:cf3d1f2 important 1 — fixed — .github/workflows/pr.yml:417 — cancellation now has a separate annotation that describes infrastructure interruption and manual cancellation only as possible causes rather than asserting either one.
  • prior:cf3d1f2 important 2 — fixed — .github/workflows/pr.yml:412 — skipped lanes now receive their own unmet-dependency annotation instead of falling through to the failure message.
  • prior:cf3d1f2 important 3 — fixed — scripts/__tests__/pr-verify-lane-outcome.test.mjs:47 — committed extracted-shell coverage now exercises cancellation, failure, skipped, mixed, success, and unknown outcomes.
  • prior:a727f73 important 1 — fixed — scripts/__tests__/npmrc-devdeps-guard.test.mjs:109 — the worktree-install guard now verifies that WORKTREE_INSTALL_RESULT enters the classifier and that non-success outcomes fail the required check.
  • prior:fc1199b important 1 — fixed — .github/workflows/pr.yml:407 — all non-empty outcome categories are annotated before the single terminal exit at line 422, so mixed failures no longer hide cancellations or skips.

Looks good. No Critical or Important issues found.

Suggestions (1)

  • [tests] scripts/__tests__/pr-verify-lane-outcome.test.mjs:17 — Consider bounding the run: | lookup to the named step, or parsing the YAML, so a future structural edit cannot make the extractor silently select a later step.

Strengths

  • The required aggregate remains fail-closed for cancelled, skipped, failed, empty, and unknown results.
  • Mixed result categories each emit actionable diagnostics before the final non-zero exit.
  • Tests execute the workflow's actual shell block rather than a duplicate implementation.
  • Exact-head syntax checks passed; current CI has the build, typecheck, worktree-install, e2e, canary, and most general-test lanes green, with two general-test shards still pending at review time.

Recommended Action

No blocking code findings. Wait for every required check to reach a terminal green state before merge.

This PR is authored by app/allyblockcast, so the Ally GitHub App cannot review or approve its own PR. This exact head must be reopened under an independent author before an App approval can satisfy review/ally-complete; the existing User-type Ally team approval does not substitute for App gate evidence.

@kkroo

kkroo commented Aug 2, 2026

Copy link
Copy Markdown

@ally review exact head 8256424

@kkroo
kkroo dismissed stale reviews from themself August 2, 2026 23:03

Dismiss stale approval: review body attests an older head, while current PR head is 8256424. Waiting for fresh exact-head approval.

@kkroo

kkroo commented Aug 2, 2026

Copy link
Copy Markdown

/ally review

Please review exact current head 8256424d2fb714c712a4395ac371136ee7d27279 after update onto master. Prior approvals were dismissed as stale because their bodies attested older heads.

@allyblockcast

allyblockcast Bot commented Aug 2, 2026

Copy link
Copy Markdown
Author

Ally — Consolidated PR Review

Lenses: pr-review-toolkit (code, tests, comments, errors, types) + gstack/review + native-codex.
Reviewed head: 8256424

Looks good. No Critical or Important issues found.

Suggestions (1)

  • [tests] scripts/__tests__/pr-verify-lane-outcome.test.mjs:17 — Consider bounding the run: | lookup to the named step's end (or parsing the workflow YAML) so a future structural edit cannot make the test extract a later shell block.

Strengths

  • Unknown outcomes remain fail-closed, while failed, skipped, and cancelled logical lanes receive distinct annotations.
  • Mixed outcomes across independent lanes are all reported before the aggregate job exits non-zero.
  • The regression tests execute the workflow's actual shell block and cover success, each outcome category, mixed categories, and unknown values.
  • Exact-head targeted verification passed: 10 tests, 10 passed, 0 failed.

Approval Status

The PR author is app/allyblockcast, so the Ally GitHub App cannot review or approve its own PR. This exact head must be reopened under an independent author before an App approval can satisfy review/ally-complete; no merge-token substitution was used.

@kkroo kkroo left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Independent exact-head approval.

Reviewed head: 8256424

The updated head preserves the reviewed CI classifier change after rebasing onto current master. The verify job remains fail-closed, distinguishes failed/skipped/cancelled lane outcomes, and emits every non-success category before one terminal exit. The actual PR diff is limited to .github/workflows/pr.yml and the two script test files; newly added master commits are outside the PR diff.

@kkroo
kkroo merged commit 6f007ab into master Aug 3, 2026
20 checks passed
@kkroo
kkroo deleted the sre/blo-20867-verify-lane-cancellation branch August 3, 2026 00:40
allyblockcast Bot pushed a commit that referenced this pull request Aug 3, 2026
…nter (BLO-21078)

Bounded counter (labeled only by conclusion) incremented once per completed
workflow_run webhook delivery. Numerator for the mass-cancellation detector
alert mirrored in Blockcast/onprem-k8s. Split out of PR #977, which also
carried a pr.yml verify-summary rewrite that duplicated and would have
regressed the skipped-lane handling already merged via #964 (BLO-20867) --
dropped that hunk here, kept only the metric.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
allyblockcast Bot pushed a commit that referenced this pull request Aug 4, 2026
…gate verify (BLO-20733)

Both Ally Important findings on PR #973 @ 1dd3154.

1. deployment-api.yaml copied all of pod.annotations into the map it then
   stamps, so the release-controlled marker key could arrive from chart
   values. Two silent failure modes, neither covered by the existing tests
   (they use an ordinary `example.com/team` key):

   - api.approvalPlanSha256 UNSET: the value passes straight through, so the
     render the release job treats as "unstamped" already carries a marker.
     The hash taken from render #1 is then computed over a document
     containing a marker and can never match what the approve script
     recomputes from render #2 -- every release dies at "planned Deployment
     pod template must carry ...".
   - api.approvalPlanSha256 SET: `set` silently overwrote the caller's value,
     hiding a conflict rather than reporting it.

   The key is release-controlled, so reject it outright instead of picking a
   winner. That is the only behaviour that keeps render #1 genuinely
   unstamped.

2. helm_chart ran but did not gate. `verify` is the required context and
   neither listed helm_chart in `needs` nor asserted its result, so a red
   Helm lane could sit beside a green required check. Both halves matter and
   fail independently: without the `needs` entry `needs.helm_chart.result`
   renders empty and the lane silently never gates; without the map entry the
   result is collected and ignored.

Verified locally (helm + kubectl present):
  - chart marker suite 7/7, full chart suite 28/28, verify lane suite 11/11
  - mutation-proven three ways, each restoring to green:
      remove the hasKey guard          -> 2 chart tests red
      drop helm_chart from verify.needs -> 1 lane test red
      drop the lane_results entry       -> 2 lane tests red

Rebased onto master, which had since rewritten the verify step for
cancelled-vs-failed lanes (BLO-20867 #964); the new entry follows that shape.

Co-Authored-By: Claude <noreply@anthropic.com>
allyblockcast Bot pushed a commit that referenced this pull request Aug 4, 2026
…r (BLO-20869)

Fold verify_serialized_server's result into the existing if:always()
verify aggregator's lane_results check, alongside the other required
lanes. A cancelled, skipped, or never-scheduled serialized shard now
fails the one required check instead of being invisible to the merge
gate (mergeStateStatus reads BLOCKED instead of UNSTABLE/MERGEABLE).

Rebased onto current master: BLO-20867/#964 rewrote this job into a
bash lane_results map after the original fix branch was opened; this
carries the same change forward in that shape rather than reverting
#964's cancelled-vs-failed distinction.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
kkroo pushed a commit that referenced this pull request Aug 6, 2026
…nter (BLO-21078)

Bounded counter (labeled only by conclusion) incremented once per completed
workflow_run webhook delivery. Numerator for the mass-cancellation detector
alert mirrored in Blockcast/onprem-k8s. Split out of PR #977, which also
carried a pr.yml verify-summary rewrite that duplicated and would have
regressed the skipped-lane handling already merged via #964 (BLO-20867) --
dropped that hunk here, kept only the metric.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
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