Skip to content

Start every spawned child from a clean signal state - #15813

Open
lawrencecchen wants to merge 4 commits into
mainfrom
fix-spawn-signal-mask
Open

lawrencecchen wants to merge 4 commits into
mainfrom
fix-spawn-signal-mask

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

A child that cmux starts with posix_spawn inherits the calling thread's signal mask and every ignored disposition. cmux spawns from Swift concurrency and dispatch worker threads, which block nearly every signal, so these children never received SIGTERM, SIGINT or SIGWINCH and could not shut down or resize. The acpmux daemon ignoring SIGTERM (#15521) was one case of this.

POSIXSpawnSignalPolicy (CmuxFoundation) configures a posix_spawnattr_t with an empty mask and the default disposition for every catchable signal, adding POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF to the flags already set. All 18 posix_spawn sites in the app, its packages and the CLI now use it:

Site Before After
RosettaNativeRelaunch inherited mask and ignores policy
AgentForkCommandOutputRunner inherited mask and ignores policy
NotificationSoundSettings+CustomSoundStaging (2 calls) inherited mask and ignores policy
AutomationProcessSession inherited mask and ignores policy
AgentRestoreLaunchLease (CMUXAgentLaunch) inherited mask and ignores policy
WorkspaceChangesGitProcess (CmuxGit) inherited mask and ignores policy
SimulatorPOSIXProcessLauncher (CmuxSimulator) inherited mask and ignores policy
CmuxSudoBroker: SudoPOSIXProcessSpawner, SudoPrivilegedProcessSupervisor, SudoRunnerLauncher, SystemSudoAppLauncher, SystemSudoTouchIDSetupLauncher inherited mask and ignores policy
TerminalCustomUploadRunner, TerminalNotificationPolicy mask cleared, all ignores inherited policy, SIGPIPE ignore still inherited
CLI CodexTeamsAppServerProcess mask cleared, all ignores inherited policy
CLI OwnedProcessSupervisor mask cleared, TERM/INT/HUP defaulted policy
CLI restore provider preflight mask cleared, PIPE/WINCH/TTOU defaulted policy

The upload command and notification hooks keep the app's ignored SIGPIPE on purpose (a closed pipe returns EPIPE instead of killing them mid-cleanup, #12383), through POSIXSpawnSignalPolicy(inheritingDispositionsOf: [SIGPIPE]).

Foundation Process needs no change. A probe spawned by Process from a thread with every signal blocked and SIGINT, SIGQUIT, SIGHUP and SIGPIPE ignored reported an empty mask and default dispositions; the same probe through a bare posix_spawn reported the full mask and all four ignores. The CLI's execve sites already reset state through cliExecFailureErrno. A non-interactive /bin/sh still starts & jobs with SIGINT and SIGQUIT ignored whatever the spawn attributes say; the only such launches are the CLI's fire-and-forget hook workers, which is harmless for them and left alone. Ghostty's terminal spawn (Pty.childPreExec) resets dispositions but not the mask; it forks from Ghostty's IO thread and is out of scope here.

CmuxSudoBroker and CMUXAgentLaunch now depend on CmuxFoundation, the leaf package that every target linking them already links.

After #15521 merges, AcpmuxDaemonLauncher.spawnDetached should switch to this policy; that PR keeps its own copy because it is not merged.

Testing

  • SimulatorPOSIXProcessLauncherSignalStateTests launches a Perl probe through the real launcher from a thread with every signal blocked and SIGXFSZ ignored. swift test --filter SimulatorPOSIXProcessLauncherSignalStateTests in Packages/macOS/CmuxSimulator: red on 45190ff (blocked=1 2 … 31 ignored=25), green on 5919e97.
  • POSIXSpawnSignalPolicyTests (CmuxFoundation): the policy yields a clean child, the inherited-disposition option keeps only that signal, prior flags survive, and a control spawn without the policy shows the leak. 5 tests pass locally with swift test. Locally I had to drop the unrelated SSHPTYReplayOutputFilterTests.swift, which Swift 6.4 cannot type-check in time; CI's toolchain is unaffected.
  • swift test passes for CMUXAgentLaunch and CmuxSudoBroker; CmuxGit builds.
  • CLIExecInheritedSignalStateTests keeps its main scope (CLI/ only). Its spawn check now also accepts POSIXSpawnSignalPolicy, because the three CLI spawn sites use it; without that change the existing check fails.
  • Fleet build of 5919e97 (app and CLI, before the test-only guard commit) succeeded, job 8bf5c71575f55a4c644c2c91.

