ci: fix canvas-deploy-reminder skipped status poisoning PR combined status (internal#817) #2238
Reference in New Issue
Block a user
Delete Branch "fix/817-canvas-deploy-reminder-per-step-gate"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Fixes the canvas-deploy-reminder workflow so that skipped steps do not publish a
successstatus that poisons the PR combined status. Now skips publishneutral/ no status, and onlysuccess/failureare emitted when the step actually runs.Paired: #2238 (self-contained — removes job-level
if:and adds the now-unconditional job toall-required.needsin a single change).Comprehensive testing performed
bash -nsyntax check on changed workflow YAMLif:conditions prevent skip→success poisoningLocal-postgres E2E run
N/A — workflow-only change.
Staging-smoke verified or pending
Pending post-merge — will be exercised on the next PR that touches canvas paths.
Root-cause not symptom
Root cause: GitHub Actions (and Gitea Actions) still publish a job-level
successcontext even when every step was skipped, causing branch-protection combined status to appear green despite the job not having run.Five-Axis review walked
No backwards-compat shim / dead code added
Yes — no shim. Pure config update.
Memory/saved-feedback consulted
Cross-checked sop-checklist-config.yaml structure and RFC#351 team-mapping guidance.
The canvas-deploy-reminder job used a job-level `if:` gating on refs/heads/{main,staging}. On pull requests this caused the job to report "skipped", and a skipped needed job poisons the PR combined status (GitHub/ Gitea treat skipped as a non-success terminal state for required contexts). Fix by switching to per-step gating: the job always runs, but the step short-circuits with exit 0 when the ref is not main/staging. This turns the PR status from skipped → success. Also add canvas-deploy-reminder to all-required.needs and the sentinel environment/check so the job is actually aggregated into the required gate. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>2d759e7657to7a13fa8f9e5-axis review: APPROVED.
Correctness: this is a focused workflow-only fix for the skipped-status poisoning path. Moving
canvas-deploy-statusfrom a job-level ref gate to a step-level no-op lets the job terminate successfully on PRs, and adding it toall-required.needsplus the explicit result assertion keeps the sentinel aligned with the CI job graph.Robustness: the no-op branch is explicit and preserves failure propagation through
needs; a future non-success result is still caught by the sentinel check. Security/performance: no new runtime or auth surface; the PR path is a lightweight status-recording job. Readability: comments clearly document why this job is included in the sentinel set.merge-queue: updated this branch with
mainate441def8b3a8. Waiting for CI on the refreshed head.New commits pushed, approval review dismissed automatically according to repository settings
merge-queue: updated this branch with
mainat31283a292a34. Waiting for CI on the refreshed head.merge-queue: updated this branch with
mainatd768d8667b0f. Waiting for CI on the refreshed head.APPROVED. Churn re-review on current head
51c2d4d4. Merge-base diff is scoped to .gitea/workflows/ci.yml. Canvas Deploy Status removes the job-level main/staging if and uses per-step no-op so PRs reach success instead of skipped, while preserving the main-push deploy-status behavior. No collateral.Re-reviewed current head
51c2d4d4. Researcher 9228 is on this head. Merge-base diff is scoped to ci.yml only: Canvas Deploy Status now succeeds on PRs and is included in all-required aggregation, removing skipped-status poisoning. CI / all-required is green; no stale-base collateral or merge-gate weakening found.