Skip to content

feat(cloud): show who made a machine on its sidebar row - #15341

Closed
teamleaderleo wants to merge 10 commits into
manaflow-ai:mainfrom
teamleaderleo:cloud-sidebar-machine-creator
Closed

teamleaderleo wants to merge 10 commits into
manaflow-ai:mainfrom
teamleaderleo:cloud-sidebar-machine-creator

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

Stacked on #15309, which carries the author from /api/vm to MachineSnapshot and stops there. Nothing renders it. This is the part you can see.

The Cloud sidebar's complaint (hq audit item D2): on a team-scoped sidebar you see your teammates' machines as a list of generated three-word names with no way to tell who made any of them. The backend has known the answer the whole time.

What changes

The machine row's second line gains by <name>, beside the facts it already carries:

build box
vm-1 · Base · by Ada Lovelace · 3 hours ago

The default preset is single-line, so most users meet this through the tooltip, which repeats the same line. Whether the compact row should show the author inline without hovering is a taste call and goes to cmux#13742, not here.

Nothing is shown when there is no name to show. A known account with no recorded name gets silence rather than by 7f3a91c2: an opaque account id is one more generated token in the pile this is meant to clear, so it is deliberately not a fallback.

CloudMachineCreatorLabel is its own file for a dull reason worth stating: scripts/localize-changes cannot parse a defaultValue containing a \u{...} escape, and CloudTreeMachineRowContent has several, so a new string added there is invisible to the tool.

Tests

Red and green from the same focused command, recorded below as they land.

Changelog

Added: Cloud sidebar machine rows show who created the machine.

🤖 Generated with Claude Code


Summary by cubic

Makes the Cloud sidebar say who created each machine on its row, so a team fleet stops reading as a pile of generated three-word names.

  • Carries createdBy from /api/vm through VMSummary and MachineSnapshot and renders by <name> on the row's second line and tooltip.
  • Decodes the author on the create and status endpoints too, so cmux vm new --json and cmux vm status --json stay consistent, and re-publishes it in the vm.list socket payload for the CLI and remote clients.
  • A known account with no recorded name shows nothing rather than falling back to an opaque account id.
  • The sidebar spacing lab's fixture now includes a short-id machine so the author actually fits on the row; its preset picker is reachable by a dogfood tour, which now scopes menu clicks to the opened menu and selects presets by type-select.

Written for commit 738f4e4. Summary will update on new commits.

Review in cubic

claude and others added 4 commits September 28, 2026 03:04
A Cloud team's fleet reads as a pile of generated three-word names with no
way to tell whose machine is whose. cmux#15261 made `/api/vm` publish the
author; nothing on the client reads it yet.

These cover the three author shapes the backend can send (a named account,
an account with no recorded name, and no author at all on a control plane
that predates the field) at each place the value has to survive: the list
decode, the create receipt, the status read, the snapshot a row renders
from, and the socket payload.

The create receipt and the status read are here because the review of the
backend change found exactly this bug on that side: a client that appends a
create response to its list, or merges a detail read into a listed row,
drops the author it had and shows a machine as unauthored to the person who
just made it. The same hole exists on this side of the wire.

The `vm.list` socket payload is how the CLI and remote clients see the
fleet. Dropping the author there would leave `cmux` on the command line
unable to answer a question the sidebar beside it can.

The `userId` is kept even when no name is known, so rows by the same person
still group together while they read as unnamed.

Red here is a build failure rather than failing assertions: `VMCreator` does
not exist yet, so the suite cannot compile. Recorded as such rather than
dressed up as a behavioral red.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…napshot

`VMCreator` is the client's view of `/api/vm`'s `createdBy`: an account id
that is always there and a display name that often is not. The id is kept
without a name so rows by the same person still group together instead of
collapsing into one anonymous bucket, and the name never falls back to the
raw id, since an opaque id in place of a name is the same unreadable list
this is meant to fix.

