Skip to content

ci(cmux-tui): skip docs-only publishes while preserving artifact lookup - #28214

Merged
teamleaderleo merged 54 commits into
feat-cmux-nextfrom
lane/cmux-tui-docs-publish-v2
Oct 31, 2026
Merged

teamleaderleo merged 54 commits into
feat-cmux-nextfrom
lane/cmux-tui-docs-publish-v2

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Leo: "we just need the nightlies bro". Docs-only changes under cmux-tui/docs/** must not trigger the R2 publisher.

The push trigger excludes that subtree and the runtime key omits it without reading parents, including shallow checkouts and merge commits. Existing v2 keys remain available as v2-legacy, and consumers still read historical v1 objects. Preflight requires the canonical docs-independent publication before it skips a build; otherwise a later docs-only push could have no readable key. Publication writes the canonical and v2-legacy keys.

This repairs the compatibility mismatch found by independent review of #28184. The retry workflow keeps its workflow_run trigger. Related design: https://github.com/manaflow-ai/cmuxterm-hq/issues/5123#issuecomment-6515215902 and https://github.com/manaflow-ai/cmuxterm-hq/issues/4946.

Validation: 90 workflow/security/retry tests; tree-key-v2 (docs-only, mixed changes, merge, depth-one checkout, v1 and old-v2 lookup); tree-publish-v2 (real workflow publication step); embedded-input coverage (191 files); git diff --check. Risk: the new canonical key requires one publication even when old compatibility objects already exist. No permissions or secrets change.
Agent session: agent session

@blacksmith-sh

blacksmith-sh Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Found 6 test failures on Blacksmith runners:

Failures

Test View Logs
main.DeveloperIdAppTests.test_download_prints_the_active_profile_only/
test_download_prints_the_active_profile_only
View Logs
stubs: /System/Library/Frameworks/Security.framework/Versions/A/Security has no stub/
Security has no stub
View Logs
stubs: CoreFoundation.tbd: install-name /System/Library/Frameworks/
CoreFoundation.framework/Versions/A/CoreFoundation, missing 1: ['_CFRetain']/
CoreFoundation, missing 1: ['_CFRetain']
View Logs
stubs: CoreFoundation.tbd: install-name /System/Library/Frameworks/
CoreFoundation.framework/Versions/A/CoreFoundation, missing 1: ['_log2']/
CoreFoundation, missing 1: ['_log2']
View Logs
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs

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

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

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 94dd297: 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=pr28214 -f ref=lane/cmux-tui-docs-publish-v2 -f platform=macos -f backend_mode=local

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

CI passes on 94dd297706 (run 41155486162 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

Shipped in:

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex-review-box/gpt-6-astra high, lane-place): BLOCK at 915900a

BLOCK

  1. .github/workflows/cmux-tui-artifacts.yml:82 — Ignoring docs-only pushes removes the workflow’s documented repair path for an unpublished runtime tree. If a runtime commit’s artifact run fails or is cancelled, a subsequent docs-only commit has the same v2 key but will not start a publisher, leaving consumers waiting indefinitely for that key.

@teamleaderleo
teamleaderleo force-pushed the lane/cmux-tui-docs-publish-v2 branch from 915900a to dfbc350 Compare October 30, 2026 10:11
@teamleaderleo
teamleaderleo force-pushed the lane/cmux-tui-docs-publish-v2 branch from dfbc350 to 05158b1 Compare October 30, 2026 10:18
teamleaderleo and others added 20 commits October 30, 2026 03:19
* test(ios): New Message to one agent forwards its images

Red first: routing a New Message / Forward to one agent sends only
the text, so images are dropped and an image-only message sends nothing.

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

* fix(ios): New Message to one agent sends its images

New Message and Forward addressed to one agent sent only the text as
the agent's prompt: attached images were dropped, and an image-only
message sent nothing after the sheet closed. The images now go as the
prompt's image attachments, bytes and order kept.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… checks (#28187)

* test(setup): cover actionable harness auth reports

Agent-Session: https://cmux.com/deeplink/agent?id=aid-252635b51d8eab1624f1

* fix(setup): expose actionable harness auth recovery

Agent-Session: https://cmux.com/deeplink/agent?id=aid-252635b51d8eab1624f1

* docs(setup): clarify actionable verification failures

Agent-Session: https://cmux.com/deeplink/agent?id=aid-252635b51d8eab1624f1

* fix(setup): preserve disabled profile check uncertainty

Agent-Session: https://cmux.com/deeplink/agent?id=aid-252635b51d8eab1624f1

* test(setup): select custom profile among discovered harnesses

Agent-Session: https://cmux.com/deeplink/agent?id=aid-252635b51d8eab1624f1

* fix(setup): an expired credential reports signed_out with the login recovery

Base added acpmux::harness_health::Auth::Expired; setup already routes it to
the login action, so its auth_status is signed_out (the match was
non-exhaustive and cmux-tui did not compile).

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* acpmux: leave superseded tool output out of open pages and sealed segments

codex-acp re-sends a running command's whole output as the content of
every tool_call_update, so a Codex chat's log grows with the square of
its output and its open page holds a few snapshots of one command.

A page a client bounds by bytes (maxBytes) now leaves out updates a
newer update of the same call in the scan makes moot, and drops moot
content from the rest. Each sealed segment of a live chat's log loses
the content a later update of the same call in it supersedes, on a
thread of its own; seq, deltas and each call's last content stay.

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

* acpmux: supersede only within a prompt; fence the sealed rename

Review findings on #27614:
- A call id names a call within one prompt: a user_message or
  turn_started between two updates keeps both, in pages and on disk.
  A read cut at a prompt (a fork through a turn) sees every call as logged.
- The copy goes in under the writers' lock a retention commit holds, and
  only over the very file it was read from (device, inode, length): a
  retention rewrite, a delete or a replacement is never overwritten.
- A segment that changed stops the pass without moving the marker.
- The copy is removed on any error, and a crash's copy by the next pass.

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

* acpmux: keep this PR to the open page; sealed-segment compaction moves to a follow-up

Review found that rewriting sealed segments changes what a fork or export
pinned mid-prompt reads, so this PR now changes only pages read newest first
with a byte bound. A page of some kinds still resets at every prompt.

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

* acpmux: touch only output-only updates, and keep the oldest of each call a page reads

Review: dropping any covered update changed the fold where an update carries
more than output (input keys merge, subagent _meta, a diff a hidden call shows),
and the start time a page takes from the first update it reads. Now only an
update of status and text content is touched, and the oldest of each call a
page reads stays until an older record of the call makes it moot.

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

* acpmux: scope superseded calls by subagent owner, keep content:null, honour stubs

Review: a native subagent numbers its calls apart from its chat; an explicit
content null clears output; a record a page stubs carries no output. Each now
supersedes nothing it should not.

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

* acpmux: fix superseded tests (clippy useless_vec, the clear test)

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

* acpmux: a params _meta of any other shape is never plain

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… a down machine reconnects on use (#26786)

* feat(machines): one machine link state for the sidebar and the agent pane, reconnecting on use

The sidebar machine header draws a spinner while a machine connects or
reconnects and red when it is down; the agent pane gets the same word
(machineLink) for its composer strip; opening or sending to a chat on a
down machine reconnects it and goes on once its handshake finished.

Sidebar-Look: Leo 2026-10-28 "you just get a little green dot ... as if you were working on your own computer, but now it's remote"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-4ba8980ae4e8eecb82d6

* test(sidebar): a still of the machine headers in each link state

Sidebar-Look: Leo 2026-10-28 "you just get a little green dot ... as if you were working on your own computer, but now it's remote"

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

* fix(machines): an optional update draws the connected dot; a cancelled send is not retried

Sidebar-Look: Leo 2026-10-28 "you just get a little green dot ... as if you were working on your own computer, but now it's remote"

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

* fix(agent-pane): a send cancelled while its machine reconnects stops waiting at once

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

* fix(agent-pane): a cancelled send reconnects nothing

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

* fix(agent-pane): a send cancelled during its machine's reconnect is not retried

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

* fix(agent-pane): the strip's machine and its Reconnect are the machine the tab's chat runs on

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

* fix(agent-pane): a released tab's page leaves the machine link; the last one ends its observation

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

* fix(agent-pane): name the settings JSONValue the page event carries

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-4ba8980ae4e8eecb82d6
(cherry picked from commit f354c69)

* test(agent-pane): the Observable fake machine is not private (its macro's extension needs it)

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

* feat(sidebar): remote machines follow acpmux's peer state pushes from the app's own daemon

The app's own acpmux watch now reads `_acpmux/peer_state_changed` and hands it to the remote
machines' sidebar: a listed peer's header goes up or down at once, a repeat changes nothing, and
an unknown or removed peer, or a reopened watch, reads `_acpmux/peers` again. A mirrored acpmux's
(the Chief home's) pushes are ignored, so only this Mac's own links show.

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

* fix(sidebar): a peer list read that a push overtook is read again

A push that lands while `_acpmux/peers` is in flight (a separate socket, so its answer may be from
before the push) drops that answer and reads the list once more; pushes come only on a state
change, so a burst ends in one more read.

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

* fix(sidebar): any peer push drops the list read it overtook, one that changes nothing shown too

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

* cmux NEXT machine link: a send stops waiting on a link that needs a person, and a failed socket or handshake reconnects too

Review findings at fbdd271: awaitLink waited the whole 45 s budget when the reconnect ended
stuck (a refused sign-in, a required update); it now ends at once. The retry wrapped only the
endpoint, so a socket or daemon handshake failing after the endpoint came back bypassed the
reconnect; the attach client now asks the machine link (AgentSessionAttachClient.Reconnect)
when any part of its connection fails, and tries once more.

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

* cmux NEXT machine link: the reconnect retry runs in the caller's task, and a failed first try ends no attachment

Review findings at 703d820: a first try whose handshake failed closed its transport, whose
onClose ended the page's attachment before the retry; and the reconnect wait ran in the shared
unstructured connect task, so a cancelled call kept waiting. The retry now wraps the shared
connection in the caller's task; a quiet first try tells its loss only when no retry follows
or the retry fails too.

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

* Fix machine link event delivery and reconnect endpoint

Agent-Session: aid-b12e655d1a89af187c5a

* Pass empty scripts for machine link delivery

Agent-Session: https://cmux.com/deeplink/agent?id=aid-16e16f9e7a55152abe76

* Report quiet attach loss after endpoint failure

Agent-Session: https://cmux.com/deeplink/agent?id=aid-16e16f9e7a55152abe76

* Fix machine-link guard and lint findings

Agent-Session: https://cmux.com/deeplink/agent?id=aid-16e16f9e7a55152abe76

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
…er restore (#27840)

* ci(cmux-tui): owned minis skip the Go and branch Rust caches that never restore

On owned Mac minis, the macOS job's setup-go cache never restored: untarring
it over the mini's own read-only ~/go/pkg/mod failed with Permission denied
(8 of 8 sampled jobs), after a ~63 s download and before another save attempt.
The rust-cache restored 0 of 8; its branch saves cost ~155 s each and filled
most of the 10 GB GitHub cache store, evicting other entries.

Owned minis now run setup-go without the Actions cache, and save the cargo
cache only from feat-cmux-next. Blacksmith VMs keep both.

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

* ci: keep cache regression out of guard workflow

Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…TRACE (#28122)

#25857 made the swift test wrapper export SWIFT_BACKTRACE=enable=yes,...
so a crash of the test process prints its stack. Every child inherited it:

- An exit test's child traps on purpose. With the variable set, it spawned
  the backtracer to symbolicate the whole test binary, and the parent sat in
  wait4 until the stuck-test watchdog ended the run (BlockingCheckTests
  .aCheckedFileManagerCallOnTheMainThreadTraps, #26809 run 40999753339
  shard 6, exit 143).
- A privileged tool writes "swift runtime: backtrace-on-crash is not
  supported for privileged executables." to stderr first. A test reading
  the child's stderr took that line for the answer: ChromiumRuntimeInstaller
  failed with unsafeEntry and then stalled 303 s (same run, shard 5), as the
  python bridges #27981 fixed one by one did.

The test bundle's load-time constructor now unsets the variable. The Swift
runtime read it when libswiftCore loaded, before the bundle, so the test
process keeps its own backtracer and no child gets one.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-1288bbb2b5d2f5c6b66a

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- cargo fmt in cmux-tui

Made again on e0f3350: it moved the inputs of a repair made at 941b7a4.

scripts/cmux-next/base-autofix.sh: https://github.com/manaflow-ai/cmux/actions/runs/41038166183

Re-applied on 91e0204, which feat-cmux-next moved to after e0f3350.
…et (#28240)

* ci(cmux-tui artifacts): short Linux jobs take the shared 32/16 vCPU set

On 2026-10-30 every cmux-tui artifacts run on feat-cmux-next sat queued on
blacksmith-4vcpu-ubuntu-2404 (run 41007923202: tree preflight waited 4 min,
mark-tree-commits and point-feat-channel were still queued 15 min later), so
nightly-next promotion stalled behind the tree marker.

The 11 short Linux jobs now use the expression this workflow's publish jobs
already use: a non-Blacksmith LINUX_RUNNER pool, else Blacksmith 32 vCPU, or
16 vCPU while the overflow switch has failed over. A new guard test evaluates
every Linux runs-on of the workflow against each variable state.

* Test the hosted LINUX_RUNNER and the Darwin cross override

Codex review of #28240: the matrix lacked ubuntu-24.04, the value the overflow switch writes, and pinned LINUX_RUNNER_DARWIN_CROSS empty, so macos-cross-shadow's override was never exercised. Add both; a new test checks only that job reads the override.
… on any host; several are refused with each HOST/NAME command (#28000)

* acpmux: a bare name names the one live session on this host or a peer; several are refused with each HOST/NAME command

Every command that takes a session resolves a bare name or id prefix the same way, in the
daemon (hub/key_route.rs, applied on the unix socket before any check reads the key): the one
live session with that whole name (else id prefix) across this daemon and its peers. Closed
sessions count only when no live one matches. Several live matches are refused
(session_ambiguous, exit 2) with each choice, and the CLI prints the exact command for each.

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

* acpmux README: neutral host names in the ambiguity example

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

* acpmux key_route: test hub is an Arc; the refusal list owns its strings

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

* acpmux: red/green request test, a name shared by a session here and a peer's is refused on info and send

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

* acpmux key_route: a whole name and an id prefix are one tier; every choice in the data; keep's exact id is not routed; the argv swap skips an option's value (review of #28000)

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

* acpmux key_route: a sub-session's whole name (parent/child) is routed across hosts too (review of #28000)

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

* acpmux key_route tests: neutral sample host names (fleet rule lint)

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

* acpmux key_route: poisoned locks are read, never unwrapped (crash ratchet)

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…base red) (#28167)

"String tables (21 languages)" failed on feat-cmux-next with 112 style
errors against its warning cap of 100. The last 12 came from
action.agentPane.continueAfterError (9e836df), which shipped in 9 of
the 21 languages. Fill it and the seven older keys that made up the rest
of the debt, so the check reports 0 errors:

- ActionCatalog: action.agentPane.continueAfterError,
  action.palette.forkAgentConversation, action.palette.forkAgentConversationTo
- PaneCreation: paneCreation.allCommands
- Updater: updater.button.updateAvailable, updater.button.updateAvailableNamed
- CmuxHome: home.plan.title, home.plan.activeCount (all 20 languages)

Wording follows each table's neighbours (the Fork Conversation family,
Continue In…, Update Available, detail.plan). State is "translated" where
the key's other languages are, and "needs_review" in CmuxHome, as that
table's other machine translations are.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-a98b158f6fd70b0eae26

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…unner set (#28209)

#25935 (85628c0) moved build-nightly-remote-daemon and
attest-nightly-remote-daemon off the Mac builder onto
blacksmith-4vcpu-ubuntu-2404. That label is outside the trusted runner set
of #27125 (9127e61, "Linux jobs take the runner set, not one small
Blacksmith label"), so tests/test_nightly_trusted_routing.py
test_every_linux_nightly_job_takes_a_runner_set_member is red on
feat-cmux-next (20 failures, both jobs) and nightly-guards / release-notary
is red on every feat PR.

Both jobs now use the runner-set expression of the other Linux nightly
jobs (16 vCPU when vars.LINUX_RUNNER names it, else 32). They stay off the
Macs, which was the goal of #25935.

tests/test_gh_budget_wait.py pinned the attest job to the 4 vCPU label;
that one assertion conflicts with the trusted-routing rule, so it now
checks that the job holds no Mac and takes the runner set. Its other
assertions are unchanged.

Test: python3 -I tests/test_nightly_trusted_routing.py (FAILED, failures=20
on 97133a4; OK on this commit); python3 -I tests/test_gh_budget_wait.py
(OK on both).
- regenerated web/data/cmux-shortcuts.generated.json
- regenerated schemas/defaults/cmux-next.json
- cargo fmt in cmux-tui

Made again on afe5e8d: it moved the inputs of a repair made at 4e5fe02.

scripts/cmux-next/base-autofix.sh: https://github.com/manaflow-ai/cmux/actions/runs/41040753079
* test: reproduce silent environment save failure

Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed6c50a2fcd43ba5fe7f

* fix: surface failed Session Info environment saves

Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed6c50a2fcd43ba5fe7f

* style: format environment save fixtures

Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed6c50a2fcd43ba5fe7f

* test: assert actual gallery color scheme and reduced motion

Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed6c50a2fcd43ba5fe7f

* test: wait for Environment before checking gallery settings

Agent-Session: https://cmux.com/deeplink/agent?id=aid-ed6c50a2fcd43ba5fe7f

* fix(inspector): hide unsupported chat environment save

Agent-Session: https://cmux.com/deeplink/agent?id=aid-aaebdf126bd73033484e
…essages there (#28141)

* test(acpmux): a person's Stop of a peer's chat holds the agent messages there (red)

On base the peer takes the forwarded Stop as a plain cancel: no
queue_paused with reason stop on the peer, and the agent message runs.
A fake peer checks that only a peer listing personStop gets the field,
and that a non-person's Stop never carries it.

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

* fix(acpmux): a person's Stop of a chat on a peer holds the agent messages there

The peer daemon's link is never the person on the peer, so a Stop for a
peer's chat was a plain cancel there: the stopped turn ended and the
next agent message started a turn at once. This daemon now forwards the
person's Stop with _meta.acpmux.personStop to a peer that lists the
personStop feature, and a peer takes it only from a peer daemon's own
link (PeerToken, held to the peer's rules, not via web or device) and
runs the same person_stop as for its own person. An older peer gets the
plain cancel. A client's own personStop field is dropped before the
forward.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The line said ssh-tmux mirrored workspaces get no agent badges from the
cmux-tui journal. A main sync had dropped the sentence #19104 added, so it
read as a cmux-next gap and sent two helpers after one that does not exist
(HQ#5226 row 3). cmux-next SSH machines run cmux-tui on the host with the
full CLAUDE_EVENTS set; the ssh-tmux mirror is classic-only and reports
badges through its own tmux subscription.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-c689cdaab52479676c52

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…7861)

* fix(webviews): scope page store subscriptions to their lifetime

Agent-Session: https://cmux.com/deeplink/agent?id=aid-aaebdf126bd73033484e

* style(webviews): format store lifetime regression tests

Agent-Session: https://cmux.com/deeplink/agent?id=aid-aaebdf126bd73033484e

* fix(webviews): guard auxiliary store continuations

Agent-Session: https://cmux.com/deeplink/agent?id=aid-aaebdf126bd73033484e

* fix(webviews): fence stale app continuations

Agent-Session: https://cmux.com/deeplink/agent?id=aid-aaebdf126bd73033484e

* fix(webviews): stop stale app reload continuations

Agent-Session: https://cmux.com/deeplink/agent?id=aid-aaebdf126bd73033484e
…27938)

* feat(agent-pane): answered question and checklist as Claude desktop cards

An answered question now collapses to a compact bordered card in the
transcript: each question, the chosen answers (Other text included) in grey
under it, then who answered. An ask that ended unanswered is the same card with
Skipped, Stopped before an answer or Not answered in the answer's place. The
todo list keeps its bordered card, spinner, dashed and check marks.

QuestionCard and PlanList are memoized on their immutable inputs; a new test
counts their commits while 200 tokens stream in the same turn.

Gallery: answered looks (stacked shipped, inline, check), ended looks (card
shipped, pill, rule), and a todo list looks entry (card shipped, borderless,
count).

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

* fix(agent-pane): answered card spacing from the design tokens

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

* test(agent-pane): cards re-created per token, as the transcript does; lower the type-scale baseline

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

* test(agent-pane): count the cards' own renders, not a re-created Profiler's commits

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

* test(agent-pane): mark the module mock's promise as handled

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

* fix(agent-pane): one reply handler per live ask, so the memoized question card skips pane updates

Review (Astra) of 0dd7e86: App.tsx made replyToQuestion(permission) anew each render, so the
pending card's memo never held.

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

* test(agent-pane): mount the live ask's card wrapper in the render-count test

The live question card's reply handler moves into PermissionQuestion, which
App.tsx's PermissionAsk renders; the test mounts that wrapper with one
permission across 200 tokens, so dropping its useMemo fails the test.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…er (#28152)

* test(acpmux): a peer link hears no change of a row mirrored from another peer

Red on base: every change of a mirrored row goes out on every peer link,
which drops it (peer.rs), so with 25 peers each change went out 24 times.

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

* acpmux: a peer link hears no change of a row mirrored from another peer

Every change of a row this daemon mirrors from a peer went out as
_acpmux/session_changed on every other peer's link too, where the link
drops it (peer.rs: a mirrored row or a notice naming a peer). With 25
peers that was 24 copies of each change, tools included. A link now
hears only this daemon's own rows' changes, as its watch list since
#28105 lists only them.

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

* acpmux: a link still hears a peer's pending prompt; only session_changed is skipped

Review of 8f1a1fd: the link check returned before the peer permission
branch, and a link is any client named acpmux-peer, so a unix-socket
watcher with that name lost a peer's _acpmux/permission_pending. The check
now guards only the session_changed send; the permission branch is as on
base.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…8172)

* test(acpmux): briefs asks the peers at once and names each one left out

Red on base: the peers are asked one by one with the 600 s request budget
each, so a stalled peer holds the list for ten minutes, and a refusing
peer is left out with no word of why.

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

* acpmux: briefs asks the peers at once and names each one left out

_acpmux/briefs asked every connected peer for its briefs one by one, each
with the 600 s request budget, and left out a peer whose answer failed
with no word of why: one stalled peer held the list for ten minutes. The
peers are now asked at once under one 10 s deadline (as _acpmux/models
does), and each peer left out is named with its error in peersFailed,
logged at warn and printed by acpmux briefs ls.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Lawrence 2026-10-30: after a reboot the daemon's adoption records every
lost terminal's end before it answers anyone: 750-821 ms for 462
terminals on a clone of a 41.6 GB registry, 60% of it cold page reads.
Each end appends journal subjects (terminal, tab, pane, screen,
workspace) to journal_subject_index_by_subject_sequence, keyed by random
public ids, and a terminal event keyed by terminal id, so each insert
lands on a leaf nothing read earlier.

startup_prefetch_covers_every_page_a_terminal_end_writes: every page key
an end writes is one the startup reads ahead. terminal_end_prefetch_keys
is a stub that reads nothing, as the startup does now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Default changes

This pull request changes 2 defaults at 94dd297706a3 (what everyone gets without configuring anything):

  • tunable-source.CmuxNextSidebar/Views/SectionHeaderRowView.swift:color: "30568091cdc59ca96c79f0c196902431cc7b4898193a734fc9262b4fd3413d7f" -> "8d87db7dfb3cca34a5574c31e1be15fcea7752c5c13380ef3cf6bd493041970f"
  • tunable-source.CmuxNextSidebar/Views/SectionHeaderRowView.swift:tone: (none) -> "ac300ce7131a9a30bc83c0991777ab44729f4e5f5cabcc4c5c4d33ed45bdf5d8"

The newest verdict on this commit is a BLOCK from review (codex gpt-6-astra, router-review).
Needs a review. It passes with an independent review receipt on this commit: a comment or review whose first line is Review (<reviewer>): SHIP at 94dd297706a3e870883c9ff8da7893f2bcb3f891, from a member, not a self-review (the newest verdict naming the head decides; a later BLOCK beats an earlier SHIP), or with an approving review on this commit from @lawrencecchen or @austinywang (the call owners in .github/defaults-call-owners.json, never the author). A receipt posted as a review re-runs this check; after a plain comment, re-run it. The needs a call label alone does not pass, and a new push needs a new receipt.

Merge receipt: merged as b1e7d7db13e2 with these defaults changed, WITHOUT a SHIP receipt or an approving call owner review on its head.

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

@github-actions github-actions Bot added risk:high Risk tier (docs/ci/risk-tiers.md) and removed risk:normal Risk tier (docs/ci/risk-tiers.md) labels Oct 30, 2026
@teamleaderleo teamleaderleo changed the title ci(cmux-tui): skip docs-only artifact publishes ci(cmux-tui): skip docs-only publishes while preserving artifact lookup Oct 30, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at 9fc2592

SHIP

No blocking findings in the six docs-key files at 9fc2592e7639.

Both shell suites passed, covering historical fallback, publication, docs-only merges, and depth-one checkouts. Canonical-key seeding is correctly required before skipping publication.

Base reds: none established; unrelated changes excluded.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex-review-box/gpt-6-astra high, lane-place): SHIP at 94dd297

SHIP

cmux-bot[bot]
cmux-bot Bot previously approved these changes Oct 30, 2026

@cmux-bot cmux-bot 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.

cmux-bot approves 94dd297: an independent review passed this exact head (review box review-tui-docs-fixture receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Validation at 94dd297: independent Astra SHIP; fleet Release compile success; remote run https://github.com/manaflow-ai/cmux/actions/runs/41061827580 passes 104 tests, tree-key-v2, tree-publish-v2 and 191 embedded inputs. The earlier mocked-Git preflight failures are fixed; checks job is green.

test_reds.py classify compares release-notary with feat-cmux-next run 41062092868: own: false, shared failures are DigestTests.test_the_repository_highlights_validate and SigningHooksInStepWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check, with the same errors. The PR link job fails an HTTP 403 updating an existing comment.

Normal head-pinned squash has been requested through the owner landing route. No override was used.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra, router-review): BLOCK at 94dd297

GraphQL: API rate limit already exceeded for user ID 13091533.
BLOCK at 94dd297

Visual verdict: no images supplied (range review); the visual verdict must come separately

  1. [P1] [blocking] scripts/ci/cmux_tui_tree_key.py:66: Changing v2 also changes historical keys, but resolve_newest_published_tree() still checks only v2. Existing publications containing cmux-tui/docs become invisible to this resolver. When the new canonical publication is unavailable, nightly builds lose their previously working fallback and can fail despite valid published artifacts. Add compatibility-key lookup to the history resolver and return the actual published key. Reproduced with the existing resolver fixture publishing under v2-legacy: HEAD exits 1 with “no published tree”; restoring the previous key algorithm exits 0.

Validation: 245 Python tests and all three shell suites passed; the additional historical-publication reproduction failed as described.

exit=1

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
@cmux-bot
cmux-bot Bot dismissed their stale review October 31, 2026 01:28

A newer verdict blocks 94dd297 (a wait as new as the SHIP or newer: comment by teamleaderleo: Review (codex gpt-6-astra, router-review): BLOCK at 94dd29).

@teamleaderleo
teamleaderleo merged commit b1e7d7d into feat-cmux-next Oct 31, 2026
171 of 181 checks passed
@teamleaderleo
teamleaderleo deleted the lane/cmux-tui-docs-publish-v2 branch October 31, 2026 01:32
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Reverted by #28714: this landed at 94dd297 while the router-review receipt at the same head (#28214 (comment)) held a blocking P1 (the history resolver only checks v2 keys, so older publications become invisible and nightly loses its fallback). A follow-up that adds the compatibility-key lookup to resolve_newest_published_tree() can land again after review.

@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Oct 31, 2026
teamleaderleo added a commit that referenced this pull request Oct 31, 2026
…mpatibility keys (#28764)

#28214 changed the v2 tree key (docs-only filtering), so trees published
before it exist only under their v2-legacy (or v1) key. The nightly's
history resolver checked only v2 and lost that fallback. It now tries the
v2 key, then the commit's compatibility keys, and reports the key actually
published. The resolve-newest test publishes a tree only under its
v2-legacy key; it fails before this change and passes after.


Agent-Session: https://cmux.com/deeplink/agent?id=aid-159afad10a5ab45ea16c

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was previously deployed

3 inactive (2 outdated) deployments
ci-routing-agent — 94dd2977 Deployed Oct 30, 2026 by teamleaderleo via wait for same-key tree publisher #83227
artifacts — 9fc2592e Deployed Oct 30, 2026 by teamleaderleo via add the Windows daemon to the tree #83066
sentry-dsyms — 9fc2592e Deployed Oct 30, 2026 by teamleaderleo via upload cmux-tui dSYMs to Sentry #83066
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants