Skip to content

fix(cli,relay): resolve agents by verified owner - #2615

Merged
wpfleger96 merged 3 commits into
block:mainfrom
johnmatthewtennant:fizz/users-owner-filter
Jul 27, 2026
Merged

fix(cli,relay): resolve agents by verified owner#2615
wpfleger96 merged 3 commits into
block:mainfrom
johnmatthewtennant:fizz/users-owner-filter

Conversation

@johnmatthewtennant

@johnmatthewtennant johnmatthewtennant commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Context

buzz users get --name Honey searches relay-wide profiles and returns up to 100 identically named results without verified ownership metadata. An agent resolving “my Honey” cannot distinguish the requesting human's agent from another owner's agent, and the owned match can be excluded by the result limit. This caused the wrong Honey and Bumble pubkeys to be added to a channel.

Summary

This bug fix makes personal-agent resolution owner-aware. Callers can filter profiles by a verified owner identity before result limits are applied, and all profile results expose enough ownership context to diagnose duplicate names.

Changes

  • Adds buzz users get --owner me|<hex>|<npub> for name and pubkey lookups.
  • Resolves me to the NIP-OA owner identity when the CLI runs as an agent.
  • Filters profiles by the relay's verified agent_owner_pubkey relationship before applying the result limit.
  • Returns owner_pubkey, owner_display_name, and client-relative owned_by_me in compact and JSON output.
  • Returns an empty result when no owned profile matches instead of removing the ownership constraint.
  • Rejects malformed owner values instead of silently running an unscoped query; explicit null remains equivalent to no owner filter for ordinary CLI lookups.
  • Rejects owner constraints on specialized channel-window, feed, and thread filters that cannot enforce author filtering.
  • Scopes owner filtering and enrichment to the active community.
  • Adds a partial (community_id, agent_owner_pubkey) index for owner lookups.
  • Documents the safe users get --name Honey --owner me lookup.

Reviewer-reproducible examples

The relay-backed test creates two same-name agents with different verified owners, queries through the HTTP /query route, verifies only the selected owner's agent is returned with verified owner metadata, and verifies a missing owner returns [].

cargo test -p buzz-relay query_agent_owner_returns_only_verified_owner_matches --lib -- --ignored

The owner/author intersection and unsupported-specialized-filter contracts also have infrastructure-free relay tests:

cargo test -p buzz-relay agent_owner --lib

The CLI surface is visible in command help:

cargo run -q -p buzz-cli -- users get --help | grep -- --owner
      --owner <OWNER>     Filter agents by verified owner (`me`, 64-char hex, or npub)

Validation

  • cargo test -p buzz-cli (252 passed)
  • cargo test -p buzz-db (84 passed, 122 infrastructure tests ignored)
  • cargo test -p buzz-relay --lib (owner-filter tests pass; the full local suite is blocked by unrelated Postgres pool timeouts in media/admin tests)
  • cargo test -p buzz-relay query_agent_owner_returns_only_verified_owner_matches --lib -- --ignored (passed)
  • cargo check --workspace --all-targets
  • cargo fmt --all -- --check
  • Pre-push Rust, Desktop, and Desktop Tauri suites passed
  • Pre-push mobile suite could not start because flutter is not installed
  • pnpm check:file-sizes (passed after rebasing onto current main)

@johnmatthewtennant johnmatthewtennant changed the title feat: add owner-aware user lookup fix(cli,relay): resolve agents by verified owner Jul 23, 2026
@johnmatthewtennant
johnmatthewtennant marked this pull request as ready for review July 23, 2026 22:19
@johnmatthewtennant
johnmatthewtennant requested a review from a team as a code owner July 23, 2026 22:19
@dophsquare

Copy link
Copy Markdown

P0 triage — merge candidate. 🐝

Confirmed the identity/access bug: buzz users get --name X searched relay-wide kind:0 profiles, capped at 100, with no ownership metadata — so an agent resolving "my Honey" couldn't distinguish the requester's agent from another owner's, and the owned match could even be excluded by the limit. That's how the wrong Honey/Bumble pubkeys got added to a channel.

The fix is the right shape: --owner (accepting me | pubkey | npub via resolve_owner) threads a verified agent_owner filter into the query before the limit applies, and copy_owner_fields surfaces owner_pubkey / owner_display_name / owned_by_me so callers can disambiguate. Using auth_tag_owner_hex() with a fallback to the client's own pubkey for the me/owned_by_me computation is sensible.

Before merge, please confirm:

  1. The relay actually honors include_agent_owner / agent_owner in the filter and derives owner from a verified ownership record (not a self-asserted tag) — the whole fix hinges on the server-side verification being trustworthy.
  2. owned_by_me is computed server-consistent with the filter so a spoofed profile can't set owned_by_me: true.

Code on the CLI side LGTM; the security guarantee lives in the relay half — worth a reviewer with relay context signing off on that.

@wpfleger96 wpfleger96 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 The core of this is sound and it fixes a real incident class — the owner rows come from users.agent_owner_pubkey, materialized only after cryptographic NIP-OA verification (crates/buzz-relay/src/api/mod.rs:147-216), not from self-asserted tags; the SQL is parameter-bound and community-scoped; requested authors are intersected rather than replaced; and zero owner matches fail closed on the catch-all/search paths. But there are three things I'd want fixed before this merges, the first one especially:

Blocking:

  • The channel-window fast path bypasses the owner filter. In crates/buzz-relay/src/api/bridge.rs (around 1042-1060 and 1122-1137), agent_owner is rewritten into authors, but a request combining agent_owner with top_level:true is dispatched to handle_channel_window_filter() before the catch-all's empty-owner guard, and that path queries only channel/kind/cursor — it ignores authors entirely. So an owner-constrained query can return events from every author in the channel. Since the extension presents agent_owner as a generic /query filter, it needs to be enforced on every dispatch path: either reject agent_owner on the specialized filters it can't honor, or centralize the owner/author constraint so each path applies it before returning.
  • No end-to-end behavioral test for the security contract. The relay test at bridge.rs:2886-2895 only checks hex parsing, the DB test at crates/buzz-db/src/user.rs:539-589 is ignored and doesn't exercise /query, and the CLI tests only cover field copying. Nothing currently proves that two same-name agents with different verified owners resolve to only the requested owner's agent, that zero matches stay empty, or that an existing authors list is intersected. Given this is an identity/access fix, please add relay-backed tests that fail without the fix and cover those cases — including the channel-window path above.
  • Missing index for the new lookup. crates/buzz-db/src/user.rs:294-310 filters by (community_id, agent_owner_pubkey), but the schema only has the users PK plus the NIP-05/Okta indexes (migrations/0001_initial_schema.sql:154-181), so every owner-filtered search scans the tenant's users table. A partial index like (community_id, agent_owner_pubkey) WHERE agent_owner_pubkey IS NOT NULL plus a quick query-plan check would keep the fix from being O(all users in community).

Minor, non-blocking:

  • crates/buzz-cli/src/commands/users.rs:44-55, 144-155 always sends include_agent_owner:true and serializes agent_owner:null even for plain buzz users get, which adds an extra DB lookup to every profile read and couples the whole command to the bridge extension. Omitting it unless requested would keep the default path lean.
  • A one-line example of users get --name … --owner me in crates/buzz-cli/README.md would help agents actually discover the owner-aware path — it's the safe replacement for exactly the lookup that caused the incident.

Happy to re-review once the fast-path enforcement and tests are in.

@johnmatthewtennant
johnmatthewtennant force-pushed the fizz/users-owner-filter branch from 1df7cdd to f774fd9 Compare July 26, 2026 03:06
@johnmatthewtennant
johnmatthewtennant marked this pull request as draft July 26, 2026 03:06
@johnmatthewtennant
johnmatthewtennant marked this pull request as ready for review July 26, 2026 03:08
@johnmatthewtennant
johnmatthewtennant marked this pull request as draft July 26, 2026 03:22
npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k added 3 commits July 27, 2026 09:52
Co-authored-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
Signed-off-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
Co-authored-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
Signed-off-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
Co-authored-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
Signed-off-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
@johnmatthewtennant
johnmatthewtennant force-pushed the fizz/users-owner-filter branch from f2cc0ce to f86ef32 Compare July 27, 2026 13:55
@johnmatthewtennant
johnmatthewtennant marked this pull request as ready for review July 27, 2026 13:55
@dophsquare

Copy link
Copy Markdown

Nudge on behalf of @doph — high-priority merge list. CI is green (32 checks) and the review gate is a pending re-review request to @wpfleger96. A fresh look would unblock this. 🐝

