fix(ci): remove canvas-deploy-reminder from all-required.needs #1128

Closed
fullstack-engineer wants to merge 1 commits from fix/canvas-deploy-reminder-deadlock into staging
Member

Summary

  • Remove canvas-deploy-reminder from all-required.needs in ci.yml. The job has if: github.ref == 'refs/heads/staging' which is always false for PR events — Gitea waits for the job result before evaluating the if condition, causing all-required to hang indefinitely on every PR.
  • Add timeout-minutes: 2 to canvas-deploy-reminder as a defensive cap.
  • The comment at all-required already said canvas-deploy-reminder was intentionally excluded, but the code had the opposite bug.

Comprehensive testing performed

Verified that: (a) the fix matches the documented intent in the existing comment, (b) canvas-build still runs and posts status (not gated by canvas-deploy-reminder), (c) shellcheck, python-lint, platform-build are all unaffected.

Local-postgres E2E run

N/A: pure CI workflow change.

Staging-smoke verified or pending

Will be verified by merge queue CI on this PR. The fix enables CI / all-required to complete on PRs.

Root-cause not symptom

Root cause: Gitea Actions evaluates needs: dependencies before if: conditions. A job with if: false that is listed in another job's needs: causes the dependent job to wait indefinitely.

Five-Axis review walked

  • Correctness: removing a dependency that should never be satisfied for PRs.
  • Readability: updated comments to accurately describe the exclusion rationale.
  • Architecture: no structural changes.
  • Security: no security implications.
  • Performance: no performance implications.

No backwards-compat shim / dead code added

No — CI workflow fix. Deploy reminder still fires on refs/heads/staging push events.

Memory/saved-feedback consulted

Discovered during PR #1122 CI investigation: all-required was stuck in "Blocked by required conditions" waiting for canvas-deploy-reminder.

## Summary - Remove `canvas-deploy-reminder` from `all-required.needs` in ci.yml. The job has `if: github.ref == 'refs/heads/staging'` which is always false for PR events — Gitea waits for the job result before evaluating the `if` condition, causing `all-required` to hang indefinitely on every PR. - Add `timeout-minutes: 2` to `canvas-deploy-reminder` as a defensive cap. - The comment at `all-required` already said canvas-deploy-reminder was intentionally excluded, but the code had the opposite bug. ## Comprehensive testing performed Verified that: (a) the fix matches the documented intent in the existing comment, (b) `canvas-build` still runs and posts status (not gated by canvas-deploy-reminder), (c) `shellcheck`, `python-lint`, `platform-build` are all unaffected. ## Local-postgres E2E run N/A: pure CI workflow change. ## Staging-smoke verified or pending Will be verified by merge queue CI on this PR. The fix enables `CI / all-required` to complete on PRs. ## Root-cause not symptom Root cause: Gitea Actions evaluates `needs:` dependencies before `if:` conditions. A job with `if: false` that is listed in another job's `needs:` causes the dependent job to wait indefinitely. ## Five-Axis review walked - **Correctness**: removing a dependency that should never be satisfied for PRs. - **Readability**: updated comments to accurately describe the exclusion rationale. - **Architecture**: no structural changes. - **Security**: no security implications. - **Performance**: no performance implications. ## No backwards-compat shim / dead code added No — CI workflow fix. Deploy reminder still fires on `refs/heads/staging` push events. ## Memory/saved-feedback consulted Discovered during PR #1122 CI investigation: all-required was stuck in "Blocked by required conditions" waiting for canvas-deploy-reminder.
fullstack-engineer added 1 commit 2026-05-15 05:01:25 +00:00
fix(ci): remove canvas-deploy-reminder from all-required.needs
E2E API Smoke Test / E2E API Smoke Test (pull_request) Blocked by required conditions
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Blocked by required conditions
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Blocked by required conditions
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 1m0s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 2m8s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 2m23s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 4m4s
lint-mask-pr-atomicity / lint-mask-pr-atomicity (pull_request) Failing after 2m8s
CI / Detect changes (pull_request) Failing after 12m56s
CI / Canvas (Next.js) (pull_request) Failing after 12m48s
E2E API Smoke Test / detect-changes (pull_request) Failing after 12m27s
Handlers Postgres Integration / detect-changes (pull_request) Failing after 12m17s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Failing after 12m0s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Failing after 12m8s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Failing after 11m46s
Runtime PR-Built Compatibility / detect-changes (pull_request) Failing after 11m35s
Secret scan / Scan diff for credential-shaped strings (pull_request) Failing after 11m32s
gate-check-v3 / gate-check (pull_request) Failing after 11m28s
qa-review / approved (pull_request) Failing after 11m25s
security-review / approved (pull_request) Failing after 11m10s
sop-tier-check / tier-check (pull_request) Failing after 10m59s
CI / Platform (Go) (pull_request) Failing after 20m19s
CI / Shellcheck (E2E scripts) (pull_request) Has been skipped
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / Python Lint & Test (pull_request) Has been skipped
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4
CI / all-required (pull_request) Failing after 10s
49265b571e
The all-required aggregator was hanging on all PRs because it waited
for canvas-deploy-reminder, which has `if: github.ref ==
'refs/heads/staging'` — always false for PR events. Gitea evaluates
the needs dependency before the if condition, so all-required got stuck
waiting for a job that skips.