Changelog

Fixed: Helper processes cmux starts, such as sudo commands, git, simulator tools, upload commands and notification hooks, now receive SIGTERM and other signals instead of inheriting a blocked signal mask

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes
    • Standardized signal handling for spawned processes to prevent inherited blocked signals and ignored signal dispositions from interfering with child processes.
    • Preserved selected inherited signal behavior where needed, including SIGPIPE for terminal notification hooks.
    • Added coverage for child-process signal behavior across CLI, simulator, and process launch flows.

lawrencecchen and others added 2 commits September 29, 2026 22:31
SimulatorPOSIXProcessLauncher, launched from a thread with blocked signals,
hands the child that mask and an ignored disposition. Fails on this commit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A posix_spawn child inherits the calling thread's signal mask and every
SIG_IGN disposition. cmux spawns from Swift concurrency and dispatch worker
threads, which block nearly every signal, so such children never received
SIGTERM or SIGWINCH.

Add POSIXSpawnSignalPolicy to CmuxFoundation. It sets an empty mask and the
default disposition for every catchable signal on a posix_spawnattr_t, keeping
the flags already set. Apply it at all 18 posix_spawn sites in the app, its
packages and the CLI, replacing the partial per-site resets. The upload
command and notification hooks keep the app's ignored SIGPIPE, as before.

CmuxSudoBroker and CMUXAgentLaunch now depend on CmuxFoundation, the leaf
package every target already links.

The CLI source guard now requires the policy at every posix_spawn site under
CLI, Sources and Packages.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 3 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 9c294759-46c9-4b40-a973-53dedee2dfac

📥 Commits

Reviewing files that changed from the base of the PR and between ca6d097 and 9f51506.

📒 Files selected for processing (23)
  • CLI/CMUXCLI+RestorePreflight.swift
  • CLI/CodexTeamsAppServerProcess.swift
  • CLI/OwnedProcessSupervisor.swift
  • Packages/macOS/CMUXAgentLaunch/Package.swift
  • Packages/macOS/CMUXAgentLaunch/Sources/CMUXAgentLaunch/AgentRestoreLaunchLease.swift
  • Packages/macOS/CmuxFoundation/Sources/CmuxFoundation/Process/POSIXSpawnSignalPolicy.swift
  • Packages/macOS/CmuxFoundation/Tests/CmuxFoundationTests/Process/POSIXSpawnSignalPolicyTests.swift
  • Packages/macOS/CmuxGit/Sources/CmuxGit/Changes/WorkspaceChangesGitProcess.swift
  • Packages/macOS/CmuxSimulator/Sources/CmuxSimulator/WorkerProtocol/SimulatorPOSIXProcessLauncher.swift
  • Packages/macOS/CmuxSimulator/Tests/CmuxSimulatorTests/SimulatorPOSIXProcessLauncherSignalStateTests.swift
  • Packages/macOS/CmuxSudoBroker/Package.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SudoPOSIXProcessSpawner.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SudoPrivilegedProcessSupervisor.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SudoRunnerLauncher.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SystemSudoAppLauncher.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SystemSudoTouchIDSetupLauncher.swift
  • Sources/AgentForkCommandOutputRunner.swift
  • Sources/App/RosettaNativeRelaunch.swift
  • Sources/AutomationProcessSession.swift
  • Sources/NotificationSoundSettings+CustomSoundStaging.swift
  • Sources/TerminalCustomUploadRunner.swift
  • Sources/TerminalNotificationPolicy.swift
  • cmuxTests/CLIExecInheritedSignalStateTests.swift

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: a483d77c-b1ca-4087-919e-c07660e37f5e

📥 Commits

Reviewing files that changed from the base of the PR and between 64a1765 and ca6d097.

