docs: separate an agent's routing identifier from its display name - #347
Merged
raullopez-sandbox merged 1 commit intoSep 4, 2026
Merged
Conversation
An agent has a lowercase `name` that routes and an optional free-form `display_name` that is only ever shown. The docs did not distinguish them, and in two places the ambiguity was load-bearing: the Slack and Discord autocomplete guides say a hand-made user group or role is adopted when it is "named exactly after" an agent, which an operator could reasonably read as the display name. Both match the identifier alone, so a group or role made under a display name is adopted by nothing and leaves that agent without autocomplete. The bridge README grows the shared definition of the two names; each platform guide says which one it renders and which one addresses. The Mattermost guide gains the prerequisite it was missing entirely: a bot's display name is stored but never shown unless the server's `TeamSettings.TeammateNameDisplay` is `full_name` or `nickname_full_name`, which Switch's own deployments set and a self-supplied server does not. The three connector skills gain the same note, since `list_agents` and `get_agent_detail` return both fields and a `target_names` entry carrying a display name addresses no one. The opencode skill is embedded in the app, so its copy moves in step to keep `connector-assets.test.ts` satisfied. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
raullopez-sandbox
requested review from
amaudruz and
christian-mcdermott
as code owners
September 2, 2026 13:04
amaudruz
approved these changes
Sep 3, 2026
raullopez-sandbox
merged commit Sep 4, 2026
edcf81a
into
feat/display-name-05-mattermost
10 checks passed
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.
Last of the display-name stack. Documentation only, plus the two tool docstrings that are documentation.
An agent has a lowercase
namethat routes and an optional free-formdisplay_namethat is only ever shown. The docs never distinguished them.The part that is a correctness fix, not a clarification
SLACK_SETUP.mdandDISCORD_SETUP.mdboth describe autocomplete adoption as matching a group or role "named exactly after" an agent. With one name that was unambiguous. With two it is not, and the wrong reading is actionable: an operator who names a Discord role or Slack user group after an agent's display name gets a role that is adopted by nothing and an agent with no autocomplete, silently.Matching is on the identifier alone. Verified in code rather than inferred:
slack/adapter.py:1686— builds its lookup keys fromagent_nameand matches them against groups keyed by folded handle and folded name.discord/adapter.py:1028—discord.utils.get(guild.roles, name=agent_name), an exact match on the identifier.Both pages now say identifier explicitly, and say what happens to a group or role made under a display name.
The gap that was missing entirely
MATTERMOST_SETUP.mdhad nothing aboutTeamSettings.TeammateNameDisplay. Mattermost stores a bot's display name and renders it only when that server-wide setting isfull_nameornickname_full_name; the default isusername, under which the whole feature is invisible. Switch's own deployments set it — an operator bringing their own server does not, and had no way to know. The new prerequisite gives the System Console path, both accepted values, and notes the setting is server-wide so it changes how human members render too.Everything else
bridges/README.md— the shared definition of the two names, which the five platform guides lean on, so each of those stays a one-line clarification.TEAMS_SETUP.md,TELEGRAM_SETUP.md— which name is rendered where; Telegram also notes that addressing runs the other way.ARCHITECTURE.md— the Agent domain-model bullet.skills/switch/SKILL.mdcopies —list_agentsandget_agent_detailreturn both fields and atarget_namesentry carrying a display name addresses no one. Substantively identical in all three; every pre-existing divergence between them is untouched.skills/configure/SKILL.mdcopies — one clause noting the name pattern constrains the identifier only.operations/definitions.py— the same note on the two tool docstrings that return the field.console/…/opencode/skill-file.tsembeds the opencode skill byte-for-byte andconnector-assets.test.tsfails on drift, so its copy moves in step.Not in this PR
docs/official/is generated fromsandbox-quantum/docsand rewritten byjust sync-docs, so it is not editable here. Several published pages —deploy/messaging-apps/how-connections-work.mdmost of all — need the same distinction and will need a change in that repo.Verification
ruff format --check,ruff check,mypy— clean.test_mcp_tool_surface.py(compares the three skills' tool indexes against each other and against the registered tools): 7 passed.🤖 Generated with Claude Code