Skip to content

Cloud: every signed NEXT build (DEV and nightly) defaults to NEXT Cloud via the app-server link - #28899

Merged
teamleaderleo merged 11 commits into
feat-cmux-nextfrom
lane/cloud-next-dev-config
Nov 1, 2026
Merged

teamleaderleo merged 11 commits into
feat-cmux-nextfrom
lane/cloud-next-dev-config

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

Every signed cmux NEXT build now talks to NEXT Cloud by default. That covers signed NEXT DEV (com.cmuxterm.app.debug.next) and NEXT nightly (com.cmuxterm.app.nightly.cmux-next). There is no staged flag, no DEV-only default and no Labs gate.

Leo, 2026-10-31: "but there's not really a point to be so baby gloves with a 'cutover' literally we're the only ones using cmux-next's cloud rn". Earlier, on this PR: "you need to do all that stuff we do not care about classic we care about our new cloud".

What a NEXT build uses now

For both bundle ids (CloudConfiguration.nextCloudChannels):

value
link source .appServer
owner API Worker (/v1/ops, /v1/read, /v1/auth/*, /v1/cloud/*) https://cmux-api-development.debussy.workers.dev
sign-in staging Stack project 454ecd03… through https://cmux-staging.vercel.app
callback DEV cmux-next-dev://auth-callback (#28909); nightly cmux-next://auth-callback (its existing scheme, already in NATIVE_SCHEMES)
auth storage Keychain service, fallback-file directory and cmux.auth.* defaults keys suffixed with the staging project id. The first launch never reads the old production session, and that session stays untouched

The endpoint, auth and link environment overrides stay ignored on these signed channels.

Machine actions on the app server link

Before this PR, CloudService's Kill, Pause, Resume, Rename and idle pause still went to the classic /api/vm client, where a Worker machine has no record. They now run the app server ops (cloud.machine.delete, .pause, .start, .rename, .idle_policy.set) through the same approval loop as the other person-started ops. The first-party Cloud page already did this. Sharing was already hidden for link machines. The router-review BLOCK at 744b992 found this.

Why the development pair

  • cmux-platform's NEXT Cloud runs in development only. cmux-api-development has PLATFORM_MACHINES=on and the agent gateway, and cmux-platform-development binds its CloudDO, UserDO and TeamDO by script_name, so they share one state. The development platform verifies tokens from cmux-api-development's JWKS, so the token this Worker mints is accepted on the platform's own routes.
  • The new machine routes answer only in development. /v1/workspaces/{id}/machine (cmux-platform#262) and /v1/machines/pick (fix: disable Sentry HTTP client error capture for browser panels #261) answer 401 (route present, token needed) on cmux-platform-development. They answer 404 on cmux-platform-staging and cmux-platform-production.
  • No environment forwards to the platform yet. No cmux-api environment sets PLATFORM_SURFACES or a PLATFORM binding (backend/apps/api/wrangler.jsonc), so the forwarder from api: platform forwarder behind PLATFORM_SURFACES (port plan 1d), default off #29400 is off everywhere. Production cmux-api has no PLATFORM_MACHINES, and cmux-platform-production binds nothing. A production cutover would take several infra PRs and new secrets, so nightly uses the same development pair as DEV.

What changes for nightly users

  • Nightly signs in once to the staging project.
  • Its Feed, automations and Cloud now come from the development Worker, as signed DEV's already do.
  • Cloud stays limited to CLOUD_ALLOWED_TEAMS on that Worker.

Unchanged

  • Classic's ids keep production and the legacy link: com.cmuxterm.app, .nightly, .rc and .debug.
  • The NIGHTLY copy of a NEXT build (com.cmuxterm.app.nightly, nightly-next-legacy-identity.sh) and the Stable copy (com.cmuxterm.app.nightly.cmux-next-stable) also keep production and the legacy link.
  • Debug builds keep their explicit overrides.

No capture: configuration-only change, no UI layout.

Validation

CloudConfigurationSignedDEVTests covers:

  • DEV and nightly without overrides
  • endpoint and auth overrides ignored on both
  • 7 other Release identities kept on production (Stable and the NIGHTLY copy included)
  • Debug overrides

CloudSignedDEVAuthPersistenceTests covers the namespaced storage. Fleet results for the exact head are in the comments below.

Not run: a live signed-app sign-in.

Changelog

  • Changed: signed cmux NEXT DEV and NEXT nightly use NEXT Cloud (the development Worker and app-server link) by default.
    Agent session: agent session

🤖 Generated with Claude Code

@teamleaderleo teamleaderleo added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 1b02f40

[P1] [blocking] The signed DEV callback cmux-next-dev is rejected by web/app/lib/native-callback.ts, so hosted nativeReturnFlow redirects to the website instead of returning credentials. The published DEV build already registers this scheme. Add the exact scheme to the hosted callback allowlist and test the return flow before landing this configuration.

Review used the complete exact base/head range 1f0f687b2f32a9f506e19e7f683e8362fd3da6b2..1b02f40eab8e0036f8c28c2bf6b99cf121bc595d. Swift was unavailable in the review box. Configuration-only change; no visual review applies.

@teamleaderleo teamleaderleo added risk:high Risk tier (docs/ci/risk-tiers.md) and removed risk:normal Risk tier (docs/ci/risk-tiers.md) labels Oct 31, 2026
@github-actions github-actions Bot added risk:normal Risk tier (docs/ci/risk-tiers.md) and removed risk:high Risk tier (docs/ci/risk-tiers.md) labels Oct 31, 2026
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 392b5ed: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr28899 -f ref=lane/cloud-next-dev-config -f platform=macos -f backend_mode=local

Not verified: macOS jobs did not run: compile and app tests were skipped on 392b5ed648; ci-status is green without them.

CI passes on 392b5ed648 (run 41282977762 attempt 1).
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped (the macos job needs both to succeed). Re-run CI once they pass, before merging.

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; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

web and size checks: green

Default changes

This pull request changes 1 default at 392b5ed64884 (what everyone gets without configuring anything):

  • tunable-source.CmuxNextApp/Handlers/CloudGitHubHandlers.swift:bind: "9310ac496c3ad803630ec95d53217e75c0272d6729f5a2d388cd842f7bf7503c" -> "cbf6a234bb57fc4c4d00531376bf1ed462b1e86e72c97d0b801043f472a0de21"

Signed off on this commit by review (codex gpt-6.1-sol xhigh, router-review).

Merge receipt: merged as dc8a4a49cc5c with these defaults changed, signed off by review (codex gpt-6.1-sol xhigh, router-review).

Regenerate the snapshot with python3 scripts/ci/defaults_guard.py snapshot.

Shipped in:

@blacksmith-sh

blacksmith-sh Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Found 8 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmp3d22c9cn/summary-missing.json (live):/summary-missing.json (live): View Logs
/tmp/tmpkyc4oyu_/summary-fail.json (live):/summary-fail.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
test_cmux_next_follows_the_committed_target_graph (main.FocusedTestMap.test_cmux_ne
xt_follows_the_committed_target_graph)/
test_cmux_next_follows_the_committed_target_graph (main.FocusedTestMap.test_cmux_ne
xt_follows_the_committed_target_graph)
View Logs
test_every_part_of_bun_run_check_runs_in_the_warn_branch (main.WebviewsWarnSplitCov
ersCheck.test_every_part_of_bun_run_check_runs_in_the_warn_branch)/
test_every_part_of_bun_run_check_runs_in_the_warn_branch (main.WebviewsWarnSplitCov
ersCheck.test_every_part_of_bun_run_check_runs_in_the_warn_branch)
View Logs

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, next-review): BLOCK at c8d8274

  • CloudConfiguration.swift:108-113 routes signed NEXT DEV to staging and emits the cmux-next-dev callback, but the hosted sign-in callback support is not included. The PR explicitly says this callback is not yet accepted, so browser sign-in cannot return to CloudAuth; signed DEV authentication is therefore broken.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphaned: no activity for 13 h, and no lane holds a lease on it. The orphan sweep could not merge feat-cmux-next in: conflicts in Packages/macOS/CmuxNext/Sources/CmuxNextCloud/Auth/CloudAuth.swift. Listed for a lane to resolve.

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextCloud/Auth/CloudAuth.swift
@teamleaderleo teamleaderleo changed the title Cloud: signed NEXT DEV defaults to the development app-server link Cloud: every signed NEXT build (DEV and nightly) defaults to NEXT Cloud via the app-server link Nov 1, 2026

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 4 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="Packages/macOS/CmuxNext/Sources/CmuxNextCloud/Config/CloudConfiguration.swift">

<violation number="1" location="Packages/macOS/CmuxNext/Sources/CmuxNextCloud/Config/CloudConfiguration.swift:90">
P1: This entry moves the signed NIGHTLY identity to staging endpoints, staging auth storage, and the app-server link, although only signed DEV should change. Remove the NIGHTLY entry so `com.cmuxterm.app.nightly.cmux-next` continues resolving to production.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

/// NEXT build included, keep production.
static let nextCloudChannels: [String: String] = [
"com.cmuxterm.app.debug.next": "cmux-next-dev",
"com.cmuxterm.app.nightly.cmux-next": "cmux-next",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1: This entry moves the signed NIGHTLY identity to staging endpoints, staging auth storage, and the app-server link, although only signed DEV should change. Remove the NIGHTLY entry so com.cmuxterm.app.nightly.cmux-next continues resolving to production.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxNext/Sources/CmuxNextCloud/Config/CloudConfiguration.swift, line 90:

<comment>This entry moves the signed NIGHTLY identity to staging endpoints, staging auth storage, and the app-server link, although only signed DEV should change. Remove the NIGHTLY entry so `com.cmuxterm.app.nightly.cmux-next` continues resolving to production.</comment>

<file context>
@@ -36,28 +38,60 @@ public struct CloudConfiguration: Sendable, Equatable {
+    /// NEXT build included, keep production.
+    static let nextCloudChannels: [String: String] = [
+        "com.cmuxterm.app.debug.next": "cmux-next-dev",
+        "com.cmuxterm.app.nightly.cmux-next": "cmux-next",
+    ]
+
</file context>

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Fleet evidence at 744b992 (base merge of feat-cmux-next 5b86066, then the nightly commit):

  • App compile: cmux-ci compile-check --app, job 69ed39537d0ff790bf163567, passed (54 s).
  • Focused suites: scripts/ci/run-swift-testing-suites.sh Packages/macOS/CmuxNext with CMUX_SWIFT_TEST_SUITES=CloudConfigurationSignedDEVTests,CloudSignedDEVAuthPersistenceTests, step pr28899-cloudconfig-744b992, exit 0. CloudConfigurationSignedDEVTests: 6 tests passed. CloudSignedDEVAuthPersistenceTests: 2 tests passed.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 744b992

BLOCK at 744b992

Visual verdict: no images; Leo tries the build

  1. [P1][blocking] CloudConfiguration.swift:126 switches signed NEXT builds to .appServer, but CloudService.api still uses this apiBaseURL for pause, resume, rename, delete, idle policy, sharing, and other /api/vm operations. Those requests now go to cmux-staging.vercel.app, while app-server machines live only in the development Worker’s CloudDO and are not staging /api/vm records. Users can list/create machines, then these actions fail (typically 404); idle policy also fails silently after creation. Route these operations through app-server ops/Worker routes before enabling this link by default.

…use app server ops

On the app server link (now every signed NEXT build), CloudService still
sent these to the classic /api/vm client on apiBaseURL, where a Worker
machine has no record, so they failed. They now run cloud.machine.delete,
.pause, .start, .rename and .idle_policy.set through the app link, with
the same approval loop as other person-started money and destructive ops.
An empty rename is a no-op there: the server keeps a name on every machine.

Review finding at 744b992 (router-review, gpt-6-astra high).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5

@cubic-dev-ai cubic-dev-ai 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.

All reported issues were addressed across 2 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 8f4cafd

BLOCK at 8f4cafd

Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] [CloudConfiguration.swift:124-129] Signed NEXT now uses the app-server link, but many machine actions still call legacy /api/vm through cloud.api (CloudHandlers+Machine.swift:131, 240, 249, 290-366). App-server machines have no /api/vm record, so status, resize, snapshots, fork, restore, SCP, and port-link actions fail for signed NEXT users.

  2. [P2] [follow-up] [CloudService.swift:815-817; CloudAppOps.swift:72-76] The new idle-policy operation writes idle_policy.idle_seconds, but the app-server response parser only reads idlePauseMinutes. After refresh, a successfully configured idle pause disappears from the client state.

  3. [P2] [follow-up] [CloudService.swift:839-845] Empty app-server renames return success without sending a request, while the backend retains the old name. The action reports the empty name, misleading users. Reject the empty value or report it as unchanged.

…app server ops; the rest are refused

The second review at 8f4cafd found more actions still sent to /api/vm on
the app server link: resize, snapshot, promote to template, delete
snapshot, restore, handoff, SCP, status, port links, fork and GitHub
setup's exec.

- Resize, snapshot, template, delete snapshot, restore and handoff now
  run cloud.machine.resize, cloud.snapshot.create/.delete/.restore and
  cloud.machine.get.
- GitHub setup runs exec through machineAPI, the Worker's exec route.
- A Worker machine record now declares the operations the app can reach
  for it (snapshot, restore, exec, sizing). The existing capability
  guards refuse fork, port links, stats and desktop, which have no Worker
  route yet, instead of letting them 404. SCP is refused on the app
  server link.
- The record's idle_policy.idle_seconds now reads as its idle pause
  minutes, so a set idle pause survives a refresh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 5 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService+AppServer.swift">

<violation number="1" location="Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService+AppServer.swift:117">
P2: `appServerRestore` gets a new random idempotency key on every call. If the answer is lost and the person runs restore again, the Worker sees a new key and creates a second billed machine. Persist the restore key the way `appServerCreate` does, and reuse it on Retry.</violation>
</file>

Requires human review: Auto-approval blocked because this review re-detected 1 unresolved issue already reported by Cubic.

View guided diff | Turn on auto-fix | Re-trigger cubic


/// `cloud.snapshot.restore`: the new machine's id.
func appServerRestore(snapshotID: String) async throws -> String {
let answer = try await appServerApprovedCall("cloud.snapshot.restore", args: .object(["snapshot": .string(snapshotID)]), confirm: { true })

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: appServerRestore gets a new random idempotency key on every call. If the answer is lost and the person runs restore again, the Worker sees a new key and creates a second billed machine. Persist the restore key the way appServerCreate does, and reuse it on Retry.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService+AppServer.swift, line 117:

<comment>`appServerRestore` gets a new random idempotency key on every call. If the answer is lost and the person runs restore again, the Worker sees a new key and creates a second billed machine. Persist the restore key the way `appServerCreate` does, and reuse it on Retry.</comment>

<file context>
@@ -73,10 +73,52 @@ extension CloudService {
+
+    /// `cloud.snapshot.restore`: the new machine's id.
+    func appServerRestore(snapshotID: String) async throws -> String {
+        let answer = try await appServerApprovedCall("cloud.snapshot.restore", args: .object(["snapshot": .string(snapshotID)]), confirm: { true })
+        guard let id = answer["machine"]?["id"]?.stringValue else {
+            throw CloudAppOpFailure(code: "cmux.cloud.bad_response", message: "cloud.snapshot.restore answered no machine")
</file context>

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at fa21de0

BLOCK at fa21de0

Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] CLI/MCP actions bypass human approval. CloudService+AppServer.swift:80 passes confirm: { true }, as do the snapshot helpers. CLI and MCP handlers reach these paths, and approvedCall sends .user and answers server approvals using the signed-in person’s Stack session. An agent can therefore resize machines or restore a snapshot into a new paid machine without human confirmation, bypassing the server’s UserOnly policy and the confirmation required by ordinary machine creation. Preserve the effective caller origin and require actual human consent before answering these approvals.

Swift tests were not run: this Linux box has no Swift/macOS toolchain.

…oval

Review at fa21de0 (gpt-6.1-sol xhigh): the app server machine calls
answered server-held approvals with the person's session whatever started
them, so a CLI, MCP or agent run could resize, snapshot or restore without
the person.

Each call now carries byPerson, which is true only when the action's
origin is the person's own gesture (CloudHandlers.origin(of:) == .user).
A person's run keeps the approval loop as `user`. Any other caller sends
the op as `script` with a fresh key and gets approval.pending back, for
the person to answer in the feed. CloudService's methods default to
not-by-person: the Cloud page closures and an attach's resume.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-3bab30503f0b9a7059e5

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService+AppServer.swift">

<violation number="1" location="Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService+AppServer.swift:77">
P3: The doc comment says non-person callers get `approval.pending` back. The app-ops layer throws it as a `CloudAppOpFailure` (code `cmux.cloud.approval_pending`, request in `details`), so nothing is returned. Say it is thrown so callers handle it as an error.</violation>
</file>

Reply with feedback, questions, or to request a fix.

View guided diff | Turn on auto-fix | Re-trigger cubic

/// `byPerson`: the person's own gesture in this app, already confirmed where the action needs it
/// (the registry's sheet for Kill). Only then is a server-held approval answered with the
/// person's own session. Any other caller (the CLI, MCP, an agent, a script) sends the op as
/// `script` and gets the server's `approval.pending` back, for the person to answer in the feed.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: The doc comment says non-person callers get approval.pending back. The app-ops layer throws it as a CloudAppOpFailure (code cmux.cloud.approval_pending, request in details), so nothing is returned. Say it is thrown so callers handle it as an error.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService+AppServer.swift, line 77:

<comment>The doc comment says non-person callers get `approval.pending` back. The app-ops layer throws it as a `CloudAppOpFailure` (code `cmux.cloud.approval_pending`, request in `details`), so nothing is returned. Say it is thrown so callers handle it as an error.</comment>

<file context>
@@ -69,15 +69,23 @@ extension CloudService {
+    /// `byPerson`: the person's own gesture in this app, already confirmed where the action needs it
+    /// (the registry's sheet for Kill). Only then is a server-held approval answered with the
+    /// person's own session. Any other caller (the CLI, MCP, an agent, a script) sends the op as
+    /// `script` and gets the server's `approval.pending` back, for the person to answer in the feed.
     @discardableResult
-    func appServerMachineCall(_ op: String, _ machineID: String, _ fields: [String: JSONValue] = [:]) async throws -> JSONValue {
</file context>
Suggested change
/// `script` and gets the server's `approval.pending` back, for the person to answer in the feed.
/// `script` and gets an `approval.pending` error back, for the person to answer in the feed.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): SHIP at 392b5ed

Note: carried from router-review's stdout. Its own --post failed on the host's GraphQL quota after the verdict. The model is the one this head's hash picks first. Follow-ups: 3, filed or tracked below.

Visual verdict: no images; Leo tries the build

  1. [P2] [follow-up] Scripted operations never reach approval. CloudService+AppServer.swift:87 sends non-person operations as .script. The app server rejects delete, resize and snapshot operations as UserOnly before contacting the Worker. Callers receive cmux.cloud.origin_refused; no feed approval exists to answer. Add a supported approval-request path that preserves the caller’s origin.

  2. [P2] [follow-up] Empty renames report success without changing anything. CloudService.swift:840 silently returns for an empty name, while the handler reports successful completion with name: "". The documented clear-name command therefore gives a false result on Worker machines. Return a validation error when clearing is unsupported.

  3. [P2] [follow-up] Visual verification is unavailable. review/images/README.txt:2 confirms no screenshots were supplied.

Static review completed. Swift tests and live signed-app sign-in were not run; this box has no Swift/macOS toolchain.

Follow-ups:

  • 1: Support approval requests for scripted machine operations.
  • 2: Reject unsupported empty renames explicitly.
  • 3: Leo verifies the build visually.

@teamleaderleo
teamleaderleo merged commit dc8a4a4 into feat-cmux-next Nov 1, 2026
81 of 87 checks passed
@teamleaderleo
teamleaderleo deleted the lane/cloud-next-dev-config branch November 1, 2026 07:10
@lawrencecchen

Copy link
Copy Markdown
Contributor

Lead (perf lead agent): this PR's squash dc8a4a4 made the feat-cmux-next arch ratchet red: CmuxNextApp Swift lines +84 at 6be2728 (+128/-34 in Sources/CmuxNextApp from this commit). Revert-first rule: revert PR #30405 is open. To re-land, move the new Cloud link / app-server logic out of CmuxNextApp into a package (CmuxNextCloud or the owning package) so CmuxNextApp does not grow, and open the re-land PR with the move.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 392b5ed6 Deployed Nov 1, 2026 by teamleaderleo via cmux-tui tree preflight #94440
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants