Skip to content

cmux-next: one model picker, a clickable context ring and an aligned composer footer - #17537

Merged
teamleaderleo merged 24 commits into
feat-cmux-nextfrom
op-next-composer-footer
Oct 6, 2026
Merged

teamleaderleo merged 24 commits into
feat-cmux-nextfrom
op-next-composer-footer

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

The agent composer footer ("GPT-6.1-Sol v High v (ring) | mic (send)") had three problems Leo hit in daily use:

  • The context ring was a picture with no click, so it never showed what is in the window or offered a way to compact.
  • The controls sat on different centers with uneven gaps: 32px chips with 4px gaps, separators with their own margins, and a 16px ring next to a 32px mic.
  • Send was a 32px filled circle with an 18px arrow, larger than anything else in the row.

Change

Matches the Codex desktop app composer (left: + then the access chip; right: ring, one model picker, mic, send).

  • One model and effort picker. The model chip shows the effort after the model in secondary text, with one chevron. Its menu already has the Reasoning slider, so the separate effort chip is gone. It stays only when an agent offers efforts but no model list. openPicker("Effort") still opens the menu for automation. A default effort adds no text.
  • The context ring opens on click. It is a button now. The popover shows the share used, a bar, tokens used of the window ("34K of 200K tokens") and Compact, which sends the agent's /compact when the agent lists that command. A live chat shows the ring from its first frame, and usage fills it in place (stability rule). Before the first usage update it shows 0% with no token counts. The popover is the shared src/ui Popover (Base UI), so Escape and a click outside close it and focus returns to the ring. Nothing depends on hover.
  • The permission chip sits next to + again. Plan stays in the + menu.
  • One line on an 8px rhythm. Every bar control is 28px tall with 8px gaps and a 10px inset, so the vertical and horizontal insets match in the 48px bar. The separators are gone.
  • Send fits the row. It is a 28px circle with a 16px arrow, the same hit size as the mic and the ring.

Builds on #17505 (location row) and #17503 (model labels); #17505's commits are merged in and drop out of the diff once it lands.

ACP usage_update reports only used and window size, so the popover cannot break down what is in context.

