Raxx · internal docs

internal · gated

RCA — base-branch-lint false-positive on release promotions + migration-collision-check red on every PR

Incident ID: 2026-10-30-ci-gates-promotion-fp-and-migration-collision Date: 2026-10-30 Severity: SEV-3 (two CI gates failing for structural reasons; neither is a required check on develop, but one forced an admin merge on every release PR) Duration: gate 1 since the ADR-0115 promotion flow went live; gate 2 since the Woodpecker port (about 35 consecutive PRs, #4294 to #4812) Blast radius: every promote/release-*-to-main PR (#4809, #4817 confirmed); every PR touching console/migrations/versions/**, backend_v2/alembic/versions/** or the sqitch plan Author: sre-agent

Summary

base-branch-lint treats a commit that also lives on another remote branch as contamination. A release-promotion PR carries every develop commit by design, and every open feature branch cut from develop contains those same commits, so the gate fired on every promotion. Root cause established and fixed.

migration-collision-check had two stacked defects, both identified. (1) The base-SHA lookup depended on a GitHub token that is unusable on pull_request events. (2) Its replacement, the shared local resolver, assumes Woodpecker checks out the merge ref; in this Woodpecker the checkout is the PR head commit with no origin/* refs, so the resolver refused. The ci-pr gates that use the same resolver only work because their earlier base-branch-lint step fetches the target branch with a vault token. The gate now does the same fetch. Defect 2 was found by having the failing step post its own output to the PR, since Woodpecker logs are not readable.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Make the cross-PR comparison real if the step log says it was skipped: enable the pull_request event on the CI_FORGE_TOKEN Woodpecker secret, or give the vault read token pull-request read access. Until then a green run only means the PR is well-formed operator next CI maintenance window not filed (fix-forward policy; tracked here)
2 Any other workflow that calls resolve_pr_base_sha.sh must populate origin/<target> first or it fails closed in this Woodpecker. #4863 added the shared mechanism (fetch-pr-base step and scripts/ci/fetch_pr_base_ref.sh) for ci-pr; this gate calls the same script. New callers should do the same rather than add a second fetch sre-agent 2026-11-13 not filed
3 Sweep remaining .woodpecker/*.yaml for a network call (gh api, git fetch) whose result feeds a base or head SHA under set -e, and for comments that assert CI health without a status check sre-agent 2026-11-13 not filed

References