Shared test ids
76 of the 177 unique test ids appear on more than one surface. That is 43 percent.
This is the most actionable finding in the audit. A data-testid alone is not a sufficient
selector in Coral.
| data-testid | Surfaces ↓ | Occurrences | Appears on | Interactive | Sample label |
|---|---|---|---|---|---|
agent-command-bar | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | Agent toolbar |
agent-command-bar.feedback | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Send feedback |
agent-command-bar.overflow-trigger | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | More options |
agent-command-bar.publish-button | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Publish |
agent-command-bar.publish-split-chevron | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Customize publish channels |
agent-command-bar.save-button | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Save |
agent-command-bar.share-button | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Share |
agent-command-bar.tabs | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | Designer sections |
agent-command-bar.title | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Rename agent |
agent-preview-chat | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | New chatEnd user preview |
appshell-skip-link | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Skip to main content |
conversational-agent-authoring-page | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | RaybotRaybotBuildPreviewEvaluateMonitorPublishRaybotInstructionsYou are Raybot, an expert assistant for Ray and Ray clus… |
env-picker-trigger | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Switch environment (current: Cypherdyne (default)) |
nav-agents | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Agents |
nav-home | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Home |
nav-workflows | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Workflows |
new-chat-button | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | New chat |
preview-chat-card | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | — |
preview-chat-end-user-toggle | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | on |
preview-chat-header | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | New chatEnd user preview |
preview-chat-suggestions-area | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | — |
user-pill | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | no | D |
user-pill-avatar | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | Open account menu for Darbot |
user-pill-more | 16 | 16 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main, preview.main | yes | More options for Darbot |
preview-chat-header-overflow | 15 | 15 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access, evaluate.main, monitor.main | yes | More actions |
agent-connected-agents | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Connected agents |
agent-connected-agents-section | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Connected agents |
agent-details | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Raybot |
agent-icon-button | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | yes | Edit agent icon |
agent-instructions-builder | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | InstructionsYou are Raybot, an expert assistant for Ray and Ray clusters (the open-source distributed computing framewor… |
agent-iq-add-button | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | yes | Add Microsoft IQ |
agent-iq-list | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Microsoft IQ |
agent-iq-pill | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | raybot-kb |
agent-iq-section | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Microsoft IQ |
agent-side-panel | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Agent configuration |
agent-side-panel.connected-agents.add-button | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | yes | Add connected agent |
agent-side-panel.drag-handle | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | yes | Resize panel |
agent-side-panel.iq | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Microsoft IQ |
agent-side-panel.knowledge | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | KnowledgeProvide trusted context to guide decisionshttps://docs.ray.io |
agent-side-panel.knowledge.item | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | https://docs.ray.io |
agent-side-panel.knowledge.list | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Knowledge |
agent-side-panel.memory | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Memory |
agent-side-panel.memory.section | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | MemoryRemember interactions, workflows and context for improved results. |
agent-side-panel.memory.toggle | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | yes | Enable memory |
agent-side-panel.skills | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | SkillsDefine behaviors through structured instructionsray-cluster-troubleshooter |
agent-side-panel.skills.add-button | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | yes | Add skill |
agent-side-panel.skills.item | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | ray-cluster-troubleshooter |
agent-side-panel.skills.list | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Skills |
agent-side-panel.tools | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | no | Tools |
agent-side-panel.tools.add-button | 13 | 13 | build.main, dialog.add.microsoft-iq, dialog.add-connected-agent, dialog.add-knowledge, dialog.add-knowledge.advanced, dialog.add-mcp-server, dialog.add-skill.blank, dialog.add-skill.upload, dialog.add-tool, dialog.settings.agent-details, dialog.settings.ai-behavior, dialog.settings.greeting-prompts, dialog.settings.safety-access | yes | Add tool |
Why this table is derived, not copied
The audit's own schema-validation.json publishes a sharedTestIdsAcrossSurfaces array containing
only the top 40 rows by surface count. The true count is 76.
Rather than reproduce a truncated list, this table derives the full set from testids.json by
filtering on isShared. The numbers here are therefore complete where the source array is not.
This is worth flagging because it is a good example of a subtle data trap: a field named
sharedTestIdsAcrossSurfaces reasonably reads as "all of them", and the totals object separately
reports 76. Consuming the array and reporting its length would produce a confidently wrong answer of
40.
What breaks
A selector that matches by test id alone will, for 43 percent of ids, match on more than one surface. The failure modes in descending order of unpleasantness:
Silent wrong-element interaction. The selector resolves, a click lands, and it lands on the wrong control. No error, wrong outcome. This is the worst case because nothing surfaces it.
Strict-mode violation. Playwright's strict mode throws when a locator resolves to multiple elements. This is the good outcome — loud and immediate.
Intermittent failure. The selector works while only one surface is mounted, and fails when a modal or panel that shares the id is open. This presents as flakiness and gets papered over with retries.
What to do instead
Qualify by surface. Scope the locator to the surface container before matching the test id.
const panel = page.getByTestId('agent-side-panel');
await panel.getByTestId('add-button').click();
Prefer role and accessible name. This is what the Phase 7 capture loop does, and it is the reason that loop is reliable across 13 node types:
await page.getByRole('button', { name: 'Add a step after Start' }).click();
await page.getByRole('button', { name: 'Select action: Loop' }).click();
Role plus name is stable across re-renders, survives snapshot invalidation, and does not depend on the application author having written a unique test id.
Never cache element references. In Coral, refs go stale on every snapshot. A ref captured before a render is invalid after it. This interacts badly with shared test ids: a re-resolve may bind to a different element than the original. Re-query by role and name each time.
Why ids are shared
Mostly legitimate component reuse. A shared add-button, a shared card shell, a shared dialog footer. The test id travels with the component, and the component appears on many surfaces.
That makes this a selector-design observation rather than an application defect. The application is not wrong to reuse components. Automation is wrong to assume the resulting ids are unique.
The fix belongs on the consuming side: qualify by surface, or prefer role and name. Asking the application to emit globally unique test ids for reused components would trade a small automation inconvenience for a real maintenance burden.
Within-surface duplication is a separate problem
This page covers ids shared across surfaces. Ids repeated within a single surface are counted
separately in the dupTestIdsInSurface column on the surfaces page.
Within-surface duplication is harder. Qualifying by surface does not help, because the collision is inside the surface. These need an index, a nested scope, or a distinguishing accessible name:
const rows = page.getByTestId('knowledge-card');
await rows.filter({ hasText: 'docs.ray.io' }).click();
Filtering by content is preferable to indexing by position, because position changes when the underlying collection reorders and the resulting failure is again silent.