Skip to content

cx-v9k2f: acpmux decides each session's lane (working, input, idle since, failed with why, lost) - #20362

Merged
teamleaderleo merged 63 commits into
feat-cmux-nextfrom
op-next-cursors/lanes-state
Oct 14, 2026
Merged

teamleaderleo merged 63 commits into
feat-cmux-nextfrom
op-next-cursors/lanes-state

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Bead: cx-v9k2f (part 1 of 2; the app's lanes view follows in a second PR)

Problem

Leo, 2026-10-13: about 25 lanes sat idle for hours unnoticed, some dead on out-of-credit errors. acpmux decides each session's status dot (indicator), but nothing says how long a session has been in that state or why a turn failed. A daemon restart mid-turn also wrote a failed turn_result without recording it as the last turn, so that session read as idle.

Change

  • Every session summary (_acpmux/watch, session_changed, _acpmux/sessions) carries lane = {state, since, error}. acpmux decides it once next to indicator, from the summary's own fields:
    • working since its turn started;
    • input while a permission or question waits;
    • idle since its last turn ended, or since it was created;
    • failed with the last turn's errorText;
    • lost when the agent process is gone without an answer.
    • A closed session has no lane.
  • Peer sessions get it too, and it's re-decided when a peer goes unreachable (views::decide replaces the three separate indicator writes).
  • Both outcome_unknown paths (a daemon restart, or a host that never got the prompt) now call record_last_turn. Those sessions read failed with the reason.
  • restart_marks_unknown_outcome moves to tests/hub_integration/restart.rs, because hub_integration.rs was at its 1500-line cap.
  • The lastTurn key list is views::LAST_TURN_KEYS, so hub/turns.rs (over the god-file limit on base) does not grow.

Verification

  • Red at b8305e5 (tests only), hosted --filter lanes::: test result: FAILED. 0 passed; 5 failed on Linux and on macOS. Every lane test panicked because summaries had no lane.
  • Green on 7076fa6 (base 541435d), hosted --filter lanes:: and --filter restart_marks_unknown_outcome: lint (linux), test (linux) and macOS lint and tests pass.
    • One run's release-path dogfood artifacts / build aarch64-apple-darwin failed; the other run built the same SHA. That job is not part of this change.
  • Green again on fresh-merge head e8d8c24 (both filters): lint (linux) and test (linux) pass.
    • Earlier, at 5099ccd, the macOS hosted tests passed, and the peer test passed on 492bd45 (Linux).
    • The PR's own checks are all green on 7076fa6, including the macOS daemon tests and the same-tree daemon tests.
  • crash_ratchet.py: ok.

Changelog

none

🤖 Generated with Claude Code

teamleaderleo and others added 2 commits October 13, 2026 17:53
Working since its turn started, input, idle since its last turn ended,
failed with the error text (a restart's outcome_unknown included), lost;
peer sessions too. Red: summaries have no lane yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lane = {state, since, error}, decided once next to indicator from the
summary's own fields, for local and peer sessions (re-decided when a peer
goes unreachable): working since its turn started, input, idle since its
last turn ended, failed with that turn's error text, lost. A restart's
outcome_unknown now records lastTurn, so that session reads failed with why,
not idle. The restart test moves to its own file (hub_integration.rs was at
its size cap).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 14, 2026 01:19 — with GitHub Actions Inactive
@coderabbitai

coderabbitai Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: c47b8867-9052-4fe1-ac49-63e411897127

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Waiting reads inputSince (when the session began waiting), so a draft save,
a later record or a second ask no longer moves it. A session lost mid-turn
is lost since it went, without the previous turn's error. outcome_unknown
records lastTurn before its record goes out, as every turn end does, and
lastTurn keeps detail. An idle session with turns but no lastTurn falls back
to updatedAt. The schema documents lane and inputSince; the restart test
module sits in order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 14, 2026 01:26 — with GitHub Actions Inactive
- cargo clippy --fix cmux-tui/crates/acpmux/src/hub/turns.rs
- cargo clippy --fix cmux-tui/crates/acpmux/src/hub/views.rs

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38495693983
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 14, 2026 02:40 — with GitHub Actions Inactive
…cx-v9k2f)

Adding `detail` wrapped the key list and grew hub/turns.rs to 1064 lines,
which the god-file check refuses (1062 on base, over the 1000 limit). The
list becomes views::LAST_TURN_KEYS, so turns.rs stays at 1062.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lawrencecchen and others added 20 commits October 14, 2026 04:01
…erves (cx-4bd8m)

Austin's cmux NEXT registry grew to 10.7 GB in 8.5 h under a build without
journal maintenance (auto_vacuum off, 4.47M journal rows). The maintenance
worker's first step converts such a registry with PRAGMA auto_vacuum=
INCREMENTAL; VACUUM; while it holds the registry: on that file every client
of the owner would read "not connected" for minutes after the next update.

Convert only while live data is at most 64 MiB. Above it the conversion is
deferred (one diagnostic per owner); sealing still runs and deletes archived
rows, and SQLite reuses their pages, so the file stops growing once sealing
keeps up. It does not shrink: sealed segments stay in the registry, so giving
the free pages back needs a compaction that does not hold the registry
(follow-up bead). Debug-only overrides for the interval and the bound keep
the behavior test small. Red/green: legacy_registry_maintenance.

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

