Skip to content

fix(chief memory): a scripted Import Memories run never lists ~/Downloads or ~/Desktop - #28882

Merged
lawrencecchen merged 6 commits into
feat-cmux-nextfrom
fix/chief-memory-import-scripted-no-exports
Nov 1, 2026
Merged

lawrencecchen merged 6 commits into
feat-cmux-nextfrom
fix/chief-memory-import-scripted-no-exports

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Privacy bug (the independent review of #28820 found it): if a chief.importMemories run names no source, the action still runs optchat-chief memory import-from detect --exports, whatever the origin of the run. Thus a script, an agent or the CLI can make cmux list ~/Downloads and ~/Desktop (folders that macOS guards, which also shows the folder prompt) before the dialog opens, with no action from the person.

After this change, only the person's own run in the app sends --exports. That run must have the user origin, the control socket must not carry it, and it must name no caller app, agent chat or terminal. A run from any other caller lists only the agents' own folders. A script can still import a zip if it names the zip (source: zip:/path).

  • ChiefMemoryImportHandlers.detectArguments(muxHome:invocation:) and offerDetectArguments(muxHome:) are pure functions that the tests call.
  • The person predicate moves from ScreenshotHandlers.isPersonsRun to ActionInvocation.isPersonsOwnRun (CmuxNextActions). Thus the raw-pixel rule and this rule are one rule. The behavior of screenshots does not change.
  • New test ChiefMemoryImportExportsTests: the launch-time offer never sends --exports (the reviewer said that this test was missing). Only a person's own run sends it.

Testing

Focused command (fleet):

cmux-ci run --class light --script scripts/ci/package-test-lane.sh --ref SHA --arg=suite --arg=Packages/macOS/CmuxNext --arg=ChiefMemoryImportExportsTests --label suites
  • Red at commit 1, 5f4e4a2 (the seam with the old behavior, plus the test): step 3ad07bc5df4cbce1d136b6c1 (aws-m4pro-1) fails on its own assertions: onlyThePersonsOwnRunListsTheExportZips records 9 issues (5 non-user origins, the socket run that claims user, and the 3 named callers all get --exports). theLaunchTimeOfferNeverListsTheExportZips passes, because the offer was already fixed by fix(chief memory): the launch-time memory offer never lists ~/Downloads or ~/Desktop (restores the #28811 test) #28820.
  • Green at the head, b661016 (ChiefMemoryImportExportsTests, MaskedScreenshotTests, ChiefMemoryImportTests, ActionOriginTests): step 6fa3ae1b30565a39628ee9b8 (cmux10s-Mac-mini) passes, all 4 suites (32 tests).
  • Compile (cmux-ci compile-check --package CmuxNext --app --recipe-version 2): job 2cc884a8c56a0c6c096fcb46 passed: CmuxNext 202 s, app 53 s, cmux-tui 37 s.

Observed / Not run

Observed:

  • scripts/cmux-next/prepush-gate.py: no new violations. CmuxNextApp is 2 lines smaller (arch-ratchet app_lines -2).

Not run:

  • No live check with a script that sends action.run chief.importMemories to a tagged build.

Proof

No capture: the dialog does not change. Only the folders that a scripted run lists change.

Changelog

  • Fixed: Import Memories started by a script or an agent no longer lists files in Downloads or Desktop.

…loads or ~/Desktop (red)

chief.importMemories with no source runs detect --exports for any caller:
a script, an agent or the CLI through the control socket makes cmux list
~/Downloads and ~/Desktop (and raise the macOS folder prompt) before the
dialog shows. Only the person's own run in the app may ask for the export
zips.

This commit moves the choice of the detect arguments into
ChiefMemoryImportHandlers.detectArguments(muxHome:invocation:) and
offerDetectArguments(muxHome:) with no change in behavior, and adds
ChiefMemoryImportExportsTests. onlyThePersonsOwnRunListsTheExportZips
fails here: every origin still gets --exports. The next commit fixes it.
…Downloads or ~/Desktop

A chief.importMemories run that names no source asked optchat-chief for
detect --exports whatever its origin, so a script, an agent or the CLI
through the control socket made cmux list ~/Downloads and ~/Desktop, the
folders macOS guards, with no action of the person.

detectArguments now passes --exports only for
ActionInvocation.isPersonsOwnRun: origin user, not carried by the control
socket, and naming no caller app, agent chat or terminal. Any other run
lists only the agents' own folders; a script still imports a zip by naming
it (source zip:/path). The predicate moves from ScreenshotHandlers.isPersonsRun
into CmuxNextActions, so the raw-pixel rule and this rule are one rule.

Reported by the independent review of #28820.
@github-actions

github-actions Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

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

Review b661016: 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=pr28882 -f ref=fix/chief-memory-import-scripted-no-exports -f platform=macos -f backend_mode=local

Default changes

This pull request changes 6 defaults at 7a8df968ca74 (what everyone gets without configuring anything):

  • tunable-source.CmuxNextApp/ChiefMemoryImport/ChiefMemoryImportHandlers.swift:bind: "006fa39a3185323b62f9fb81762b1ac441d1f88dd1e00100f4bc69a7cb6664ae" -> "133dba8cd09af0dfd422b6de87b6e3d3d405ddf0d4825343fad314f004ce256d"
  • tunable-source.CmuxNextApp/ChiefMemoryImport/ChiefMemoryImportHandlers.swift:detectArguments: (none) -> "cef832ba952bcb743849088ae3d29b963714a01a4790fac0874854021b91a7f7"
  • tunable-source.CmuxNextApp/Screenshots/ScreenshotHandlers.swift:bind: "3561e2dff059258771876af7399b4093e6259350c05af696fb727adec62ff652" -> "b70780f5b8c603f75d5d4f43fad8e7f519e3608c9ec6f3b5c3e6546b560758da"
  • tunable-source.CmuxNextApp/Screenshots/ScreenshotHandlers.swift:isPersonsRun: "b0c4a2e9432a6aed2b87b4fdc866a429b6ffc614458ec2a9a809323fc2b67dea" -> (none)
  • tunable-source.CmuxNextApp/Screenshots/ScreenshotHandlers.swift:shown: "5304ca25f312a42eafce3bc85c37d2c0b99f73caa37ad07578c36909fb3c367c" -> "138c1be06518136bb6c13a4160bc6ace749021acb408d728763d7579a51dcce5"
  • tunable-source.CmuxNextApp/Screenshots/ScreenshotHandlers.swift:start: "88c48ddffbc75f20524cdb7526896fd6408db5a2801325f80757389b24bb8189" -> "35ca50858d0d7f65ad0a5d0696035f03a4b0b5239344e5945b02a26c7731ba0a"

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 7a8df968ca74c1005a2f2812896a679a2ab4802b, 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 @austinywang or @teamleaderleo (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 3b3e0c4dcbc4 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.

Shipped in:

@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Review (claude-opus independent reviewer): SHIP at b661016

Correctness checked by reading the diff and every entrypoint; no blocking finding.

  1. The predicate is identical. ActionInvocation.isPersonsOwnRun (Packages/macOS/CmuxNext/Sources/CmuxNextActions/ActionInvocation.swift:159-161) is origin == .user && !viaControlSocket && callerApp == nil && callerAgentSession == nil && callerTerminal == nil, the same as the removed ScreenshotHandlers.isPersonsRun. All 3 screenshot call sites use it (ScreenshotHandlers.swift:79, :116, :162). AppWindowImage.swift:24 and ActionOriginTests.swift:192 change only doc text. MaskedScreenshotTests.swift:411-428 keeps the same cases. Screenshot behavior does not change.
  2. Capture and wiring are correct. detectArgs is computed synchronously in the bind closure from the run's own invocation (ChiefMemoryImportHandlers.swift:35), before the Task. It is a [String] (Sendable), and the Runner's detect receives it (:44, :119). muxHome(context) was already read on this turn by resolveTarget, so the turn does no new work. detectForOffer still calls offerDetectArguments, which is detect() with no --exports (:72, :77).
  3. The person's own runs still list the zips. Palette: ActionInvocation() defaults to .user (CmuxNextPalette/RegistryPaletteProvider.swift:137, :142). Home first-run offer click: HomeHostView.swift:248. Chief row context menu: TopHomePageView.swift:130, 141. The action has no main-menu surface. In the Sources tree, only the control socket sets viaControlSocket or a caller (RegistryControlBridge.swift:220-226, ControlRouter+ActionRun.swift:103-105, ImportSuggestionsCenter.swift:309-329, DebugToast.swift:47). So action.run and action.batch from the CLI, MCP, an agent or an app all lose --exports, as intended. CLI and MCP are guiOnly-exempt (AgentActionCatalog.swift:543), so the generic socket action.run is the only automation path, and it is covered.
  4. No other path lists the zips. --exports is passed only through MemoryImportCommand.detect(exports:) (CmuxNextChiefMemory/Import/MemorySource.swift:127). On the Rust side, detect_with_exports runs only on that flag (Native/OptChat/optchat-chief/src/memory_sync.rs:469-470). The plain detect reads only agent folders (memory_sync_state.rs:31-58). No Swift, webview or script path calls import-from detect.
  5. The tests are non-vacuous. The red commit 5f4e4a2 keeps exports: true behind the seam. The 9 recorded issues match the cases: 5 non-user origins, 1 socket run that claims user, and 3 named callers. The positive .user case stops a vacuous "never exports" fix. The offer test locks LAUNCH-NO-TCC-PROMPTS. Limit: the test calls the pure seam, not the bound handler, so the one-line wiring at ChiefMemoryImportHandlers.swift:35/44 is verified only by reading. This is acceptable, because bundledTool() needs the app bundle.
  6. Package conventions are met. It is an instance property on an existing struct that already has instance members, so the namespace rule (caseless enum or all-static type) does not apply.

Non-blocking:

  • ActionInvocation.swift:154: the struct is public nonisolated, but the new public extension has no nonisolated. In this .defaultIsolation(MainActor.self) package (Package.swift:145), the property is probably main-actor isolated. All current callers are on the main actor, the same as the old static, so nothing breaks. Consider nonisolated public extension ActionInvocation (the pattern in ActionCatalog+Focus.swift:8) so that socket-side or off-main code can call the predicate.
  • defaults guard is red only on tunable-source fingerprints: ChiefMemoryImportHandlers bind and detectArguments, ScreenshotHandlers bind, isPersonsRun, shown and start. No default value changes. This receipt satisfies the guard. The base autofix regenerates schemas/defaults/cmux-next.json, so do not hand-edit it.
  • These reds do not come from this PR. cmux-next swift test stopped at the 1500 s limit with reds in unrelated suites; ChiefMemoryImportExportsTests, MaskedScreenshotTests and ActionOriginTests passed in that run. cmux-next app compile (build fleet) got no verdict: controller unreachable, cmux-ci exit 69. Run that job again. The fleet compile-check job 2cc884a8c56a0c6c096fcb46 named in the PR body passed.

@lawrencecchen lawrencecchen added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 31, 2026
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Non-green checks at head b661016. None of them come from this PR:

  • cmux-next fleet Release compile, cmux-next app compile (build fleet) and cmux-next/compile: the controller gave "no result" (it timed out on requests at that time). These are infrastructure reds, and I started a rerun at the same SHA. The fleet compile job 2cc884a8c56a0c6c096fcb46 at this head passed CmuxNext, app and cmux-tui.
  • cmux-next swift test: the run hit the 1500 s limit, with reds in unrelated suites. ChiefMemoryImportExportsTests, MaskedScreenshotTests and ActionOriginTests passed in that run, and fleet step 6fa3ae1b30565a39628ee9b8 passed all 4 suites.
  • defaults guard: only the fingerprints of tunable sources changed, no default value. The base autofix regenerates schemas/defaults/cmux-next.json.
  • nightly-guards / release-notary: base finding.

@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 16:45 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 16:45 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 19:43 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 19:43 Inactive
lawrencecchen pushed a commit that referenced this pull request Oct 31, 2026
…oads or ~/Desktop (#28882)

merge-batch candidate: the squash merge of #28882 at 193f3d7
lawrencecchen pushed a commit that referenced this pull request Oct 31, 2026
…oads or ~/Desktop (#28882)

merge-batch candidate: the squash merge of #28882 at 193f3d7
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 21:44 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 21:44 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 21:49 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 23:48 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent October 31, 2026 23:48 Inactive
@cursor

cursor Bot commented Oct 31, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

lawrencecchen added a commit that referenced this pull request Nov 1, 2026
…ds ~/Desktop until the person shows it (#28907)

* test(chief memory): a scripted Import Memories run never lists ~/Downloads or ~/Desktop (red)

chief.importMemories with no source runs detect --exports for any caller:
a script, an agent or the CLI through the control socket makes cmux list
~/Downloads and ~/Desktop (and raise the macOS folder prompt) before the
dialog shows. Only the person's own run in the app may ask for the export
zips.

This commit moves the choice of the detect arguments into
ChiefMemoryImportHandlers.detectArguments(muxHome:invocation:) and
offerDetectArguments(muxHome:) with no change in behavior, and adds
ChiefMemoryImportExportsTests. onlyThePersonsOwnRunListsTheExportZips
fails here: every origin still gets --exports. The next commit fixes it.

* fix(chief memory): only the person's own Import Memories run lists ~/Downloads or ~/Desktop

A chief.importMemories run that names no source asked optchat-chief for
detect --exports whatever its origin, so a script, an agent or the CLI
through the control socket made cmux list ~/Downloads and ~/Desktop, the
folders macOS guards, with no action of the person.

detectArguments now passes --exports only for
ActionInvocation.isPersonsOwnRun: origin user, not carried by the control
socket, and naming no caller app, agent chat or terminal. Any other run
lists only the agents' own folders; a script still imports a zip by naming
it (source zip:/path). The predicate moves from ScreenshotHandlers.isPersonsRun
into CmuxNextActions, so the raw-pixel rule and this rule are one rule.

Reported by the independent review of #28820.

* test(screenshots): a Screenshots model not started reads and watches no folder (red)

~/Desktop is macOS's default screenshot folder, which macOS guards. The
Screenshots page reads and watches its folders as soon as the page is made,
and an agent or a script makes it with no action of the person (cmux
browser on its tab, the DevTools relay, screenshots.open with focus: true).

This commit adds ScreenshotsModel(listsAtOnce:), isListing and
startListing() with no change in behavior (every model still lists at
once), and ScreenshotsModelListsOnlyWhenStartedTests, which fails here: a
model made with listsAtOnce: false lists and watches ~/Desktop. The next
commit fixes it and makes the app's page start listing only when it is on
screen.

* fix(screenshots): a Screenshots page reads ~/Desktop only once it is on screen, and only the person's run puts it there

The Screenshots page read and watched its folders, ~/Desktop (macOS's
default screenshot folder, which macOS guards) among them, as soon as the
page was made. An agent or a script makes it with no action of the person:
cmux browser on its tab and the DevTools relay make the page off screen,
and screenshots.open with focus: true put the tab in front.

ScreenshotsModel(listsAtOnce: false) now reads and watches nothing until
startListing(). The app's page model is made that way and starts listing
when the page is first on screen (setContentVisible(true), which only the
pane that shows the tab calls). screenshots.open selects the tab only for
ActionInvocation.isPersonsOwnRun (the rule of #28882); any other run opens
it in the background.

A tab the person left on screen is restored on screen and lists at once:
that is the person's own view, as Chrome reloads a restored tab.

* test(screenshots): a restored or agent-shown Screenshots page lists nothing until the person clicks (red)

The review of #28907 found that showing the page is not the person's
choice: an agent can show a background Screenshots tab (cmux tab focus,
a browser mirror, the Home mirror), and a tab restored on screen reads
~/Desktop at launch, which raises the macOS folder prompt after a privacy
reset or on a new Mac (LAUNCH-NO-TCC-PROMPTS).

This commit adds the seams ScreenshotsView.showsPrompt and
showScreenshots(), and ScreenshotsOpen (the decision of a screenshots.open
run) with the old behavior, and the tests:
- ScreenshotsPageListsOnlyAfterTheClickTests: a page made by the app and
  shown (restored on screen, or shown by an agent) lists nothing and shows
  the prompt until the person clicks; it fails here (showing it lists).
- screenshotsOpenFromAScriptWithFocusSaysItOpenedInTheBackground (the
  handler, on a real window): a scripted run with focus says that it
  opened the tab in the background; it fails here (it says nothing).
- ScreenshotsOpenDecisionTests: only the person's run selects and lists at
  once, and every other run gets a note; it fails here.

* fix(screenshots): a Screenshots page lists nothing until the person clicks Show Screenshots in it

The review of #28907 (FIX) found that showing the page is not the person's
choice. An agent can show a background Screenshots tab (cmux tab focus, a
browser mirror, the Home mirror), and a tab restored on screen read
~/Desktop at launch, which raises the macOS folder prompt after a privacy
reset or on a new Mac (LAUNCH-NO-TCC-PROMPTS). Chrome's reload of a
restored tab is no precedent here: Chrome passes no OS privacy gate.

- ScreenshotsView shows a Show Screenshots prompt (title, one line on why,
  one button) until the person clicks it; only that click starts the model
  listing. Shown, focused or restored, the page reads and watches nothing.
  The prompt goes in one frame, with no animation; its fonts come from the
  app's Typography.
- The app's page model is made with listsAtOnce: false, and
  setContentVisible no longer starts listing.
- screenshots.open: only the person's own run (isPersonsOwnRun) brings the
  tab to the front; any other run, with --focus too, opens it in the
  background and says so (result opened: background, and a note), never a
  silent background open. The decision is ScreenshotsOpen.
- ScreenshotsModel.apply does nothing before listing starts.
- Four new strings in all 21 locales of the Screenshots catalog.

* test(screenshots): the click-gate test checks plain values, so a red run never reflects the view

In the red run (step c6a93fd37237b33f8c12418c) the test failed on its own
assertion, then the test process crashed while Swift Testing described the
next failed expectation: it reflected ScreenshotsView and hit a null
NSPasteboard. The handler test after it never ran. Each expectation now
checks a Bool that is read first.

* test(screenshots): no detection before the click, the click remembered per tab, and screenshots.open says what it did (red)

The review of 791f3d7 (FIX) found:
- folder detection ran before the click (makePage); it reads other apps'
  containers and checks folders under ~/Desktop, which can raise a macOS
  prompt at launch for a restored tab;
- the keyboard could not reach Show Screenshots (the hidden grid took focus);
- the click was kept on the page, so a page made again (hibernation wake,
  engine switch) asked again;
- ScreenshotsModel listed at once by default;
- screenshots.open told a script "opened in the background" for a tab
  already open and listing; the unselected tab and the no-window refusal
  had no test.

This commit adds the seams ScreenshotsGate (unlocked tabs by key),
ScreenshotsView.onShowScreenshots and focusTarget, and an injectable
ScreenshotEnvironment for ScreenshotsPageService, all with the old
behavior, and the tests ScreenshotsGateTests and ScreenshotsGateWiringTests,
which fail here.

* fix(screenshots): nothing is detected before the click, the click is kept per tab, and screenshots.open says what it did

The fixes for the review of 791f3d7 (FIX):
- Folder detection (which reads other apps' containers and checks folders
  under ~/Desktop) runs only after the person's first Show Screenshots click
  (ScreenshotsGate.mayDetect); before it, a restored or agent-made page
  reads nothing at all.
- The click is kept per tab key (ScreenshotsGate), so a page made again
  after a hibernation wake or an engine switch lists with no second click.
- While the prompt is up, focusing the tab focuses the Show Screenshots
  button (Space presses it; no Return key equivalent), not the hidden grid.
- ScreenshotsModel lists only when its caller says so (listsAtOnce
  defaults to false).
- The prompt's secondary text uses the palette (Palette.textSecondary).
- screenshots.open from a script on a tab already open answers
  opened: existing with listing true or false (and a note while it waits
  for the click), not "opened in the background".
- SystemScreenshotsWorkspace (the open and reveal adapter) moves from
  CmuxNextApp into CmuxNextScreenshots.
- A What's New highlight, and one new string in all 21 locales.

* test(screenshots): the answer for a Screenshots tab already open is tested on ScreenshotsOpen

The red run at d5198fd (step bfd0f9bd9fc2d72fa22f0be0) showed that
screenshotsOpenSaysWhatItDid passed there: its existing-tab part ran only
when the new tab was in the pane, and in a test with no daemon the tab
never arrives, so that part was skipped. That part moves to
ScreenshotsOpenDecisionTests, on ScreenshotsOpen.result: a new tab opened
behind, the tab already open and listing, and the tab already open and
waiting for the click. The handler test keeps the background answer.

* test(screenshots): Space shows the screenshots without Full Keyboard Access, and the wiring test never reads the test Mac's Desktop (red)

The third review (FIX at bf28c6a) found that the Show Screenshots
button takes the keyboard only with Full Keyboard Access on, so with the
default setting Space did nothing; and that one wiring test ran the real
detector after its click, which lists the test Mac's own Desktop.

spacePressesShowScreenshotsWhileThePromptIsUp: while the prompt is up the
pane itself takes the keyboard and Space shows the screenshots; it fails
here (the focus target is the button, and Space does nothing). The click
test now uses a fake detection environment. The unused
ScreenshotsGate.forget leaves the gate test.

* fix(screenshots): Space shows the screenshots with the default keyboard setting; the title is themed; a script with no pane is refused; the highlight validates

The fixes for the third review (FIX at bf28c6a):
- B: while the prompt is up the pane itself takes the keyboard
  (acceptsFirstResponder) and Space shows the screenshots: a plain button
  takes the keyboard only with Full Keyboard Access on. After the click the
  keyboard goes on to the grid.
- A: the What's New highlight has its action line (screenshots.open), so
  the highlight validator passes.
- E: the prompt title takes Palette.textPrimary.
- F: screenshots.open with no focused pane is refused (No pane is focused),
  never a silent success.
- D: the unused ScreenshotsGate.forget is gone; a click stays for the life
  of the process (tab keys are durable).
- G: the click test uses a fake detection environment.

* test(screenshots): the Space test checks plain values, so a red run never reflects the view

Its red run (step 7dd4a41d0e08065a142e97fc) crashed while Swift Testing
described a failed expectation on two views (a null NSPasteboard in the
reflection), as the click test did before. It now compares Bools.

* chore(next): PR autofix

The regenerated files from autofix run 41198445289 at e04a9b9 (its
pr-autofix-patch artifact): ci-target-graph.json (CmuxNextScreenshots now
depends on CmuxNextCompat), action-surfaces.json and actions.md
(screenshots.open is an effect binding), the CLI and palette reference
docs, and schemas/defaults/cmux-next.json. The run's push job did not run:
it needs a non-pull_request event, and pull_request is the only trigger.

* chore(next): this PR carries no generated output (take the base's copies)

The security of the merge (review FIX at cef95c1): the autofix patch
was applied with git apply, not with pr-autofix-apply.sh, so it pushed
outputs this pull request does not own (bot-only schemas/defaults, the CLI
and palette references, and export rows regenerated against an older base;
merged with a newer base, action-surfaces.json and actions.md removed 155 of
the base's rows, the #21946 problem). generated_outputs.py drift also says
ci-target-graph.json is written by the base autofix only.

All six now equal origin/feat-cmux-next; the base autofix regenerates them
after this pull request merges. The commit message of cef95c1 was also
wrong: the export change there was the base's automations.show, not
screenshots.open.

---------

Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
@lawrencecchen
lawrencecchen merged commit 3b3e0c4 into feat-cmux-next Nov 1, 2026
211 of 226 checks passed
@lawrencecchen
lawrencecchen deleted the fix/chief-memory-import-scripted-no-exports branch November 1, 2026 02:21

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 7a8df968 Deployed Oct 31, 2026 by cmux-bot[bot] via cmux-tui tree preflight #92112
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant