block / block/buzz

Renaming an agent in one community renames a different agent (different keypair) in another community

Open
#5,601 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
32.7k
Forks
4.3k
Avg merge
1d 13h
Merged PRs (30d)
253

Description

## Summary

Two managed agents that have **different keypairs** and live in **different communities** share a single persona record. Renaming one of them renames the other. The agent identity is scoped per community and per install; the definition that names it is install-global and keyed by a value that is byte-identical everywhere.

Observed with two agents created from the built-in Welcome Team, on two separate machines and two separate relays.

## Not a data-exposure issue

Stating this up front so severity is not misjudged: `KIND_PERSONA` (30175) is a member of `SHARED_GATED_KINDS` (`crates/buzz-core/src/kind.rs:215`), so persona events are author-only unless they carry exactly `["shared","true"]`, enforced at every relay read chokepoint. System prompts do not become readable across communities, no identity signs on the wrong relay, and no message crosses. **What crosses is configuration** — display name, and by the same path prompt/model/runtime.

## Reproduction

1. Install the built-in Welcome Team.
2. Create an agent from one of its personas in Community A. It gets its own keypair.
3. Create an agent from the same persona in Community B (separate relay; a second machine makes it more visible). It gets a *different* keypair.
4. Rename the agent in Community A via the Agents view.
5. The agent in Community B is renamed too.

## Root cause — three factors converging

**1. The definition store is install-global.**
`agents/personas.json`, `agents/managed-agents.json`, and `agents/teams.json` are one file per install, with no per-community partition — while `agents/retention/` is correctly partitioned into one database per community. The isolation boundary was drawn at events but not at definitions.

**2. Editing an agent edits the shared persona.**
The Agents view routes the edit through `updatePersonaAndPublish` (`desktop/src/features/agents/ui/usePersonaActions.ts:195`) — the shared definition, not the per-pubkey managed-agent record.

**3. The persona d-tag is the bare team slug.**
`persona_d_tag` (`desktop/src-tauri/src/managed_agents/persona_events.rs:65`) prefers `source_team_persona_slug` and only falls back to the record's UUID `id`. Every persona sourced from a built-in team therefore keys on a slug that is identical across every community and every install.

`apply_inbound_persona` (`desktop/src-tauri/src/commands/personas/inbound.rs:342`) then overwrites `display_name`, `avatar_url`, `system_prompt`, `runtime`, `model`, `provider`, `respond_to`, and `parallelism` on whatever record matches that d-tag.

```
rename in Community A
→ patches the one global persona keyed by the team slug
→ agent in Community B (different keypair, different relay) is renamed
```

The managed-agent path is correctly scoped by contrast — its d-tag *is* the agent pubkey (`inbound.rs:365`), so those events never collide.

## Relay sync is not required to trigger this

The shared local file alone is sufficient: both agents resolve the same persona record on the same install. The kind:30175 sync (`inbound.rs:22` — "so Device B inherits Device A's edits") extends the same collision across machines, but is not the origin.

This also means the per-community retention scoping does not mitigate it, even though that scoping is otherwise correct.

## Suggested fix

**Real fix:** scope the persona d-tag. `persona_d_tag` should mix in the community (and arguably the install) rather than returning the bare team slug, so two agents instantiated from the same built-in persona in different communities occupy different coordinates.

**Cheap mitigation:** make the managed agent's own `name` authoritative for presentation, so a persona behaves as a template applied at creation rather than a live binding.

Worth deciding explicitly which of these is intended, since "built-in personas stay in sync across my devices" is plausibly a *feature* for the single-community case — but it should not reach across communities.

## Not verified

I traced the Agents view to the persona update path but did not step through which exact form field the rename submits. The empirical behaviour (rename crosses communities) is confirmed; the precise UI field binding is inferred.

Line references are against `6c16354`.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.