Skip to content

Let Computer Use toggles save past unrelated cmux.json issues - #14183

Merged
teamleaderleo merged 2 commits into
mainfrom
fix-13254-followup-validate-new-issues
Sep 24, 2026
Merged

teamleaderleo merged 2 commits into
mainfrom
fix-13254-followup-validate-new-issues

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

Follow-up to #13254. The Computer Use toggles in Settings refused to save whenever cmux.json already had an unrelated issue, such as a key written by a newer cmux build or an invalid value on another path, because the validated write checked the whole file. Now a validated write is refused only for issues the change itself adds.

JSONConfigStore.setWithReceipt, resetWithReceipt, and undo validate the candidate. If it has issues, they also validate the file on disk and refuse only the candidate's issues the file didn't already have. An issue is identified by its path and message. The validator builds messages from the schema constraint, not the config value, so the pair is stable. A valid candidate still costs one validation. A no-op write can't add an issue, so it's no longer validated.

The cmux-settings helper validated the whole file before #13254 too. I moved it to the same rule so the helper and the app agree on what blocks a write. The extra cmux config validate run happens only when the candidate already fails. If a validator run fails without reporting per-path issues (an older CLI, a crash), the write is still refused outright, because there's nothing to compare. Three more helper fixes from the #13254 review:

  • A refused write is now a structured {"status": "conflict", "code": "invalid_config", ..., "issues": [{"path", "message"}]} on stderr instead of free-text error: lines. cmux-settings validate keeps its human-readable output.
  • An existing --receipt file now returns a receipt_exists conflict before anything is written, instead of an uncaught FileExistsError traceback. The new receiptExists message is in all 9 locales. A receipt path that can't be created (missing parent, permissions) returns receipt_unwritable with the existing receiptInvalid message.
  • The helper's undoConflict message ended in "…before changing it:" with nothing after the colon. It's now a complete sentence in all 9 locales. The key is still returned in its own field. The app's Swift string is unchanged because the app appends the path after the colon.

Verification

  • test(settings) (614c1df) adds the regressions first. On that commit, all 4 new helper tests fail for the expected reasons: the unrelated issue refuses the write, the write prints error: text instead of JSON, the conflict for an existing receipt isn't structured, and en.undoConflict ends in a colon. The fix commit adds tests for a validator that fails without per-path issues and for a receipt path that can't be created. At HEAD, tests/test_cmux_settings_transactions.py (22), test_cmux_settings_jsonc.py (20), and test_cmux_settings_supported_paths.py (7) pass. The new helper tests run the real validation path against a fake cmux config validate.
  • Swift: JSONValueModelTransactionTests now asserts that a toggle writes past an unknown key plus an invalid app.appearance, and that a write adding an issue is refused with only that issue. The test that asserted the old refusal is gone. JSONConfigTransactionTests.validatedMutationRefusesOnlyIssuesItIntroduces covers the store directly. These haven't run locally: CmuxSettings doesn't build on Linux because of SwiftUI, Darwin, and String(localized:bundle:). Instead, I compiled the real validator sources, the embedded schema, and the new issuesIntroduced(by:over:) file on Linux (Swift 6.1.3) with a localization shim, and ran them against the real schema. For a baseline with an unknown key and an invalid appearance, the toggle added no issues. A mistyped notifications.dockBadge added only $.notifications.dockBadge: expected boolean, got string. The package tests run in CI.
  • Known limit: new issues are matched by path and message. Changing an already-invalid value to another value that breaks the same constraint isn't refused. This is documented in docs/config-transactions.md.
  • python3 scripts/verify-local.py: all checks pass (test-wiring passed with --timeout 1100; it exceeds the default 60 s here). A local sweep of the workflow guard steps found no failures caused by this change. The steps that failed need CI env vars (RUNNER_TEMP, CMUX_TEST_REGISTRY_BASE_SHA) or submodules this worktree doesn't have, or timed out locally.
  • Localization audit: config_mutation_messages.json has the same keys in all 9 locales (en, ja, de, fr, es, ar, zh-Hans, zh-Hant, ko), and a test enforces that no message ends in a colon. Resources/Localizable.xcstrings is unchanged. The xcstrings and localization parity checks pass.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Summary by CodeRabbit

  • Bug Fixes

    • Configuration changes are no longer blocked by unrelated validation issues already present in the file. Changes that introduce new issues are still rejected, and the file remains unchanged.
    • Receipt creation now reports a clear conflict if the receipt already exists, or if its path cannot be created.
  • Documentation

    • Updated configuration transaction guidance to explain validation and receipt behavior.

