Repository navigation
fix(mobile): chat and composer chips stay readable in light mode - #22585
Conversation
ApprovabilityVerdict: Needs Human Approval Macroscope's review found this PR requires human approval — This range contains substantial mobile runtime changes beyond contrast tuning, including thread/project chip rendering, project icon resolution, native rasterization, and state-driven asset lookup. It also adds a configuration-level static-analysis escape-hatch allowlist entry, so the scope and review-policy impact require human review. You can add or adjust custom eligibility rules. Learn more. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
3b04881 to
866349e
Compare
866349e to
6100c1f
Compare
6100c1f to
954a2ef
Compare
954a2ef to
11c8e9d
Compare
11c8e9d to
09de6c7
Compare
|
Taking over this one |
Takeover tests for pingdotgg#22585: the two contrast behaviours (light themes read at 4.5:1, dark and saturated Material You surfaces keep the shared accents), rewritten with static imports and deduplicated accents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ontrast Replace the hand-tuned light-surface accent table with the existing contrast helper, so a new chip accent reads on light themes without a matching entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… theme Colored dark themes put chips on a mid-tone user bubble where the shared accents nearly vanish (Ember video, Grove terminal). Each chip now gets one color per theme: the accent's OKLCH hue at the most chroma sRGB allows, lightened or darkened only until it reads at 4.5:1 on the bubble, the reply canvas and the composer. Surfaces with opposite-shade text, like Material You's light bubble, get their own match. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-contrast # Conflicts: # apps/mobile/src/features/threads/ThreadFeed.tsx
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
## What's Changed * fix(web): clear stale resource monitor errors after retry by @juliusmarminge in pingdotgg/t3code#24229 * fix(mobile): align draft workspace controls with the composer by @PixPMusic in pingdotgg/t3code#24239 * feat(mobile): thread header minimizes on the Duo while reading back through history by @juliusmarminge in pingdotgg/t3code#24235 * fix(web): center pull request timeline actions by @PixPMusic in pingdotgg/t3code#24259 * fix(server): find the resource monitor when the server runs from its build output by @yordis in pingdotgg/t3code#23965 * fix(pull-requests): list filters narrow on every host that can by @juliusmarminge in pingdotgg/t3code#23922 * fix(pull-requests): a filtered list fills its page instead of waiting for a scroll by @juliusmarminge in pingdotgg/t3code#23923 * feat(pull-requests): label and author filters search the host by @juliusmarminge in pingdotgg/t3code#23924 * fix(mobile): chat and composer chips stay readable in light mode by @flamboh in pingdotgg/t3code#22585 * fix(web): review thread avatars no longer clip in collapsed activity rows by @flamboh in pingdotgg/t3code#23545 * ci: close "needs more info" issues after 7 days without a reply by @juliusmarminge in pingdotgg/t3code#22628 * fix(server): Codex accounts show ChatGPT's current plan names by @flamboh in pingdotgg/t3code#24200 * fix(observability): desktop dev version and web environment match the other services by @yordis in pingdotgg/t3code#23975 * fix(observability): custom resource attributes use the t3code prefix by @yordis in pingdotgg/t3code#23974 * fix(mobile): Home and pull request lists let UIKit own their top inset by @juliusmarminge in pingdotgg/t3code#24284 * fix(mobile): keep the Duo's Home and pull request headers fixed by @juliusmarminge in pingdotgg/t3code#24295 * fix(server): interrupts started by an agent no longer say "by user" in the timeline by @juliusmarminge in pingdotgg/t3code#24299 * ci(relay): deploy labeled PRs to relay preview stages by @juliusmarminge in pingdotgg/t3code#23872 * fix(mobile): HTML links in pull request comments open when tapped by @flamboh in pingdotgg/t3code#22110 * perf(client): avoid full ordering scans for streamed replacements by @juliusmarminge in pingdotgg/t3code#24264 * fix(server): a fork's first /compact compacts its inherited history by @juliusmarminge in pingdotgg/t3code#24172 * fix(server): agent recordings honor the browser frame rate setting by @juliusmarminge in pingdotgg/t3code#23895 * fix(client-runtime): Stop clears commands already finished on the server by @juliusmarminge in pingdotgg/t3code#23814 * fix(web): SSH environments on an older reused remote server explain the version mismatch instead of reconnecting forever by @juliusmarminge in pingdotgg/t3code#23647 * fix(web): keep usage-limit wake action visible by @juliusmarminge in pingdotgg/t3code#23803 * fix(server): reject pairing with an incompatible server protocol by @juliusmarminge in pingdotgg/t3code#23789 **Full Changelog**: pingdotgg/t3code@v0.1.3-nightly.20261023.3592...v0.1.3-nightly.20261024.3604 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.3-nightly.20261024.3604
* test: delete low-value tests and dead test-only exports (pingdotgg#24058) * test(server): restore DST scheduling tests deleted in the test snap (pingdotgg#23991) * test(web): restore project settings permission tests deleted in the test snap (pingdotgg#24011) * test(mobile): restore clipboard secret-redaction test deleted in the test snap (pingdotgg#23980) * fix(web): Cmd+B toggles the sidebar unless text is selected (pingdotgg#24063) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): agent-browser and Chrome no longer outlive the agent that started them (pingdotgg#21299) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * test(client-runtime): restore render scheduler tests deleted in the test snap (pingdotgg#23977) * fix(web): cmd+k search hides subagents and favors recent, whole-word matches (pingdotgg#24032) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * test(lint): new polling loops in tests now fail lint (pingdotgg#23983) * ci: unused dependency patches fail in check:changed, not after push (pingdotgg#23988) * fix(desktop): PDFs in the preview can be annotated (pingdotgg#24022) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): instructed compact runs without a bare compaction first (pingdotgg#24008) Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> * fix(desktop): reduce app crashes when a preview tab's renderer dies during agent screenshots (pingdotgg#24056) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Stop stops a thread's subagents again (pingdotgg#23886) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(desktop): a stuck quit no longer leaves the app unkillable (pingdotgg#23873) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep blockquote text readable in every theme (pingdotgg#24036) * fix(bitbucket): stop the startup sweep from flooding Bitbucket with 429s (pingdotgg#23889) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): screen readers hear when the open thread starts, needs you or finishes (pingdotgg#23752) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): reduce allocations in streaming timeline scans (pingdotgg#23739) * perf(web): reuse a collator when sorting changed-file trees (pingdotgg#23776) * perf(scripts): check:changed finishes in about 10 s (pingdotgg#23581) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): size Usage header controls to the available width (pingdotgg#24123) * perf(server): speed up large terminal clipboard sequences (pingdotgg#23819) Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(server): make stale CLI service recovery actionable (pingdotgg#23541) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): pasted images show their upload tile instantly (pingdotgg#23832) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> * fix(server): clean up deleted threads worktrees with subagents (pingdotgg#23900) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): pause periodic PR discovery without foreground clients (pingdotgg#23852) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): meter checkpoint git subprocess attempts (pingdotgg#24218) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(web): clear stale resource monitor errors after retry (pingdotgg#24229) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(mobile): align draft workspace controls with the composer (pingdotgg#24239) * feat(mobile): thread header minimizes on the Duo while reading back through history (pingdotgg#24235) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): center pull request timeline actions (pingdotgg#24259) * fix(server): find the resource monitor when the server runs from its build output (pingdotgg#23965) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Victor Vogel <satsdev@only21mil.xyz> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Joseph Vidal <135430578+josephv123@users.noreply.github.com> Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com> Co-authored-by: Akshar Patel <123344143+AksharP5@users.noreply.github.com> Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com> * fix(pull-requests): list filters narrow on every host that can (pingdotgg#23922) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(pull-requests): a filtered list fills its page instead of waiting for a scroll (pingdotgg#23923) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(pull-requests): label and author filters search the host (pingdotgg#23924) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): chat and composer chips stay readable in light mode (pingdotgg#22585) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): review thread avatars no longer clip in collapsed activity rows (pingdotgg#23545) * ci: close "needs more info" issues after 7 days without a reply (pingdotgg#22628) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> * fix(server): Codex accounts show ChatGPT's current plan names (pingdotgg#24200) * fix(observability): desktop dev version and web environment match the other services (pingdotgg#23975) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(observability): custom resource attributes use the t3code prefix (pingdotgg#23974) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> * fix(mobile): Home and pull request lists let UIKit own their top inset (pingdotgg#24284) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): keep the Duo's Home and pull request headers fixed (pingdotgg#24295) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): interrupts started by an agent no longer say "by user" in the timeline (pingdotgg#24299) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(relay): deploy on-demand preview stages for labeled PRs Labeled same-repo PRs deploy stage pr-<n> behind the relay-preview environment reviewer gate. Unlabel or close tears the stage down, and a nightly job retries failed teardowns. Runtime-created managed endpoint tunnels and CNAMEs are swept by a PreviewTunnelSweep resource. Known gaps, tracked as follow-ups: an interrupted preview deploy can leave runtime tunnels behind; repo-level relay secrets still bypass the environment gate until moved. 🤖 Generated with [Claude Code](https://claude.com/claude-code) * fix(mobile): HTML links in pull request comments open when tapped (pingdotgg#22110) * perf(client): avoid full ordering scans for streamed replacements (pingdotgg#24264) * fix(server): a fork's first /compact compacts its inherited history (pingdotgg#24172) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): agent recordings honor the browser frame rate setting (pingdotgg#23895) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): Stop clears commands already finished on the server (pingdotgg#23814) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): SSH environments on an older reused remote server explain the version mismatch instead of reconnecting forever (pingdotgg#23647) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep usage-limit wake action visible (pingdotgg#23803) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): reject pairing with an incompatible server protocol (pingdotgg#23789) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): Live Activity stops shouting the running-agent count (pingdotgg#24329) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(usage): include Muse Code session history (pingdotgg#22443) Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(mobile): add Usage and Settings to workspace navigation (pingdotgg#23841) * fix(mobile): keep iPad workspace columns aligned while resizing (pingdotgg#24182) * fix(mobile): no-project threads show a chat bubble instead of a monogram (pingdotgg#21546) * fix(mobile): stabilize Duo search and portrait navigation (pingdotgg#24206) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): the unfolded Duo keeps its header in portrait (pingdotgg#24339) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client-runtime): avoid duplicate handoff previews during startup (pingdotgg#24349) * fix(mobile): Usage and Settings use the glass header and the Duo rail (pingdotgg#24348) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): coalesce superseded streaming text updates (pingdotgg#24267) * fix(server): stop flooding analytics with successful MCP tool calls (pingdotgg#24287) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(search): Cmd+K finds the right thread first, with indexed message search (pingdotgg#24343) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> --------- Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Joseph Vidal <135430578+josephv123@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Theo Browne <me@theo.li> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com> Co-authored-by: Akshar Patel <123344143+AksharP5@users.noreply.github.com> Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com> Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: Alex <me@pixp.cc> Co-authored-by: Victor Vogel <satsdev@only21mil.xyz> Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com> Co-authored-by: Wiktor Golicz <56449542+Wiktor102@users.noreply.github.com>
Note
🤖 Claude Opus 5.5 on behalf of Oliver
Update: dark themes and vivid accents
Colored dark themes put chips on a mid-tone user bubble where the shared accents nearly vanish. Ember's video chip read at 2.0:1 and Grove's terminal chip at 1.9:1. Composer and some reply chips in those themes were also below 4.5:1. The light-mode rule blended accents toward black, which greyed them out and overshot to about 6:1.
Each chip now gets one color per theme, the same in messages, agent replies and the composer:
themeAccentWithContrastkeeps the accent's OKLCH hue and the most chroma sRGB allows, and moves only lightness, lighter on dark themes and darker on light ones, until the color reads at 5:1 on every chip surface (user bubble, thread canvas, composer). That leaves a margin over the 4.5:1 that normal text needs, because chip labels are small.Evidence is the full theme matrix rendered from the real
getMobileThemeVariablesvalues and the shipped helper, as before vs after. Ratios are shown against each surface: red is under 4.5:1. All 360 pairs reach 5:1 after, versus 128 below 4.5:1 before.iOS simulator
iPhone 18 Pro, iOS 27.0. Before is
mainat 9a391eb3f5, after is 598d97f929. Both run on the same dev client and the same offline chat fixture, which has a user message with every chip kind, an agent reply and the composer. In the after shots, the agent reply's "Linked thread" renders as a chip because of the thread-link layer earlier in this stack, not because of the contrast change.Validation:
composerChipPresentation.test.tschecks every chip accent (including PR states) in every built-in theme and both modes. Each must be identical across the three surfaces and reach 5:1 on all of them, plus a Material You primary bubble. Also passing:mobileTheme,nativeThemeandenrichedLinkPresentationtests, mobiletsc-rs --noEmit, and lint on the changed files.useEnrichedLinkVariants.tsjoins theallowUniwindThemeinterop allowlist, because it hands raw colors to the native markdown renderer.Made with Claude Opus 5.5 via Claude Code in T3 Code.
Original description by @flamboh
Problem
Mobile chat chips have no fill or border. Their text and icon use the chip kind's full accent color, the sRGB form of web's OKLCH set. Those accents read fine in dark mode. On light surfaces most of them fall to about 3:1, below the 4.5:1 that normal-size text needs, and teal and green are the worst. Desktop avoids this because its chip text mixes only a little accent into the foreground, on top of a tinted pill. Mobile has no pill.
Fix
composerChipPresentation.ts, so rendering does no color math beyond one luminance check.contextChipAccent(accent, textColor)returns the form to draw. It picks by the color of the surrounding text, not by the theme's appearance: dark text means the chip sits on a light surface. That matters for Material You on Android, where the light theme's user bubble is the saturated primary color with white text. Darkening chips there would make them worse, so they keep the shared accent.#0090cd#016795#0096af#016b7d#009f6e#016f4c#009c96#036d69#b261be#90409c#8a70dd#6a4eb8#7079e4#5155bd#7f8793#5a626d#d55665#af3346#d06217#a04701#b87501#895601Bubble and canvas are the default T3 Code light theme (
#efeff1,#fcfcfc). The last column is the lowest ratio across every built-in light theme's bubble and canvas; the Grove bubble is the darkest of these surfaces.Composer
#22518, now merged, gave composer chips these same accents. This PR applies the readable form there too: both composer editors (
T3ComposerEditor.ios.tsxandT3ComposerEditor.native.tsx) passcontextChipAccent(presentation.accent, textColor)with the composer's own text color, so composer and message chips stay identical on light surfaces.Evidence
The fixture thread has a user message holding every chip kind plus an assistant reply with thread and file chips. The installed dev clients ran this branch's JS over Metro.
Validation
composerChipPresentation.test.ts: every chip accent, including each PR state, reaches 4.5:1 on each built-in light theme's bubble and canvas when drawn with that surface's text color. Dark themes and a Material You primary bubble keep the shared accents.reactCompilerCoverage.test.ts, mobiletsc --noEmit, and lint on the changed files pass.Made with Claude Opus 5.5 via Claude Code in T3 Code.
Takeover
Continues @flamboh’s original PR on its fork branch, preserving the contributor commits.
Replaces the manually maintained light-accent table with the existing theme contrast helper; rewrites the two regression tests without growing the suite. Keeps the offline fixture replay tooling in linked, hashed artifacts so it does not ship.
Dependency: #22237 → #22243 → #22481, all open when inspected. These feature layers are inherited, not part of the contrast fix, and must land before this PR. Julius’s
landlabel is required.Status: blocked on incomplete required iOS evidence; green CI and the source reviews do not clear the visual-proof gate.
Evidence
Overview is downscaled; full native surfaces and both diffs follow.
Verification scope: mobile verified on static fixture only, for the delivered states. Required gaps remain unverified and block evidence acceptance.
Current-head iOS capture set — INCOMPLETE; required gaps block evidence acceptance.
Before 955b4cc801; after bfd730292a; fixture 7d1650ea51. Baseline-to-head includes inherited thread/PR chips, project icons/monograms and palette behavior beyond the contrast change; Julius review remains required. Linked fixture tooling is separate from production scope.
397 paired v3 full native surfaces across 28 matrix row IDs. Independent09:23 audit accepts10/29 iOS rows for their stated combinations: U1,A1,E1,E3,E4,T1,T2,T3,T5,G1;18 other iOS rows remain partial, and M1 is the expected native-platform limit. Z1 Android is separately unverified. V3 inventory:475 BEFORE PNGs,397 AFTER PNGs,397 exact matched filenames;78 BEFORE-only extras remain unpaired and do not count as proof. Separate v4 delivers8 exact pairs. Counts describe delivered pages, not acceptance or offscreen coverage.
Environment: EAS iPhone 17e, iOS 26.5, 390×844 logical points portrait, DPR 3 (1170×2532 PNG), app base size 16pt, OS text size large except named W2 accessibility-medium captures. Native safe areas; keyboard/scroll state is named per page. Static message dates 2026-01-01; PNG status bar normalized to9:41; recordings retain the actual simulator status time/battery. The OS clock itself was not frozen.
Diff0: absolute RGB channel delta multiplied by 32 and clamped, with no threshold. Diff8: retain pixels whose maximum RGB channel delta is >8/255, then amplify by 32. Full surfaces appear at native width in each sheet.
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
955b4cc801
bfd730292a
955b4cc801 → bfd730292a
955b4cc801 → bfd730292a
What else changed
Cleanup: both owned EAS simulator sessions stopped successfully by09:16 UTC; exact IDs/status in resource-cleanup.json and stop logs in replay archive. Both private simulator dotenv files reset mode0600. All four EAS builds FINISHED; no dev server started, source edit, PR write or push by capturer.
pixel-statistics.json
build-manifest.json
22585-final-page-manifest.json
[fixture-7d1650ea51.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ebdad1f823d950b2/fixture-[7d1650ea51](https://git.cafe/pingdotgg/t3code/commit/7d1650ea51f81a4000937f5c76d31221f1c89ac2).tar.gz)
22585-supplemental-overlay.tar
22585-supplemental-overlay-v4.tar
22585-supplemental-overlay-files.sha256
22585-supplemental-overlay-v4-files.sha256
22585-supplemental-REPLAY.md
22585-evidence-matrix-v2.md
22585-final-fixture-audit.md
22585-audit-recapture.png
22585-audit-recapture.json
22585-audit-pixel-delta.json
capture-inventory.json
capture-action-log.json
resource-cleanup.json
pair-accounting.json
evidence-replay-scripts.tar.gz
Independent AFTER U1 recapture: zero product-region pixel delta;1438 full-image status/battery pixels differed. This is one-state reproduction, not whole-matrix acceptance.
X1-unchanged-draft-before.mp4
X1-unchanged-draft-after.mp4
G2-light-before.mp4
G2-light-after.mp4
G2-dark-before.mp4
G2-dark-after.mp4
Separate v4 K2 native query and isolation proof
Separate v4 K2 excerpt uses supplement
cf24e99e7716078dcb49e2e2939cfdfc9bc0e95e97ce849dd222e1ca5445041d, BEFORE buildb2371778-7494-4477-bccc-c4de8e37dfad, AFTER buildd4415978-2a0a-46ca-8509-56b3014632c3. v3 supplement1b163126bbaa361d8448498e87b795a508b7413321c0ae2a4552016ac13faf51supplies all other rows. Both share base gzip909f1369d4e742411630dc94b6ac6349d83085b205708274987059244dfdd1da. EAS gitCommitHash is null; source archives/manifests supply provenance.Unverified
Verification log
Source head: bfd730292a; merge-base/main: 955b4cc801. Main was integrated by merge commit. The shipped diff contains 17 mobile files; linked fixture tooling is excluded.
Tests: contrast suite 2 → 2 in one file, rewritten to fail independently when either light-mode correction or dark-surface preservation is reverted. Final source scoped run: 5 files, 37 passed, 0 failed. Mobile typecheck and targeted lint pass; existing warnings remain. Linked v4 fixture suite: 7 files, 39 passed, 0 failed, including a scoped-pin enter → hold → leave → later-update regression that fails with the previous permanent pin. Linked fixture typecheck, lint and formatting pass.
Reviews: seven fresh rounds with two reviewers each (GPT-6.1-Sol and Claude Opus 5.5); round 7 both NEEDS_JULIUS, with no production correctness findings. Rounds 1–6 found no production contrast defect. Fixture findings included missing providers, wrong streaming role, scene fallthrough, dirty-source snapshot provenance, scratch configuration, invalid shell defaults, and a search pin surviving cleanup. Those were corrected in the linked fixtures. The fixture scope objection was resolved by removing the harness from the shipped source. Round 6 compared a base-archive digest with a supplemental-archive digest; the replay identifies these distinct files and records both named hashes. Both round-7 reviewers verified the separately named hashes and accepted the v4 cleanup fix. Native proof remains independently audited; colour taste requires Julius.
Inherited lower-layer performance concern: repeated malformed thread-link prefixes can make the unchanged lower-layer matcher quadratic. This was not introduced by the contrast change and was preserved with the lower layer.
Native build recovery: materialized baseline dependencies inside its archive to avoid fingerprint path mismatch; used a fixture-only arm64 simulator hook because GhosttyKit lacks an x86_64 simulator slice. Normal release exports with fixture flag unset and flag 0 produced identical bundles without fixture markers. Obsolete cloud jobs were canceled or failed; all four final paired cloud builds finished, 405 paired captures were delivered, and the final audit is insufficient. Both simulator sessions are stopped; all owned commands and delegated work finished; private dotenv files were reset to mode 0600.
Final-head CI at 08:57 UTC: all 30 checks successful, 0 pending, 0 failing on bfd730292a, read through cafe pr status. No fork-run approval required. Parent holds the sole PR watch until final handoff.
Independent same-artifact U1 reset/recapture: product region y>=160 has exactly 0 changed pixels across 2,775,240 pixels; full surface has 1,438 changed pixels confined to battery/charging glyph at x1046–1102,y55–93. OS chrome differences are disclosed rather than described as anti-aliasing.
Dark-mode limit: preservation is not a 4.5:1 readability claim. The auditor measured unchanged iris dark user-bubble chips at about 2.42–2.80:1 (bubble #4b3d72); this inherited behavior is shown honestly and is outside the light-mode fix.
Final independent proof audit: INSUFFICIENT C1 P1 P2 P3 F1 F2 N1 E2 C2 W1 W2 T4 G2 G3 K1 K2 X1 X2. It accepts 10/29 iOS rows, with 18 partial and M1 a permitted Android-only limit. The final index contains 397 v3 plus 8 v4 exact pairs, each with stats, Diff0 and Diff8; 78 before-only diagnostics are excluded. K2 native user/agent excerpts and cleanup isolation are accepted, while its complete title/detail/selection mapping remains partial.
Inherited lower-layer commits, preserved unchanged:
Inherited lower-layer files (the enriched-link hook also contains this PR’s contrast hunk):
Takeover implemented with Claude Opus 5.5 and GPT-6.1-Sol through T3 Code.