Skip to content

fix(desktop): coordination teams are plumbing, and teams list per workspace - #790

Merged
nocodeafrica merged 7 commits into
developfrom
fix/coordination-teams-invisible-and-scoped
Sep 13, 2026
Merged

fix(desktop): coordination teams are plumbing, and teams list per workspace#790
nocodeafrica merged 7 commits into
developfrom
fix/coordination-teams-invisible-and-scoped

Conversation

@nocodeafrica

Copy link
Copy Markdown
Collaborator

Why

The Agents page in the Colony workspace showed thirteen "Company Coordination" cards next to the Welcome Team. One coordination team exists per workspace by design (the relay validates a Task's owningTeamId against the owner's published kind 30176 heads), so it is infrastructure and must never render as something the owner made.

Two things broke that. teams.json held the coordination teams with is_builtin: false after an external rewrite, so team_publishes_to_relay took the user-team branch and the boot reconcile published every workspace's coordination team into whichever workspace was open. And list_teams returned every team on disk with no workspace filter.

What changed

  1. A coordination team is built-in by its id (is_coordination_team_id), whatever the stored flag says; loading normalises the flag.
  2. A coordination team publishes only to the relay its discriminator names, regardless of the flag.
  3. list_teams is workspace-scoped: user teams that apply to the active relay, plus the Welcome Team. Coordination teams never appear.
  4. The "Agent teams" section hides itself when only the Welcome Team would show.
  5. Unit tests for each.

Context

Traycer epic 42f611d5, artifact agent-registry-duplication, ticket T4. Sibling PRs: #788 (agent head retention scoped to the agent's community) and #789 (Colony's provisioned Chief of Staff supersedes the built-in one). The leaked team heads were removed from the relay by hand.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NdT8mbVQvCa2j8vu4nnLWU

…ed flag

Another client sharing this data directory rewrote teams.json with
is_builtin false on all thirteen coordination records. With the flag
false the publish rule took the user-team branch and put every
community's coordination head on whichever relay was open.

Restore the flag on load from the id, which is the authority, and let
the existing save-on-change path persist it.

Signed-off-by: Basheer Phiri <phiribash@gmail.com>
team_publishes_to_relay trusted two fields a foreign client had already
rewritten: is_builtin and the relay pin. With is_builtin false, every
coordination record took the user-team branch and published into
whichever community was open.

The discriminator inside the id cannot be rewritten without naming a
different team, so decide on that and ignore both.

Signed-off-by: Basheer Phiri <phiribash@gmail.com>
list_teams returned every built-in the store held, which on this device
meant thirteen Company Coordination cards next to the Welcome Team. A
coordination team is what the relay resolves a Task's owningTeamId
against; it is not a team anyone assembled and it is not deletable.

Built-ins now list by exception, the Welcome Team alone, and a
coordination id lists nowhere whatever its stored flag says. User teams
are unchanged: they still list where their pin applies.

Signed-off-by: Basheer Phiri <phiribash@gmail.com>
The Welcome Team is in every store, so the section was never empty: a
heading, a New team card, and one team nobody assembled. It appears once
the list holds a team that is not one this client seeds for itself, and
an error still renders, because a failed list must not read as none.

Signed-off-by: Basheer Phiri <phiribash@gmail.com>
Signed-off-by: Basheer Phiri <phiribash@gmail.com>
nocodeafrica pushed a commit that referenced this pull request Sep 13, 2026
…e the inventory

Both branches touch native-inventory.json; carrying #790's change here keeps
this branch mergeable whichever lands first.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NdT8mbVQvCa2j8vu4nnLWU
Signed-off-by: Basheer Phiri <phiribash@gmail.com>
The teams list is not only the Agents page. useMentions, NewTaskDialog,
TaskThreadContext, AddChannelBotDialog and LaunchAgentDialog all resolve a
Task's owning team out of it, and the relay's company_broker refuses an
owningTeamId it cannot resolve, so dropping every coordination id broke the
first job a community runs.

Scope a coordination team by the relay its id names instead: this
workspace's lists, every other workspace's stays out.

Signed-off-by: Basheer Phiri <phiribash@gmail.com>
…s them

The section rule already ignored every builtin-team: id. This adds the id
test the cards need, so the one coordination team list_teams keeps for
mentions, tasks and the deploy dialogs is not drawn as a team someone
assembled.

Signed-off-by: Basheer Phiri <phiribash@gmail.com>
@nocodeafrica
nocodeafrica merged commit 79fc277 into develop Sep 13, 2026
32 checks passed
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.

2 participants