@wpfleger96
wpfleger96 merged commit c3084b3 into block:main Jul 27, 2026
32 checks passed
tellaho pushed a commit that referenced this pull request Jul 27, 2026
* origin/main:
  fix(cli,relay): resolve agents by verified owner (#2615)
  fix(desktop): make the test loader work on Windows (#2758)
  fix(desktop): make lint and unit-test gates work on Windows (#2943)
  feat(mobile): refactor Activity behavior and ui (#2889)

Signed-off-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@buzz.block.builderlab.xyz>
tlongwell-block pushed a commit that referenced this pull request Jul 27, 2026
Inherits the #3154 file-size override for AgentCreationPreview.tsx that
turned Desktop Core red on every PR's synthetic merge, plus #2615 and
Windows test-gate fixes.

Co-authored-by: Tyler Longwell <tlongwell@block.xyz>
Signed-off-by: Tyler Longwell <tlongwell@block.xyz>

* origin/main:
  chore(desktop): add AgentCreationPreview file-size override to unblock main CI (#3154)
  fix(cli,relay): resolve agents by verified owner (#2615)
  fix(desktop): make the test loader work on Windows (#2758)
  fix(desktop): make lint and unit-test gates work on Windows (#2943)
  feat(mobile): refactor Activity behavior and ui (#2889)
  feat(desktop): add search to agent emoji picker (#2630)
  fix(desktop): keep identity key help dialog readable in dark mode (#2854)
  feat(acp): title agent sessions from the agent and channel name (#3028)
  feat(mobile): bring message actions to desktop parity (#3070)
  feat(git): use agent display name as git author name (#3040)

Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@buzz.block.builderlab.xyz>
wpfleger96 added a commit to SeanGearin/buzz that referenced this pull request Jul 27, 2026
* origin/main: (102 commits)
  chore(desktop): add AgentCreationPreview file-size override to unblock main CI (block#3154)
  fix(cli,relay): resolve agents by verified owner (block#2615)
  fix(desktop): make the test loader work on Windows (block#2758)
  fix(desktop): make lint and unit-test gates work on Windows (block#2943)
  feat(mobile): refactor Activity behavior and ui (block#2889)
  feat(desktop): add search to agent emoji picker (block#2630)
  fix(desktop): keep identity key help dialog readable in dark mode (block#2854)
  feat(acp): title agent sessions from the agent and channel name (block#3028)
  feat(mobile): bring message actions to desktop parity (block#3070)
  feat(git): use agent display name as git author name (block#3040)
  fix(security): enforce durable community ban on NIP-43 relay-admin kinds 9030-9033 (block#3128)
  chore(deps): update react monorepo to v19.2.8 (block#3064)
  fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote DoS) (block#3135)
  docs(contributing): set PR expectations and require UI screenshots (block#3140)
  fix(desktop): read the newest pair-scoped harness log (block#3134)
  fix(security): authorize kind:9000 role changes in both directions (block#3017)
  feat(desktop): handle project work from Inbox (block#3117)
  fix(desktop): clarify identity key button when key exists (block#2357)
  Restore Goose and Buzz Agent to onboarding harness selection (block#2731)
  fix(mobile): mitigate message-post delay with optimistic rendering (block#3037)
  ...
wpfleger96 added a commit to SeanGearin/buzz that referenced this pull request Jul 27, 2026
* origin/main: (102 commits)
  chore(desktop): add AgentCreationPreview file-size override to unblock main CI (block#3154)
  fix(cli,relay): resolve agents by verified owner (block#2615)
  fix(desktop): make the test loader work on Windows (block#2758)
  fix(desktop): make lint and unit-test gates work on Windows (block#2943)
  feat(mobile): refactor Activity behavior and ui (block#2889)
  feat(desktop): add search to agent emoji picker (block#2630)
  fix(desktop): keep identity key help dialog readable in dark mode (block#2854)
  feat(acp): title agent sessions from the agent and channel name (block#3028)
  feat(mobile): bring message actions to desktop parity (block#3070)
  feat(git): use agent display name as git author name (block#3040)
  fix(security): enforce durable community ban on NIP-43 relay-admin kinds 9030-9033 (block#3128)
  chore(deps): update react monorepo to v19.2.8 (block#3064)
  fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote DoS) (block#3135)
  docs(contributing): set PR expectations and require UI screenshots (block#3140)
  fix(desktop): read the newest pair-scoped harness log (block#3134)
  fix(security): authorize kind:9000 role changes in both directions (block#3017)
  feat(desktop): handle project work from Inbox (block#3117)
  fix(desktop): clarify identity key button when key exists (block#2357)
  Restore Goose and Buzz Agent to onboarding harness selection (block#2731)
  fix(mobile): mitigate message-post delay with optimistic rendering (block#3037)
  ...
wpfleger96 added a commit to jatinder14/buzz that referenced this pull request Jul 27, 2026
* origin/main: (22 commits)
  chore(desktop): add AgentCreationPreview file-size override to unblock main CI (block#3154)
  fix(cli,relay): resolve agents by verified owner (block#2615)
  fix(desktop): make the test loader work on Windows (block#2758)
  fix(desktop): make lint and unit-test gates work on Windows (block#2943)
  feat(mobile): refactor Activity behavior and ui (block#2889)
  feat(desktop): add search to agent emoji picker (block#2630)
  fix(desktop): keep identity key help dialog readable in dark mode (block#2854)
  feat(acp): title agent sessions from the agent and channel name (block#3028)
  feat(mobile): bring message actions to desktop parity (block#3070)
  feat(git): use agent display name as git author name (block#3040)
  fix(security): enforce durable community ban on NIP-43 relay-admin kinds 9030-9033 (block#3128)
  chore(deps): update react monorepo to v19.2.8 (block#3064)
  fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote DoS) (block#3135)
  docs(contributing): set PR expectations and require UI screenshots (block#3140)
  fix(desktop): read the newest pair-scoped harness log (block#3134)
  fix(security): authorize kind:9000 role changes in both directions (block#3017)
  feat(desktop): handle project work from Inbox (block#3117)
  fix(desktop): clarify identity key button when key exists (block#2357)
  Restore Goose and Buzz Agent to onboarding harness selection (block#2731)
  fix(mobile): mitigate message-post delay with optimistic rendering (block#3037)
  ...
kalvinnchau pushed a commit that referenced this pull request Jul 27, 2026
Co-authored-by: Kalvin Chau <kalvin@block.xyz>

Signed-off-by: Kalvin Chau <kalvin@block.xyz>

* origin/main:
  chore(deps): update plugin org.jetbrains.kotlin.android to v2.2.21 (#3058)
  resolve findings (#3150)
  Revert "fix(cli,relay): resolve agents by verified owner" (#3168)
  feat(desktop): redesign agent runtime settings (#3093)
  fix(mobile): match markContextRead signature in activity test fake (#3158)
  fix(desktop): use forward slashes for git credential.helper on Windows (#3023)
  fix(mobile): tapping threaded message in Inbox navigates to top level of channel  (#2103)
  fix(mobile): retry channel-sections startup sync when relay rate-limits cold start (#3004)
  chore(desktop): add AgentCreationPreview file-size override to unblock main CI (#3154)
  fix(cli,relay): resolve agents by verified owner (#2615)
  fix(desktop): make the test loader work on Windows (#2758)
  fix(desktop): make lint and unit-test gates work on Windows (#2943)
  feat(mobile): refactor Activity behavior and ui (#2889)
  feat(desktop): add search to agent emoji picker (#2630)
  fix(desktop): keep identity key help dialog readable in dark mode (#2854)
  feat(acp): title agent sessions from the agent and channel name (#3028)
  feat(mobile): bring message actions to desktop parity (#3070)

Signed-off-by: npub122y0pqkertljmedu303rl0aqrj3w8pvu43t6jxm6875lzg6f2pwqegc3xc <5288f082d91aff2de5bc8be23fbfa01ca2e3859cac57a91b7a3fa9f12349505c@buzz.block.builderlab.xyz>
kalvinnchau pushed a commit that referenced this pull request Jul 27, 2026
…inks

* origin/main: (24 commits)
  Refine pending message status (#3153)
  feat(admin): show reported message content in report detail (#3149)
  fix(desktop): recover full local storage on startup (#3182)
  Replace mobile reconnect banners with skeleton shimmer (#3143)
  fix(desktop): keep collapsed table separators out of spoilers (#3169)
  chore(deps): update plugin org.jetbrains.kotlin.android to v2.2.21 (#3058)
  resolve findings (#3150)
  Revert "fix(cli,relay): resolve agents by verified owner" (#3168)
  feat(desktop): redesign agent runtime settings (#3093)
  fix(mobile): match markContextRead signature in activity test fake (#3158)
  fix(desktop): use forward slashes for git credential.helper on Windows (#3023)
  fix(mobile): tapping threaded message in Inbox navigates to top level of channel  (#2103)
  fix(mobile): retry channel-sections startup sync when relay rate-limits cold start (#3004)
  chore(desktop): add AgentCreationPreview file-size override to unblock main CI (#3154)
  fix(cli,relay): resolve agents by verified owner (#2615)
  fix(desktop): make the test loader work on Windows (#2758)
  fix(desktop): make lint and unit-test gates work on Windows (#2943)
  feat(mobile): refactor Activity behavior and ui (#2889)
  feat(desktop): add search to agent emoji picker (#2630)
  fix(desktop): keep identity key help dialog readable in dark mode (#2854)
  ...

Signed-off-by: npub1dccv64krpcpse5cmkzfeh998cftungyatw3djt8jwdw6g43f7fyqzzmrf7 <6e30cd56c30e030cd31bb0939b94a7c257c9a09d5ba2d92cf2735da45629f248@buzz.block.builderlab.xyz>
Co-authored-by: npub1dccv64krpcpse5cmkzfeh998cftungyatw3djt8jwdw6g43f7fyqzzmrf7 <6e30cd56c30e030cd31bb0939b94a7c257c9a09d5ba2d92cf2735da45629f248@buzz.block.builderlab.xyz>
jatinder14 pushed a commit to jatinder14/buzz that referenced this pull request Jul 28, 2026
* origin/main: (22 commits)
  chore(desktop): add AgentCreationPreview file-size override to unblock main CI (block#3154)
  fix(cli,relay): resolve agents by verified owner (block#2615)
  fix(desktop): make the test loader work on Windows (block#2758)
  fix(desktop): make lint and unit-test gates work on Windows (block#2943)
  feat(mobile): refactor Activity behavior and ui (block#2889)
  feat(desktop): add search to agent emoji picker (block#2630)
  fix(desktop): keep identity key help dialog readable in dark mode (block#2854)
  feat(acp): title agent sessions from the agent and channel name (block#3028)
  feat(mobile): bring message actions to desktop parity (block#3070)
  feat(git): use agent display name as git author name (block#3040)
  fix(security): enforce durable community ban on NIP-43 relay-admin kinds 9030-9033 (block#3128)
  chore(deps): update react monorepo to v19.2.8 (block#3064)
  fix(deps): bump nostr to 0.44.6 for RUSTSEC-2026-0216 (NIP-44 remote DoS) (block#3135)
  docs(contributing): set PR expectations and require UI screenshots (block#3140)
  fix(desktop): read the newest pair-scoped harness log (block#3134)
  fix(security): authorize kind:9000 role changes in both directions (block#3017)
  feat(desktop): handle project work from Inbox (block#3117)
  fix(desktop): clarify identity key button when key exists (block#2357)
  Restore Goose and Buzz Agent to onboarding harness selection (block#2731)
  fix(mobile): mitigate message-post delay with optimistic rendering (block#3037)
  ...
calvadev pushed a commit to shopstr-eng/buzz that referenced this pull request Aug 3, 2026
## Context

`buzz users get --name Honey` searches relay-wide profiles and returns
up to 100 identically named results without verified ownership metadata.
An agent resolving “my Honey” cannot distinguish the requesting human's
agent from another owner's agent, and the owned match can be excluded by
the result limit. This caused the wrong Honey and Bumble pubkeys to be
added to a channel.

## Summary

This bug fix makes personal-agent resolution owner-aware. Callers can
filter profiles by a verified owner identity before result limits are
applied, and all profile results expose enough ownership context to
diagnose duplicate names.

## Changes

- Adds `buzz users get --owner me|<hex>|<npub>` for name and pubkey
lookups.
- Resolves `me` to the NIP-OA owner identity when the CLI runs as an
agent.
- Filters profiles by the relay's verified `agent_owner_pubkey`
relationship before applying the result limit.
- Returns `owner_pubkey`, `owner_display_name`, and client-relative
`owned_by_me` in compact and JSON output.
- Returns an empty result when no owned profile matches instead of
removing the ownership constraint.
- Rejects malformed owner values instead of silently running an unscoped
query; explicit `null` remains equivalent to no owner filter for
ordinary CLI lookups.
- Rejects owner constraints on specialized channel-window, feed, and
thread filters that cannot enforce author filtering.
- Scopes owner filtering and enrichment to the active community.
- Adds a partial `(community_id, agent_owner_pubkey)` index for owner
lookups.
- Documents the safe `users get --name Honey --owner me` lookup.

## Reviewer-reproducible examples

The relay-backed test creates two same-name agents with different
verified owners, queries through the HTTP `/query` route, verifies only
the selected owner's agent is returned with verified owner metadata, and
verifies a missing owner returns `[]`.

```bash
cargo test -p buzz-relay query_agent_owner_returns_only_verified_owner_matches --lib -- --ignored
```

The owner/author intersection and unsupported-specialized-filter
contracts also have infrastructure-free relay tests:

```bash
cargo test -p buzz-relay agent_owner --lib
```

The CLI surface is visible in command help:

```bash
cargo run -q -p buzz-cli -- users get --help | grep -- --owner
```

```text
      --owner <OWNER>     Filter agents by verified owner (`me`, 64-char hex, or npub)
```

## Validation

- `cargo test -p buzz-cli` (252 passed)
- `cargo test -p buzz-db` (84 passed, 122 infrastructure tests ignored)
- `cargo test -p buzz-relay --lib` (owner-filter tests pass; the full
local suite is blocked by unrelated Postgres pool timeouts in
media/admin tests)
- `cargo test -p buzz-relay
query_agent_owner_returns_only_verified_owner_matches --lib --
--ignored` (passed)
- `cargo check --workspace --all-targets`
- `cargo fmt --all -- --check`
- Pre-push Rust, Desktop, and Desktop Tauri suites passed
- Pre-push mobile suite could not start because `flutter` is not
installed
- `pnpm check:file-sizes` (passed after rebasing onto current `main`)

---------

Signed-off-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
Co-authored-by: npub1qye6rec0htgg3np8yt6plpyyg8cyffaq66emt3kmk05eylckkzhq0hnf2k <0133a1e70fbad088cc2722f41f848441f044a7a0d6b3b5c6dbb3e9927f16b0ae@buzz.block.builderlab.xyz>
calvadev pushed a commit to shopstr-eng/buzz that referenced this pull request Aug 3, 2026
mrmoe28 pushed a commit to mrmoe28/buzz-reloaded that referenced this pull request Aug 6, 2026
wpfleger96 added a commit that referenced this pull request Aug 8, 2026
## Buzz Relay release v0.2.1

### Changes since relay-v0.2.0:

- fix(sdk): preserve self-mention p tags in message and forum event
builders ([#4975](#4975))
([`78c87ae20e`](78c87ae))
- feat(desktop): adding rich link previews to messages
([#3818](#3818))
([`1922d49cb2`](1922d49))
- feat(relay): accept kind:30179 private managed-agent events at ingest
([#5133](#5133))
([`ad923353a2`](ad92335))
- fix(media): require authenticated reads
([#4610](#4610))
([`769ac70b74`](769ac70))
- feat(identity): recover desktop identity from a signed-in phone
([#4845](#4845))
([`6eb65919f1`](6eb6591))
- ci: prove the relay-driven mesh lifecycle — discover, join, infer,
deny — with real nodes
([#3862](#3862))
([`38bf642fcf`](38bf642))
- relay: fuzz WebSocket 1012 restart-close timing on graceful drain
(BUZZ_DRAIN_JITTER_MS)
([#4542](#4542))
([`e14fff74d0`](e14fff7))
- fix(reactions): support max-length custom emoji
([#3833](#3833))
([`2ea9385015`](2ea9385))
- fix(channels): restrict private-channel invitations
([#4612](#4612))
([`efe1893dd3`](efe1893))
- fix(workflow): bind trigger author to the signed event
([#4607](#4607))
([`885bed35ee`](885bed3))
- fix(git): revoke access for banned relay members
([#4608](#4608))
([`997b8caaa4`](997b8ca))
- Define private managed agent wire protocol
([#4593](#4593))
([`067c085f37`](067c085))
- perf(relay): index channel-id lookups and skip trace-only reads
([#4647](#4647))
([`bc9e6528a7`](bc9e652))
- Polish mobile inbox and media flows
([#4512](#4512))
([`feccf4eabc`](feccf4e))
- fix(git): allow deleting the default branch
([#4297](#4297))
([`fc598f5f8d`](fc598f5))
- feat(projects): add buzz projects CLI commands (NIP-MP kind:30621)
([#4020](#4020))
([`b7bb15122e`](b7bb151))
- perf(relay): serve relay-membership checks from the read replica
([#4124](#4124))
([`ac4fa13b8e`](ac4fa13))
- fix(relay): allow open relays to set their NIP-11 workspace icon
(kind:9033) ([#3998](#3998))
([`5765fc74b7`](5765fc7))
- feat(relay): accept kind:30621 multi-repo projects at ingest
([#3171](#3171))
([`cb9701cd30`](cb9701c))
- feat(relay): raise hosted community limit to five
([#3829](#3829))
([`10d5a26414`](10d5a26))
- fix(relay): align NIP-11 max_limit with REQ ceiling
([#3635](#3635))
([`23f0c26b1c`](23f0c26))
- feat(relay): gate kind 30178 team-catalog reads behind the shared tag
([#3358](#3358))
([`114d40d9d3`](114d40d))
- fix(db): isolate usage metrics advisory-lock test on scratch DB
([#3670](#3670))
([`dba97eecd9`](dba97ee))
- perf(presence): reduce heartbeat frequency
([#3783](#3783))
([`bf139e8d0b`](bf139e8))
- feat(mesh): upgrade embedded mesh to v0.74 and harden shared compute
(split 1/2 of #3467) ([#3741](#3741))
([`4933672eb4`](4933672))
- feat(replica): portable heartbeat-token fence with snapshot-local
reader routing ([#3268](#3268))
([`63496cc1d4`](63496cc))
- fix(git): channel binding tooling + author remediation for unbound
repos ([#3626](#3626))
([`788b3c002b`](788b3c0))
- feat: configure S3 URL addressing style
([#3400](#3400))
([`7012d86d52`](7012d86))
- feat(tracing): correlate trace IDs in relay logs
([#3608](#3608))
([`005b5b819a`](005b5b8))
- fix(relay): avoid subscription lock inversion
([#3413](#3413))
([`22be8bb351`](22be8bb))
- feat(cli): add users set-status command for NIP-38 profile status
([#3253](#3253))
([`60158fce3e`](60158fc))
- feat(relay): make Postgres pool size configurable, default 50
([#3191](#3191))
([`2ce2d71cc3`](2ce2d71))
- feat(tracing): add datastore tracing plumbing
([#2760](#2760))
([`e94b9aeda0`](e94b9ae))
- feat(invites): add use-limited invite links
([#3141](#3141))
([`d500c2d5cf`](d500c2d))
- feat(admin): show reported message content in report detail
([#3149](#3149))
([`f069a85503`](f069a85))
- resolve findings ([#3150](#3150))
([`9b0f744804`](9b0f744))
- Revert "fix(cli,relay): resolve agents by verified owner"
([#3168](#3168))
([`a041e2d21e`](a041e2d))
- fix(cli,relay): resolve agents by verified owner
([#2615](#2615))
([`c3084b36d9`](c3084b3))
- fix(security): enforce durable community ban on NIP-43 relay-admin
kinds 9030-9033 ([#3128](#3128))
([`e2e0079101`](e2e0079))
- fix(security): authorize kind:9000 role changes in both directions
([#3017](#3017))
([`00ecf2cac7`](00ecf2c))
- feat(desktop): handle project work from Inbox
([#3117](#3117))
([`c5c4f390b6`](c5c4f39))
- feat(relay): make per-owner community limit configurable via
BUZZ_MAX_COMMUNITIES_PER_OWNER
([#2599](#2599))
([`2a051a404d`](2a051a4))
- feat(relay): add author-only-unless-shared read gate for kind 30175
([#2768](#2768))
([`ab3af82871`](ab3af82))
- fix(core): block IPv6 transition SSRF targets
([#2801](#2801))
([`c26bf5945d`](c26bf59))
- fix(workflow): bypass system proxies for webhooks
([#2800](#2800))
([`60a171b19e`](60a171b))
- fix(audit): hash created_at at the precision Postgres stores
([#2638](#2638))
([`264a56a226`](264a56a))
- feat(desktop): make pull request reviews actionable
([#2510](#2510))
([`9081ab0ec9`](9081ab0))
- fix(relay): decompress gzip-encoded git smart-HTTP request bodies
([#2670](#2670))
([`5ca36e7b91`](5ca36e7))
- fix(sharing): preserve agent/team snapshot tEXt chunks through media
sanitization ([#2438](#2438))
([`b096b0a15a`](b096b0a))
- fix(relay): send 1012 restart close to all clients on graceful drain
([#2575](#2575))
([`1911c69aa2`](1911c69))
- fix(media): sanitize animated image uploads
([#2524](#2524))
([`8f8f5fa5a4`](8f8f5fa))
- fix(channels): strip leading hash prefixes from names
([#2250](#2250))
([`d0ab3fdb05`](d0ab3fd))
- feat(relay): make Redis pool size configurable, default 16
([#2521](#2521))
([`bcc3e13069`](bcc3e13))
- feat(desktop+acp): spawn a harness per (agent, community) pair at GUI
startup — warm sockets, lazy LLM pool
([#2122](#2122))
([`61cc738ee8`](61cc738))
- feat(media): add S3-truth per-community storage sweep
([#2044](#2044))
([`bd37a4d584`](bd37a4d))
- feat(relay): log NIP-98 pubkey attribution on HTTP bridge requests
([#2206](#2206))
([`7e34bee62c`](7e34bee))
- Revert "feat(relay): inventory unreachable Git objects"
([#2275](#2275))
([`0fb820f9bf`](0fb820f))
- feat(relay): inventory unreachable Git objects
([#2264](#2264))
([`3afc9dae15`](3afc9da))
- relay: add author_type label to buzz_events_stored_total
([#2243](#2243))
([`b9f54c43fe`](b9f54c4))
- fix(git): make project branch workflows reliable
([#2213](#2213))
([`166f27be4b`](166f27b))
- feat(cli): manage repository protection rules
([#2193](#2193))
([`f94324598d`](f943245))
- feat(cli): add agents archive/unarchive/archived subcommands
([#2173](#2173))
([`7d7992067b`](7d79920))
- fix(mobile): sanitize Android image uploads
([#2188](#2188))
([`ee21da90bd`](ee21da9))
- fix(cli): paginate channel directory queries
([#2181](#2181))
([`03fe19d603`](03fe19d))
- fix(mobile): image upload fails due to unstripped metadata
([#2185](#2185))
([`37f15b2001`](37f15b2))
- perf(relay): compact Git packs before manifest limits
([#2172](#2172))
([`80e0ab16b0`](80e0ab1))
- perf(relay): cache Git pack hydration
([#2169](#2169))
([`a4d82ec722`](a4d82ec))
- fix(relay): bound and observe Git read operations
([#2167](#2167))
([`5f7c93d9c1`](5f7c93d))
- relay: gate push enqueue on live leases; batch matcher pipeline
(T1b/T1a-repair/T2b) ([#2145](#2145))
([`e43b2d5aac`](e43b2d5))
- relay: add audit logging disable switch
([#2134](#2134))
([`bf5acabdde`](bf5acab))
- relay: skip TTL deadline bump for known-permanent channels (T1a
write-amp) ([#2125](#2125))
([`2e936d439c`](2e936d4))
- fix(git): carry NIP-OA delegation in auth event
([#2120](#2120))
([`c12257d57a`](c12257d))
- Route lag-tolerant reads to an optional Postgres read replica
([#2084](#2084))
([`29c48883d3`](29c4888))
- fix: recover community access visibility
([#2074](#2074))
([`ca384d082d`](ca384d0))
- feat: proxy feedback-scoped admin attachments
([#2059](#2059))
([`d7f918e3cb`](d7f918e))
- feat: add read-only deployment moderation dashboard
([#1999](#1999))
([`68e670e001`](68e670e))
- Bug-bash round 2: table scroll, Goose instructions, workflow mention
wake ([#2034](#2034))
([`64b8fea6dc`](64b8fea))
- Strip media metadata on clients and reject it at the relay
([#2006](#2006))
([`5cfd69cb0c`](5cfd69c))
- [codex] Hold Git concurrency permits through streaming (BUZZ-SEC-018)
([#1916](#1916))
([`7baea42abb`](7baea42))
- [codex] Enforce shared relay admission limits (BUZZ-SEC-019)
([#1917](#1917))
([`73fc0ec6cf`](73fc0ec))
- [codex] Block banned actors from moderation commands (BUZZ-SEC-007)
([#1915](#1915))
([`caa195ca58`](caa195c))
- [codex] Fix relay WebSocket admission limits
([#1682](#1682))
([`d3ce971fc7`](d3ce971))
- feat: add invite QR and mobile direct join
([#1957](#1957))
([`648cbf3610`](648cbf3))
- fix(join-policy): require legal consent on hosted invites
([#1987](#1987))
([`2e1577f76f`](2e1577f))
- [codex] Prevent actor-tag UI impersonation
([#1931](#1931))
([`c540ec9678`](c540ec9))
- Scope relay runtime state by community
([#1658](#1658))
([`d52dedb06f`](d52dedb))
- Apply optional relay join policy across join flows
([#1894](#1894))
([`6c2d667575`](6c2d667))
- feat(media): require auth for relay media reads
([#1926](#1926))
([`f308762852`](f308762))
- feat(relay): add community unarchive endpoint
([#1908](#1908))
([`6b9641db2b`](6b9641d))
- feat(relay): gate Git web GUI separately
([#1901](#1901))
([`34dc7dec75`](34dc7de))
- mesh: upgrade runtime, enforce membership, add shared compute provider
([#1656](#1656))
([`54638ff4bb`](54638ff))
- Route Git scratch through configured volume
([#1884](#1884))
([`2318b3096c`](2318b30))
- feat(relay): gate usage metrics behind stable leader
([#1814](#1814))
([`59e9821503`](59e9821))
- Relay mesh: cross-pod tunnel + huddle transport (buzz-relay-mesh)
([#1670](#1670))
([`ccb021d713`](ccb021d))
- feat(push): deliver accepted relay events as wakes
([#1866](#1866))
([`bffbc5f22c`](bffbc5f))
- fix(db): resolve duplicate migration version
([#1863](#1863))
([`08ad38a07f`](08ad38a))
- Add private product feedback sidecar
([#1857](#1857))
([`af190c93e1`](af190c9))
- feat(relay): add durable community archival
([#1834](#1834))
([`2b15a72675`](2b15a72))
- feat(push): add public APNs gateway
([#1770](#1770))
([`1c006822e4`](1c00682))
- feat(relay): add atomic community ownership transfer
([#1845](#1845))
([`52e42ccb9f`](52e42cc))
- Bound NIP-RS retention and search indexing
([#1771](#1771))
([`1b4703021d`](1b47030))
- Add optional standalone pairing relay to Helm chart
([#1799](#1799))
([`9b47c8548f`](9b47c85))
- fix(relay): publish membership snapshot on provisioning
([#1761](#1761))
([`0950d392b7`](0950d39))
- feat(relay): per-community usage metrics
([#1723](#1723))
([`620822899a`](6208228))
- refactor(desktop): remove vestigial MCP toolsets config
([#1776](#1776))
([`dfec75b3c0`](dfec75b))

**To release:** merge this PR. The tag and build will happen
automatically.

Signed-off-by: Will Pfleger <pfleger.will@gmail.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.

3 participants