* test: a local merge commit reuses the fetched same-tree acpmux (red)

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

* fix: a local merge commit reuses the fetched same-tree acpmux

reload.sh on a developer Mac stopped with "no cached acpmux" for any commit
no workflow published (a local integration of feat-cmux-next and PRs), even
though the tree fetch had just put that tree's checksum-verified acpmux in
place. build-acpmux.sh now seeds its commit cache from it when it has every
requested architecture.

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

* chore(next): PR autofix at 7be0d24

- regenerated schemas/defaults/cmux-next.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38542356066

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
* webviews: test that every popup draws one hairline edge

Red: --acpmux-popup-elevation stacks a composer-edge hairline on the one
already in --ui-popup-shadow.

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

* webviews: popups draw one hairline, not two

--acpmux-popup-elevation stacked a 0.5px composer-edge hairline on the
hairline already in --ui-popup-shadow. It now is the shared popup shadow,
so every menu and popover has one edge. Increase Contrast colors that one
edge in the popup's ink, which the composer-edge hairline did before.

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

* chore(next): PR autofix at 1cc6616

- vp fmt webviews/src/agent-session/acpmux/modelPickerLayout.ts

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38520503432

* webviews: test that popups draw no border over the hairline and clear it under borders none

Red: the pages' .ui-popup and the chat find bar draw a border over the
--ui-popup-shadow hairline, and appearance.borders none leaves the
hairline drawn.

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

* webviews: one rim on page popups and the find bar; borders none clears it

The pages' .ui-popup drew a 1px border over the --ui-popup-shadow
hairline; it now draws no border. The chat find bar keeps its border
(its focus cue) and casts --ui-popup-drop, the shadow without the
hairline. appearance.borders none sets --ui-popup-edge transparent.

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

* webviews: format modelPickerLayout.ts (base fmt red)

Keeps cmux-autofix's vp fmt of the base file, which the base merge
replaced with the unformatted copy; react-apps-check fails on it.

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

* webviews: the Channels palette draws one rim; test follows the summary card

Red after the base merge: the new Channels palette (.lg-palette, ledger.css)
drew a 1px border over the --ui-popup-shadow hairline, and the summary
popover became .acpmux-summary-card. The palette now draws no border.

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

* chore(next): PR autofix at 54dd59d

- regenerated schemas/defaults/cmux-next.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38543983469

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
…(clears the concurrency red) (#20485)

* fix: clear two feat-cmux-next check reds

tree-publish-v2's stub uploader takes --conflict-exit-code, which the tree
publisher now passes (af8b68e). PaneAnimationsSetting carries the
namespace-type justification its ratcheted sibling settings have.

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

* fix: keep PaneAnimationsSetting internal to CmuxNextSettings

Nothing outside the module uses it, so it needs no namespace-type allow.

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

* chore(next): PR autofix at c2bdb98

- regenerated schemas/defaults/cmux-next.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38530638157

* fix: name the owner of ControlWorkspaceInfoCache's publish hop

check-concurrency flags the unowned Task d0a62be added; it is a
one-shot main-actor hop that holds the cache weakly.

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

* chore(next): PR autofix at 7cf07e3

- regenerated schemas/defaults/cmux-next.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/38544346314

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
…hover card (#20483)

* test: a notified compact row stays one line; its text reads in the hover card

Leo 2026-10-14: "why is it even 2 lines in the first place?"

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

* fix: compact sidebar rows are one line by default; the notification text moves to the hover card

sidebar.workspaceRow.notification is now off by default (Leo 2026-10-14). #19862
turned it on for classic parity; the setting stays as an opt-in.

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

* chore: regenerate the settings schema hash for the notification default

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

* chore: regenerate the settings schema hash on the merged base

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

* chore: take base's settings exports after the base merge (regenerated next)

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

* chore: regenerate the settings exports on the merged base

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

* chore: refresh the defaults snapshot on the merged base

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

* docs: the hover card template lists the notification fact; comments say where the text shows

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

---------

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

Copy link
Copy Markdown
Contributor

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

CI passes on 52af7b59a5 (run 38555649642 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.

@teamleaderleo
teamleaderleo merged commit 7ba2731 into feat-cmux-next Oct 14, 2026
228 of 253 checks passed
@teamleaderleo
teamleaderleo deleted the op-next-cursors/lanes-state branch October 14, 2026 14:59
teamleaderleo added a commit that referenced this pull request Oct 14, 2026
Keeps base's now-playing follower beside the lanes What's New settings in
SidebarBridge+Cards. The lanes item's click moves to
WhatsNewPage.activateClientItem (the client-only item hub), so SidebarBridge
stays within its 1000-line type limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 14, 2026
Base (#20362) adds each session's lane and `inputSince` and derives
`indicator` and `lane` with `views::decide`. The typed SessionSummary gains
`inputSince`, `lane` ({state, since, error}) and `lastTurn.detail`, and
session_summary calls `decide` on the serialized summary. Spec and generated
TS are regenerated.

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

This branch was previously deployed

2 inactive deployments
artifacts — 52af7b59 Deployed Oct 14, 2026 by teamleaderleo via mark the published tree as daemon-tested #12866
cmux-tui-merge-tree — 52af7b59 Deployed Oct 14, 2026 by teamleaderleo via publish the merge tree #627
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