teamleaderleo and others added 2 commits September 24, 2026 00:38
A Computer Use toggle, or a cmux-settings write, should not be refused
because cmux.json already had an unrelated issue such as a key from a
newer build. It should still be refused when the change itself creates
one. Also covers an existing --receipt file returning a structured
conflict and every helper message reading as a complete sentence.

These fail on main: the whole-file check refuses the unrelated issue,
the receipt collision raises FileExistsError, and undoConflict ends in a
colon with nothing after it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Computer Use toggles validated the whole cmux.json, so an issue the
toggle never touched (a key from a newer build, an invalid value on
another path) blocked it with an alert. The store now validates the
candidate and, only when it has issues, the file on disk, and refuses
the issues the change adds, identified by path and message.

The cmux-settings helper follows the same rule. A validator run that
fails without per-path issues still refuses the write outright. An
invalid_config refusal is now a structured JSON conflict listing the
added issues instead of free-text error lines, a receipt path that
exists or can't be created returns a structured conflict instead of a
traceback, and undoConflict reads as a complete sentence in all nine
locales.

Co-Authored-By: Claude Opus 5.5 <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 24, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

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

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: 9d6859e2-a54f-454f-8f2b-b52a0fa18ce4

📥 Commits

Reviewing files that changed from the base of the PR and between bf13034 and c0c5c8b.

📒 Files selected for processing (11)
  • Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CmuxConfigSemanticValidator+IntroducedIssues.swift
  • Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/JSONConfigMutationError.swift
  • Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/JSONConfigStore.swift
  • Packages/macOS/CmuxSettings/Tests/CmuxSettingsTests/JSONConfigTransactionTests.swift
  • Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Bindings/JSONValueModel.swift
  • Packages/macOS/CmuxSettingsUI/Tests/CmuxSettingsUITests/JSONValueModelTransactionTests.swift
  • docs/config-transactions.md
  • skills/cmux-settings/SKILL.md
  • skills/cmux-settings/scripts/cmux-settings
  • skills/cmux-settings/scripts/config_mutation_messages.json
  • tests/test_cmux_settings_transactions.py

Included review availability: Your plan provides up to 10 included reviews per hour; 1 remains after this review.


📝 Walkthrough

Walkthrough

Native settings writes and the cmux-settings helper now reject only validation issues introduced by a change. The helper also returns distinct conflicts for existing receipt files and receipt paths that cannot be created.

Changes

Config mutation validation

Layer / File(s) Summary
Compare candidate and baseline issues
Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CmuxConfigSemanticValidator+IntroducedIssues.swift, skills/cmux-settings/scripts/cmux-settings
The native validator and helper compare candidate issues with baseline issues by JSON path and message. The helper separates issue parsing from validation execution.
Apply issue comparison to writes
Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/JSONConfigMutationError.swift, Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/JSONConfigStore.swift, Packages/macOS/CmuxSettings/Tests/CmuxSettingsTests/JSONConfigTransactionTests.swift, Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Bindings/JSONValueModel.swift, Packages/macOS/CmuxSettingsUI/Tests/CmuxSettingsUITests/JSONValueModelTransactionTests.swift, skills/cmux-settings/scripts/cmux-settings, tests/test_cmux_settings_transactions.py, docs/config-transactions.md, skills/cmux-settings/SKILL.md
Native store mutations and helper writes use introduced-issue checks. Tests cover writes with unrelated pre-existing issues, newly introduced issues, and validator failures without per-path findings. Documentation describes the validation behavior and its matching limits.
Report receipt creation conflicts
skills/cmux-settings/scripts/cmux-settings, skills/cmux-settings/scripts/config_mutation_messages.json, tests/test_cmux_settings_transactions.py, docs/config-transactions.md, skills/cmux-settings/SKILL.md
The helper reports receipt_exists for an existing receipt and receipt_unwritable when it cannot create the receipt. Tests and localized messages cover these conflicts.

Priority: ➖ Normal

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

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant MutationCaller
  participant JSONConfigStore
  participant CmuxConfigSemanticValidator
  participant GlobalSchema
  participant ConfigFile
  MutationCaller->>JSONConfigStore: Request mutation
  JSONConfigStore->>CmuxConfigSemanticValidator: Compare candidate with baseline
  CmuxConfigSemanticValidator->>GlobalSchema: Validate candidate
  GlobalSchema-->>CmuxConfigSemanticValidator: Candidate issues
  opt Candidate has issues
    CmuxConfigSemanticValidator->>GlobalSchema: Validate baseline
    GlobalSchema-->>CmuxConfigSemanticValidator: Baseline issues
  end
  CmuxConfigSemanticValidator-->>JSONConfigStore: Return introduced issues
  alt No introduced issues
    JSONConfigStore->>ConfigFile: Write candidate
  else Introduced issues exist
    JSONConfigStore-->>MutationCaller: Reject mutation with issues
  end
Loading

Merge Risk: ⚪ Minimal · up to c0c5c

The reported undo and validation behaviors match their documented contracts. The change is mergeable after normal checks.


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (2 errors, 2 warnings)

Check name Status Explanation Resolution
Cmux Algorithmic Complexity ❌ Error Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CmuxConfigSemanticValidator+IntroducedIssues.swift:27 filters every candidate issue and calls existing.contains($0) for each item. This is O… Build a hash-based identity set for baseline issues once, using each issue's path and message, then filter candidate issues with average O(1) set lookups. For example, add a Hashable identity type (or make CmuxConfigSemanticIssue sa…
Cmux User-Facing Error Privacy ❌ Error The production cmux-settings CLI is a concrete end-user path. The new ValidatorFailure flow copies arbitrary cmux config validate stderr/stdout into issues, and mutate_setting emits it in th… Do not forward validator stderr, stdout, or untrusted validator messages to users. Convert validator failures to a fixed, product-level message with safe recovery guidance, and keep raw details in sanitized internal diagnostics only. Apply …
Docstring Coverage ⚠️ Warning Docstring coverage is 14.81% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 27 functions across 7 files. (4 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The description gives a detailed summary, testing results, known limitation, and localization status. It does not include the required Demo Video or screenshots section, the Checklist section, or an e… Add the required Demo Video section with a video or screenshots for this behavior change. Add the Checklist section and mark each applicable item, including test coverage, localization audit, documentation, and review status. Rename Verific…
✅ Passed checks (21 passed)
Check name Status Explanation
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 reviewed range changes CmuxSettings validation, JSON mutation handling, helper scripts, localization messages, documentation, and tests. It does not change Cloud terminal creation, cmux-tui …
Cmux Swift Actor Isolation ✅ Passed PASS. The production Swift diff adds a pure validation helper on the existing nonisolated CmuxConfigSemanticValidator value type. It adds no actor-isolated protocol, shared mutable Sendable refere…
Cmux Swift Blocking Runtime ✅ Passed The Swift production diff adds semantic issue filtering and documentation only. It does not add semaphores, blocking waits, sleeps, delayed dispatch, polling, main-queue sync, or manual locks. The exi…
Cmux Browser Automation Off-Main ✅ Passed PASS: This pull request changes CmuxSettings validation, transaction handling, documentation, and tests only. The authoritative diff contains no browser automation, WebKit, AppKit, socket-worker, or p…
Cmux Expensive Synchronous Load ✅ Passed PASS — The Swift production diff changes canonical cmux.json validation in the JSONConfigStore actor and updates JSONValueModel documentation. The new code compares semantic config issues and does…
Cmux Cache Substitution Correctness ✅ Passed PASS: The production Swift diff does not replace an authoritative read with a cache. JSONConfigStore.mutateRoot still acquires the writer lock and reads document from readDocument(at: writeURL) …
Cmux No Hacky Sleeps ✅ Passed PASS. The authoritative diff adds no fixed sleep, timer, polling loop, delayed dispatch, or wall-clock backoff in covered production code. The Python helper adds synchronous subprocess.run calls to …
Cmux Swift Concurrency ✅ Passed The Swift diff adds only synchronous validation logic, documentation, and XCTest/Testing coverage. The only new async expression is await Task.yield() in tests, which is test synchronization and is …
Cmux Swift @Concurrent ✅ Passed PASS. The Swift diff adds only the synchronous issuesIntroduced(by:over:) helper and changes validation inside the existing JSONConfigStore actor method. No nonisolated async function or `@concu…
Cmux Swift Package Boundaries ✅ Passed PASS. The production Swift behavior change is in the existing CmuxSettings SwiftPM target (Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores), not in the app target's root Sources/ path. T…
Cmux Swiftpm Lockfiles ✅ Passed PASS: The authoritative PR diff changes 11 source, test, documentation, and helper files only. It changes no Package.swift, Package.resolved, .gitignore, workflow, Xcode project, or workspace files, a…
Cmux Swift Logging ✅ Passed PASS: The Swift diff adds no print, debugPrint, dump, NSLog, ad hoc file/stdout logging, or Logger declarations. The only errorLog references are unchanged documentation context, and the a…
Cmux Full Internationalization ✅ Passed The production diff adds no new Swift user-facing copy; the existing Swift errors still use String(localized:defaultValue:), and their catalog entries remain present for all nine supported locales. …
Cmux Swiftui State Layout ✅ Passed PASS. The pull request changes config validation logic, documentation, and transaction tests. It does not add or materially expand SwiftUI state or layout code. The only changed UI source file, `JSONV…
Cmux Architecture Rethink ✅ Passed The changed Swift code is a local semantic-validation correctness fix. It keeps mutation ownership in the existing JSONConfigStore actor and adds issuesIntroduced(by:over:) without sleeps, delayed…
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS: The authoritative diff changes only CmuxSettings validation/store code, JSONValueModel documentation, and test fixtures. It adds or materially changes no NSWindow, NSPanel, NSWindowController, S…
Cmux Source Artifacts ✅ Passed All 11 changed paths are intentional Swift/Python source, tests, documentation, or an existing localization/config message catalog. The review-scoped diff adds only one source file and modifies existi…
Cmux No Test Or Debug Seam In Production Source ✅ Passed The PR adds no test/debug seam in production Swift source. The new issuesIntroduced(by:over:) member is ordinary internal validation logic and has a production caller in JSONConfigStore. The other…
Title check ✅ Passed The title clearly summarizes the main behavior change: Computer Use toggles can save despite unrelated existing cmux.json issues.
Full details: Docstring Coverage

Explanation

Docstring coverage is 14.81% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 27 functions across 7 files. (4 skipped: 4 unsupported.)

Full details: Cmux Algorithmic Complexity

Explanation

Packages/macOS/CmuxSettings/Sources/CmuxSettings/Stores/CmuxConfigSemanticValidator+IntroducedIssues.swift:27 filters every candidate issue and calls existing.contains($0) for each item. This is O(C×B) over candidate and baseline issue collections. Those collections can grow with user-owned config records, including unbounded vault.agents, notifications.hooks, and workspaceGroups.byCwd entries shown in web/data/cmux.schema.json. The PR has no bound or benchmark for this path. The helper implementation avoids this problem with a set, but the production Swift implementation does not.

Resolution

Build a hash-based identity set for baseline issues once, using each issue's path and message, then filter candidate issues with average O(1) set lookups. For example, add a Hashable identity type (or make CmuxConfigSemanticIssue safely Hashable) and use let existing = Set(validate(jsonObject: baseline).map(IssueIdentity.init)), followed by issues.filter { !existing.contains(IssueIdentity($0)) }. Keep the candidate order and path/message matching. Add a regression or benchmark with a large number of invalid user-owned records to verify near-linear behavior.

Full details: Cmux User-Facing Error Privacy

Explanation

The production cmux-settings CLI is a concrete end-user path. The new ValidatorFailure flow copies arbitrary cmux config validate stderr/stdout into issues, and mutate_setting emits it in the user-visible structured conflict on stderr. The added regression test confirms the output contains the raw internal message error: unknown option --scope. This exposes a raw upstream/internal error and an internal CLI flag. The PR materially changes the mutation error body to carry that raw text as issues.

Resolution

Do not forward validator stderr, stdout, or untrusted validator messages to users. Convert validator failures to a fixed, product-level message with safe recovery guidance, and keep raw details in sanitized internal diagnostics only. Apply the same sanitization to report_validation_failure and parsed issue messages before cmux-settings validate, set, unset, or undo expose them.

Full details: Description check

Explanation

The description gives a detailed summary, testing results, known limitation, and localization status. It does not include the required Demo Video or screenshots section, the Checklist section, or an explicit Testing heading.

Resolution

Add the required Demo Video section with a video or screenshots for this behavior change. Add the Checklist section and mark each applicable item, including test coverage, localization audit, documentation, and review status. Rename Verification to Testing or provide the required Testing section explicitly.

  • Fix all pre-merge checks with AI
✨ 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.

@teamleaderleo teamleaderleo left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Independent review of c0c5c8b. No blocking findings; this is ready to merge.

Issue identity. issuesIntroduced(by:over:) (CmuxConfigSemanticValidator+IntroducedIssues.swift:26-27) and the helper's known set (cmux-settings:672) do a set difference on path + message. That is enough because the validator already deduplicates its output, and every message is built from the schema constraint or the value's JSON type, never from the value itself. A new issue can only match an existing one at the same path. So the gap is confined to a subtree that already fails validation, which is the limit docs/config-transactions.md states. One more instance of that limit: an object already over maxProperties (notifications.soundOverrides, 256) reports the same $.notifications.soundOverrides: must contain at most 256 key(s) after each added key, so the write can keep growing it. Adding a key there already requires the file to be invalid, and a toggle write on another path can't make a valid file invalid, so I don't think this needs code, but the docs could name it.

Race. Swift validates the baseline against document.root, the same parse the candidate starts from. That parse happens under JSONConfigWriteLock (JSONConfigStore.swift:424, :498), and publish(..., expected: document.originalData) (:511) refuses the write if another editor changed the file. The helper takes baseline from the same load_settings result inside mutation_lock (cmux-settings:783, :790). The revision is read just before that, and the write checks it (:872). If a non-cooperating editor lands between those two reads, the write is refused. It is never accepted against a stale baseline.

No-op writes. The jsonObjectsEqual early return (JSONConfigStore.swift:461) publishes nothing, so skipping validation there can't change what's on disk. The helper already skipped validation on unchanged writes before this PR.

Output consumers. Only tests/test_cli_config_doctor.py:376 and :396 read the helper's stderr. They check for the substring $.app.appearance, which the JSON issues array still contains, and validate keeps its error: lines. The skills and docs only mention the new shape.

Evidence. The helper tests passed at the PR head in a separate worktree: test_cmux_settings_transactions.py (22), test_cmux_settings_jsonc.py (20), and test_cmux_settings_supported_paths.py (7). In CI, the macos / swift-package-tests log (job 107554355079) shows that validatedMutationRefusesOnlyIssuesItIntroduces() passed in CmuxSettings (401 tests). validatedModelWritesPastUnrelatedPreExistingIssues() and validatedModelRefusesAnIssueItIntroduces() passed in CmuxSettingsUI (184 tests). These are executed tests, not just compiled ones.

Not a regression, but worth knowing: an undo whose receipt replaced an invalid value (neon → dark) is still refused, because restoring neon adds an issue the file doesn't have. The old whole-file check refused this too.

@teamleaderleo
teamleaderleo merged commit ae46aa9 into main Sep 24, 2026
62 of 63 checks passed
rustybret pushed a commit to rustybret/bmux that referenced this pull request Sep 24, 2026
ff6c6dc ci: stop restoring an iOS GhosttyKit cache nothing saves (manaflow-ai#14189)
2827231 ci: seed DerivedData on the 12 vCPU macOS 26 pool (manaflow-ai#14188)
ae46aa9 Let Computer Use toggles save past unrelated cmux.json issues (manaflow-ai#14183)
a785270 test: fail loudly when portal rendering authority denies a fixture's tab id (manaflow-ai#13937)
9a1dea0 test: pin which terminal tabs get an agent mark after manaflow-ai#14062 (manaflow-ai#14177)
91bcb28 test: run the change-area tests in parallel workers (manaflow-ai#14193)
6d203e8 test: await the geometry publish in the equalize-splits shortcut case (manaflow-ai#13916)
48f1adf ci: balance the guard legs the macOS gate waits on (manaflow-ai#14186)
38117cd test: settle the split's reparent-focus suppression before focus feedback (manaflow-ai#14049)
a12a0b8 ci: neutralize Swift sources without a per-character loop (manaflow-ai#14169)
2b6ca4c ci: stop counting queue time on cancelled jobs as runner minutes (manaflow-ai#14187)
2837f22 test: stop gating terminal focus on key status the app host cannot grant (manaflow-ai#13948)
23c0ce2 test: give each detect-step run its own cmux-ci scratch files (manaflow-ai#14185)
a13ea28 ci: skip Mac lanes that bundled scripts and guard-only lints cannot fail (manaflow-ai#14179)
b59f34f ci: restore Swift packages and a compilation cache for iOS uploads (manaflow-ai#14180)
bcca243 profiling: poll child processes every 0.1 s instead of every second (manaflow-ai#14170)
76d6176 refactor: move 45 leaf browser files into CmuxBrowser (manaflow-ai#14092)
bf13034 test: fail the Desktop drop fast instead of restarting the app host (manaflow-ai#14076)
51d486b ci: start guards and web beside Fast static checks (manaflow-ai#14176)

# Conflicts:
#	.github/workflows/ci-guards.yml
#	.github/workflows/ci.yml
#	.github/workflows/ios-appstore-upload.yml
#	.github/workflows/ios-testflight.yml
#	.github/workflows/nightly.yml
#	.github/workflows/seed-derived-data.yml
#	.github/workflows/test-ios.yml
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.

1 participant