Skip to content

fix(ci): check E2E jobs within ci-e2e.yml orchestrator runs#409

Merged
FSM1 merged 11 commits into
mainfrom
fix/release-gate-e2e-verification
Mar 30, 2026
Merged

fix(ci): check E2E jobs within ci-e2e.yml orchestrator runs#409
FSM1 merged 11 commits into
mainfrom
fix/release-gate-e2e-verification

Conversation

@FSM1

@FSM1 FSM1 commented Mar 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • Web E2E gate no longer fails when the CI E2E orchestrator's overall conclusion is non-success (e.g. Desktop E2E failed). It now checks the specific "Web E2E" job directly.
  • Desktop E2E gate rewritten to check for "Desktop E2E" jobs inside ci-e2e.yml runs instead of searching for standalone desktop-e2e.yml workflow runs (which don't exist when triggered via workflow_call).
  • Web fallback search no longer filters by overall run conclusion, so it can find passing Web E2E jobs even in runs where other jobs failed.

Context

The release gate was failing because:

  1. The web check gated on CI E2E overall status before inspecting the Web E2E job
  2. The desktop check searched for desktop-e2e.yml runs, but workflow_call runs appear as jobs within the caller — not as separate workflow runs

Both checks now use the same consistent pattern: find ci-e2e.yml run → check specific job by name → fall back to recent runs if skipped.

Test plan

  • Merge to main and verify the release-gate re-run picks up Web E2E and Desktop E2E from the ci-e2e.yml run
  • Verify that if only one of web/desktop E2E ran, the other gate correctly falls back to a recent passing run

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Improved release workflow verification to perform job-level checks for Web and Desktop end-to-end runs, detect skipped vs failed jobs more accurately, and fall back to recent successful runs when needed.
    • Refined messaging around skip vs fail outcomes to reflect per-job conclusions rather than a single orchestrator status.

…dalone runs

Two bugs in release-gate.yml:

1. Web E2E verification checked the CI E2E orchestrator's overall
   conclusion before checking the Web E2E job. If Desktop E2E failed,
   the orchestrator failed, blocking the web gate even though Web E2E
   passed. Fix: skip the overall conclusion check and inspect the
   specific Web E2E job directly.

2. Desktop E2E verification searched for standalone desktop-e2e.yml
   workflow runs. But when ci-e2e.yml calls desktop-e2e.yml via
   workflow_call, it doesn't create separate workflow runs — the jobs
   appear within the ci-e2e.yml run. Fix: check for "Desktop E2E" jobs
   inside ci-e2e.yml runs (same pattern as the web check).

Also fixed the web fallback search to not filter by overall run
conclusion, so it can find passing Web E2E jobs even in runs where
other jobs failed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: c41172817edd
@coderabbitai

coderabbitai Bot commented Mar 30, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@FSM1 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 9 minutes and 25 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 9 minutes and 25 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b91783e2-4dae-4110-9fa0-cd4de3e7e607

📥 Commits

Reviewing files that changed from the base of the PR and between 38c8f6b and 86250c6.

📒 Files selected for processing (1)
  • .github/workflows/release-gate.yml

Walkthrough

Shifted E2E verification in .github/workflows/release-gate.yml from relying on a top-level orchestrator E2E_CONCLUSION and separate desktop-e2e.yml runs to job-level inspection of ci-e2e.yml runs; added per-job pass/skip checks and fallback search of older ci-e2e.yml runs when jobs are absent/skipped.

Changes

Cohort / File(s) Summary
Release Gate workflow
​.github/workflows/release-gate.yml
Removed orchestrator-level E2E_CONCLUSION check. Reworked Web E2E verification to inspect ci-e2e.yml run jobs (fail on any non-success/non-skipped, pass if ≥1 success, fallback to older runs when skipped/absent). Replaced Desktop E2E polling of desktop-e2e.yml with polling ci-e2e.yml completion at MAIN_SHA, inspecting jobs named Desktop E2E, failing on any failed platform job, and falling back to the most recent completed run where all Desktop E2E matrix jobs succeeded.

Sequence Diagram(s)

sequenceDiagram
participant ReleaseGate as Release Gate (workflow)
participant GHAPI as GitHub API
participant CI_E2E as ci-e2e.yml run
participant WebJobs as Web E2E jobs
participant DesktopJobs as Desktop E2E jobs

ReleaseGate->>GHAPI: Query latest ci-e2e run for MAIN_SHA / latest completed
GHAPI-->>ReleaseGate: Return run metadata
ReleaseGate->>CI_E2E: Poll until completed (if needed)
CI_E2E-->>ReleaseGate: Run completed
ReleaseGate->>GHAPI: List jobs for run (filter "Web E2E")
GHAPI-->>ReleaseGate: Return WebJobs list + conclusions
alt any Web job has non-success/non-skipped
    ReleaseGate->>ReleaseGate: Fail Web gate
else at least one Web job success
    ReleaseGate->>ReleaseGate: Pass Web gate
else Web jobs absent/skipped
    ReleaseGate->>GHAPI: Search older ci-e2e runs until all Web jobs succeeded
    GHAPI-->>ReleaseGate: Return fallback run or not
end
ReleaseGate->>GHAPI: List jobs for run (filter "Desktop E2E")
GHAPI-->>ReleaseGate: Return DesktopJobs list + conclusions
alt any Desktop job failed
    ReleaseGate->>ReleaseGate: Fail Desktop gate
else all Desktop jobs succeeded
    ReleaseGate->>ReleaseGate: Pass Desktop gate
else Desktop jobs absent/skipped
    ReleaseGate->>GHAPI: Search older ci-e2e runs until all Desktop jobs succeeded
    GHAPI-->>ReleaseGate: Return fallback run or not
end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly and clearly identifies the main change: shifting E2E job verification from orchestrator-level checks to job-level inspection within ci-e2e.yml runs.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/release-gate-e2e-verification

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov

codecov Bot commented Mar 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 61.28%. Comparing base (bb87d17) to head (86250c6).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff           @@
##             main     #409   +/-   ##
=======================================
  Coverage   61.28%   61.28%           
=======================================
  Files         133      133           
  Lines        9790     9790           
  Branches      988      988           
=======================================
  Hits         6000     6000           
  Misses       3574     3574           
  Partials      216      216           
Flag Coverage Δ
api 84.36% <ø> (ø)
api-client 84.36% <ø> (ø)
core 84.36% <ø> (ø)
crypto 84.36% <ø> (ø)
sdk 84.36% <ø> (ø)
sdk-core 84.36% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Updates the release gate workflow to validate Web/Desktop E2E results by inspecting specific jobs within ci-e2e.yml orchestrator runs, rather than relying on overall workflow conclusions or searching for standalone workflow runs that don’t exist under workflow_call.

Changes:

  • Web E2E gate no longer fails purely on the ci-e2e.yml run’s overall conclusion; it’s intended to check the “Web E2E” job directly.
  • Desktop E2E gate rewritten to look for “Desktop E2E” jobs inside ci-e2e.yml runs instead of desktop-e2e.yml workflow runs.
  • Web fallback search no longer filters candidate runs by overall run conclusion.

Comment thread .github/workflows/release-gate.yml
Comment thread .github/workflows/release-gate.yml Outdated
Address review feedback: the gate now distinguishes three states for
each E2E check (passed/failed/skipped) instead of two (passed/other).

- Failed jobs trigger immediate failure instead of falling back to
  older runs — prevents masking regressions on main.
- Desktop E2E matrix: verifies ALL platform jobs passed, not just
  that at least one succeeded (prevents partial-failure false pass).
- Fallback to older runs only activates when jobs are absent/skipped.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 0b8e5d642de5

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 2 comments.

Comment thread .github/workflows/release-gate.yml Outdated
Comment thread .github/workflows/release-gate.yml Outdated
FSM1 and others added 2 commits March 30, 2026 13:15
Use if/else pattern for Desktop E2E pass/fallback instead of
if+exit 0, matching the Web E2E code structure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: bac91d754325
Tighten fallback acceptance condition for both Web and Desktop E2E:
require all matching jobs to have succeeded (SUCCESS == TOTAL) instead
of just checking no failures. Prevents accepting partial runs where
some jobs were skipped.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: d282fc26c9a5

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/release-gate.yml:
- Around line 224-245: The loop that sets RECENT_RUN_ID currently skips past
newer runs with Web E2E failures; change the logic so you iterate completed
ci-e2e.yml runs newest-first and for each run (use RECENT_RUN_ID / rid,
JOBS_JSON, TOTAL, SUCCESS, FAILED) you first check if TOTAL (Web E2E jobs) is
zero and then continue (absent/skipped), but if TOTAL > 0 treat this run as
authoritative: if FAILED > 0 emit an error and exit non-zero immediately,
otherwise set RECENT_RUN_ID (echo "$rid") and break; ensure you do not continue
scanning older successful runs once a newer run had Web E2E jobs (either pass or
fail).
- Around line 318-340: The current RECENT_RUN_ID loop (using JOBS_JSON and
reading run ids) skips newer runs with failing Desktop E2E jobs and keeps
searching for an older success; change the logic so you examine runs in
descending order and stop at the first run where Desktop E2E actually ran:
compute TOTAL, SUCCESS and FAILED from JOBS_JSON and if TOTAL>0 then if FAILED>0
immediately fail/exit with an error about that run, otherwise set RECENT_RUN_ID
to that run id and break; do not continue searching past the first run that ran
Desktop E2E (use the existing RECENT_RUN_ID, JOBS_JSON, TOTAL, SUCCESS, FAILED
symbols).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9c321963-3c9a-4953-9aef-0fc539b7b7c7

📥 Commits

Reviewing files that changed from the base of the PR and between bb4b70e and 38c8f6b.

📒 Files selected for processing (1)
  • .github/workflows/release-gate.yml

Comment thread .github/workflows/release-gate.yml Outdated
Comment thread .github/workflows/release-gate.yml Outdated
The fallback loops that search older ci-e2e.yml runs now treat the
first run that actually contains the E2E jobs as authoritative: if
that run failed, fail the gate immediately instead of scanning further
back for an older passing run. This prevents masking regressions.

Also switched from piped while-loop (subshell) to process substitution
so that exit 1 inside the loop propagates to the step.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 9fb58ca125c1

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 2 comments.

Comment thread .github/workflows/release-gate.yml
Comment thread .github/workflows/release-gate.yml Outdated
Both polling loops waited 20 min (40 * 30s) but desktop-e2e.yml has a
45-minute timeout. If Desktop E2E runs long, the orchestrator won't
complete within the polling window, causing false failures.

- Increase both polling loops to 90 * 30s = 45 min
- Increase verify-e2e job timeout from 40 to 50 min

Since both steps poll the same ci-e2e.yml run, the second step finds
it already complete — no risk of 45+45=90 min sequential waits.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 2968bec3da2a

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.

Comment thread .github/workflows/release-gate.yml Outdated
If all matching E2E jobs in a ci-e2e.yml run have conclusion "skipped",
the fallback should continue searching older runs (E2E didn't actually
run). Previously, TOTAL > 0 but SUCCESS == 0 would trigger a false
failure. Now counts only non-skipped (active) jobs for the pass/fail
evaluation.

Applies to both Web and Desktop E2E fallback loops.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 75ed4a9a4008

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 2 comments.

Comment thread .github/workflows/release-gate.yml
Comment thread .github/workflows/release-gate.yml Outdated
The polling loops selected [0] from runs matching the HEAD SHA, which
picks the newest run. If a rerun is in-progress while an older
completed run exists, the gate would wait unnecessarily (or time out).

Now sorts completed runs first via jq sort_by, so a completed run is
used immediately even if a rerun is in-progress. Also consolidates
the conclusion + run ID into a single API call.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 90d2204a667c
@FSM1

FSM1 commented Mar 30, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai please review

@coderabbitai

coderabbitai Bot commented Mar 30, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
fd -i "release-gate.yml" --exec cat {}

Length of output: 0


🏁 Script executed:

#!/bin/bash
# Fetch the PR diff from GitHub
gh pr view 409 --repo FSM1/cipher-box --json title,body,files
echo "---"
gh api repos/FSM1/cipher-box/pulls/409/files --jq '.[] | select(.filename | contains("release-gate")) | .filename, .patch'

Length of output: 20095


@FSM1 The refactor is well-structured — the three-state (passed / failed / skipped) distinction, fail-fast on failure vs. fall-back on skip, and the unified pattern for both suites are all clear improvements. A few items worth attention:


🔴 Timeout budget mismatch

The job's timeout-minutes: 50 but each poll loop can run up to MAX_ATTEMPTS=90 × POLL_INTERVAL=30s = 45 min. When both Web E2E and Desktop E2E steps run, the Desktop step's poll exits on attempt 1 (the run is already complete), so the total is ~45 min + overhead — fine.

But when only Desktop E2E runs (no web changes detected, so the Web step is skipped), the Desktop step must do the full 45-min poll on its own. With 50 min available, there's only ~5 min of margin for everything else in the job. If the desktop suite runs long, the job timeout will fire before the poll completes and the gate exits without a useful error message.

Suggested fix: raise timeout-minutes to at least 60, or keep a single poll loop that is shared by both checks.


🟡 E2E_RUN_ID not validated after the poll loop

After both poll loops (one in each step), E2E_RUN_ID is set with:

E2E_RUN_ID=$(echo "$RUN_DATA" | jq -r '.databaseId')

If $RUN_DATA is unexpectedly empty or .databaseId is null, this becomes the literal string "null" and the subsequent gh api "…/actions/runs/null/jobs" call fails at the API level with a confusing 404 rather than a clear error. A guard after the loop would help:

if [ -z "$E2E_RUN_ID" ] || [ "$E2E_RUN_ID" = "null" ]; then
  echo "::error::Could not determine CI E2E run ID for ${MAIN_SHA}"
  exit 1
fi

🟡 Missing :-0 default in Desktop success comparison

# Web (consistent)
if [ "${WEB_TOTAL:-0}" -gt 0 ] && [ "${WEB_FAILED:-0}" -gt 0 ]; then
...
if [ "${WEB_SUCCESS:-0}" -gt 0 ]; then

# Desktop — DESKTOP_TOTAL has no default in the equality test
if [ "${DESKTOP_SUCCESS:-0}" -gt 0 ] && [ "$DESKTOP_SUCCESS" -eq "$DESKTOP_TOTAL" ]; then

$DESKTOP_TOTAL should be ${DESKTOP_TOTAL:-0} for consistency (jq length always returns a number, so this won't cause a real bug, but it's an inconsistency that can bite during future edits).


🟢 Everything else looks good

  • The sort_by(.status == "completed" | not) logic is correct — false (completed) sorts before true (in-progress), so reruns don't block the gate. ✓
  • The fallback ACTIVE > 0 guard correctly skips all-skipped runs (including the current E2E_RUN_ID) without needing an explicit exclusion. ✓
  • Desktop matrix "all must pass" (SUCCESS == ACTIVE) is strictly correct and prevents partial-success false positives. ✓
  • The WEB_FAILED filter (!= "success" and != "skipped" and != null) correctly handles all terminal failure states within a completed run. ✓
  • Duplicate poll loops — acceptable for GitHub Actions bash; extracting a helper function would be cleaner but is not a blocking concern.

🧠 Learnings used
Learnt from: FSM1
Repo: FSM1/cipher-box PR: 0
File: :0-0
Timestamp: 2026-03-30T01:40:47.029Z
Learning: In FSM1/cipher-box (`release-gate.yml`), `.github/workflows/ci-e2e.yml` is intentionally excluded from both `WEB_PATTERNS` and `DESKTOP_PATTERNS` in the release gate's change-detection step. Reason: `ci-e2e.yml` self-includes in its own `dorny/paths-filter` for both `web` and `desktop`, so any change to the orchestrator still triggers both E2E suites on `main` pushes. Including it in the release gate patterns would cause a deadlock: the gate detects "desktop changed" but `ci-e2e.yml`'s narrower per-push filter may not schedule a Desktop E2E job, leaving no run for the gate to find. The release gate only needs to block on actual app-code changes, not on CI config changes. Do NOT flag the absence of `ci-e2e.yml` from the release gate pattern lists.

Learnt from: FSM1
Repo: FSM1/cipher-box PR: 253
File: tests/e2e-desktop/scripts/test-conflict-detection.ps1:156-157
Timestamp: 2026-03-03T14:55:05.884Z
Learning: In `tests/e2e-desktop/scripts/*.{sh,ps1}` (FUSE E2E tests): Fixed sleep-based waits after file mutations are an inherent limitation of FUSE-mount testing. The FUSE daemon provides no IPC signal or status endpoint to indicate when a debounced IPNS metadata publish completes. Tests use conservative fixed waits (e.g., 8s for initial publish accounting for 1.5s debounce + 10s safety valve, 15s for conflict resolution) and can be increased if CI proves flaky. Eliminating sleep-based waits would require exposing an IPC readiness signal from the FUSE daemon.
✅ Actions performed

Full review triggered.

- Raise verify-e2e job timeout from 50 to 60 min (more margin when
  only Desktop E2E runs and needs the full 45-min poll window)
- Add E2E_RUN_ID validation after both poll loops — fail with a clear
  error instead of a confusing 404 on "runs/null/jobs"
- Add missing ${DESKTOP_TOTAL:-0} default for consistency with other
  variable references

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: ae1a31740645
@FSM1

FSM1 commented Mar 30, 2026

Copy link
Copy Markdown
Owner Author

All three items addressed in 0a8acb9:

  • 🔴 Timeout budget: timeout-minutes raised from 50 → 60 min
  • 🟡 E2E_RUN_ID validation: Added null/empty guard after both poll loops — fails with a clear error instead of a 404 on runs/null/jobs
  • 🟡 Missing default: $DESKTOP_TOTAL${DESKTOP_TOTAL:-0} for consistency

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 3 comments.

Comment thread .github/workflows/release-gate.yml
Comment thread .github/workflows/release-gate.yml
Comment thread .github/workflows/release-gate.yml
When E2E jobs are absent/skipped at HEAD, only fall back to older runs
if the ci-e2e.yml run succeeded (meaning detect-changes intentionally
skipped the suite). If the run failed or was cancelled, E2E may have
been skipped due to upstream failure — falling back would mask the
issue.

Also improved log messages to say "skipped/absent" instead of
assuming "no changes in that push".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 5051a8c8a04f

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 2 comments.

Comment thread .github/workflows/release-gate.yml
Comment thread .github/workflows/release-gate.yml Outdated
If the GitHub API call fails (rate limit, auth, network), the polling
loop would spin until timeout with a misleading "still running"
message. Now uses `if !` to fail fast on API errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 28b16c9575e1
@FSM1 FSM1 enabled auto-merge (squash) March 30, 2026 12:38
@FSM1 FSM1 merged commit 949b18e into main Mar 30, 2026
25 checks passed
@FSM1 FSM1 deleted the fix/release-gate-e2e-verification branch March 30, 2026 12:46
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