# Raft Visual Testing Generated: 2026-11-09 22:51:50 UTC Latest run: 41a40027-20261109220201 Latest commit: 41a40027-20261109220201 Commit subject: fix(webview): stalled or crashed in-app web pages show an error with Retry (dm #102) Providers: react vs android, react vs ios, android vs ios Summary: total 122, same 0, pass 1, basic-pass 8, different 76, missing 37 AI analysis: ready 39 / total 122, pending 83 Visual coverage matrix: active 131 / total 151, pending 17, skipped 3 Capture taxonomy: components use component-fixture; real screens use real-screen ## Comparisons - react__android: total 122, same 0, pass 1, basic-pass 8, different 76, missing 37 - react__ios: total 122, same 0, pass 9, basic-pass 15, different 46, missing 52 - android__ios: total 122, same 0, pass 12, basic-pass 25, different 33, missing 52 ## Capture Type Coverage - Components Parity (component-fixture): active 113, pending 3, total 118 - Screens Parity (real-screen): active 18, pending 14, total 33 ## Provider Coverage - react: active 121, pending 13, unsupported 0 - android: active 79, pending 18, unsupported 0 - harmony: active 0, pending 80, unsupported 0 - ios: active 0, pending 1, unsupported 0 ## Pending Coverage Rows - screens.home.choose-server: Missing true Home top-bar choose-server capture after opening the server selector from the app shell; distinct from the post-login auth choose-server gate. - components.settings.integrations.permission-review: Settings Integrations Permission Review - screens.auth.choose-server: Missing post-login choose-server gate parity; this is distinct from the Home top-bar server switcher opened inside the app shell. - components.members.agent-lifecycle-actions: Real React AgentDetailPanel mobile action menu and KMP MembersDetailContent management dropdown. The Android fixture opens the same lifecycle action menu state so Stop Agent and Restart / Reset are visible. - components.members.avatar-management: Real React AgentDetailPanel avatar picker and KMP MembersAgentProfileTab inline avatar picker, covering generated/default choices, upload action, and active selection states. - components.thread.message-menu.default: Real React MessageItem right-click menu captured through the portal plus Android shared ThreadMessageMenuChrome with default message actions. Protects quick reactions and grouped row separators. - components.thread.message-menu.task: Real React MessageItem right-click menu for a linked task message plus Android shared ThreadMessageMenuChrome task-state action variant. - components.thread.message-row.deleted-human: Real React MessageItem vs Android shared ThreadMessageCard fixture for deleted human authors. Protects muted uploaded-avatar styling and gray-border Deleted sender tag. - components.thread.message-row.long-inline-code: Inline-code cross-platform net (task #400): real React MessageItem vs Android shared long_inline_code thread fixture. Covers compact short inline-code chips, char-level wrapping of long paths/commands (#58), trailing-edge inline-code border (#228), and markdown flow around code spans. OHOS leg pending self-hosted capture harness. - components.thread.message-row.md-latest-release: Real mixed-markdown status message requested by artin (task #502): leading horizontal rule, Chinese prose, bold emphasis, inline-code angle-bracket placeholders, and a plain PR reference. React and KMP bodies are byte-for-byte identical; OHOS capture remains pending until the provider lane is available. - components.thread.message-row.md-link-ref: Raft Markdown dialect net (task #519, guarding task #517): real React MessageItem vs Android shared md_link_ref thread fixture. Refs inside a Markdown link label/destination stay part of one external link; standalone refs outside links chip. - components.thread.message-row.md-wrap-adjacent: Adjacent-chip acceptance (task #60): real React MessageItem vs Android md_wrap_adjacent fixture; '#31 / #521' two chips + slash on one line. OHOS leg pending self-hosted capture harness. - components.thread.message-row.md-wrap-clarify: Narrow (260px) markdown message-row wrap net: real React MessageItem vs Android shared md_wrap_clarify thread fixture. Reproduces the Android inline-box line-wrap bug where a task chip wraps to the next line. OHOS leg pending self-hosted capture harness. - components.thread.message-row.md-wrap-slice1: Narrow (260px) markdown message-row wrap net: real React MessageItem vs Android shared md_wrap_slice1 thread fixture. Reproduces the Android inline-box line-wrap bug where a channel/task chip wraps to the next line. OHOS leg pending self-hosted capture harness. - components.thread.message-row.md-wrap-status606: Agent-status markdown specimen: thread-ref chip + long-hex inline code coverage. OHOS leg pending self-hosted capture harness. - components.thread.message-row.md-wrap-task607: Narrow (260px) markdown message-row wrap net: real React MessageItem vs Android shared md_wrap_task607 thread fixture. Reproduces the Android inline-box line-wrap bug where a channel/task chip wraps to the next line. OHOS leg pending self-hosted capture harness. - components.thread.message-row.rich-content: Real React MessageItem vs Android shared ThreadMessageCard component fixture. Fixture covers long markdown body, @mention, #channel, task #222, URL link, two attachment chips, task footer, reply footer, and reaction footer. - components.thread.message-share.preview: React source of truth uses SelectShareLightbox with a real captureSelectedMessages image. Android app flow now calls a native screenshot/export bridge, but the visual fixture remains pending until it can drive that real export path instead of instantiating the modal directly. - components.thread.message-share.selection: Android shared/KMP selected-message rows and bottom shared-message toolbar. React source of truth is SelectModeToolbar; KMP adds Generate to seed an editable composer draft. - components.thread.composer.as-task-selected: Real React MessageInput with As Task checked vs Android connected visual-only rendering of ThreadComposerContent seeded with seedAsTask=true. This is a focused diff for the selected As Task toggle. - components.thread.composer.channel-suggestions: Real React MessageInput #channel autocomplete popover vs Android connected visual-only rendering of ThreadComposerContent with the channel suggestion panel open. Covers the # icon, channel name, and description row layout. - components.thread.composer.empty: Real React MessageInput empty state vs Android connected visual-only rendering of ThreadComposerContent with an empty seed. This case specifically protects the disabled send button color/opacity and empty placeholder treatment. - components.thread.composer.file-previews: fixture alignment deferred — artin 2026-07-05: 例子没对齐,但也许不用做了 - components.thread.composer.image-preview: Real React MessageInput pending image attachment chip vs Android connected visual-only rendering of ThreadComposerContent with a ready image preview above the composer card. - components.thread.composer.member-suggestions: Real React MessageInput @mention autocomplete popover vs Android connected visual-only rendering of ThreadComposerContent with the member suggestion panel open. Covers avatar, agent description, channel-membership grouping, and trailing @handle treatment. - components.thread.composer.pending-mention-actions: Real React MessageInput post-send PendingMentionActionStrip vs Android ThreadComposerContent PendingMentionActionBanner. Seeded action covers an agent outside the current channel with Add, Notify, and Dismiss controls so nightly diffs expose typography, button chrome, spacing, and layout drift. - components.thread.composer.states: Real React MessageInput draft state vs Android connected visual-only rendering of ThreadComposerContent. Baseline covers the complete composer shell with draft text, attachment buttons, As Task toggle, and Send button using the same component-bounds crop as the empty and selected states. - components.thread.message.row: Real React MessageItem vs Android rendering of shared ThreadMessageCard with matching fixture text, reply count, and task metadata. - tasks.card.states: Task Card States - components.channel.members.add-panel: Phone-width add-member view: real React ChannelMembers presentation="page" (the channel overflow drawer's members page, 390x844) after tapping the bottom-pinned Add Member entry. Android/KMP provider is the shared ChannelAddMemberPanel. - components.channel.settings.panel: Real React channel drawer (ChatPanel settings trigger -> ChannelOverflowMenu with EditChannelDialog as its body); query params channel=design|private|joint|dm, view=members, role=member pick the variant. Android/KMP provider uses the shared thread settings modal route; Harmony capture remains pending. - components.home.activity.results: Real React ThreadsInbox activity page vs Android rendering of shared Home Activity panel. Covers PanelHeader/back affordance, segmented filters, mark-all-read action, ConversationPreviewCard-like rows, unread/mention/task footer badges, and scroll body spacing. - components.home.create-channel.dialog: Real React CreateChannelDialog vs Android rendering of the shared SharedCreateChannelDialog/SlockUnifiedDialog route. - components.home.notification-center.states: React and Android now render the same two-notification fixture: warning agent disconnect plus info release-gate review. Harmony remains pending real-device/provider capture. - components.home.saved.results: Real React SavedPanel saved-message list vs Android rendering of shared Home Saved panel after Search/Saved parity. Covers panel header, saved channel/thread/DM rows, sender avatar/meta, remove affordance, and load-more action. - components.home.search.channel-dropdown: Focused open-state canonical for the search channel filter. React opens the real MessageSearchPage SelectionPopover; Android opens SharedHomeSearchPanel's real SlockFilterPopover through initialOpenFilterId after the channel trigger anchor is measured. Covers trigger alignment, popover border/shadow, internal search input chrome, and channel option rows without DM leakage. - components.home.search.results: Real React MessageSearchPage filtered results vs Android rendering of shared Home Search panel. Covers query field, reusable filter primitives, entity results, grouped thread hits, and load-more affordance. - components.home.titlebar.states: Four states declared as the case variants: other-server unread with a long name, short name with a server avatar, long-name ellipsis, and the expanded server switcher. React renders each with the real mobile Sidebar in its own iframe of the visual host (the bar reads global stores); Android renders the same board on its KMP page. Harmony remains pending real-device/provider capture. - components.members.agent-detail.profile: Real React AgentDetailPanel profile tab vs Android rendering of the shared Members detail profile surface. Fixture pins a manageable Codex agent with machine, runtime config, skills, DMs, reminders, and activity summary data; additional private tabs can be split into separate cases. - components.members.create-agent.dialog: Real React CreateAgentDialog vs Android rendering of the shared SharedCreateAgentDialog/SlockUnifiedDialog visual route. Matrix covers Codex CLI default, Claude Code default, and Claude custom-provider/advanced configuration because each runtime exposes different selectable fields. - components.navigation.tabbar.states: React now captures the real MainLayout MobileTabBar from the visual route. The previous hand-built VisualMobileTabBar approximation was removed from the provider path. Harmony remains pending real-device/provider capture. - components.settings.account.error-state: Account save/avatar/password/provider error messages are rendered from typed Store action state rather than raw API responses. - components.settings.account.page: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.administration.admins: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.administration.invites: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.administration.join-links: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.administration.member-permissions: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.administration.onboarding: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.administration.pre-join-agreement: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.administration.translation: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.appearance.page: Real React SettingsPanel AppearanceSection mapped to KMP SettingsAppearanceContent through the shared settings visual page; full Settings route coverage remains screens.settings.appearance pending. - components.settings.notifications.page: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.settings.root.page: Real mobile Settings tab root / first screen: React Sidebar mobileInline grouped list vs Android shared SettingsAppShellContent home route. Covers PERSONAL, WORKSPACE, ABOUT groups and Mobile, About, Release Notes rows. - components.settings.server.profile: React SettingsPanel sub-page mapped to the real shared KMP Settings visual route using a pageData variant and typed sample snapshot. - components.tasks.panel.states: Real React TasksPanel (server mode, list view) with shared tasksFixture.json rows covering todo / in_progress / in_review / done status sections, task numbers, and per-status InlineBadgeEditor chips. - components.tasks.status-menu: Real React InlineBadgeEditor status menu rendered open with all five selectable statuses (Todo / In Progress / In Review / Done / Closed) and the current status check-marked. - components.thread.files.list: Real React ChannelFilesPanel vs Android connected visual-only rendering of ThreadFilesContent with image, PDF, archive, download/open state, and load-more affordance. - components.thread.header.states: React now captures the real ChatPanel PanelHeader with the visual channel fixture. The previous hand-built PanelHeader wrapper was removed from the provider path. Harmony remains pending real-device/provider capture. - screens.auth.forgot-password: Missing forgot-password route parity for the auth recovery flow. - screens.auth.login: Missing true login route parity; old auth.login inputs are not active in the canonical manifest. - screens.home.activity: Existing components.home.activity.results is a connected visual fixture; this tracks the real Home Activity route/screen capture. - screens.home.channel-list: Whole phone Home root (top bar, Saved, Pinned / Joint Channels / Channels / Direct Messages, tab bar) from shared/fixtureData.json homeChannelList, light mode. - screens.home.channel-list.dark: Whole phone Home root (top bar, Saved, Pinned / Joint Channels / Channels / Direct Messages, tab bar) from shared/fixtureData.json homeChannelList, dark mode. - screens.home.index: Missing true Home channel/thread list screen parity with realistic server/channel data. - screens.home.loading: Post-sign-in loading transition: MainLayout mounted at the server home with channels/DMs/agents/computers still fetching, so the mobile home surface shows Sidebar skeleton rows. Parity target for replacing the Android app's gray home loading state (task #372). - screens.home.saved: Existing components.home.saved.results is a connected visual fixture; this tracks the real Home Saved route/screen capture. - screens.members.agent-detail.activity: Real Members route capture for the Activity tab with the shared Product UX agent fixture. Harmony remains pending real-device/provider capture. - screens.members.agent-detail.apps: Real Members route capture for the Apps tab with the shared Product UX agent fixture. Harmony remains pending real-device/provider capture. - screens.members.agent-detail.profile: Real Members route capture for the Profile tab with the shared Product UX agent fixture. Harmony remains pending real-device/provider capture. - screens.members.agent-detail.reminders: Real Members route capture for the Reminders tab with the shared Product UX agent fixture. Harmony remains pending real-device/provider capture. - screens.members.agent-detail.workspace: Real Members route capture for the Workspace tab with the shared Product UX agent fixture. Harmony remains pending real-device/provider capture. - screens.members.human.profile: Real Members route capture for human member detail profile. React uses MainLayout at /s/visual/human/visual-user; Android uses compose_member_detail pageData with memberId=visual-user and memberKind=human. Harmony remains pending real-device/provider capture. - screens.members.index: Pending: needs real Members route/provider capture with seeded humans, agents, invite/add states, and loading/empty/error coverage. Do not activate through the component-only agent detail visual page. - screens.settings.administration.full-height: Full-height (content-height, not viewport-clipped) Settings Administration route for react↔android parity (task #388). React renders all ADMINISTRATION_VISUAL_SECTIONS stacked, unclamped, captured fullPage (verified 1170x6648). Android eager full-height capture on main (#259, verified 1170x7382; density diff normalizes). First react↔android full-height pairing runs next full/nightly. - screens.settings.appearance: Pending as a full Settings screen route. Component coverage lives in components.settings.appearance.page; this screen case needs real Settings route launch on both providers, not a component visual page. - screens.settings.billing-portal: Skipped: billing portal is an external browser URL action (https://raft.build/settings/billing), not an in-app screen/WebView route. Validate the Billing page/action state instead. - screens.settings.server-danger-modal: Real React SettingsPanel DangerZoneSection modal and KMP SettingsServerDeleteConfirmationDialog safe open state; destructive submit stays disabled and no delete action is invoked. - screens.settings.storage: Pending: needs React Settings Storage route/provider plus Android Settings Storage route capture with seeded storage rows; do not activate through the generic settings visual page. - screens.tasks.index: Missing true Tasks screen parity: list, filters, task status, and create-task entry need real route captures. - screens.thread.channel: Pending: needs a real ThreadPage channel route capture with seeded channel messages, attachments, replies, task metadata, and composer state on both React and Android. Do not activate with standalone pageData-only fixtures. - screens.thread.dm: Pending: needs a real ThreadPage DM route capture with seeded peer identity/status, member-scoped mentions, replies, attachments, and composer state on both React and Android. Do not activate with standalone pageData-only fixtures. - screens.thread.task-thread: Pending: needs a real task-thread route plus seeded task data/status controls before capture. Keep pending until React and Android can launch the same task-bound thread without fake pageData. - components.tokens.palette: Temporarily hidden: palette screenshot is not a valid parity gate; use token-audit for machine validation. ## Runs - 41a40027-20261109220201: react vs android, total 122, pass 1, basic-pass 8, different 76, matrix runs/41a40027-20261109220201/component-matrix.json, page runs/41a40027-20261109220201/ - 590aade5-20261108215926: react vs android, total 122, pass 1, basic-pass 8, different 76, matrix runs/590aade5-20261108215926/component-matrix.json, page runs/590aade5-20261108215926/ - 40815d3e-20261107215920: react vs android, total 106, pass 1, basic-pass 8, different 76, matrix runs/40815d3e-20261107215920/component-matrix.json, page runs/40815d3e-20261107215920/ - 1e916283-20261105220131: react vs android, total 92, pass 1, basic-pass 8, different 76, matrix runs/1e916283-20261105220131/component-matrix.json, page runs/1e916283-20261105220131/ - bf972e2b-20261104090539: react vs android, total 87, pass 1, basic-pass 7, different 77, matrix runs/bf972e2b-20261104090539/component-matrix.json, page runs/bf972e2b-20261104090539/ - 63a3324a-20261104074137: react vs android, total 93, pass 1, basic-pass 7, different 77, matrix runs/63a3324a-20261104074137/component-matrix.json, page runs/63a3324a-20261104074137/ - e6d3cbab-20261103232613: react vs android, total 93, pass 2, basic-pass 12, different 77, matrix runs/e6d3cbab-20261103232613/component-matrix.json, page runs/e6d3cbab-20261103232613/ - 33a0350d-20261103220336: react vs android, total 93, pass 2, basic-pass 12, different 77, matrix runs/33a0350d-20261103220336/component-matrix.json, page runs/33a0350d-20261103220336/ - 515ed2a6-20261103205636: react vs android, total 93, pass 2, basic-pass 12, different 77, matrix runs/515ed2a6-20261103205636/component-matrix.json, page runs/515ed2a6-20261103205636/ - cd8e52ea-20261103200309: react vs android, total 93, pass 2, basic-pass 12, different 77, matrix runs/cd8e52ea-20261103200309/component-matrix.json, page runs/cd8e52ea-20261103200309/ - 2bf19cb1-20261103170447: react vs android, total 93, pass 2, basic-pass 12, different 77, matrix runs/2bf19cb1-20261103170447/component-matrix.json, page runs/2bf19cb1-20261103170447/ - fcf6ae60-20261103094938: react vs android, total 93, pass 1, basic-pass 12, different 78, matrix runs/fcf6ae60-20261103094938/component-matrix.json, page runs/fcf6ae60-20261103094938/ - 5468c13a-20261103070304: react vs android, total 94, pass 2, basic-pass 14, different 76, matrix runs/5468c13a-20261103070304/component-matrix.json, page runs/5468c13a-20261103070304/ - da544d25-20261103041702: react vs android, total 95, pass 2, basic-pass 14, different 77, matrix runs/da544d25-20261103041702/component-matrix.json, page runs/da544d25-20261103041702/ - 4f79b778-20261102183226: react vs android, total 101, pass 1, basic-pass 16, different 81, matrix runs/4f79b778-20261102183226/component-matrix.json, page runs/4f79b778-20261102183226/ - 2d44f513-20261102125634: react vs android, total 102, pass 2, basic-pass 9, different 86, matrix runs/2d44f513-20261102125634/component-matrix.json, page runs/2d44f513-20261102125634/ - 8a04b1cc-20261102055356: react vs android, total 101, pass 2, basic-pass 9, different 86, matrix runs/8a04b1cc-20261102055356/component-matrix.json, page runs/8a04b1cc-20261102055356/ - f149c5a3-20261030220049: react vs android, total 101, pass 2, basic-pass 9, different 86, matrix runs/f149c5a3-20261030220049/component-matrix.json, page runs/f149c5a3-20261030220049/ - 46561aa-20261030051258: react vs android, total 101, pass 2, basic-pass 8, different 87, matrix runs/46561aa-20261030051258/component-matrix.json, page runs/46561aa-20261030051258/ - 098d263-20261023220346: react vs android, total 101, pass 2, basic-pass 8, different 86, matrix runs/098d263-20261023220346/component-matrix.json, page runs/098d263-20261023220346/ - d2f13bc-20261023113615: react vs android, total 101, pass 2, basic-pass 8, different 86, matrix runs/d2f13bc-20261023113615/component-matrix.json, page runs/d2f13bc-20261023113615/ - 857e1fe-20261023102553: react vs android, total 101, pass 2, basic-pass 7, different 87, matrix runs/857e1fe-20261023102553/component-matrix.json, page runs/857e1fe-20261023102553/ - a52d784-20261019224352: react vs android, total 99, pass 0, basic-pass 2, different 89, matrix runs/a52d784-20261019224352/component-matrix.json, page runs/a52d784-20261019224352/ - 2c1bc667-20261018063524: react vs android, total 99, pass 0, basic-pass 1, different 90, matrix runs/2c1bc667-20261018063524/component-matrix.json, page runs/2c1bc667-20261018063524/ - d78af8ed-20260911220901: react vs android, total 99, pass 0, basic-pass 0, different 91, matrix runs/d78af8ed-20260911220901/component-matrix.json, page runs/d78af8ed-20260911220901/ - 9e487358-20260906215817: react vs android, total 99, pass 0, basic-pass 0, different 90, matrix runs/9e487358-20260906215817/component-matrix.json, page runs/9e487358-20260906215817/ - 9e487358-20260905220922: react vs android, total 99, pass 0, basic-pass 0, different 90, matrix runs/9e487358-20260905220922/component-matrix.json, page runs/9e487358-20260905220922/ - 91cbf42a-20260902220309: react vs android, total 92, pass 0, basic-pass 0, different 85, matrix runs/91cbf42a-20260902220309/component-matrix.json, page runs/91cbf42a-20260902220309/ - e17abec9-20260901220040: react vs android, total 92, pass 0, basic-pass 0, different 85, matrix runs/e17abec9-20260901220040/component-matrix.json, page runs/e17abec9-20260901220040/ - d30188a0-20260831215858: react vs android, total 92, pass 0, basic-pass 0, different 86, matrix runs/d30188a0-20260831215858/component-matrix.json, page runs/d30188a0-20260831215858/ - 9710520d-20260830215948: react vs android, total 92, pass 0, basic-pass 0, different 86, matrix runs/9710520d-20260830215948/component-matrix.json, page runs/9710520d-20260830215948/ - 98ec5ddf-20260829215639: react vs android, total 92, pass 0, basic-pass 0, different 86, matrix runs/98ec5ddf-20260829215639/component-matrix.json, page runs/98ec5ddf-20260829215639/ - 98ec5ddf-20260828223831: react vs android, total 92, pass 0, basic-pass 0, different 86, matrix runs/98ec5ddf-20260828223831/component-matrix.json, page runs/98ec5ddf-20260828223831/ - bbe9c375-20260828005428: react vs android, total 92, pass 0, basic-pass 0, different 86, matrix runs/bbe9c375-20260828005428/component-matrix.json, page runs/bbe9c375-20260828005428/ - dcd71319-20260826225301: react vs android, total 92, pass 0, basic-pass 0, different 86, matrix runs/dcd71319-20260826225301/component-matrix.json, page runs/dcd71319-20260826225301/ - 7ffc900e-20260820220535: react vs android, total 86, pass 0, basic-pass 0, different 85, matrix runs/7ffc900e-20260820220535/component-matrix.json, page runs/7ffc900e-20260820220535/ - ff2da678-20260819220528: react vs android, total 86, pass 0, basic-pass 0, different 85, matrix runs/ff2da678-20260819220528/component-matrix.json, page runs/ff2da678-20260819220528/ - aece8704-20260818220517: react vs android, total 86, pass 0, basic-pass 0, different 85, matrix runs/aece8704-20260818220517/component-matrix.json, page runs/aece8704-20260818220517/ - 7f91c208-20260810221045: react vs android, total 86, pass 0, basic-pass 0, different 85, matrix runs/7f91c208-20260810221045/component-matrix.json, page runs/7f91c208-20260810221045/ - dfa0cfbd-20260809220800: react vs android, total 86, pass 0, basic-pass 0, different 85, matrix runs/dfa0cfbd-20260809220800/component-matrix.json, page runs/dfa0cfbd-20260809220800/ - a44e9411-20260803221729: react vs android, total 84, pass 0, basic-pass 0, different 83, matrix runs/a44e9411-20260803221729/component-matrix.json, page runs/a44e9411-20260803221729/ - cbeff10c-20260801030228: react vs android, total 80, pass 0, basic-pass 0, different 79, matrix runs/cbeff10c-20260801030228/component-matrix.json, page runs/cbeff10c-20260801030228/ - ef4f45a1-20260730043036: react vs android, total 80, pass 0, basic-pass 0, different 79, matrix runs/ef4f45a1-20260730043036/component-matrix.json, page runs/ef4f45a1-20260730043036/ - d27f2622-20260726220916: react vs android, total 80, pass 0, basic-pass 0, different 79, matrix runs/d27f2622-20260726220916/component-matrix.json, page runs/d27f2622-20260726220916/ - ffcf4337-20260726050045: react vs android, total 80, pass 0, basic-pass 0, different 79, matrix runs/ffcf4337-20260726050045/component-matrix.json, page runs/ffcf4337-20260726050045/ - 91f78973-20260724222236: react vs android, total 79, pass 0, basic-pass 0, different 78, matrix runs/91f78973-20260724222236/component-matrix.json, page runs/91f78973-20260724222236/ - 8cf0118-20260721104254: react vs android, total 84, pass 0, basic-pass 1, different 82, matrix runs/8cf0118-20260721104254/component-matrix.json, page runs/8cf0118-20260721104254/ - c1d1e21-20260713220645: react vs android, total 95, pass 0, basic-pass 1, different 89, matrix runs/c1d1e21-20260713220645/component-matrix.json, page runs/c1d1e21-20260713220645/ - 0dcd91e-20260712220551: react vs android, total 90, pass 0, basic-pass 1, different 85, matrix runs/0dcd91e-20260712220551/component-matrix.json, page runs/0dcd91e-20260712220551/ - 7bd2af9-20260711220607: react vs android, total 90, pass 0, basic-pass 1, different 85, matrix runs/7bd2af9-20260711220607/component-matrix.json, page runs/7bd2af9-20260711220607/ - ea5a365-20260711052840: react vs android, total 90, pass 0, basic-pass 4, different 82, matrix runs/ea5a365-20260711052840/component-matrix.json, page runs/ea5a365-20260711052840/ - f845b2d-20260710220551: react vs android, total 89, pass 0, basic-pass 2, different 83, matrix runs/f845b2d-20260710220551/component-matrix.json, page runs/f845b2d-20260710220551/ - 6df430f-20260710131759: react vs android, total 89, pass 0, basic-pass 6, different 79, matrix runs/6df430f-20260710131759/component-matrix.json, page runs/6df430f-20260710131759/ - 4890633-20260709221654: react vs android, total 89, pass 0, basic-pass 5, different 80, matrix runs/4890633-20260709221654/component-matrix.json, page runs/4890633-20260709221654/ - b7cbd7d-20260709142821: react vs android, total 89, pass 0, basic-pass 5, different 80, matrix runs/b7cbd7d-20260709142821/component-matrix.json, page runs/b7cbd7d-20260709142821/ - 3748ea5-20260709083602: react vs android, total 89, pass 0, basic-pass 5, different 82, matrix runs/3748ea5-20260709083602/component-matrix.json, page runs/3748ea5-20260709083602/ - f00de08-20260709073651: react vs android, total 89, pass 0, basic-pass 5, different 82, matrix runs/f00de08-20260709073651/component-matrix.json, page runs/f00de08-20260709073651/ - f00de08-20260709072311: react vs android, total 89, pass 0, basic-pass 5, different 82, matrix runs/f00de08-20260709072311/component-matrix.json, page runs/f00de08-20260709072311/ - 86f2b41-20260708224504: react vs android, total 89, pass 0, basic-pass 5, different 82, matrix runs/86f2b41-20260708224504/component-matrix.json, page runs/86f2b41-20260708224504/ - 6ae2789-20260708204330: react vs android, total 89, pass 0, basic-pass 5, different 82, matrix runs/6ae2789-20260708204330/component-matrix.json, page runs/6ae2789-20260708204330/ - 6ae2789-20260708200615: react vs android, total 89, pass 0, basic-pass 0, different 0, matrix runs/6ae2789-20260708200615/component-matrix.json, page runs/6ae2789-20260708200615/ - 7d77b5b-20260708182309: react vs android, total 89, pass 0, basic-pass 5, different 82, matrix runs/7d77b5b-20260708182309/component-matrix.json, page runs/7d77b5b-20260708182309/ - b0f6a2f-20260707222554: react vs android, total 87, pass 0, basic-pass 5, different 80, matrix runs/b0f6a2f-20260707222554/component-matrix.json, page runs/b0f6a2f-20260707222554/ - 04bbe8e-20260707180439: react vs android, total 87, pass 0, basic-pass 5, different 78, matrix runs/04bbe8e-20260707180439/component-matrix.json, page runs/04bbe8e-20260707180439/ - 1dcb122-20260706223444: react vs android, total 84, pass 0, basic-pass 4, different 75, matrix runs/1dcb122-20260706223444/component-matrix.json, page runs/1dcb122-20260706223444/ - 6abae56-20260706130112: react vs android, total 84, pass 0, basic-pass 5, different 67, matrix runs/6abae56-20260706130112/component-matrix.json, page runs/6abae56-20260706130112/ - c21f5b1-20260706091849: react vs android, total 84, pass 0, basic-pass 5, different 70, matrix runs/c21f5b1-20260706091849/component-matrix.json, page runs/c21f5b1-20260706091849/ - 876435d-20260706075548: react vs android, total 84, pass 0, basic-pass 5, different 58, matrix runs/876435d-20260706075548/component-matrix.json, page runs/876435d-20260706075548/ - 911fdb1-20260705222119: react vs android, total 83, pass 0, basic-pass 4, different 77, matrix runs/911fdb1-20260705222119/component-matrix.json, page runs/911fdb1-20260705222119/ - 911fdb1-20260705214455: react vs android, total 82, pass 0, basic-pass 4, different 73, matrix runs/911fdb1-20260705214455/component-matrix.json, page runs/911fdb1-20260705214455/ - 8c4406b-20260705164052: react vs android, total 82, pass 0, basic-pass 6, different 73, matrix runs/8c4406b-20260705164052/component-matrix.json, page runs/8c4406b-20260705164052/ - 884d172-20260705161853: react vs android, total 82, pass 0, basic-pass 6, different 73, matrix runs/884d172-20260705161853/component-matrix.json, page runs/884d172-20260705161853/ - e512d6b-20260705153218: react vs android, total 82, pass 0, basic-pass 6, different 71, matrix runs/e512d6b-20260705153218/component-matrix.json, page runs/e512d6b-20260705153218/ - 308bcdf-20260705140151: react vs android, total 82, pass 0, basic-pass 1, different 80, matrix runs/308bcdf-20260705140151/component-matrix.json, page runs/308bcdf-20260705140151/ - 02e09aa-20260705104859: react vs android, total 82, pass 0, basic-pass 1, different 80, matrix runs/02e09aa-20260705104859/component-matrix.json, page runs/02e09aa-20260705104859/ - e17a1d4-20260705102311: react vs android, total 82, pass 0, basic-pass 1, different 80, matrix runs/e17a1d4-20260705102311/component-matrix.json, page runs/e17a1d4-20260705102311/ - 80be632-20260705101315: react vs android, total 82, pass 0, basic-pass 1, different 80, matrix runs/80be632-20260705101315/component-matrix.json, page runs/80be632-20260705101315/ - 7ca6a69-20260705095113: react vs android, total 82, pass 0, basic-pass 1, different 80, matrix runs/7ca6a69-20260705095113/component-matrix.json, page runs/7ca6a69-20260705095113/ - 11f2525-20260705065201: react vs android, total 82, pass 0, basic-pass 1, different 78, matrix runs/11f2525-20260705065201/component-matrix.json, page runs/11f2525-20260705065201/ - 0baa579-20260704220716: react vs android, total 82, pass 0, basic-pass 1, different 79, matrix runs/0baa579-20260704220716/component-matrix.json, page runs/0baa579-20260704220716/ - 0458783-20260704203528: react vs android, total 82, pass 0, basic-pass 1, different 79, matrix runs/0458783-20260704203528/component-matrix.json, page runs/0458783-20260704203528/ - 963d46cb1-20260703121500: react vs android, total 82, pass 0, basic-pass 3, different 78, matrix runs/963d46cb1-20260703121500/component-matrix.json, page runs/963d46cb1-20260703121500/ - b120ed975-20260703092044: react vs android, total 52, pass 0, basic-pass 0, different 0, matrix runs/b120ed975-20260703092044/component-matrix.json, page runs/b120ed975-20260703092044/ - 48631ed3f-20260703075006: react vs android, total 82, pass 0, basic-pass 3, different 78, matrix runs/48631ed3f-20260703075006/component-matrix.json, page runs/48631ed3f-20260703075006/ - c153932a6-20260703042704: react vs android, total 104, pass 0, basic-pass 3, different 100, matrix runs/c153932a6-20260703042704/component-matrix.json, page runs/c153932a6-20260703042704/ - 695c99afb-20260702214109: react vs android, total 104, pass 0, basic-pass 3, different 100, matrix runs/695c99afb-20260702214109/component-matrix.json, page runs/695c99afb-20260702214109/ - 695c99afb-20260702202831: react vs android, total 103, pass 0, basic-pass 3, different 99, matrix runs/695c99afb-20260702202831/component-matrix.json, page runs/695c99afb-20260702202831/ - b1d7a3d01-20260702184638: react vs android, total 102, pass 0, basic-pass 3, different 98, matrix runs/b1d7a3d01-20260702184638/component-matrix.json, page runs/b1d7a3d01-20260702184638/ - 1c6dce5ad-20260701181253: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701181253/component-matrix.json, page runs/1c6dce5ad-20260701181253/ - 1c6dce5ad-20260701181139: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701181139/component-matrix.json, page runs/1c6dce5ad-20260701181139/ - 1c6dce5ad: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad/component-matrix.json, page runs/1c6dce5ad/ - 1c6dce5ad-20260701173710: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701173710/component-matrix.json, page runs/1c6dce5ad-20260701173710/ - 1c6dce5ad-20260701173638: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701173638/component-matrix.json, page runs/1c6dce5ad-20260701173638/ - 1c6dce5ad-20260701173402: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701173402/component-matrix.json, page runs/1c6dce5ad-20260701173402/ - 1c6dce5ad-20260701173330: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701173330/component-matrix.json, page runs/1c6dce5ad-20260701173330/ - 1c6dce5ad-20260701172140: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701172140/component-matrix.json, page runs/1c6dce5ad-20260701172140/ - 1c6dce5ad-20260701172109: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701172109/component-matrix.json, page runs/1c6dce5ad-20260701172109/ - 1c6dce5ad-20260701171619: react vs android, total 62, pass 0, basic-pass 3, different 58, matrix runs/1c6dce5ad-20260701171619/component-matrix.json, page runs/1c6dce5ad-20260701171619/ ## Baseline Gate Only real product component paths should be included in this report. Pending, fake, preview-only, or mis-scaled provider cases should be excluded from similarity accounting.