📒 Files selected for processing (23)
  • CLI/CMUXCLI+RestorePreflight.swift
  • CLI/CodexTeamsAppServerProcess.swift
  • CLI/OwnedProcessSupervisor.swift
  • Packages/macOS/CMUXAgentLaunch/Package.swift
  • Packages/macOS/CMUXAgentLaunch/Sources/CMUXAgentLaunch/AgentRestoreLaunchLease.swift
  • Packages/macOS/CmuxFoundation/Sources/CmuxFoundation/Process/POSIXSpawnSignalPolicy.swift
  • Packages/macOS/CmuxFoundation/Tests/CmuxFoundationTests/Process/POSIXSpawnSignalPolicyTests.swift
  • Packages/macOS/CmuxGit/Sources/CmuxGit/Changes/WorkspaceChangesGitProcess.swift
  • Packages/macOS/CmuxSimulator/Sources/CmuxSimulator/WorkerProtocol/SimulatorPOSIXProcessLauncher.swift
  • Packages/macOS/CmuxSimulator/Tests/CmuxSimulatorTests/SimulatorPOSIXProcessLauncherSignalStateTests.swift
  • Packages/macOS/CmuxSudoBroker/Package.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SudoPOSIXProcessSpawner.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SudoPrivilegedProcessSupervisor.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SudoRunnerLauncher.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SystemSudoAppLauncher.swift
  • Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/SystemSudoTouchIDSetupLauncher.swift
  • Sources/AgentForkCommandOutputRunner.swift
  • Sources/App/RosettaNativeRelaunch.swift
  • Sources/AutomationProcessSession.swift
  • Sources/NotificationSoundSettings+CustomSoundStaging.swift
  • Sources/TerminalCustomUploadRunner.swift
  • Sources/TerminalNotificationPolicy.swift
  • cmuxTests/CLIExecInheritedSignalStateTests.swift

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 5 remain after this review.


📝 Walkthrough

Walkthrough

The change adds a shared POSIX spawn signal policy that clears child signal masks and resets selected catchable signals to default dispositions. CLI, app, and package launch paths use the policy, with some callers preserving inherited dispositions.

Changes

Spawn signal policy

Layer / File(s) Summary
Define and test the signal policy
Packages/macOS/CmuxFoundation/Sources/CmuxFoundation/Process/POSIXSpawnSignalPolicy.swift, Packages/macOS/CmuxFoundation/Tests/CmuxFoundationTests/Process/POSIXSpawnSignalPolicyTests.swift
POSIXSpawnSignalPolicy clears the child signal mask and defaults selected catchable signals. Callers can preserve specified inherited dispositions. Tests cover signal inheritance, preserved spawn flags, and defaulted signals.
Apply policy in CLI and restore launch
CLI/CMUXCLI+RestorePreflight.swift, CLI/CodexTeamsAppServerProcess.swift, CLI/OwnedProcessSupervisor.swift, Packages/macOS/CMUXAgentLaunch/Package.swift, Packages/macOS/CMUXAgentLaunch/Sources/CMUXAgentLaunch/AgentRestoreLaunchLease.swift
CLI spawn paths use the shared policy instead of local signal setup. The restore watcher applies it before spawning, and CMUXAgentLaunch adds the CmuxFoundation dependency.
Apply policy in app and package launchers
Packages/macOS/CmuxGit/..., Packages/macOS/CmuxSimulator/..., Sources/AgentForkCommandOutputRunner.swift, Sources/App/RosettaNativeRelaunch.swift, Sources/AutomationProcessSession.swift, Sources/NotificationSoundSettings+CustomSoundStaging.swift, cmuxTests/CLIExecInheritedSignalStateTests.swift
Git, simulator, and app launch paths apply the policy. Simulator tests check the spawned process’s signal state, and a repository test recognizes the policy as spawn signal configuration.
Apply policy in sudo process launchers
Packages/macOS/CmuxSudoBroker/Package.swift, Packages/macOS/CmuxSudoBroker/Sources/CmuxSudoBroker/*
CmuxSudoBroker adds the CmuxFoundation dependency. Its spawn paths apply the policy and route setup failures through their existing error handling.
Preserve selected SIGPIPE dispositions
Sources/TerminalCustomUploadRunner.swift, Sources/TerminalNotificationPolicy.swift
Terminal upload and notification launches preserve inherited SIGPIPE dispositions. Notification hook spawning no longer explicitly clears the inherited signal mask.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant SimulatorPOSIXProcessLauncher
  participant POSIXSpawnSignalPolicy
  participant posix_spawn
  participant PerlProbe
  SimulatorPOSIXProcessLauncher->>POSIXSpawnSignalPolicy: apply(to: attributes)
  SimulatorPOSIXProcessLauncher->>posix_spawn: launch with configured attributes
  posix_spawn->>PerlProbe: start process with signal policy
Loading

Suggested reviewers: austinywang

Merge Risk: ⚪ Minimal · up to ca6d0

Spawned processes receive clean signal state while upload and notification commands retain their intended SIGPIPE behavior. No actionable issue remains; merge after normal checks.

Security Architecture Review

Security architecture risk: 🔵 Low · up to ca6d0

The shared policy makes child signal handling predictable while preserving inspected process-isolation controls. No introduced privilege expansion was established. Risk remains low rather than minimal because interruption behavior in authentication setup and some downstream launch paths was not fully verified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The effective scope is local process execution across application and CLI launchers, including privileged script execution and sudo-mediated authentication setup. Descendants can inherit the new signal state unless they replace it. The inspected changes do not establish new remote, tenant or cross-service reachability.

Trust Boundaries and Controls

  • inferred — The inspected policy does not add executable selection, credentials, environment entries or descriptor authority. Existing launch paths still determine command execution and privilege transitions; the new operation changes the child's response to signals without introducing an authorization bypass in those inspected paths.

Resilience and Maintainability Implications

  • inferred — The privileged supervisor retains early-exit cleanup, generation-aware process identity, descendant termination and recovery inventory. Default signal dispositions make cooperative termination available without replacing force-kill containment. Arbitrary detached descendants remain outside the primary process-group boundary; that limitation predates this policy change.

Hardening Proposals

  • proposed — Exercise externally delivered SIGTERM and SIGPIPE during privileged suspended-start and resume transitions, asserting that identity capture failures, early exits and watcher attachment failures cannot strand privileged descendants.
🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 24.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 25 functions across 23 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the primary change: spawned children now start with a clean signal state.
Description check ✅ Passed The description includes a detailed Summary, Testing section, Changelog entry, affected spawn sites, design rationale, and reported validation. It omits the template checklist and demo section, but th…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Cloud Persistent Session And Early Input ✅ Passed PASS: The authoritative PR diff changes POSIX spawn signal handling, package dependencies, and related tests across 23 files. It does not change Cloud terminal creation, persistent cmux-tui transport,…
Cmux Swift Actor Isolation ✅ Passed The production diff adds POSIXSpawnSignalPolicy as an immutable Sendable value type and adds signal-policy calls at existing spawn sites. It does not add implicit MainActor models or service proto…
Cmux Swift Blocking Runtime ✅ Passed The production diff adds POSIX signal-attribute configuration only. It introduces no semaphore, blocking wait, sleep, delayed dispatch, polling, main-queue sync, or manual lock. The only blocking oper…
Cmux Browser Automation Off-Main ✅ Passed The pull request changes POSIX spawn signal handling and related tests only. The authoritative diff does not modify Sources/TerminalController.swift or `Packages/macOS/CmuxControlSocket/Sources/Cmux…
Cmux Expensive Synchronous Load ✅ Passed The pull-request diff changes POSIX spawn signal configuration and related package dependencies/tests only. It does not add or move RestorableAgentSessionIndex.load(), agent-history stores, transcri…
Cmux Cache Substitution Correctness ✅ Passed The PR changes POSIX spawn signal attributes and adds signal-state tests. The production diff does not replace an authoritative persistence, history, undo, or snapshot read with a cached or opportunis…
Cmux No Hacky Sleeps ✅ Passed PASS: The authoritative diff contains 23 .swift files only. It introduces no TypeScript, JavaScript, shell, or build/runtime sleep, timer, polling, or wall-clock wait changes. The two `Package.swift…
Cmux Algorithmic Complexity ✅ Passed PASS. The only new production iteration is in POSIXSpawnSignalPolicy: it filters the fixed signal range 1..<NSIG and then loops over that same bounded signal list to build a sigset_t. The code h…
Cmux Swift Concurrency ✅ Passed PASS. The review-scoped diff adds POSIX spawn signal-policy setup, package dependencies, and synchronous signal-state tests. It adds no background Dispatch queue or DispatchGroup, Combine state, compl…
Cmux Swift @Concurrent ✅ Passed PASS. The authoritative Swift diff adds only synchronous POSIX signal-policy code and synchronous call-site changes. It introduces no async, nonisolated async, @concurrent, @MainActor, or acto…
Cmux Swift Package Boundaries ✅ Passed PASS: The reusable signal-state logic is introduced in the small CmuxFoundation SwiftPM target as public POSIXSpawnSignalPolicy, with package tests. Changes under the app Sources/ and CLI/ tar…
Cmux Swiftpm Lockfiles ✅ Passed PASS: The only SwiftPM manifest changes add the local path dependency ../CmuxFoundation to CMUXAgentLaunch and CmuxSudoBroker. CmuxFoundation has no external package dependencies, so no extern…
Cmux Swift Logging ✅ Passed The diff adds no prohibited production logging. The only added print calls and FileHandle output reads are in test probe harnesses, which the rule allows. The Rosetta relaunch diagnostic uses the …
Cmux User-Facing Error Privacy ✅ Passed The production diff changes POSIX spawn signal attributes and adds no new user-facing error text, alerts, API bodies, or command output containing prohibited details. CLI restore failures retain gener…
Cmux Full Internationalization ✅ Passed The PR adds signal-policy code and tests only. Added Swift string literals are test probes, test names, comments, internal POSIX operation labels, or a debug-only logger message. The changed notificat…
Cmux Swiftui State Layout ✅ Passed PASS: The review-scoped diff contains no SwiftUI imports, views, ObservableObject/@Published/@observable state, GeometryReader, lazy/list row stores, or render-time state mutations. The changes are li…
Cmux Architecture Rethink ✅ Passed PASS. The diff adds one shared POSIXSpawnSignalPolicy platform bridge with a clear invariant: spawned children start with an empty signal mask and defined dispositions. Production call sites apply t…
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS — The PR changes process spawning, package dependencies, and signal-state tests only. The authoritative diff adds no NSWindow, NSPanel, NSWindowController, SwiftUI Window/WindowGroup, window iden…
Cmux Source Artifacts ✅ Passed All 23 changed paths are intentional Swift source, package configuration, or test files under expected source and test directories. The diff adds no binary files, logs, screenshots, recordings, tempor…
Cmux No Test Or Debug Seam In Production Source ✅ Passed The production Sources diff adds and applies POSIXSpawnSignalPolicy for real child-process behavior. It adds no #if DEBUG or test-build guard, test/debug-named member, test accessor, or visibili…
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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.

Revert the extension of the source scan to Sources/ and Packages/. The CLI
check now accepts POSIXSpawnSignalPolicy, because the three CLI spawn sites
use it instead of setting the mask by hand.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

CI failure attribution

CI failed on 9f51506265 (run 36735778051 attempt 1): 2 code.

Job Verdict Why
macos / swift-package-tests code a compile error
macos / app-host unit tests (changed suites) code a test failed
Matched log lines
macos / swift-package-tests: /Users/cmux/actions-runner-glaeda-1/_work/cmux/cmux/Packages/macOS/CmuxFoundation/Sources/CmuxFoundation/CmuxFontMagnificationEnvironmentModifier.swift:1:8: error: public import of 'SwiftUI' was not used in public declarations or inlinable code
macos / app-host unit tests (changed suites): ✘ Test "An existing Cloud workspace row admits one local workspace before attach and reuses it on repeat" recorded an issue at CloudWorkspaceCreationSidebarTests.swift:18:6: Time limit was exceeded: 300.000 seconds

Not re-run automatically: macos / swift-package-tests, macos / app-host unit tests (changed suites) are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's.

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Dogfood tours of 9f515062

browser-notifications-tour at 9f515062, on its merge 7d721de5 that CI built: passed (run)

browser-notifications-tour at 9f515062

Key frames of browser-notifications-tour at 9f51506 04-browser-split 12-omnibar-suggestions 20-notifications-menu 27-end

Tours are picked by the paths globs in dogfood/scenarios/*.json; a Dogfood-tours: a, b line in the description picks them instead (none turns this off). Look at every frame before merging: a green tour only means no step failed.

Catch-up merge by scripts/ci/catch_up_pr.py (RFC #14631).
Merged by scripts/merge-main.sh: origin/main at f627d1f, the newest commit with green CI fast guards (1 newer skipped).

Catch-up-previous-head: ca6d097
Catch-up-base: f627d1f

This branch has not been deployed

No deployments
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