Repository navigation
fix(agents): remove the owner-access read tools - #3123
Merged
kazemek21 merged 3 commits intoNov 9, 2026
Merged
Conversation
Remove owner_channel_list, owner_channel_get, owner_member_list, owner_read, owner_canvas_get and owner_canvas_history (block#2745, block#2881), with the OwnerAccess capability and BUZZ_OWNER_MCP_COMMUNITIES flag that only they used. Agents read only with their own access again. Stop and turn-lifetime fences, author-only edit selection, plugin and external isolation, the reserved owner_ plugin-tool prefix and channel archive/unarchive/delete rights are unchanged. Fixes NEXUS-4348 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Kyle Zemek <kylez@squareup.com>
…annel Background sync may read through the owner's session during the test; the refusal is the proof, and no owner-session read may name `private`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Kyle Zemek <kylez@squareup.com>
…nothing The owner's session holds the channel's messages; the read runs with the agent's key, which the relay answers with none, and never falls back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Kyle Zemek <kylez@squareup.com>
kazemek21
marked this pull request as ready for review
November 9, 2026 20:01
wpfleger96
added a commit
that referenced
this pull request
Nov 9, 2026
…restricted-communities * origin/main: ci: give WebKit shards headroom and keep fixture servers' idle connections open (#3074) fix(messages): offer Retry as soon as a send fails (#3080) fix(agents): link Settings from key failures and quote the provider (#3081) fix(identity): link Builderlab from Identity sync where its page holds the next step (#3082) fix(startup): show a recoverable screen when Buzz fails to open or crashes (#3085) fix(attention): ask before deleting a watch (#3092) fix(agents): remove the owner-access read tools (#3123) fix(channels): keep the side pane mounted under the image viewer (#3111) fix(solo): ask before Escape or Close drops a new workspace's typed fields (#3114) # Conflicts: # docs/configuration.md # vite.config.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TL;DR
Removes the six owner-session read tools that let a Buzz-hosted agent read with its owner's own access: channel, member and DM lists, channel details, messages and canvases. An agent's own reads and the channel archive, unarchive and delete changes are unchanged. The tools are gone from discovery on every harness, and a cached or direct call to one is refused before anything is read with the owner's session.
Fixes NEXUS-4348 · Initiative: https://blockcell.sqprod.co/sites/kylez-buzz-mcp-initiative/
Scope
Kyle's request was to remove "the channel/member/dm list/get" endpoints and leave the archive/delete channel changes for now. Removing
owner_readand the two Canvas tools as well is the initiative lead's interpretation: they read through the same owner session and handle, and leaving them would keep the owner-read capability this removes. If that is wrong, the #2881 half can be restored on its own.Removed
From #2745 (owner channels and members):
owner_channel_list,owner_channel_get,owner_member_list, their hint text and discovery on Claude Code, Codex, Pi, the session RPC and the harness kit.src/features/agents/owner-access.ts, the run handle'sownerAccessfield and the runner's host hook that built it for bundled-revision runs.BUZZ_OWNER_MCP_COMMUNITIESbuild setting (vite.config.ts). A distributor build that still sets it now gets nothing from it;docs/configuration.mdlists it with the other retired inputs.docs/agents.md,docs/configuration.md,docs/buzz-help.mdandsrc/buzz-mcp/AGENTS.md.From #2881 (owner messages and canvases):
owner_read,owner_canvas_get,owner_canvas_history,src/buzz-mcp/owner.tsand theOwner*client types.docs/relay-queries.mdparagraph, and the exports oftools.tshelpers that onlyowner.tsused.edited()keeps its author-only edit selection, minus the owner parameter.Kept
workLifetime,current()), which every Buzz tool call now depends on, and the channel-lifecycle changes (channel-lifecycle.ts, including itsrecordsparameter).addToolstill refuses plugin tool names starting withowner_, so a stale call to a retired name can never reach plugin code. There is no other owner-prefixed restriction and no new permission layer.Alternate routes checked
Nothing else reached these tools: no Rust, IPC, sidecar or RPC path, and Mesh and external agents use the same run handle that no longer carries owner access. Codex thread tool keys no longer carry the
:ownersuffix, so threads created with owner tools are replaced instead of reused with a stale tool list.Tests
The new tests list the six names as a fixed fixture rather than reading them from the catalog:
session-tools.test.ts:sessionTools()andsessionHint(), which every harness lists from, name none of the six.service.test.ts: a real bundled run handle has noownerAccess. With the owner's session stubbed to return anOWNER_ONLYmessage for an owner-only channel, each retired name is refused withNo tool <name>before any relay query. An ordinaryreadof that channel then runs with the agent's own key, filtered to that channel, and returnsNo messages.. The same client'sreadof the agent's own channel returns its message, and no read through the owner's session ever names the owner-only channel. External agents see none of the names and are refused the same way.codex/runtime.test.ts:dynamicToolslists none of the names, each call fails Codex's validation, a planted owner-access spy is never called, and the thread's ownreadworks.app-client.test.ts: a handle that still carries an owner capability doesn't pass it to the tool client.mem_getread instead of an owner tool.On a Blox box with these commits applied to main:
tscpasses, and the 12 affected Vitest files pass (claude, codex, goose, pi runtimes, app-client, tools, session-tools, service, kit, ACP client, channel-lifecycle). Full CI covers the rest.git push --no-verifyskipped the pre-push lanes (types-and-related-unit-tests, design-system, rust-clippy); CI'spnpm check, sharded Vitest and clippy jobs repeat all three.Fail-before check: the removal tests in
service.test.tsandcodex/runtime.test.tswere run against the pre-removal source (0a5c190). Three of them fail on real assertions:dynamicToolscontainsowner_channel_list.No tool owner_channel_list.ownerAccess.All three pass on this branch. Vitest strips types, so this check doesn't cover
tsc. Thesession-tools.test.tsdiscovery test also passes on the old source, because that source only lists the tools when the owner setting is on, so it doesn't count as a fail-before check.Not covered
Related open PRs
🤖 Generated with Claude Code (claude-opus-5-5) on behalf of kylez