Repository navigation
Conversation
The Solo agent picker, the new-chat draft, the chat header and its agent switcher, and the "working" label showed each agent's raw name, so two agents with one name looked the same. They now use the shared identity-names labels, scoped over the agents Solo offers. Archived agents are already left out of that list, so an archived namesake adds no qualifier. Solo keeps showing the owner's inventory name ahead of the agent's own profile name. An agent with no name now shows the short npub every other picker shows. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Logan Johnson <loganj@squareup.com>
Solo shows the owner's inventory name ahead of an agent's cached profile name, and a verified name ahead of both. The widget tests used one name for both sources, so nothing caught losing that preference. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Logan Johnson <loganj@squareup.com>
🔐 Codex Security Review
Review SummaryOverall Risk: NONE
FindingsNo concrete security, correctness, or reliability findings were identified. Notes
Generated by Codex Security Review | |
kazemek21
left a comment
There was a problem hiding this comment.
Kyle reviewed the PR and the Nexus review-tracker notes and approved with no comments.
Posted by Codex (gpt-6.1-sol) on behalf of kylez.
jedwards27
left a comment
There was a problem hiding this comment.
🤖 :bot: Jude’s code review agent — integrated review of fb9c8fc57b5cb10eb3cf5319f50cfb2d432fa159 (base e2dc54e22fc113f298889d76c3acf674cb46db4b). Two author-actionable defects; recommend fixing before merge. Per this repository’s AGENTS.md reviewing policy, this is a COMMENT review with blocking recommendations, not a GitHub Request Changes event.
-
P2 — Saved, archived targets lose their identity in recovery UI.
mobile/lib/features/channels/me/me_chat_assistant.dart:108–119calls the contextual resolver only for agents still in the live inventory and otherwise displays a cached rawdisplayName.meAssistantsProviderfilters archived agents (mobile/lib/shared/me/me_assistants.dart:35–40) without removing their cached profiles. If a pendingMeAgentChangepoints to archived Atlas A while active Atlas B is offered, the pending notice and Resume/Discard dialog show the indistinguishable label “Atlas”; the persisted new-chat draft makes the same fallback inmobile/lib/features/channels/me/me_chat_draft.dart:21–36. This is especially misleading precisely when the owner must decide how to recover saved intent.IdentityNames.resolvealready supports out-of-context keys (mobile/lib/shared/identity_names/identity_names.dart:165–181). Author action: label the saved, unavailable target relative to active choices with an agent role, or give it a stable key-qualified/unavailable label, in both recovery paths; test a cached archived target and an active same-name agent with a persisted pending action. Verification owner: author for fix and regression; reviewer for fresh-head semantics. -
P2 — Idle Solo rows repeatedly copy the whole cached profile map on the UI isolate.
_MeChatRowwatchesmeWorkingAgentsProvider(channelId)(mobile/lib/features/channels/me/me_page_helpers.dart:35). With any live agents, that provider constructsmeAssistantNamesbefore reading whether this chat has typing activity (mobile/lib/features/channels/me/me_working_provider.dart:13–24).meAssistantNameSourcescopies all cached profiles and the agent-name directory (mobile/lib/shared/me/me_assistant_names.dart:15–38), separately for each expanded Solo row. Thus opening a long Solo list or updating cached profiles performs O(visible chats × cached profiles) allocations even if nobody is working; 500 visible rows × 5,000 cached profiles is 2.5 million copied map entries. This is a source-derived cost, not a measured frame-time claim, and violatesVISION_MOBILE.md's responsive-UI/bounded-isolate-work intent. Author action: consult typing before building names and reuse an inventory-scoped computed name context instead of copying the full cache per active row; add a regression that bounds idle-row work and retains distinct labels for simultaneously working namesakes. Verification owner: author for fix/test; reviewer for fresh-head scaling check.
What held: Picker, draft send and switch persistence keep raw pubkeys for identity and membership; the display-label changes do not appear to change their recipient keys in the inspected paths. The owner-inventory name and verified-name precedence are preserved. The exact-head clean worktree passed git diff --check and just mobile-install mobile-check mobile-test (exit 0; full Flutter suite 4,617 passed, 73 skipped; subsequent package suites passed). Relevant Mobile CI was green on the reviewed head. Author-provided Android emulator screenshots demonstrate the normal same-name journey; I did not independently run a native journey or measure UI frame time. A two-simultaneously-working-agents semantics test is still absent from the inspected added tests; that is a coverage/confidence gap, not a third blocking finding. Any new head needs a fresh review of its delta.
jedwards27
left a comment
There was a problem hiding this comment.
🤖 :bot: Jude’s code review agent — integrated review of fb9c8fc57b5cb10eb3cf5319f50cfb2d432fa159 (base e2dc54e22fc113f298889d76c3acf674cb46db4b). Two author-actionable defects; recommend fixing before merge. Per this repository’s AGENTS.md reviewing policy, this is a COMMENT review with blocking recommendations, not a GitHub Request Changes event.
-
P2 — Saved, archived targets lose their identity in recovery UI.
mobile/lib/features/channels/me/me_chat_assistant.dart:108–119calls the contextual resolver only for agents still in the live inventory and otherwise displays a cached rawdisplayName.meAssistantsProviderfilters archived agents (mobile/lib/shared/me/me_assistants.dart:35–40) without removing their cached profiles. If a pendingMeAgentChangepoints to archived Atlas A while active Atlas B is offered, the pending notice and Resume/Discard dialog show the indistinguishable label “Atlas”; the persisted new-chat draft makes the same fallback inmobile/lib/features/channels/me/me_chat_draft.dart:21–36. This is especially misleading precisely when the owner must decide how to recover saved intent.IdentityNames.resolvealready supports out-of-context keys (mobile/lib/shared/identity_names/identity_names.dart:165–181). Author action: label the saved, unavailable target relative to active choices with an agent role, or give it a stable key-qualified/unavailable label, in both recovery paths; test a cached archived target and an active same-name agent with a persisted pending action. Verification owner: author for fix and regression; reviewer for fresh-head semantics. -
P2 — Idle Solo rows repeatedly copy the whole cached profile map on the UI isolate.
_MeChatRowwatchesmeWorkingAgentsProvider(channelId)(mobile/lib/features/channels/me/me_page_helpers.dart:35). With any live agents, that provider constructsmeAssistantNamesbefore reading whether this chat has typing activity (mobile/lib/features/channels/me/me_working_provider.dart:13–24).meAssistantNameSourcescopies all cached profiles and the agent-name directory (mobile/lib/shared/me/me_assistant_names.dart:15–38), separately for each expanded Solo row. Thus opening a long Solo list or updating cached profiles performs O(visible chats × cached profiles) allocations even if nobody is working; 500 visible rows × 5,000 cached profiles is 2.5 million copied map entries. This is a source-derived cost, not a measured frame-time claim, and violatesVISION_MOBILE.md's responsive-UI/bounded-isolate-work intent. Author action: consult typing before building names and reuse an inventory-scoped computed name context instead of copying the full cache per active row; add a regression that bounds idle-row work and retains distinct labels for simultaneously working namesakes. Verification owner: author for fix/test; reviewer for fresh-head scaling check.
What held: Picker, draft send and switch persistence keep raw pubkeys for identity and membership; the display-label changes do not appear to change their recipient keys in the inspected paths. The owner-inventory name and verified-name precedence are preserved. The exact-head clean worktree passed git diff --check and just mobile-install mobile-check mobile-test (exit 0; full Flutter suite 4,617 passed, 73 skipped; subsequent package suites passed). Relevant Mobile CI was green on the reviewed head. Author-provided Android emulator screenshots demonstrate the normal same-name journey; I did not independently run a native journey or measure UI frame time. A two-simultaneously-working-agents semantics test is still absent from the inspected added tests; that is a coverage/confidence gap, not a third blocking finding. Any new head needs a fresh review of its delta.
…lo rows A saved agent switch or a resumed new chat can still point to an agent that is now archived. Its recovery notice, Resume/Discard dialog and draft header now label it as an agent against the live agents, so it never reads exactly like a live namesake. Solo rows no longer build a name context while no agent is working in them. Working rows read one shared context instead of each copying the profile cache. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Logan Johnson <loganj@squareup.com>
|
🤖 Both findings held up and are fixed in 6bd0894.
|
Summary
In Solo, two agents with the same name looked identical: the agent picker, the new-chat draft ("Message Atlas"), the chat header and its agent switcher, and the "working" label all showed the raw name. Now they use the same disambiguated labels as the rest of the app, so same-name agents read differently everywhere in Solo, and one agent reads the same in every place.
Related issue
None found.
Testing
Widget tests open the picker and header with two same-name agents, switch between them, and archive one (the remaining agent goes back to its plain name). Further tests cover a saved agent switch and a resumed new chat that still point to an archived agent with a live namesake, and Solo rows with no working agent building no names. A focused test covers which name Solo shows. Each fails without its change.
Android emulator, local relay, fictional names. Two live agents are both named Helper; Atlas and Scout each have an archived namesake, which Solo already left out.
New Solo chat › Choose an agent: two agents named Helper
New-chat draft with one Helper picked
Chat settings › Agent row of an existing Solo chat
Agent switcher opened from that row
Details
🤖 Generated with Claude Code