Decoded on all three endpoints that return a machine, not just the list.
The panel appends a create receipt to the list it is showing and replaces a
listed row with a status read, so decoding only the list would make the
machine you just made the one row with no author, and would make any
machine go anonymous the moment something polled it.

A malformed or absent author is dropped rather than failing the decode,
unlike a missing `id` or `provider`. An author is decoration on a row; a
control plane that does not send one must still list.

`socketWorkerVMSummaryPayload` re-publishes it in the response's own shape,
explicit null and all, so a socket client decodes one payload rather than
two. It stops being private so the test can check that the CLI is sent the
same machine facts the sidebar gets.

No display surface yet: this is the plumbing, and the row's tooltip that
will show it is in cmux#15225.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The review of this PR caught three comments asserting things the code
does not do.

The create and status sites claimed the panel appends a create receipt
to the list it is showing and replaces a listed row with a status read.
It does neither: `MachinesPanelViewModel.machines` is only ever assigned
a whole `listPage()` result, and both endpoints have exactly one caller
each, the matching socket method. So a created machine shows its author
on the next list refresh, not immediately, and what these two decodes
really feed is `cmux vm new --json` and `cmux vm status --json`.

The socket payload claimed the backend omits `createdBy` when there is
no author. It does not; it sends an explicit null. The payload's shape
is the narrower of the two, which is fine because both readers treat
absent and null alike, but the comment said they were identical and was
backwards on the one case it named.

Also adds `.serialized` to the new suite, matching the other consumer of
the same process-global stub.

No behavior change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The author now survives every hop from `/api/vm` to `MachineSnapshot` and
the sidebar still does not show it, which is the complaint: on a team the
fleet reads as a list of generated three-word names with no way to tell
whose is whose.

These fail on the row's second line, which already carries the machine's
other identity facts and is what the tooltip repeats. The unnamed-account
case is pinned in the same pass: an account id is not a name, and "by
7f3a91c2" is one more opaque token in the pile this is meant to clear.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 9 minutes.

Check out review usage here.

View limit details

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

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

Learn how review limits work.

Review configuration:

⚙️ Run configuration

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

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 3f9b95bf-150f-429f-873a-fe4bb62bce67

📥 Commits

Reviewing files that changed from the base of the PR and between 0c753fe and 738f4e4.

📒 Files selected for processing (14)
  • Packages/macOS/CmuxCloud/Sources/CmuxCloud/Machines/MachineSnapshot.swift
  • Packages/macOS/CmuxCloud/Sources/CmuxCloud/Machines/MachineSnapshotBuilder.swift
  • Packages/macOS/CmuxCloud/Sources/CmuxCloud/VMClient/VMClient.swift
  • Packages/macOS/CmuxCloud/Sources/CmuxCloud/VMClient/VMCreator.swift
  • Resources/Localizable.xcstrings
  • Sources/Cloud/CloudMachineCreatorLabel.swift
  • Sources/Cloud/CloudSidebarDebugLabWindow.swift
  • Sources/Cloud/CloudTreeMachineRowContent.swift
  • Sources/Cloud/VMClientSocketCommands.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/CloudMachineCreatorTests.swift
  • cmuxTests/CloudRefreshURLProtocol.swift
  • cmuxUITests/DogfoodScenarioUITests.swift
  • dogfood/scenarios/cloud-machine-author-tour.json

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.

@github-actions

Copy link
Copy Markdown
Contributor


Thank you for your submission, we really appreciate it. Like many open-source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution. You can sign the CLA by just posting a Pull Request Comment same as the below format.


I have read the CLA Document v2.2 and I hereby sign the CLA


1 out of 2 committers have signed the CLA.
✅ teamleaderleo
❌ claude
You can retrigger this bot by commenting recheck in this Pull Request. Posted by the CLA Assistant Lite bot.

The row's second line already carries the machine's identity facts, and
the tooltip repeats that line, so the author goes there: "vm-1 · Base ·
by Ada Lovelace · 3 hours ago". Before the age, so who made it and when
read as one thought.