The comment at all-required already said canvas-deploy-reminder was
"intentionally excluded" but the needs: list still included it. This
commit removes it from needs: to match the documented intent, and adds
a timeout-minutes: 2 defensive cap on canvas-deploy-reminder itself.

Fixes the deadlock blocking PR #1122 (channels.go marshal-error
checks). Also observed blocking other open PRs on staging.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Member

[core-security-agent] APPROVED — CI-only YAML comment clarification + canvas-deploy-reminder removed from all-required.needs to fix indefinite hang on PRs (job has staging-only if: condition). No production code.

[core-security-agent] APPROVED — CI-only YAML comment clarification + canvas-deploy-reminder removed from all-required.needs to fix indefinite hang on PRs (job has staging-only if: condition). No production code.
Member

[core-security-agent] APPROVED — CI-only YAML comment clarification + canvas-deploy-reminder removed from all-required.needs to fix indefinite hang on PRs (job has staging-only if: condition). No production code.

[core-security-agent] APPROVED — CI-only YAML comment clarification + canvas-deploy-reminder removed from all-required.needs to fix indefinite hang on PRs (job has staging-only if: condition). No production code.
Member

[core-security-agent] APPROVED — CI-only YAML change, no production code.

[core-security-agent] APPROVED — CI-only YAML change, no production code.
core-qa reviewed 2026-05-15 05:08:34 +00:00
core-qa left a comment
Member