Validation

  • Red then green: bun test src/agent-session/acpmux/composerPickers.test.tsx (red commit: 25 pass, 6 fail; fix: 31 pass).
  • bun test src/agent-session: 1012 pass, 0 fail.
  • vp check src/agent-session/acpmux/: format, lint and types clean.
  • scripts/cmux-next/build-agent-pane-web.sh --check: bundle current.
  • scripts/verify-local.py: the localization parity errors are inherited from feat-cmux-next (none name a key from this PR). No Swift changed; the whole-tree Swift parse cannot run on this Linux host.
  • Localization: 4 new agent pane keys (context.title, context.percent, context.tokens, context.compact), labels only, translated into all 21 pane locales and regenerated into generated/strings.json and locales/*.js.
  • Fleet before/after captures next to the Codex desktop app reference: cmux-next: one model picker, a clickable context ring and an aligned composer footer #17537 (comment)
  • Also formats 7 files feat-cmux-next left unformatted (acpmux/conversation/*, pages/keybindings/model.test.ts), which failed react-apps-check. Formatting only.
  • After merging the latest feat-cmux-next: bun test src/agent-session test/ui-rules.test.ts 1054 pass; vp check clean.

Changelog

Fixed the agent composer footer: one model and effort picker, a context ring that opens usage details and Compact on click, every control on one line, and a smaller Send button.

🤖 Generated with Claude Code


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


Summary by cubic

Redesigns the agent composer footer and location row, and makes every scroller follow the macOS "Show scroll bars" setting instead of forcing overlay or hidden indicators.

  • The context ring is now a button; its popover shows window usage and Compact (the agent's /compact) when the agent offers it, and stays at 0% before the first usage update.
  • Model and effort share one chip with the effort in secondary text; the separate effort chip remains only when an agent offers efforts but no model list, and openPicker("Effort") still opens the menu for automation.
  • Every bar control is 28px tall with 8px gaps and a 10px inset; Send is a 28px circle with a 16px arrow, matching the mic and ring.
  • The location row is a quiet row of text menu buttons: a Base UI menu of recent folders using the shared inline location treatment, with the current one checked, path descriptions, Choose folder… and Browse, and the full path as the tooltip. Existing new-chat project selection behavior is kept.
  • A press that closes the open context popover does not reopen it.

Scrollbars follow macOS

  • SystemScrollers.observe and WebTheme.scrollers propagate the system setting to every webview; the theme sets data-scrollers on <html> and pages re-send it when the setting changes.
  • The terminal and native views (site data, certificate details, remote terminal placeholder, Home lists, compose sheet) follow the setting instead of forcing indicator styles.
  • Agent pane lists no longer hide their scrollbars, and Monaco, diff rows, and tree scrollbars follow the setting.
  • A new check-scrollbars.sh CI gate fails on forced scroller styles, hidden indicators, custom web scrollbars, and overflow: scroll, with a listed exception policy.

Written for commit 65fe235. Summary will update on new commits.

Review in cubic Turn on auto-fix

teamleaderleo and others added 12 commits October 5, 2026 21:13
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Use the shared inline location treatment for recent project folders, add path descriptions and Browse, and style the portaled computer menu with the pane font and compact checkmark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Regenerate the tracked agent pane resources so the composer picker changes ship in the native pane.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Apply the repository formatter to the composer location picker and refresh its tracked agent pane bundle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep existing new-chat project selection behavior while matching the composer location row, showing project paths in the menu, and retaining Browse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…into op-next-composer-footer

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
…xt ring (red)

Fails today: the effort draws as a second chip, the context ring is an
image with no click, and it disappears before the first usage update.

Red: bun test src/agent-session/acpmux/composerPickers.test.tsx
(25 pass, 6 fail).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…open its details

- One model chip names the effort after the model in secondary text, with one
  chevron; its menu already holds the reasoning slider, so the separate effort
  chip goes (it stays only when an agent offers efforts without models).
  "Effort" still opens the menu for automation.
- The context ring is a button: a click opens the share used, tokens used of
  the window and Compact (the agent's /compact) when the agent offers it.
  A live chat keeps the ring from its first frame; usage fills it in place.
- The permission chip sits next to + again; Plan stays in the + menu.
- Every bar control is 28px tall on an 8px gap, 10px from the box edge; Send
  is a 28px circle with a 16px arrow, the mic's size, not 32px.

Green: bun test src/agent-session/acpmux/composerPickers.test.tsx (31 pass).

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

cursor Bot commented Oct 6, 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.

@coderabbitai

coderabbitai Bot commented Oct 6, 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: e0fe57c7-25b2-4e47-a408-00b4f4b06e28

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
  • Autopilot · 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.

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Unclear: web / react-apps-check failed: no known signature; failed step: Test webviews.

CI failed on 65fe235b08 (run 37504574040 attempt 1): 1 unknown.
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped.

Job Verdict Why
web / react-apps-check unknown no known signature; failed step: Test webviews

Not re-run automatically: web / react-apps-check is not a machine failure.

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.

teamleaderleo and others added 5 commits October 5, 2026 23:26
…h labels only

Keeps ComposerPickers.tsx under its ui-rules pending count (no raw role or key
handlers) and drops the explanatory pending/compact hint copy.

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

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ar.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/bs.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/da.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/de.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/en.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/es.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/fr.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/it.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ja.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/km.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ko.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/nb.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/pl.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/pt-BR.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ru.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/th.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/tr.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/uk.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/vi.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/zh-Hans.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/zh-Hant.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
#	webviews/src/agent-session/acpmux/ComposerContext.tsx
#	webviews/src/agent-session/acpmux/projectChooser.test.tsx
#	webviews/src/agent-session/acpmux/styles.css
…poser-footer

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ar.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/bs.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/da.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/de.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/en.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/es.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/fr.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/it.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ja.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/km.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ko.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/nb.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/pl.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/pt-BR.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ru.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/th.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/tr.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/uk.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/vi.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/zh-Hans.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/zh-Hant.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 6, 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 added a commit that referenced this pull request Oct 6, 2026
next-batch/20261006: #17527 and #17537 were validated green but
web / react-apps-check failed on formatting and blocked landing.
python3 -m unittest tests.test_next_batch: 5 failing.

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

Copy link
Copy Markdown
Collaborator Author

Batch queue: green. Stack next-batch/20261006 at 954248bfe072 (feat-cmux-next 7cf558be8de1 + #17527 #17537 #17542 #17553 #17554 #17559, generated files regenerated) built on the fleet, production: job c8f563681211aa65c6e94453, tag next-batch-f16f40ea (cmux-ci artifact c8f563681211aa65c6e94453). Validated this PR at 7087d7e3c145.

Own check still red: web / react-apps-check, formatting. Run bun run check:fix in webviews/ and push.

Next: land it yourself with gh-merge-green on this receipt.

…poser-footer

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
@cursor

cursor Bot commented Oct 6, 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

Batch queue: green. Batch stack c03ab5ca52f8 on feat-cmux-next 3892c6ce7b55 with #17520 #17527 #17534 #17537 #17541 #17542 #17551 #17552 #17553. Fleet production build: job d1e25b8a9144e8ef3ef2287e (cmux-ci artifact d1e25b8a9144e8ef3ef2287e (job d1e25b8a9144e8ef3ef2287e, tag nb-local-20261006-160146-1)). heavy tier did not run on this branch (run); your PR's own checks are the tests. Validated this PR at 71989ada83a0.

Next: land it yourself with gh-merge-green on this receipt.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Batch queue: green. Batch stack 585c7c73df5a on feat-cmux-next b7cd157736d2 with #17534 #17537 #17551 #17552 #17556 #17582 #17583 #17588 #17590. Fleet production build: job 4a08261515853623d652f844 (cmux-ci artifact 4a08261515853623d652f844 (job 4a08261515853623d652f844, tag nb-local-20261006-162817-1)). heavy tier did not run on this branch (run); your PR's own checks are the tests. Validated this PR at e575a6a99879.

Next: land it yourself with gh-merge-green on this receipt.

…poser-footer

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
…poser-footer

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ar.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/bs.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/da.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/de.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/en.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/es.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/fr.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/it.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ja.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/km.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ko.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/nb.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/pl.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/pt-BR.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/ru.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/th.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/tr.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/uk.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/vi.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/zh-Hans.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/locales/zh-Hant.js
#	Packages/macOS/CmuxNext/Sources/CmuxNextAgentPane/Resources/agent-pane/pane.js
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Batch queue: green. Batch stack b034a977a4d8 on feat-cmux-next d4056375d08d with #17537 #17597 #17599 #17602 #17604 #17609 #17611 #17613. Fleet production build: job 24360b4ae2a093d871aa1591 (cmux-ci artifact 24360b4ae2a093d871aa1591 (job 24360b4ae2a093d871aa1591, tag nb-local-20261006-180248-1)). heavy tier did not run on this branch (run); your PR's own checks are the tests. Validated this PR at 65fe235b0877.

Next: land it yourself with gh-merge-green on this receipt.

@teamleaderleo
teamleaderleo merged commit 96f7421 into feat-cmux-next Oct 6, 2026
59 of 62 checks passed
@teamleaderleo
teamleaderleo deleted the op-next-composer-footer branch October 6, 2026 18:20
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/37510605955 at 96f7421 failed: cmux-next generated files, cmux-next swift test.
Those jobs last passed at 9872eec. This pull request is one of 3 merged since: #17599, #17597, #17537.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/37515600457 at ff267c4 failed: cmux-next swift test.
Those jobs last passed at 3088ebf. This pull request is one of 5 merged since: #17597, #17537, #17621, #17600, #17605.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

teamleaderleo added a commit that referenced this pull request Oct 7, 2026
* test(cmux-next): batch dispatch runs every dispatch-gated job (red)

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

* ci(cmux-next): run every tier when dispatched on a next-batch branch

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

* test(ci): cmux-next batch queue selection, stacking and bisect (red)

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

* ci(cmux-next): implicit batch queue for feat-cmux-next

Debounced PR events dispatch one batch: stack eligible PRs on
feat-cmux-next, rebuild conflicted generated files, run every cmux-next
tier and a fleet production build on the stack, then land each PR with
gh-merge-green or bisect a red stack to its culprit.

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

* fix(ci): address batch workflows by id, not file name

feat-cmux-next is not the default branch, so the Actions API cannot find
a workflow file that exists only there by its name.

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

* fix(ci): batch keeps one base and never blames a PR for a fleet failure

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

* fix(ci): batch skips workflow changes and stays off until enabled

GitHub refuses the job token's push or merge of a .github/workflows
change, so those PRs land by hand. Debounce dispatches only when
CMUX_NEXT_BATCH_ENABLED is 1.

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

* fix(ci): create batch branches at the base before pushing the stack

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

* fix(ci): batch pushes and merges with an App token; terse bot comments

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

* docs(ci): batch queue App token, off switch and workflow PRs

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

* test(ci): batch queue serve loop, remote regeneration and local fleet build (red)

python3 -m unittest tests.test_next_batch: 14 failures, all in the new
ServeDebounce, RemoteRegeneration, LocalController and regen workflow tests.

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

* feat(ci): serve the batch queue under a gh login; regenerate on runners

next_batch.py serve polls open PRs, debounces like the debounce job and
runs one batch at a time with the operator's gh login, so it runs without
the batch App. Its pushes and merges start CI, so nothing is re-dispatched
after landing; the fleet build uses the host's cmux-ci.

Generators run the stack's code, so they no longer run on the controller:
regen-linux (web, SDK) and regen (Swift) check out the stack with a
read-only token and return a patch that the controller applies and pushes.

python3 -m unittest tests.test_next_batch: 41 pass (14 failed on 552c900).

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

* test(ci): Swift regeneration runs the workflow ref's generator (red)

next-batch/20261006: the regen job ran the stack's own copy of
regenerate-swift-exports.sh, which the stack does not have yet (exit 127).
python3 -m unittest tests.test_next_batch: 1 failure.

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

* fix(ci): run the Swift export generator from the workflow's ref

The stack checkout keeps the stack's code; only the generator script comes
from the trusted ref. python3 -m unittest tests.test_next_batch: OK.

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

* test(ci): retry a mini job that was refused before writing a result (red)

next-batch/20261006: the Swift regen job was refused at runner setup (a
fleet build was waiting for the host) and the batch gave up.
python3 -m unittest tests.test_next_batch: 3 errors.

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

* fix(ci): dispatch a mini job once more when it wrote no result

python3 -m unittest tests.test_next_batch: OK.

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

* test(ci): a production fleet build passes no backend mode (red)

cmux-ci build --production --backend-mode local: "production builds cannot
use offline backend mode". python3 -m unittest tests.test_next_batch: 1 failure.

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

* fix(ci): submit the production fleet build without a backend mode

python3 -m unittest tests.test_next_batch: OK.

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

* test(ci): the queue formats a PR's webviews before landing it (red)

next-batch/20261006: #17527 and #17537 were validated green but
web / react-apps-check failed on formatting and blocked landing.
python3 -m unittest tests.test_next_batch: 5 failing.

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

* fix(ci): format a PR's webviews on a runner before landing it

A PR changing webviews/ whose only red is web formatting stays eligible.
Before landing it, regen-linux runs bun run check:fix (formatter and lint
autofix) on its head and the queue pushes the patch to the PR's branch;
gh-merge-green waits for the rerun. python3 -m unittest tests.test_next_batch: 50 OK.

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

* test(ci): serve posts a receipt for owners instead of merging (red)

Landing from the queue host is not allowed yet; owners land on the
receipt. A receipt names the heavy jobs that ran, since cmux-next.yml
skips them on next-batch/* until this PR is on feat-cmux-next.
python3 -m unittest tests.test_next_batch: 4 failing.

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

* fix(ci): serve posts a receipt and owners land, unless --land

python3 -m unittest tests.test_next_batch: 54 OK.

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

* test(ci): page the open-PR query and retry a gateway timeout (red)

next_batch.py select: gh api graphql failed: gh: HTTP 504 (100 PRs with
files and checks in one query). python3 -m unittest tests.test_next_batch: 2 failing.

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

* fix(ci): page the open-PR query 30 at a time and retry a 5xx once

python3 -m unittest tests.test_next_batch: OK; next_batch.py select: OK.

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

* test(ci): a local run posts receipts unless --land (red)

python3 -m unittest tests.test_next_batch: 1 failing.

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

* fix(ci): a local run posts receipts unless --land

python3 -m unittest tests.test_next_batch: OK.

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

* test(ci): an owner push during formatting waits for the next batch (red)

Batch local-20261006-153816: #17534's owner pushed while its formatting
ran; the report showed a raw git push error. python3 -m unittest tests.test_next_batch: 1 error.

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

* fix(ci): an owner push during formatting leaves the PR for the next batch

python3 -m unittest tests.test_next_batch: OK.

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

* fix(ci): a PR with a green receipt at its head is not validated again

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

* test(ci): the queue never pushes to a branch it does not own (red)

An opted-in PR by another author got the formatting push too.
python3 -m unittest tests.test_next_batch: 1 failure.

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

* fix(ci): push formatting only to batch authors' branches

python3 -m unittest tests.test_next_batch: OK.

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

* test(ci): serve reports a batch author's PR closed by someone else (red)

Detect and alert only: number, actor and time to the coordinator; one
alert for 3 or more within 10 minutes. python3 -m unittest tests.test_next_batch: 4 errors.

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

* feat(ci): serve reports a batch author's PR closed by someone else

The minute poll runs on its own thread, so it keeps going while a batch
runs; a PR leaving the open set costs one lookup. Detect and alert only.
python3 -m unittest tests.test_next_batch: 63 OK.

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

* test(ci): retry a truncated GraphQL reply once (red)

serve log 20:34 and 20:37 UTC: gh api graphql failed: unexpected end of
JSON input. python3 -m unittest tests.test_next_batch: 1 failure.

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

* fix(ci): retry a truncated GraphQL reply once

python3 -m unittest tests.test_next_batch: OK.

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

---------

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

1 participant