Nothing is shown when there is no name. A known account with no recorded
name gets silence rather than "by 7f3a91c2": an opaque id is one more
generated token in the pile this is meant to clear, so it is not used as
a fallback.

`CloudMachineCreatorLabel` sits in its own file because
`scripts/localize-changes` cannot parse a `defaultValue` holding a
`\u{...}` escape and `CloudTreeMachineRowContent` has several, so a new
string added there is invisible to the tool. Nine locales landed through
the normal packet from here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Stack note: this branch is built on #15309's head, so it carries that PR's two mis-authored commits (325ab9e14a3, 31201fb169e, authored by Claude <noreply@anthropic.com>) and fails CLA Assistant for the same reason. My own two commits here are authored correctly. Details and the reason I cannot fix it from this sandbox are on #15309.

Catch-up merge by scripts/ci/catch_up_pr.py (RFC manaflow-ai#14631).
Merged by scripts/merge-main.sh: origin/main at 0c753fe.

Resolved conflicts:
- Resources/Localizable.xcstrings: xcstrings key-level union
- cmux.xcodeproj/project.pbxproj: union of added entries, then normalize-pbxproj.py

Catch-up-previous-head: ba6b200
Catch-up-base: 0c753fe
@vercel

vercel Bot commented Sep 28, 2026

Copy link
Copy Markdown

@teamleaderleo is attempting to deploy a commit to the Manaflow Team on Vercel.

A member of the Team first needs to authorize it.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Red receipt

Run: https://github.com/manaflow-ai/cmux/actions/runs/36414896188
Commit: bc22e4f0f4e (the regression commit, before the fix)
Command: cmuxTests/CloudMachineCreatorTests on blacksmith-6vcpu-macos-26

◇ Test run started.
✔ Test "the machine list decodes the author the backend sends" passed after 0.012 seconds.
✔ Test "the single-machine endpoints carry the author too" passed after 0.011 seconds.
✔ Test "a blank author id decodes as no author" passed after 0.001 seconds.
✔ Test "the row's snapshot carries the author through the builder" passed after 0.001 seconds.
✔ Test "catalog-discovered machines have no author" passed after 0.001 seconds.
✔ Test "the socket payload re-publishes the author" passed after 0.001 seconds.
✘ Test "the machine row says who made it" recorded an issue at CloudMachineCreatorTests.swift:164:9:
  Expectation failed: (content.subtitle → "vm-1 · Base · 3h ago").contains("by Ada Lovelace")
✘ Test "the machine row says who made it" recorded an issue at CloudMachineCreatorTests.swift:167:9:
  Expectation failed: (content.toolTip → "build box …).contains("by Ada Lovelace")
✘ Test "the machine row says who made it" failed after 0.002 seconds with 2 issues.
✔ Test "a machine with no named author says nothing about one" passed after 0.001 seconds.
✘ Suite "Cloud machine creator metadata" failed after 0.028 seconds with 2 issues.
✘ Test run with 8 tests in 1 suite failed after 0.028 seconds with 2 issues.
** TEST EXECUTE FAILED **

Two things worth reading off this rather than just "it went red".

It fails on assertions, not on a build. The run compiled and executed all eight tests. That
matters here because the regression commit deliberately leaves out
blankNameShowsNoAuthor, which names CloudMachineCreatorLabel: a type that does not exist
until the fix commit. Including it would have made this a compile failure, which proves
nothing about the row.

The six passing tests are the point. The author survives the list decode, the
single-machine endpoints, the snapshot builder and the socket payload. Every hop already
carries it. The one place it does not arrive is the row a person actually looks at, and
"vm-1 · Base · 3h ago" is exactly the subtitle this PR is about: an id, a kind and an age,
and nothing about whose machine it is.

a machine with no named author says nothing about one passes in red as well, which it would:
nothing renders an author yet, so "says nothing" is trivially true. It only starts carrying
weight in green, where it holds the line against falling back to the account id.

Green receipt to follow on ba6b200a1ee; its run is queued.

Skipped verification, disclosed: python3 scripts/verify-local.py is blocked in this
environment, so the local pre-commit scoped verification was not run. CI is the whole record
here.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Green receipt

Run: https://github.com/manaflow-ai/cmux/actions/runs/36415201990
Commit: ba6b200a1ee (the fix)
Command: the same one the red run used, cmuxTests/CloudMachineCreatorTests on blacksmith-6vcpu-macos-26

◇ Test run started.
✔ Test "the machine list decodes the author the backend sends" passed after 0.015 seconds.
✔ Test "the single-machine endpoints carry the author too" passed after 0.014 seconds.
✔ Test "a blank author id decodes as no author" passed after 0.001 seconds.
✔ Test "the row's snapshot carries the author through the builder" passed after 0.001 seconds.
✔ Test "catalog-discovered machines have no author" passed after 0.001 seconds.
✔ Test "the socket payload re-publishes the author" passed after 0.001 seconds.
✔ Test "the machine row says who made it" passed after 0.002 seconds.
✔ Test "a machine with no named author says nothing about one" passed after 0.001 seconds.
✔ Test "a name of only whitespace is not a name" passed after 0.001 seconds.
✔ Test run with 9 tests in 1 suite passed after 0.034 seconds.
** TEST EXECUTE SUCCEEDED **

Nine tests here against eight in the red run. The ninth is a name of only whitespace is not a name, which names CloudMachineCreatorLabel and therefore could not exist before the fix
commit created that type. It is in the fix commit for that reason, not to pad the green run:
including it in the regression commit would have turned that run into a compile failure, which
would have proved nothing about the row.

The two tests that were red are green, and the two negative tests that passed trivially in red
now carry weight: with the row able to render an author, a machine with no named author says nothing about one is what stops the fallback from becoming the account id.

Still open on this PR: CLA Assistant is red because two commits inherited from the branch this
one builds on are authored by an identity with no GitHub account. That is not fixable from
here and is with Leo.

Skipped verification, disclosed: python3 scripts/verify-local.py is blocked in this
environment, so no local scoped verification ran. The red and green runs above are the whole
record.

…tour

The author only renders on the second line, which the default compact preset
does not draw, so the change is invisible in every frame a tour could take.
Switching preset was the one thing the lab could not be driven to do:
`labelsHidden()` leaves its Preset picker with no identifier to aim at.

Give the picker one, put a creator on the lab's machine fixture, and add a
tour that walks Compact then Aero. The fixture name is long on purpose: the
lab's job is to show the crowded case, where the id, the author and the age
all compete for one line.

Debug-only. The lab window is the only caller.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`clickMenu` walked the path with an app-wide `app.menuItems[item]`. A DEBUG
build lists "Cloud Sidebar Spacing Lab…" in the Debug menu and again in the
Help menu, so the query matched more than one element and XCUITest refused
the click:

    Failed to click "Cloud Sidebar Spacing Lab…" MenuItem:
    Find single matching element. Multiple matching elements found.

Recorded in run 36425167799, step 28. The item is unambiguous inside the menu
the tour just opened, so scope the lookup to it, and carry the scope forward
so a submenu path stays anchored to its parent rather than re-searching the
whole app at every level.

The error message now names the path it was walking; "no menu item Zoom" on
its own did not say which menu was open.

No unit test: this is the UI test harness itself, and the behaviour it fixes
is only observable against a running app on a CI runner. The failing tour run
above is the repro.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Three commits added on top of the feature so the design call can have shots.

The author renders on the machine row's second line. The default compact preset does not draw that line, so on the default preset this change is invisible and only reaches the pointer through the hover text and assistive technology. It is visible in the Aero preset, which lives in the Cloud Sidebar Spacing Lab (Help menu, DEBUG builds).

  • 75293773453 gives the lab's Preset picker an accessibility identifier — labelsHidden() left it with nothing a dogfood tour could aim at, so a tour could reach the lab but never change preset — puts a creator on the lab's machine fixture, and adds dogfood/scenarios/cloud-machine-author-tour.json, which walks Compact then Aero. The fixture name is long on purpose: the lab exists to show the crowded case, where the id, the author and the age compete for one line.
  • 58975f0a087 is a cherry-pick of Click a dogfood tour's menu item inside the menu it opened #15372. The first tour run failed at the Help menu with "Multiple matching elements found": the tour runner looked the item up app-wide, and a DEBUG build lists the lab in both the Debug and the Help menu. Click a dogfood tour's menu item inside the menu it opened #15372 fixes that on its own merits; the pick is here only so this tour can run before that lands, and it will fold away on the next main merge.

manaflow-ai/cmux#15365 is the same tour on main plus that identifier, so the two Aero frames differ only by the author segment. A before frame from a different tour at a different scale is not a comparison, which is why it gets its own branch rather than reusing an older shot.

Both tours are dispatched. The design call goes to #13742 when they land.

Note on the earlier CI receipt: run 36421630940 was dispatched at 13fd8eedc87, which is now three commits behind this branch. The three commits above are DEBUG-only lab code plus a JSON file and a UI-test harness change, none of it reachable from the shipping app, but the receipt at the current head will be posted rather than relying on that argument.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

CI receipt, cmuxTests/CloudMachineCreatorTests at 13fd8eedc87, run 36421630940: Test run with 9 tests in 1 suite passed after 0.038 seconds.

  • the machine list decodes the author the backend sends
  • the single-machine endpoints carry the author too
  • a blank author id decodes as no author
  • the row's snapshot carries the author through the builder
  • catalog-discovered machines have no author
  • the socket payload re-publishes the author
  • the machine row says who made it
  • a machine with no named author says nothing about one
  • a name of only whitespace is not a name

13fd8eedc87 is three commits behind the current head. The three since are a DEBUG-only lab fixture, a tour JSON file and a cherry-picked UI-test harness fix, none of it reachable from the shipping app, but a run at the true head 58975f0a087 is dispatched rather than resting on that argument, and its result goes in a reply here.

Disclosure: python3 scripts/verify-local.py was refused in my environment, so the scoped local verification did not run. The focused dispatches stand in for it.

A SwiftUI Picker builds its popup from NSMenuItems that carry their text
as `title`. The accessibility tree for the Spacing Lab preset menu shows
`MenuItem, identifier: 'menuAction:', title: 'Aero'` with no `label`
attribute, so the tour's `{"click": {"label": "Aero"}}` matched nothing
and the run failed at that step.

Use NSMenu type-select instead: press the item's first letter, then
Return. That is order-independent, so it keeps working if a preset is
added or reordered, and it needs no change to the scenario runner.

Also give the tour a `paths` list so PR media picks it up for Cloud
sidebar changes without a `Dogfood-tours:` line in the PR body.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Tour fix at e836b5d2965

Same change as on #15365, which carries the "before" side of this comparison: the Spacing Lab's preset items come from a SwiftUI Picker, so they carry title: 'Aero' and no label, and a {"click": {"label": "Aero"}} step matches nothing. The tour now picks the preset with NSMenu type-select ({"key": "a"} then {"key": "return"}), which is order-independent. The tour also gained paths so PR media picks it up for Cloud sidebar changes.

Only dogfood/scenarios/cloud-machine-author-tour.json changed between 58975f0a087 and e836b5d2965. No Swift moved.

Runs

  • after tour, this branch at e836b5d2965: 36434151534 on glaeda-std-xcode-26.6
  • before tour, DRAFT evidence branch: the machine-author 'before' frame #15365 at 80596612b51: 36434106533
  • unit tests, cmuxTests/CloudMachineCreatorTests at 58975f0a087: 36429408451, still running at the time of writing. That SHA differs from the current head only in the tour JSON above, so its result still covers the Swift under test. If it lands red I will re-dispatch on the current head rather than reason across the gap.

Still open on this PR

  • b92f70b2640 is a cherry-pick that has to come off cloud-sidebar-machine-creator before merge.
  • CLA Assistant is red because of 226cc732bee, 325ab9e14a3 and 31201fb169e, authored by Claude <noreply@anthropic.com>, an identity with no GitHub account that can sign. Rewriting authorship on a pushed branch needs Leo.
  • This is a visual default, so it is a design call and waits on cmux#13742, not on CI.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Unit tests green: run 36429408451 @ 58975f0a087

cmuxTests/CloudMachineCreatorTests, 9 tests in 1 suite, all passing.

✔ Test "the machine list decodes the author the backend sends" passed after 0.013 seconds.
✔ Test "the single-machine endpoints carry the author too" passed after 0.012 seconds.
✔ Test "a blank author id decodes as no author" passed after 0.001 seconds.
✔ Test "the row's snapshot carries the author through the builder" passed after 0.001 seconds.
✔ Test "catalog-discovered machines have no author" passed after 0.001 seconds.
✔ Test "the socket payload re-publishes the author" passed after 0.001 seconds.
✔ Test "the machine row says who made it" passed after 0.001 seconds.
✔ Test "a machine with no named author says nothing about one" passed after 0.001 seconds.
✔ Test "a name of only whitespace is not a name" passed after 0.001 seconds.
✔ Suite "Cloud machine creator metadata" passed after 0.029 seconds.
✔ Test run with 9 tests in 1 suite passed after 0.029 seconds.

The runner's own accounting agrees: cmuxTests/CloudMachineCreatorTests: 9 test(s) executed.

I checked this rather than reading the conclusion, because two lines in the same log say the opposite and both are noise:

  • the test job shows skipped while the run concludes success. The selected tests ran inside build; test is a separate lane that never runs on a focused dispatch.
  • Test Suite 'cmuxTests.xctest' passed ... Executed 0 tests, with 0 failures is XCTest's legacy counter, which is always zero for a Swift Testing suite.

SHA gap, stated plainly. This run is at 58975f0a087; the head is now e836b5d2965. The only change between them is dogfood/scenarios/cloud-machine-author-tour.json, a test scenario file that this suite does not read. No Swift moved, so the result covers the code under test at the current head. The tour itself is covered separately by run 36434151534.

The evidence tour ran green on both branches and produced identical
frames. The accessibility trees differ only by a window UUID, and the
screenshots are indistinguishable, so the tour proved nothing about the
change it exists to show.

The cause is the fixture the author was added to. Its id is 49
characters, the subtitle is `id · kind · by <name> · <age>`, and at the
lab's 360pt preview the line truncates inside the id. "by Ada Lovelace"
never reaches the screen. The crowded case was chosen on purpose, but
crowded turned out to mean absent.

Add a second machine with a short id, so the lab shows both: one row
where the author is truncated away and one where it fits. The design
call needs a picture, and until now there was nothing to look at.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

The evidence tour went green and proved nothing. Fixed at 738f4e4e92f

Both tours passed every step. Run 36434106533 on the before branch, run 36434151534 here, 16 of 16 steps ok on each, and both reached Aero for real: the tree attachment shows PopUpButton, identifier: 'CloudSidebarDebugLab.preset', value: Compact before the keystrokes and value: Aero after.

Then I compared the two, and they are the same picture.

aero before no author fixture truncates

aero after identical author truncated away

Not close to the same. The accessibility trees are 775 lines each and differ in exactly one line, the window's UUID:

< Window (Main), identifier: 'cmux.main.C77D2D03-4B4D-44A2-8380-C95BA3CBDCB6'
> Window (Main), identifier: 'cmux.main.0B559955-1DC4-4A95-B560-7E3572BDBC89'

Why. subtitle builds the second line as id · kind · by <name> · <age>, and the lab has one machine fixture, whose id is debug-long-machine-name-for-cloud-sidebar-spacing. At the lab's 360pt preview the line truncates inside the id, so everything after it, the author included, never reaches the screen. The comment I wrote when adding createdBy to that fixture said the lab "exists to show the crowded case, not the flattering one". That was the right instinct and the wrong fixture: crowded turned out to mean absent, and the author was added to the one row that cannot display it.

Fix. 738f4e4e92f adds a second machine with a short id (vm-4f2a, label api-smoke-test, author Grace Hopper), so the lab shows both cases: one row where the author is truncated away and one where it fits. The before branch gets the same machine without an author (a94155523207 on #15365), so the two frames differ only by the change under discussion.

Re-dispatched: before 36443829715, after 36443884335.

This is the general trap, not a one-off. A key step logs ok whether or not the keystroke did anything, the same way clickAt does, and expect can only assert that an element exists or does not. The scenario format cannot assert an element's value, so no tour can fail on "the preset did not change" or "the row says nothing about an author". Green tours have to be read against their tree and image attachments, every time. Filed with the title matching gap as follow-up 4 on cmuxterm-hq#853.

No before/after has gone to the design call on #13742 yet, because until now there was nothing to show.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Out of draft. The before and after evidence is in, from two CI dogfood tour runs on the same
scenario and the same Spacing Lab preset, so the by-line is confirmed to render rather than
truncate away:

row before no creator

row after by grace hopper

This one shows new metadata on a row by default, so it is a team call rather than a fix, and
the options are on #13742. Auto-merge stays off until that call lands. Two things still to do
before it can merge either way: the branch carries a cherry-picked commit that has to come
off, and CLA Assistant is red on three commits authored under an identity with no GitHub
account, which needs the author rewritten.

@cursor

cursor Bot commented Sep 30, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Closing this in favour of #15948, which carries the same change on a branch that can actually land.

This branch is 371 commits behind main and conflicts with it, and the conflict is not worth resolving because most of the diff is already on main. cmux#15309 landed the machine-author work as 547340ae7d0, which covers eight of this PR's fourteen files outright:

Packages/macOS/CmuxCloud/Sources/CmuxCloud/Machines/MachineSnapshot.swift
Packages/macOS/CmuxCloud/Sources/CmuxCloud/Machines/MachineSnapshotBuilder.swift
Packages/macOS/CmuxCloud/Sources/CmuxCloud/VMClient/VMClient.swift
Packages/macOS/CmuxCloud/Sources/CmuxCloud/VMClient/VMCreator.swift
Sources/Cloud/VMClientSocketCommands.swift
cmux.xcodeproj/project.pbxproj            (4 of the 8 added lines)
cmuxTests/CloudMachineCreatorTests.swift  (152 of 213 lines)
cmuxTests/CloudRefreshURLProtocol.swift

Two of the commits here are also authored Claude <noreply@anthropic.com>, which CLA Assistant reads as an unsigned author, so this branch cannot go green as it stands.

#15948 re-lands the remaining eight files on a fresh branch off main: the creator label view, its row and debug-lab call sites, the part of CloudMachineCreatorTests main lacks, the tour and its registration, the new Localizable.xcstrings keys, and the project.pbxproj entries. Every commit there is authored under the CLA-signed address. Nothing from this PR is lost.

The creator design call itself is still open on cmux#13742, so #15948 stays unmerged until that is answered.

teamleaderleo added a commit that referenced this pull request Oct 1, 2026
* test(cloud): pin the machine creator label on the row

Add the remaining row-label behavior tests from #15341 after the metadata
coverage landed in #15309. The focused app tests are not run locally;
this environment prohibits app builds and execution. CI must establish
the red/green runtime evidence.

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

* feat(cloud): show machine creator on sidebar rows

Add the creator display name to the machine row identity facts, with localized copy, debug-lab fixtures, and a dogfood tour. Keep menu traversal scoped to the opened menu so the new tour is deterministic.

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

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
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