Repository navigation
Custom panes built with Chief, and an App Store review flow - #26713
austinywang wants to merge 119 commits into
Conversation
…ue 26579) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…26579) apps-web-call decides a web pane's cmux.call like a host call (grant, sandbox, no gesture); apps-web-log puts its console in the app's log ring; apps.registry.put lands an approved bundle after checking its hash and package. Only the hosting app connection may send them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AppRegistryDO keeps publishers, versioned submissions, their files and an audit log; /v1/apps/registry/ serves approved listings and bundles, person submissions, and an APP_REVIEWERS-gated approve/reject queue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An app with implements["cmux.pane/1"].web opens as its own page: the files of runtime.web.root under cmux-app://<namespace>/ with the host's CSP floor (the manifest's policy can only narrow it), a non-persistent store, no navigation off its origin, and one message handler. cmux.call goes to the supervisor as apps-web-call; the console goes to the app log. A local-reload or registry-put of the app reloads the page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#26579) The App Store page lists approved community apps (Get hands the bundle to the supervisor, then the usual install sheet), submits a local app under a publisher, shows the person's submissions, and gives reviewers a queue with the files and Approve/Reject. cmux.registry.* is answered on the Mac over the person's Cloud session; submit and a decision pass a native sheet. The registry refuses a manifest whose repository is not the publisher's, since such a bundle could never install. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…26579) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Bead |
- A manifest runtime.web.csp may use fetch directives, base-uri, form-action and sandbox only. report-uri, report-to and navigate-to could name a URL the page's data is sent to; the daemon's manifest rules, the registry and the pane host all refuse them. - A web pane has at most 64 calls in flight per app (app.limit), as an app host does; each call runs on its own daemon thread. - One App Store id pattern everywhere, the manifest schema's (a publisher may start with a digit and has at most 39 characters). - A bundle holds one manifest file: the registry read cmux-app.v2.json first and the catalog cmux-app.json, so a reviewer could approve one and the Mac install the other. The Mac packer reads the catalog's file. - Get takes the hash from the app's listing, not from the bundle it checks. - Registry puts run one at a time; a put fails when another copy shadows it. - The submit body is read in chunks and dropped past its limit. - The pane's root must resolve inside the package; the reload task ends with its view; console lines are capped over the pane's life too. - Tests: the navigation refusal is awaited, not timed; rustfmt on the daemon and Chief tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Correctness review (subagent) at ef49254: FIX, resolved in b7a4adeBlocking, all fixed
Non-blocking
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Swift Testing refuses a nested #require expansion; the manifests are unwrapped first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#26579) The one-manifest check compared exact names, but a Mac disk ignores case: cmux-app.v2.json (reviewed) plus Cmux-App.json would install the second through catalog::manifest_file. The registry and the daemon now refuse a second manifest in any case or one not named in lowercase, and the daemon refuses paths that differ only in case, as the registry does. A put whose id another source shadows is now refused before anything is written, and a web pane reloads on return to its window when its files changed while it was away. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WKWebView exposes RTCPeerConnection, and ICE reaches any STUN or TURN host that neither the content policy nor the egress gate sees: a sandboxed pane could send data out. The document-start script removes the WebRTC constructors, unrecoverably, before the page's first script. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rame (#26579) A same-origin about:blank child frame had its own RTCPeerConnection, since the removal script ran in the main frame only. Turn peer connections and DNS prefetch off in the pane's WebKit preferences (private keys, set only when WebKit answers their setter, as WebKitEngine does), and run the removal script in every frame. The test now checks two child frames. Crash-allow-OK: claude-subagent review round 4 of #26713 (recommended the responds(to:)-guarded peerConnectionEnabled preference) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Fresh-home launch of
Screenshot withheld: the pr-media privacy check or upload refused it.
|
|
Verification completed on
The description now records the final source, regression commands, base-red classification, and limits: no live public registry publication, macOS 14/15 runtime, or full Swift-suite pass is claimed. |
|
The current autoland report (2026-10-31 23:55 UTC) still classifies this head's Clippy ratchet failure as its own. The latest completed base run at 5eb0539d10fe52513d2888c8025958af38fb8890 and this head's job report the same two violations: The full repository classifier was executed against GitHub's completed jobs and exited 0: python3 scripts/ci/base_red_excuse.py --repo manaflow-ai/cmux \
--base feat-cmux-next --sha fc840535c397e46ea94f8ff51c95c8b48d601266 \
--check 'clippy (changed cmux-tui packages)'It reports: Head remains |
|
Review (fc840_correctness, inherited-red audit): SHIP at fc84053 The independent correctness reviewer rechecked autoland's Rust classification against the latest base failure and found no PR-caused ratchet defect. All 42 printed failure rows/locations match; the repository's actual The entire cmux-tui crate tree is identical between this head and merged base e899518 (tree |
# Conflicts: # cmux-tui/crates/cmux-tui-core/src/apps/local_reload.rs
|
Review (claude-review-subagent-cw): SHIP at 49dc3ba Scope: the merge commit 49dc3ba (parents 7c00e3b and feat dd61ce5). I read Merge resolution
Blocking time
Non-blocking
Verdict: no blocking defect. |
|
Conflict wave: merged feat-cmux-next dd61ce5 into this branch (merge 49dc3ba). There was one conflict, in cmux-tui-core Fleet evidence at 49dc3ba:
I did not add |
SW-08 independent security review — App Store publisher identity is first-claim, not verified (P1)Source at this PR's exact head Verified admission path:
Reproduction as a deterministic fixture: cmux user A, verified email but without control of GitHub Principled correction:
Scope and proof: code-confirmed first-claim behavior on an open, unmerged PR. No external account, GitHub repo or registry endpoint was accessed or tested; this is a pre-ship source finding. It is independent of WebKit's sandbox and of the store's manual code review. SW-08 parent: https://github.com/manaflow-ai/cmuxterm-hq/issues/5599. |
|
W2-17 independent source audit (advisory, at PR head
Small fix suggested to this existing owner: change the sample's Targeted falsification test (in an isolated test daemon/terminal, with user grant explicitly simulated): after Evidence level: current GitHub source, no local app install or test execution by this reviewer. This is a product-safety copy finding, not a merge HOLD request. I am retaining your custom-pane implementation and ownership; broader W2-17 results will be linked on HQ #5944. |
|
For awareness: this PR has a SHIP review at its head, but GitHub reports it as conflicting with |
Conflicts: - Package.swift: CmuxNextPages keeps the PR's CmuxNextIcons dependency next to base's BrowserCore and Files. - wrangler.jsonc: base's CloudDO script_name and production vars, plus the PR's AppRegistryDO binding outside production. - apps/local_reload.rs: base's Folders watcher (it watches a missing local folder appearing) supersedes the PR's create-dir watch_local; the PR's catalog_updates lock stays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ubmission A submit no longer claims an unowned publisher, so a pending or rejected submission cannot squat a name (SW-08). Approving the first submission under a publisher binds it to the submitter, audited as the reviewer's publisher.verify; approving one under a publisher another person owns is refused with registry.publisher_taken. Test: backend/apps/api test/app-registry.test.ts 'never lets an unapproved submission squat a publisher' (left to CI: the workers pool does not warm on this host). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A granted scope is not tied to a click: any code in the pane can send terminal input. The Workspace Board sample and the Chief skill now say so (W2-17). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… prompt The merge of feat-cmux-next brought a seventh built-in skill and the mcp-contact golden; count both skills in BUILTIN and give the new golden the custom-pane prompt line the other goldens carry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page logs "ready one" while it parses, so its didFinish could arrive
after that and be taken as the revocation's blank document: the title read
then found the old page ("one"). The test now waits for the entry page's
didFinish, and takes only an about:blank finish as the revocation.
Red: cmux-next swift test on 49dc3ba, all seven Revocation cases at
AppWebPaneUpdateTests.swift:49 (document.title).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts kept both sides: Package.swift deps (ChiefMemory and Icons), Chief BUILTIN skills (10 entries), PageFactory routes (registry and the new panels route), AppsClient state (changedFiles and eventListeners), manifest fixture tests, and production wrangler vars with the app registry left unbound. defaults_guard.py takes base's type-aware helper matching (#33161), which supersedes this branch's name-only fix; the three tests that asserted the old conservative name matching are dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The merge with feat-cmux-next joined test doubles from each side with protocol and struct changes from the other: - base's FakePanelsTransport now implements the PR's webCall, webLog and registryPut; - the PR's UpdatingPaneTransport now implements base's sessionInfoPanels; - base's sidebar integration Sources literal sets the PR's registry field. Found by review of the merge; no behavior change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Picks up #34476 (Windows workflow help and automation clippy). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
b078357 added automation ops to cmux-app-host/generated/scopes.json without resyncing the CmuxNextApps copy, so the app platform check (sync-app-runtime.sh --check) is red on feat-cmux-next and on this PR. Output of scripts/cmux-next/sync-app-runtime.sh; --check now passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot needs on-demand usage enabledBugbot 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. |
The send-path cap guard (#33145) now covers backend/apps/api/src and flags the App Store registry limits: MAX_FILES and MAX_DECODED_BYTES for one app bundle, MAX_SUBMIT_BODY and MAX_DECIDE_BODY for the submit and review bodies. These bound app packages a reviewer reads, not a message, prompt or attachment send, so they get safe: entries. tests/test_send_path_caps.py passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for review at What changed in this round
Review
Remaining reds, all also red on
|
Fixes #26579
Chief can build a local custom pane, have the person install it through the App Store's native consent sheet, and open it beside the chat. Saving its files reloads the pane. The store adds versioned submissions, a reviewer queue, and approved Community listings. The App Store entry stays behind the default-off Preview Features setting.
Design: custom-panes-DESIGN.md.
What changed
Changelog
Verification
Head
fc840535c397e46ea94f8ff51c95c8b48d601266, tree425d8d30851d47f3e3bc7dba4acd5c896360500c, normally merges basee899518539cd40b12ce14fb95281bddf38635a42. Both parents and incoming changes are preserved; no pushed history was rewritten. The registry/trajectory migration conflict preserves TrajectoryDO v20 in all environments and adds AppRegistryDO v21 only in local/development/staging. Production has neither the registry binding nor its creation migration.The lifecycle regression was committed before the fix. This focused command executed at regression commit
024b1dd30fcf24156d388f7f79bccd2419066649(fleet stepca220df482267e603bff8f15) and at this head (step3213c9dd36fde39bf949f3ef, which also selected the other seven focused suites):Before the fix, all seven revocation cases failed with 35 assertions: stale package resources/document and a still-enabled bridge. On this head, all seven pass, as do restoration, initial stale-disabled rejection, crash callbacks, and manifest replacement. This proves actual WebKit behavior, not a source-text assertion.
Observed / Not run
python3 tests/test_defaults_guard.py, 64 PASS. Static prepush gate and actual push hooks PASS. Release compile and defaults-guard rerun PASS.issue-26579-pane-flow-twentytwo, job725f5f9ebb83dfbd859d8174, PASS withworkspace_reset: true; artifact SHA25687cbd96e2d05127b8158d8e5d98a2d53cb5e72d5343b316ad230ffad8fd61a64. Try the tagged build. Local backend mode; this does not establish shared-service or production behavior.26579-custom-panes-app-storetag is preserved because it contains active chats and agents.Risk
risk:high: daemon socket commands, publication in the person's name, and a registry creation migration for local/development/staging. Preview Features defaults off; native install/update/publication consent and current daemon grants remain required. Review routes return 404 until reviewers are configured.cmux-platform: This existing registry implementation stays production-unbound pending its move to cmux-platform, a per-person pending-submission cap or write rate limit, and the required migration/promotion validation. This PR does not enable production.