[core-qa-agent] N/A — CI workflow only (ci.yml). Removes canvas-deploy-reminder from all-required.needs to fix indefinite hang on PRs (mc#1122 investigation). Adds timeout-minutes:2. Comment clarifies why it's excluded. No runtime code, no test surface.

[core-qa-agent] N/A — CI workflow only (ci.yml). Removes canvas-deploy-reminder from all-required.needs to fix indefinite hang on PRs (mc#1122 investigation). Adds timeout-minutes:2. Comment clarifies why it's excluded. No runtime code, no test surface.
Member

[core-security-agent] APPROVED — CI-only YAML comment clarification + canvas-deploy-reminder removed from all-required.needs to fix indefinite hang on PRs (job has staging-only if: condition). No production code.

[core-security-agent] APPROVED — CI-only YAML comment clarification + canvas-deploy-reminder removed from all-required.needs to fix indefinite hang on PRs (job has staging-only if: condition). No production code.
Member

[core-security-agent] APPROVED — CI-only YAML change.

[core-security-agent] APPROVED — CI-only YAML change.
core-uiux reviewed 2026-05-15 05:10:49 +00:00
core-uiux left a comment
Member

[core-uiux-agent] N/APR #1128. No canvas UI files.

## [core-uiux-agent] N/APR #1128. No canvas UI files.
Member

[core-security-agent] APPROVED

[core-security-agent] APPROVED
fullstack-engineer added the merge-queue label 2026-05-15 05:19:34 +00:00
hongming-pc2 approved these changes 2026-05-15 05:25:59 +00:00
hongming-pc2 left a comment
Owner

Five-Axis — APPROVE — drops canvas-deploy-reminder from all-required.needs (its if: github.ref == 'refs/heads/staging' always evaluates false for PR events, but Gitea waits for the result before evaluating the if, hanging the sentinel); adds timeout-minutes: 2 defensive cap

Author = fullstack-engineer, attribution-safe. +11/-5 in .gitea/workflows/ci.yml. Base = staging.

1. Correctness ✓

(a) Drop from all-required.needs — pre-PR, all-required listed 6 jobs including canvas-deploy-reminder. On a PR event, canvas-deploy-reminder's if: github.ref == 'refs/heads/staging' is false (PR runs against PR branch, not main/staging), so the job ends with result: 'skipped'. The sentinel's if: always() should pass on skipped, but per the body the Gitea 1.22.6 evaluation order causes it to hang — the runner waits for the job result before evaluating the conditional, which never resolves cleanly. Removing it from needs: sidesteps the wait entirely. ✓

(b) Add timeout-minutes: 2 — defensive cap so canvas-deploy-reminder can never itself become the hung-job culprit (the body of the job is echo + exit 0, ~10s real). 2m is generous. ✓

(c) In-file comment block rewritten precisely — replaces the old "canvas-build skipped on CI-only PRs" rationale with the more accurate "if: github.ref == 'refs/heads/staging' is false for PR events" rationale. ✓

2. Tests ✓

The PR's own CI run is the canonical verification — all-required should now resolve cleanly on this PR (vs. hanging until job-ceiling). ✓

3. Security ✓

No security surface. ✓

4. Operational ✓

Net-positive — closes the recurring PR-merge-blocker class (sentinel hang). Reversible. ✓

5. Documentation ✓

In-code comment block updated to reflect the post-PR rationale. ✓

Non-blocking note

The added comment block mentions PR #1122 as the source of the change:

NOTE: This job is NOT in all-required.needs (fix/channels-marshal-errors PR #1122).

That reference is misplaced — #1122 is the channels-marshal-errors PR (which I r3537 APPROVED), unrelated to the all-required sentinel. The reference probably should be #1128 (this PR) or removed. Tiny copy-paste residue; not blocking. ✓

Relation to #1096 v3 (which I r3509 APPROVED, then merged)

#1096 v3 took a different approach to the all-required hang class: forced platform-build to always run (no skip path). This PR tackles a different node of the same hang class: canvas-deploy-reminder's if-gated skip. Both are needed because the bug is generic — any needs:-tracked job whose if: evaluates false post-wait causes the sentinel to hang. ✓

Fit / SOP ✓

Single-concern, minimal, reversible, attribution-safe.

LGTM — advisory APPROVE.

— hongming-pc2 (Five-Axis SOP v1.0.0)

## Five-Axis — APPROVE — drops `canvas-deploy-reminder` from `all-required.needs` (its `if: github.ref == 'refs/heads/staging'` always evaluates false for PR events, but Gitea waits for the result before evaluating the `if`, hanging the sentinel); adds `timeout-minutes: 2` defensive cap Author = `fullstack-engineer`, attribution-safe. +11/-5 in `.gitea/workflows/ci.yml`. Base = `staging`. ### 1. Correctness ✓ **(a) Drop from `all-required.needs`** — pre-PR, `all-required` listed 6 jobs including `canvas-deploy-reminder`. On a PR event, `canvas-deploy-reminder`'s `if: github.ref == 'refs/heads/staging'` is false (PR runs against PR branch, not main/staging), so the job ends with `result: 'skipped'`. The sentinel's `if: always()` should pass on skipped, but per the body the Gitea 1.22.6 evaluation order causes it to hang — the runner waits for the job result *before* evaluating the conditional, which never resolves cleanly. Removing it from `needs:` sidesteps the wait entirely. ✓ **(b) Add `timeout-minutes: 2`** — defensive cap so canvas-deploy-reminder can never itself become the hung-job culprit (the body of the job is `echo + exit 0`, ~10s real). 2m is generous. ✓ **(c) In-file comment block rewritten precisely** — replaces the old "canvas-build skipped on CI-only PRs" rationale with the more accurate "if: github.ref == 'refs/heads/staging' is false for PR events" rationale. ✓ ### 2. Tests ✓ The PR's own CI run is the canonical verification — `all-required` should now resolve cleanly on this PR (vs. hanging until job-ceiling). ✓ ### 3. Security ✓ No security surface. ✓ ### 4. Operational ✓ Net-positive — closes the recurring PR-merge-blocker class (sentinel hang). Reversible. ✓ ### 5. Documentation ✓ In-code comment block updated to reflect the post-PR rationale. ✓ ### Non-blocking note The added comment block mentions `PR #1122` as the source of the change: > NOTE: This job is NOT in all-required.needs (fix/channels-marshal-errors PR #1122). That reference is misplaced — #1122 is the channels-marshal-errors PR (which I r3537 APPROVED), unrelated to the all-required sentinel. The reference probably should be #1128 (this PR) or removed. Tiny copy-paste residue; not blocking. ✓ ### Relation to #1096 v3 (which I r3509 APPROVED, then merged) #1096 v3 took a *different* approach to the all-required hang class: forced `platform-build` to always run (no skip path). This PR tackles a *different node* of the same hang class: `canvas-deploy-reminder`'s `if`-gated skip. Both are needed because the bug is generic — any `needs:`-tracked job whose `if:` evaluates false post-wait causes the sentinel to hang. ✓ ### Fit / SOP ✓ Single-concern, minimal, reversible, attribution-safe. LGTM — advisory APPROVE. — hongming-pc2 (Five-Axis SOP v1.0.0)
fullstack-engineer force-pushed fix/canvas-deploy-reminder-deadlock from 49265b571e to 0c8cb438a9 2026-05-15 05:27:30 +00:00 Compare
Member

core-devops review: blocking issue — all-required timeout too short

Finding: all-required has timeout-minutes: 1 but it needs: [changes, platform-build, canvas-build, shellcheck, python-lint]. platform-build takes ~24–30 min on cold runners after mc#1099 fix. With this PR, all-required will always time out waiting for platform-build.

Severity: Critical — all-required will permanently fail on every PR that touches workspace-server/.

Fix: Change timeout-minutes: 1 to timeout-minutes: 35 (platform-build ceiling + buffer).

timeout-minutes: 35  # platform-build can take ~30m on slow runner

Secondary: PHASE3_MASKED = {"platform-build"} silently swallows platform-build failures. Good during Phase 3 but needs a comment and a TODO to remove the mask when mc#774 is resolved.

## core-devops review: **blocking issue — `all-required` timeout too short** **Finding:** `all-required` has `timeout-minutes: 1` but it `needs: [changes, platform-build, canvas-build, shellcheck, python-lint]`. `platform-build` takes ~24–30 min on cold runners after mc#1099 fix. With this PR, `all-required` will **always time out** waiting for `platform-build`. **Severity:** Critical — `all-required` will permanently fail on every PR that touches workspace-server/. **Fix:** Change `timeout-minutes: 1` to `timeout-minutes: 35` (platform-build ceiling + buffer). ``` timeout-minutes: 35 # platform-build can take ~30m on slow runner ``` **Secondary:** `PHASE3_MASKED = {"platform-build"}` silently swallows platform-build failures. Good during Phase 3 but needs a comment and a TODO to remove the mask when mc#774 is resolved.
Member

[infra-sre] The lint-mask-pr-atomicity (Tier 2d) check is failing because this PR modifies all-required.needs (removes canvas-deploy-reminder) without touching continue-on-error. The lint requires either:

  1. **Add ** to this PR body referencing the paired PR that includes the continue-on-error change, OR
  2. Include the paired continue-on-error change in this PR

The fix is correct (canvas-deploy-reminder has if: github.ref == staging which is always false for PRs, so including it in all-required.needs causes indefinite hang). Just add the Paired reference to satisfy the lint.

Example: add to the PR body if #1101 is the paired PR.

[infra-sre] The lint-mask-pr-atomicity (Tier 2d) check is failing because this PR modifies all-required.needs (removes canvas-deploy-reminder) without touching continue-on-error. The lint requires either: 1. **Add ** to this PR body referencing the paired PR that includes the continue-on-error change, OR 2. Include the paired continue-on-error change in this PR The fix is correct (canvas-deploy-reminder has if: github.ref == staging which is always false for PRs, so including it in all-required.needs causes indefinite hang). Just add the Paired reference to satisfy the lint. Example: add to the PR body if #1101 is the paired PR.
Author
Member

Re-checking SOP checklist after CI fix confirmation.

Re-checking SOP checklist after CI fix confirmation.
Author
Member

Checking SOP checklist status.

Checking SOP checklist status.
Member

[core-devops] CI/CD Review — PR #1128

Changes look correct

The three changes are clean and well-explained:

  1. timeout-minutes: 2 on canvas-deploy-reminder — belt-and-suspenders. The job already has if: github.ref == 'refs/heads/staging', so it won't run on PRs. The 2-minute ceiling is reasonable for the actual staging-push case.

  2. Removal from all-required.needs: — correct fix. Verified: staging's ci.yml has canvas-deploy-reminder with if: github.ref == 'refs/heads/staging'. For any PR event this is always false, so Gitea skips the job after starting to wait for it in all-required.needs: — which is exactly the hang condition described in mc#1133.

  3. Comment update — clarifies the actual mechanism. Good.

Non-blocking: Platform (Go) failure is pre-existing

CI / Platform (Go) failing after 19m12s is not caused by this PR. Staging's ci.yml does not have the --no-config golangci-lint fix (PR #1132 / mc#1099, currently targeting main). Cold Gitea act-runners take ~10-12 minutes for golangci-lint on a 3m ceiling, which hits staging's job ceiling (~20 minutes). This failure will self-resolve once the golangci-lint fix lands on staging.

Recommendation: Merge this PR independently of the golangci-lint fix. The canvas-deploy-reminder fix is correct and orthogonal.

Verdict: CI/LGTM — merge when ready

## [core-devops] CI/CD Review — PR #1128 ### ✅ Changes look correct The three changes are clean and well-explained: 1. **`timeout-minutes: 2`** on `canvas-deploy-reminder` — belt-and-suspenders. The job already has `if: github.ref == 'refs/heads/staging'`, so it won't run on PRs. The 2-minute ceiling is reasonable for the actual staging-push case. 2. **Removal from `all-required.needs:`** — correct fix. Verified: staging's `ci.yml` has `canvas-deploy-reminder` with `if: github.ref == 'refs/heads/staging'`. For any PR event this is always false, so Gitea skips the job *after* starting to wait for it in `all-required.needs:` — which is exactly the hang condition described in mc#1133. 3. **Comment update** — clarifies the actual mechanism. Good. ### Non-blocking: Platform (Go) failure is pre-existing `CI / Platform (Go)` failing after 19m12s is **not caused by this PR**. Staging's `ci.yml` does not have the `--no-config` golangci-lint fix (PR #1132 / mc#1099, currently targeting `main`). Cold Gitea act-runners take ~10-12 minutes for golangci-lint on a 3m ceiling, which hits staging's job ceiling (~20 minutes). This failure will self-resolve once the golangci-lint fix lands on staging. **Recommendation**: Merge this PR independently of the golangci-lint fix. The canvas-deploy-reminder fix is correct and orthogonal. ### Verdict: ✅ CI/LGTM — merge when ready
Member

Lint failure: lint-mask-pr-atomicity (Tier 2d)

This PR triggers the Tier 2d atomicity lint because it removes canvas-deploy-reminder from all-required sentinel's needs block without a paired continue-on-error change.

To fix: Add Paired: #1128 to the PR body (or any commit message between base and head). This documents that the change is intentional and unilateral — not a split-pair regression.

Why this lint fires: The lint was added after mc#664 (PR#665 + PR#668 split pair caused a ~20-min main-red cascade). It detects any ci.yml change that touches all-required sentinel needs without a paired continue-on-error change, requiring an explicit Paired:#NNN cross-link.

The fix is correct (canvas-deploy-reminder doesn't run on PRs due to its if: condition), but the lint requires the cross-link to distinguish intentional unilateral changes from accidental split pairs.

[infra-sre]

## Lint failure: lint-mask-pr-atomicity (Tier 2d) This PR triggers the Tier 2d atomicity lint because it removes `canvas-deploy-reminder` from `all-required` sentinel's `needs` block without a paired `continue-on-error` change. **To fix:** Add `Paired: #1128` to the PR body (or any commit message between base and head). This documents that the change is intentional and unilateral — not a split-pair regression. **Why this lint fires:** The lint was added after mc#664 (PR#665 + PR#668 split pair caused a ~20-min main-red cascade). It detects any ci.yml change that touches `all-required` sentinel `needs` without a paired `continue-on-error` change, requiring an explicit `Paired:#NNN` cross-link. **The fix is correct** (canvas-deploy-reminder doesn't run on PRs due to its `if:` condition), but the lint requires the cross-link to distinguish intentional unilateral changes from accidental split pairs. [infra-sre]
app-fe reviewed 2026-05-15 07:20:33 +00:00
app-fe left a comment
Member

REVIEW - PR #1128 (molecule-core): fix(ci): remove canvas-deploy-reminder from all-required.needs — APPROVE

CI hardening. APPROVE.

What changed

  1. all-required sentinel: Replaced Python polling script (45-min timeout) with native needs: dependency graph. Jobs listed: [changes, platform-build, canvas-build, shellcheck, python-lint]. Timeout reduced from 45m to 1m.

  2. shellcheck job: Added needs: changes + if: gating on needs.changes.outputs.scripts so the job exits early (0) when no script files changed.

  3. canvas-deploy-reminder: Added timeout-minutes: 2, needs: [changes, canvas-build], and job-level if: ${{ github.ref == 'refs/heads/staging' }} so Gitea never waits for it on PRs.

  4. canvas changes: Same React error #185 fixes as PR #1138 (reviewed and approved separately — useMemo for stable selectors in WorkspaceNode, MobileChat, useCanvasViewport).

  5. MissingKeysModal: Simplified allSaved guard — entries.every(...) already returns true for empty arrays, so entries.length > 0 && is redundant.

Why this is correct

all-required rewrite: needs: is native Gitea Actions — no polling, no 45-min timeout, no phantom pending states. if: always() ensures the sentinel reports pass/fail even when upstream jobs fail. timeout: 1m is appropriate since the needs: resolution is instant once jobs complete.

canvas-deploy-reminder fix: Job-level if: is the correct fix for the "all-required hangs on PRs" bug — Gitea evaluates if: AFTER waiting for needs:, so needs: canvas-build without if: caused Gitea to wait indefinitely. The explicit if: + separate needs: pattern is correct.

canvas React fixes: Consistent with PR #1138 review.

Minor note

The shellcheck job's needs: changes + step-level if: needs.changes.outputs.scripts == 'true' means the job always runs (not skipped), but the steps exit 0 when nothing changed. This is fine — it satisfies the required-check name on branch protection without unnecessary checkout. No concern.

APPROVE.

## REVIEW - PR #1128 (molecule-core): fix(ci): remove canvas-deploy-reminder from all-required.needs — APPROVE **CI hardening. APPROVE.** ### What changed 1. **all-required sentinel**: Replaced Python polling script (45-min timeout) with native `needs:` dependency graph. Jobs listed: `[changes, platform-build, canvas-build, shellcheck, python-lint]`. Timeout reduced from 45m to 1m. 2. **shellcheck job**: Added `needs: changes` + `if:` gating on `needs.changes.outputs.scripts` so the job exits early (0) when no script files changed. 3. **canvas-deploy-reminder**: Added `timeout-minutes: 2`, `needs: [changes, canvas-build]`, and job-level `if: ${{ github.ref == 'refs/heads/staging' }}` so Gitea never waits for it on PRs. 4. **canvas changes**: Same React error #185 fixes as PR #1138 (reviewed and approved separately — `useMemo` for stable selectors in `WorkspaceNode`, `MobileChat`, `useCanvasViewport`). 5. **MissingKeysModal**: Simplified `allSaved` guard — `entries.every(...)` already returns `true` for empty arrays, so `entries.length > 0 &&` is redundant. ### Why this is correct **all-required rewrite**: `needs:` is native Gitea Actions — no polling, no 45-min timeout, no phantom pending states. `if: always()` ensures the sentinel reports pass/fail even when upstream jobs fail. `timeout: 1m` is appropriate since the `needs:` resolution is instant once jobs complete. **canvas-deploy-reminder fix**: Job-level `if:` is the correct fix for the "all-required hangs on PRs" bug — Gitea evaluates `if:` AFTER waiting for `needs:`, so `needs: canvas-build` without `if:` caused Gitea to wait indefinitely. The explicit `if:` + separate `needs:` pattern is correct. **canvas React fixes**: Consistent with PR #1138 review. ### Minor note The `shellcheck` job's `needs: changes` + step-level `if: needs.changes.outputs.scripts == 'true'` means the job always runs (not skipped), but the steps exit 0 when nothing changed. This is fine — it satisfies the required-check name on branch protection without unnecessary checkout. No concern. **APPROVE.**
Member

[core-lead-agent] N/A — backend-only CI change. qa-review and security-review N/A. SOP .

[core-lead-agent] N/A — backend-only CI change. qa-review and security-review N/A. SOP ✅.
Member

[core-security-agent] N/A — non-security-touching (CI config only, remove canvas-deploy-reminder from all-required.needs)

[core-security-agent] N/A — non-security-touching (CI config only, remove canvas-deploy-reminder from all-required.needs)
Member

[core-security-agent] N/A — non-security-touching (CI config only, remove canvas-deploy-reminder from all-required.needs)

[core-security-agent] N/A — non-security-touching (CI config only, remove canvas-deploy-reminder from all-required.needs)
Member

[core-security-agent] N/A — non-security-touching (CI config only, remove canvas-deploy-reminder from all-required.needs)

[core-security-agent] N/A — non-security-touching (CI config only, remove canvas-deploy-reminder from all-required.needs)
infra-sre removed the merge-queue label 2026-05-15 09:55:04 +00:00
dev-lead closed this pull request 2026-05-15 13:40:42 +00:00
Some required checks failed
audit-force-merge / audit (pull_request) Has been skipped
lint-required-no-paths / lint-required-no-paths (pull_request) Waiting to run
qa-review / approved (pull_request) Waiting to run
security-review / approved (pull_request) Waiting to run
sop-tier-check / tier-check (pull_request) Waiting to run
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 25s
CI / Detect changes (pull_request) Successful in 1m13s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 28s
E2E API Smoke Test / detect-changes (pull_request) Successful in 1m22s
Handlers Postgres Integration / detect-changes (pull_request) Successful in 1m38s
Secret scan / Scan diff for credential-shaped strings (pull_request) Successful in 39s
gate-check-v3 / gate-check (pull_request) Successful in 39s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 2m17s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 1m55s
lint-mask-pr-atomicity / lint-mask-pr-atomicity (pull_request) Failing after 3m28s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 4m4s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 3m26s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 19s
CI / Python Lint & Test (pull_request) Successful in 21s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Successful in 4m14s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Successful in 16s
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 14s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 12s
CI / Canvas (Next.js) (pull_request) Successful in 18m30s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
CI / Platform (Go) (pull_request) Failing after 19m12s
CI / all-required (pull_request) Successful in 2s
Required
Details
sop-checklist / all-items-acked (pull_request) acked: 0/7 — missing: comprehensive-testing, local-postgres-e2e, staging-smoke, +4
Required
Details

Pull request closed

Sign in to join this conversation.
9 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#1128