Repository navigation
fix(mobile): align branding with TritonAI Harness - #325
Conversation
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: dbalders/TritonAI-Harness/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (10)
📒 Files selected for processing (29)
💤 Files with no reviewable changes (2)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe changes replace T3 branding with Harness branding across mobile artwork, interface text, widgets, and client-runtime messages. Android icon exports now use approved variant-specific PNG masters. The default legal-document URLs now point to TritonAI and UC San Diego destinations. ChangesHarness branding
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Other Suggested reviewers: Merge Risk: ⚪ Minimal · up to No identified issue blocks this branding update; it is ready for normal merge checks. Security Architecture ReviewSecurity architecture risk: ⚪ Minimal · up to The new legal pages remain isolated from application authentication and use narrowly matched destinations. The inspected branding changes preserve connection identity, account checks, and clipboard payload behavior. No material security risk introduced or worsened by this change was identified. Interactive mobile verification remains incomplete. Retained concerns Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
Resilience and Maintainability Implications
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 18 functions across 25 files. (2 skipped: 2 unsupported.)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
Cross-model review unavailableImplementation (PR footer): GPT-6.1 Sol via Codex The review did not finish, so no verdict was produced. Reason: RuntimeError: autoreview published no status (exit 1, reason None) A maintainer can comment Automated cross-model review on ChelsClaw, updated 2026-10-02T15:47:04+00:00. |
dbalders
left a comment
There was a problem hiding this comment.
TritonAI Review
No actionable findings in the inspected changes; see coverage limits.
Reviewed 4715fe6acffaeedb88ba65fea1fb583797dc001e against 49acb921e6ad9c7c25298910394fa2cf7b8cbf94.
Inspected 30 file(s) in 30 part(s); reused 29 unchanged review part(s).
Changes
apps/mobile/app.config.ts: This part of apps/mobile/app.config.ts replaces the shared Android adaptive-icon foreground constant with per-variant Harness foreground PNGs (dev, nightly, prod), drops the dev/nightly adaptive background images in favor of solid variant-specific background colors, and renames the widget display names/descriptions and the microphone/camera permission strings from "T3 Code" to "TritonAI Harness". Bundle identifiers, schemes, packages, and relying parties are unchanged.apps/mobile/assets/widget/T3Mark.svg: This part deletes apps/mobile/assets/widget/T3Mark.svg, the old black 'T3' vector wordmark that the widget asset shipped to the iOS Live Activity / widget extension. The removal is part of the PR-wide replacement of T3 Code marks with the TritonAI Harness logo; the widget mark is now supplied as HarnessMark.png through plugins/withWidgetLogoAsset.cjs (copying assets/prod/tritonai-logo.png into the generated widget asset catalog) and via the changed Android drawable resources, whose changed lines are reviewed in other parts. No replacement content is added in this part, so the only lines to review are the three removed SVG lines.apps/mobile/modules/t3-agent-notifications/android/src/main/java/expo/modules/t3agentnotifications/AgentActivityPresentation.kt: This part of the diff only touches AgentActivityPresentation.kt line 17, a documentation comment inside the ActivityPhase kdoc: the wording "The icon is always the T3 mark" becomes "The icon is always the Harness mark". No executable code in this file changed; the enum values, presentation logic, and the setSmallIcon(R.drawable.agent_activity_mark) reference are byte-identical to the pre-existing version shown in related_code.apps/mobile/modules/t3-agent-notifications/android/src/main/res/drawable/agent_activity_mark.xml: This part deletes the legacy alpha-only vector drawableapps/mobile/modules/t3-agent-notifications/android/src/main/res/drawable/agent_activity_mark.xml, which rendered the T3 wordmark as a white full-bleed path sized for status-bar use. The resource nameagent_activity_markcontinues to be resolved byAgentActivityPresentation.ktviabuilder.setSmallIcon(R.drawable.agent_activity_mark); the replacement artwork (drawable-nodpi/agent_activity_mark.png) is introduced in a separately reviewed diff part, as are theAgentActivityPresentation.ktchanges and thescripts/export-android-icons.tsexport pipeline.apps/mobile/modules/t3-composer-editor/android/src/main/java/expo/modules/t3composereditor/T3ComposerEditorModule.kt: This part of the diff only replaces the three ClipData labels ("T3 Code" → "TritonAI Harness") in the Android composer clipboard helper of apps/mobile/modules/t3-composer-editor. The clip label is a display-only string shown to the user by Android's clipboard UI and is not part of the payload contract: the plain-text content ("text"), the HTML fragment carrier (""), and the read() return shape are all unchanged. The surrounding write/read logic (record filtering, screenshot-record promotion, URL-encoding, XML escaping) is untouched context, not introduced by this diff.
apps/mobile/modules/t3-subscription-widget/android/src/main/res/values/strings.xml: This part renames the Android subscription widget's user-facing strings from "T3 Code"/"Subscription usage" branding to "TritonAI Harness"/"Harness usage" branding. It only edits display copy (widget name, description, empty-state text) in apps/mobile/modules/t3-subscription-widget/android/src/main/res/values/strings.xml; string keys, format specifiers, and all other resources are unchanged.apps/mobile/plugins/withWidgetLogoAsset.cjs: This part updates the iOS widget-asset plugin (apps/mobile/plugins/withWidgetLogoAsset.cjs) to ship the full-color TritonAI logo instead of the templated T3 SVG. The imageset is renamed from T3Mark.imageset to HarnessMark.imageset, the source file is now the repo-root production logo PNG (assets/prod/tritonai-logo.png) copied in as HarnessMark.png, and the Contents.json drops the vector/template-rendering properties in favor of a plain single-scale PNG entry. The catalog write (dangerous mod) and the actool build-phase wiring via addWidgetAssetCatalog are unchanged, and the documented plugin-ordering requirement relative to expo-widgets is preserved. I verified the new source path resolves to the same repo-root asset that HarnessLogo.tsx bundles, and the hard-coded catalog path in addWidgetAssetCatalog.cjs still matches CATALOG_NAME.apps/mobile/src/components/BrandMark.tsx: BrandMark.tsx replaces the inline expo-image brand mark (which resolved its own dev/prod asset) with the shared HarnessLogo component, which now owns variant-based logo selection (dev/preview/nightly/prod). The title text, stage-label badge, compact mode, and subtitle logic are unchanged. The variant key (Constants.expoConfig?.extra?.appVariant) and layout behavior remain equivalent, and the previously rounded-corner styling on the mark is now delegated to the logo component.apps/mobile/src/components/CompactBrandTitle.tsx: This part rebrands the compact navigation-bar lockup: T3Wordmark (SVG wordmark, tinted to theme) is replaced with HarnessLogo (variant-specific static PNG via expo-image), the visible title text changes from "Code" to "TritonAI Harness" with a bolder/smaller style plus numberOfLines={1} and a shrink class, and the accessibilityLabel is updated from "T3 Code, Threads" to "TritonAI Harness, Threads". The stage-label badge, brandTitleOffset logic, renderCompactBrandTitle, and getCompactBrandHeaderOptions are unchanged context.apps/mobile/src/components/HarnessLogo.tsx: This part adds a newHarnessLogoReact Native component inapps/mobile/src/components/HarnessLogo.tsx. It resolves the app variant fromConstants.expoConfig?.extra?.appVariantat module scope, statically requires a variant-specific logo asset (dev->assets/dev/tritonai-harness-dev-universal-1024.png,preview->assets/nightly/tritonai-harness-nightly-universal-1024.png, otherwiseassets/prod/tritonai-logo.png), and renders it withexpo-imageat a caller-provided square size. Sibling changed components (BrandMark.tsx,CompactBrandTitle.tsx) consume this component for navigation and settings branding.apps/mobile/src/components/T3Wordmark.tsx: This part deletes apps/mobile/src/components/T3Wordmark.tsx in its entirety: the old "T3" SVG wordmark component (a react-native-svg Path wrapped with withUniwind, sized via the 94.3941/56.96 viewBox aspect ratio, with accessibilityLabel "T3") is removed as part of the TritonAI Harness branding alignment. Replacement branding is provided by the new HarnessLogo raster component and the updated BrandMark/CompactBrandTitle components handled in other diff parts.apps/mobile/src/features/cloud/T3ConnectProfilePage.tsx: This part of apps/mobile/src/features/cloud/T3ConnectProfilePage.tsx replaces the hardcoded "T3 Connect" product name in three user-facing strings (the deregister confirmation message, the environment-list load-error row title, and the empty-state row subtitle) and the component doc comment with the shared TRITONAI_CONNECT_NAME constant imported from @t3tools/contracts. No control flow, state handling, dialog presentation (iOS Alert vs Android showConfirmDialog), or list rendering logic is altered; the template-literal interpolation follows the existing string shapes and both platform branches of confirmDeregister share the same message.apps/mobile/src/features/connection/GitHubRoutingSettings.tsx: This part of the PR renames the fallback connection label in the mobile GitHub routing settings: when an environment has no display URL, the subtitle now shows the sharedTRITONAI_CONNECT_NAMEconstant from@t3tools/contractsinstead of the hardcoded "T3 Connect" string. The rest of the component (options list, save flow, accessibility wiring) is unchanged.apps/mobile/src/features/settings/SettingsAuthRouteScreen.tsx: This part replaces the hardcoded "T3 Connect" label on the Clerk UserProfileView custom page row with the shared TRITONAI_CONNECT_NAME constant from @t3tools/contracts. The page path ("t3-connect"), icon, content component, and all navigation/auth logic are unchanged, so Clerk's routing and the sign-in/sign-out flows are unaffected. The same constant is already used by the revised T3ConnectProfilePage (handled in a separate part), keeping the row label consistent with the page's own headings and empty-state copy.apps/mobile/src/features/settings/SettingsOpenSourceLicensesRouteScreen.tsx: This diff part changes a single string in the open-source licenses screen header: 'Notices for dependencies, assets, and optional tools used by T3 Code Mobile.' becomes '...used by TritonAI Harness.' All other lines shown in the diff records are unchanged context lines (list configuration, search input, notice-count text, empty-state copy). The related file confirms the new string renders inside the ListHeaderComponent of the license list and nothing else in the screen references the old product name.apps/mobile/src/features/settings/appearance/components/AppearancePreviews.tsx: This part changes one line in the TerminalAppearancePreview sample: the fake prompt's directory label changes fromt3codetoharness. All surrounding code (theme resolution, font spans, preview tokens) is unchanged.apps/mobile/src/features/settings/lib/legal-document-url.test.ts: This part updates only the unit test for the legal-document URL allowlist. The allowed cases replace the old t3.codes document URLs with TritonAI's trust-architecture page (including trailing-slash and query-string variants) and UCSD's terms-of-use page with a fragment, and the rejection cases add the old t3.codes privacy URL, a different TritonAI path, and a.html.evilsuffix-confusion attempt.apps/mobile/src/features/settings/lib/legal-document-url.ts: This part of the PR retargets the mobile legal-document URLs from the upstream t3.codes marketing site to TritonAI's campus site. The only changed lines are theDEFAULT_MARKETING_SITE_URLconstant (line 1) and the exported legal URL constants (lines 25-39): when the resolved marketing site is TritonAI's origin, Privacy, Security, and the Legal pages all resolve toabout/trust-architecture.html, and Terms resolves to UC San Diego's campus-wide terms page; otherwise the previous upstream-style paths (privacy-policy,security-policy,legal,terms-of-service) are preserved for non-TritonAIEXPO_PUBLIC_MARKETING_SITE_URLoverrides. The surroundingresolveMarketingSiteUrlnormalization,marketingSiteDocumentUrljoin, the allowlist,webDocumentIdentity, andisLegalDocumentUrlare unchanged context.apps/mobile/src/features/threads/thread-work-log.tsx: In apps/mobile/src/features/threads/thread-work-log.tsx, this part replaces the T3 Code wordmark used for the "t3-code" work-log icon with the variant-specific HarnessLogo component (import swap on line 39, render swap on lines 93). The WorkLogIcon branches for browser/device/pull-request symbols and all other logic in the file are unchanged.apps/mobile/src/lib/mobileTheme.ts: This part of the PR renames the mobile theme picker labels in apps/mobile/src/lib/mobileTheme.ts: the default theme option is relabeled from "T3 Code" to "TritonAI Harness", and the built-in "t3-chat" theme's label is overridden to "Harness Violet" inside a reformat of the BUILT_IN_THEMES.map callback. No theme IDs, normalization logic, color conversion, or persistence behavior is changed — the edits touch only display strings in MOBILE_THEME_OPTIONS.apps/mobile/src/widgets/AgentActivity.test.ts: This part updates the AgentActivity widget layout test to the TritonAI Harness title and retargets one attention-tint assertion from the compact leading presentation to the compact trailing presentation. The rest of the test file (row fixture, deep-link scheme, palette, ordering, and outcome assertions) is unchanged context.apps/mobile/src/widgets/AgentActivity.tsx: This part replaces the text-based "TAI" Live Activity logo in apps/mobile/src/widgets/AgentActivity.tsx with an Image asset named "HarnessMark", rendered through the same container-frame + resizable pattern already used by renderGlyph for SF Symbols. The color/foreground parameter is dropped from renderLogo, and all call sites (banner, bannerSmall, compactLeading, minimal, expandedLeading) are updated consistently. The surrounding layout, deep-link, tinting, and row-rendering logic is unchanged. The new code follows the existing sizing idiom (frame({ width: height, height })on an HStack wrapping a resizable Image),resizableandframeare already imported/used by renderGlyph, theForegroundtype remains in use, and the updated test mocks cover every modifier the new markup references. No correctness, security, data-loss, concurrency, or performance defect is introduced by the changed lines in this part.apps/mobile/src/widgets/SubscriptionUsage.tsx: This part only replaces the remaining "T3" product references in the iOS SubscriptionUsage widget with "Harness" branding: the default unconnected-provider copy (lines 42-43), the stale-snapshot refresh prompt (line 76), the accessory fallback label (line 124), the "more in" overflow label (line 226), and the empty-state footer (line 254). No logic, layout modifiers, or data flow changed; the widget still reads the SubscriptionUsageSnapshot contract from subscriptionUsageSnapshot.ts, whose companion strings ("Open Harness to refresh") were updated in the same PR. I traced each changed string against its render site in related_code and found no behavioral, truncation-logic, or contract impact introduced by these edits.apps/mobile/src/widgets/subscriptionUsageSnapshot.ts: The only changed lines in this part are two user-facing copy strings in apps/mobile/src/widgets/subscriptionUsageSnapshot.ts: the stale-data detail text at line 84 and the timeline expiry detail at line 129, both renamed from "Open T3 to refresh" to "Open Harness to refresh". The surrounding window-selection, freshness, and timeline logic is unchanged context. I traced consumers of these strings: the snapshot detail is display-only (published to the OS widget and rendered by the widget UIs); the Android widget uses its own localized strings (t3_subscription_widget_refresh), and the provided test suite asserts on other fields (remaining, expiresAt, totalWindows, detail "Subscription remaining") but not on the stale-refresh string, so no test or runtime matching breaks. The two call sites are updated consistently, and no code in the supplied context compares against the old literal. No correctness, security, concurrency, or performance defects introduced by these lines.assets/README.md: This diff part rewrites the "Android launcher and splash artwork" section of assets/README.md. The old instructions (rendering Android assets from Icon Composer SVG layer sources, including the android-icon-background-dev.png/-nightly.png background layers and a transparent wordmark foreground) are replaced with new instructions:vp run icons:export:androidnow exports variant badge foregrounds and splash icons directly from the approved Harness production/development/nightly PNG masters, each composited on a configured solid background color, and the monochrome mark, notification icon, and native agent-activity drawable are derived as a white trident silhouette from the production master. This matches the PR's removal of the android-icon-background assets from the changed-file set and the addition of the new exporter inputs. The rest of the README (Icon Composer production export, macOS master guidance) is unchanged.packages/client-runtime/src/errors/network.ts: This part replaces the hardcoded "T3 Connect" mention in NETWORK_BLOCKING_HINT with an interpolated TRITONAI_CONNECT_NAME constant imported from @t3tools/contracts, aligning the shared network-error hint with the TritonAI Harness branding. The constant is resolved once at module load as a plain template literal, so the hint remains a static string with unchanged shape and no behavioral effect on connection logic. @t3tools/contracts is already a declared dependency of @t3tools/client-runtime, and other consumers in this PR (e.g. GitHubRoutingSettings, SettingsAuthRouteScreen, T3ConnectProfilePage) import the same constant, so the import path and resolution are consistent with existing usage.packages/client-runtime/src/relay/managedRelayState.ts: This part changes a single line in packages/client-runtime/src/relay/managedRelayState.ts: thederegisterManagedRelayEnvironmenterror message for a missing/mismatched session now interpolates theTRITONAI_CONNECT_NAMEconstant instead of the hardcoded string "T3 Connect". No control flow, effects, or API surface changed.packages/client-runtime/src/state/pullRequestDiffHttp.test.ts: This part changes one assertion in packages/client-runtime/src/state/pullRequestDiffHttp.test.ts: the expected message for PullRequestDiffCredentialRejectedError is updated from "…quit and reopen T3 Code." to "…quit and reopen TritonAI Harness." The error message itself is produced in packages/client-runtime/src/state/pullRequestDiffHttp.ts by interpolating TRITONAI_APP_BASE_NAME from @t3tools/contracts, so this test line only pins the user-facing recovery text for a rejected diff session; no request, parsing, or error-mapping behavior changes.packages/client-runtime/src/state/pullRequestDiffHttp.ts: In packages/client-runtime/src/state/pullRequestDiffHttp.ts, this part replaces the hardcoded "T3 Code" app name in PullRequestDiffCredentialRejectedError's message getter with the TRITONAI_APP_BASE_NAME constant imported from @t3tools/contracts, producing the same sentence with the product name interpolated. No control flow, error mapping, timeout, or request logic is altered.scripts/export-android-icons.ts: This part rewrites scripts/export-android-icons.ts. The previous implementation re-composed Icon Composer SVG layers (wordmark foreground, per-variant full-bleed backgrounds) into Android adaptive/splash assets. The new implementation rasterizes the approved PNG brand masters directly: each variant (dev/nightly/prod) gets an adaptive-icon foreground that is the full-color badge composited at 60% of the 432px canvas over transparency, and a 1152px splash image of the badge over the variant's brand color; a white alpha-only silhouette is derived from the production master by zeroing alpha where min(R,G,B) <= 128, then trimmed and scaled to 264px for the adaptive monochrome layer and 96px for the notification icon, which is also copied into the t3-agent-notifications module's drawable-nodpi. Output filenames match the references in apps/mobile/app.config.ts (per-variant foregrounds, per-variant splash icons, shared mark/notification icon), and the variant splash colors (#0B2237/#111533/#182B49) match the configured androidAdaptiveBackgroundColor values, which is what makes mask clipping of the badge corners invisible. The old android-icon-background-*.png outputs are no longer generat
Coverage limits
- Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-icon-foreground-dev.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-icon-foreground-nightly.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-icon-foreground.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-icon-mark.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-notification-icon.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-splash-icon-dev.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-splash-icon-nightly.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/assets/android-splash-icon-prod.png. - Manual inspection required for binary, metadata-only or non-text change:
apps/mobile/modules/t3-agent-notifications/android/src/main/res/drawable-nodpi/agent_activity_mark.png. - apps/mobile/app.config.ts: The referenced Android raster assets are binary images; their pixel content, safe-zone compliance, and variant-specific badges cannot be verified from the diff. The PR states they were visually inspected after export. The generation script scripts/export-android-icons.ts is handled in a separate part.
- apps/mobile/assets/widget/T3Mark.svg: The deletion can only be confirmed safe by a repository-wide reference scan (require/import, EAS asset patterns, expo-widgets widget definitions, native widget extension sources, and tests) proving nothing still resolves 'assets/widget/T3Mark.svg' after this change. The known consumer candidates (apps/mobile/src/widgets/AgentActivity.tsx, AgentActivity.test.ts, apps/mobile/plugins/withWidgetLogoAsset.cjs, apps/mobile/assets/README.md) are all in changed_files and their changed lines are reviewed in other parts, so only references from files outside the changed set would be a defect, and the supplied context does not include a grep result or those files' full contents to rule that out. If such a dangling reference exists, the Metro bundler or widget build would fail at asset resolution; please confirm with a search for 'T3Mark' across the repo.
- apps/mobile/modules/t3-agent-notifications/android/src/main/res/drawable/agent_activity_mark.xml: Some candidate findings were omitted because their evidence or location could not be verified.
- apps/mobile/modules/t3-agent-notifications/android/src/main/res/drawable/agent_activity_mark.xml: The replacement PNG is binary and the export script's changed lines are reviewed in another part, so this review cannot confirm whether the new
agent_activity_markartwork is alpha-only (safe forsetSmallIcon) or full-color (breaks status-bar rendering). The P2 finding above is conditional on that content; a reviewer with the PNG/script content should verify the alpha-mask property directly. - apps/mobile/modules/t3-composer-editor/android/src/main/java/expo/modules/t3composereditor/T3ComposerEditorModule.kt: The other 38 changed files in this PR are handled by separate diff parts; their changed lines are not reviewable from this part and their absence here is not treated as missing evidence. If a JavaScript-side consumer of the clipboard clip label exists (e.g. code matching on the clip description string rather than the data-t3-context-fragment attribute), it is not present in the supplied context for this part; from the visible code the label change is display-only.
- apps/mobile/plugins/withWidgetLogoAsset.cjs: This part renames the widget imageset from "T3Mark" to "HarnessMark" and switches it from a template-rendered SVG to a full-color PNG. Whether the widget/Live Activity code correctly references the new "HarnessMark" asset name and no longer relies on template tinting cannot be confirmed from this part; those files' changed lines are reviewed in a separate part. If they still reference "T3Mark" or apply a foregroundColor expecting template behavior, the widget logo would fail to render or fail to tint, but that combination should be caught in the part covering the widget sources.
- apps/mobile/src/components/BrandMark.tsx: BrandMark now renders HarnessLogo, whose require() paths point at repo-root asset files. Those files and the HarnessLogo.tsx diff are handled in other diff parts, so this review cannot confirm from this part alone that the newly referenced universal assets exist on disk; a missing file would fail Metro bundling for the dev/preview variants. Verified here only that BrandMark itself no longer references the old dev-1024 asset and that no other correctness, security, or performance issue is introduced by the changed lines in this file.
- apps/mobile/src/components/CompactBrandTitle.tsx: Callers of renderCompactBrandTitle / getCompactBrandHeaderOptions (the screens that mount this lockup in the native-stack header slot) are not in the supplied context, so the header container's width/height constraints under iOS dynamic-type scaling and on Android cannot be traced here. The title text is 16 characters with numberOfLines={1} and allowFontScaling on iOS; whether large accessibility text sizes truncate the brand name depends on those containers. This is flagged for the reviewer of those screens, not asserted as a defect.
- apps/mobile/src/components/CompactBrandTitle.tsx: Whether ./T3Wordmark (removed import at diff line 6) is still referenced by other modules is handled by the separate diff part for apps/mobile/src/components/T3Wordmark.tsx; that boundary is outside this review.
- apps/mobile/src/components/T3Wordmark.tsx: The deleted T3Wordmark component's callers were not supplied in related_code, so dangling imports cannot be ruled out from the diff alone. Mitigating evidence: the PR reports
vp run typecheck(tsc --noEmit for apps/mobile) passing, which would surface any unresolved import of the removed module, and none of the provided related_code references T3Wordmark. If interactive callers existed that passed color/colorClassName (the old component accepted those; the replacement HarnessLogo does not), a rendering difference could result, but no such caller appears in the supplied context. - apps/mobile/src/features/cloud/T3ConnectProfilePage.tsx: The exported value of TRITONAI_CONNECT_NAME from @t3tools/contracts is not included in the supplied context (packages/contracts is not among this PR's changed files, so it presumably pre-exists and typecheck coverage in the PR description suggests the export resolves). Manual confirmation that the constant is exported from that entry point and evaluates to the approved product name (e.g. "TritonAI Connect") would fully close the loop on the user-facing copy in the three changed strings.
- apps/mobile/src/features/connection/GitHubRoutingSettings.tsx: The definition of
TRITONAI_CONNECT_NAMEin@t3tools/contractsis not included in this part's evidence. Its existence and value could not be directly verified here, but the same constant is already imported and used identically inapps/mobile/src/features/cloud/T3ConnectProfilePage.tsx(related_code), and the PR reportsvp run typecheckpassing, so an undefined/missing export is unlikely. If the contracts package changed in another diff part, that part's review should confirm the export's value. - apps/mobile/src/features/settings/SettingsAuthRouteScreen.tsx: The packages/contracts source defining TRITONAI_CONNECT_NAME is not in the provided context, so its exact string value could not be independently verified. However, the same import is used unchanged by the related T3ConnectProfilePage and elsewhere in the app, typecheck and the focused branding tests passed per the PR description, and no call site in this diff treats the value as anything other than a display string, so no defect is indicated.
- apps/mobile/src/features/settings/lib/legal-document-url.ts: The consumer(s) of
isLegalDocumentUrl/ALLOWED_LEGAL_DOCUMENT_URLS(presumably the settings legal-document webview or link handler) are not included in this part's context, so I could only verify the allowlist logic in isolation. Within this file the identity function (webDocumentIdentity, unchanged) correctly rejects scheme, origin, port, userinfo, and pathname variations of the four allowed URLs, and the newly added UCSD terms URL is covered by both the allow and reject test cases (...terms-of-use.html#updatesallowed,...terms-of-use.html.evilrejected). - apps/mobile/src/features/settings/lib/legal-document-url.ts: Whether
https://tritonai.ucsd.edu/about/trust-architecture.htmlandhttps://ucsd.edu/about/terms-of-use.htmlactually exist and host the described privacy/trust and terms content cannot be verified from the supplied repository context; the constants and the tests hard-code these literals without an integration check. The PR itself notes Settings screens have not been interactively inspected, so a 404 on either legal destination would not be caught by the current test suite. - apps/mobile/src/lib/mobileTheme.ts: The shared themePalettes source is not in the supplied context, so I could not fully verify that MOBILE_DEFAULT_THEME_ID is not also present in BUILT_IN_THEMES (which would render the new "TritonAI Harness" label twice in the picker) or confirm what label t3-chat previously carried. Based on the visible test files (which treat "t3-code" as the default and list t3-chat as a built-in), the mapping appears sound and label-only, so no defect is reported; a quick manual check of the picker rendering would confirm there is no duplicate or stale label.
- apps/mobile/src/widgets/AgentActivity.test.ts: Some candidate findings were omitted because their evidence or location could not be verified.
- apps/mobile/src/widgets/AgentActivity.tsx: renderLogo now depends on a widget asset catalog entry named "HarnessMark" (and, since the logo no longer receives the scheme-aware primaryForeground/tint the old text logo used, ideally on light/dark appearance variants). Whether the plugin installs an asset under exactly that name with appropriate appearance variants is determined by files whose changed lines are reviewed in other parts; this part cannot confirm or refute it.
- apps/mobile/src/widgets/SubscriptionUsage.tsx: Tests covering widget copy live in a changed file handled by another diff part; I could not confirm from this part alone whether every assertion referencing the renamed SubscriptionUsage strings was updated, though the PR reports the full suite passing.
- packages/client-runtime/src/errors/network.ts: The exact value of TRITONAI_CONNECT_NAME is not present in the supplied context, so I cannot independently confirm the rendered hint text. However, the constant is already imported by existing mobile screens in this PR, the PR reports passing typecheck and the full test suite, and the PR description explicitly acknowledges the shared error-text change, so no further inspection appears necessary.
- packages/client-runtime/src/state/pullRequestDiffHttp.test.ts: The diff for packages/client-runtime/src/state/pullRequestDiffHttp.test.ts is reviewed here. The definition of TRITONAI_APP_BASE_NAME in @t3tools/contracts is not included in this part, so the literal "TritonAI Harness" was verified against the source only by contract shape (the message getter interpolates the constant) and the PR's reported passing test run, not by reading the constant's value directly. The other changed files listed (network.ts, managedRelayState.ts) are handled by other diff parts.
- packages/client-runtime/src/state/pullRequestDiffHttp.ts: The definition and value of TRITONAI_APP_BASE_NAME in @t3tools/contracts is not included in the supplied context, so the interpolated value could not be independently verified from source. The related test packages/client-runtime/src/state/pullRequestDiffHttp.test.ts asserts the exact rendered message "...quit and reopen TritonAI Harness.", and the PR reports the suite passing, so a wrong constant would be caught there; if the constant diverges between variants, the message would follow that constant rather than the test-pinned string.
- scripts/export-android-icons.ts: Some candidate findings were omitted because their evidence or location could not be verified.
CI snapshot
Combined commit status: pending
- status CodeRabbit: pending Review in progress
Check runs:
- Publish anonymous download: status=completed conclusion=skipped app=
- Build macOS Apple Silicon preview: status=completed conclusion=skipped app=
- Mobile Native Static Analysis: status=completed conclusion=success app=
- Sync PR size label definitions: status=completed conclusion=skipped app=
- Label PR size: status=completed conclusion=success app=
- Macroscope - Effect Service Conventions: status=completed conclusion=skipped app=
- Deploy web preview: status=completed conclusion=skipped app=
- Remove preview download: status=completed conclusion=skipped app=
- Native fingerprint diff: status=completed conclusion=success app=
- Test Server 2: status=completed conclusion=success app=
- Test Server 1: status=completed conclusion=success app=
- Check: status=completed conclusion=success app=
- Test: status=in_progress conclusion=none app=
- Release Smoke: status=completed conclusion=success app=
- Test Server 3: status=completed conclusion=success app=
- Mobile Native Changes: status=completed conclusion=success app=
- Rust: status=completed conclusion=success app=
- Macroscope - Correctness Check: status=completed conclusion=skipped app=
- Prepare PR size config: status=completed conclusion=success app=
CI is reported separately. This code review does not claim to have run tests.
Comment /triton-review to request a fresh review. Findings are advisory; GitHub branch protection remains authoritative.
Summary
The mobile app still displayed T3 Code artwork and labels after adopting the Harness app name. Replace the visible navigation and tool marks with the approved variant-specific Harness logos, rename Connect/theme/widget/permission copy, and use Harness artwork for Android launcher, splash, and notification icons.
Privacy and Security now open TritonAI's Trust, Privacy & Hosting page. Terms opens the UC San Diego terms page linked from TritonAI's site.
Why
Give mobile users the same TritonAI Harness identity as the desktop and campus website.
Validation
vp check --fix: 0 errors; 781 existing warnings.vp run typecheck.vp test: 17,343 passed; 56 skipped on the main integration commit4715fe6. Focused branding tests: 90 passed.vp run lint:mobile: SwiftLint, ktlint, and detekt passed.4715fe6; CodeRabbit and TritonAI review found no actionable issues. Binary artwork was manually inspected and excluded from CodeRabbit coverage.Risk and Recovery
Keep existing storage keys, URL schemes, native module/package identifiers, and authentication identity compatible. Preserve upstream license attribution. Shared error text changes affect other Harness clients but do not change connection behavior. Restore the prior artwork/copy to roll back the branding.
Release and Deployment Impact
Native widget and Android resources changed, so the next distribution needs a native build. No TestFlight upload or nightly is triggered by this PR.
Upstream Alignment
Intentional downstream branding using the existing approved Harness assets. Builds on the launch-crash fix merged in #324.
Checklist
Implementation: GPT-6.1 Sol via Codex