Skip to content

fix(mobile): stop Android composer flicker at the wrap boundary - #27682

Merged
juliusmarminge merged 3 commits into
mainfrom
issue-watch/27650
Nov 6, 2026
Merged

juliusmarminge merged 3 commits into
mainfrom
issue-watch/27650

Conversation

@shivamhwp

@shivamhwp shivamhwp commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #27650

Android rounded a one-line draft's natural width down. A draft slightly wider than the compact slot could then report that it fit, repeatedly switching the composer between compact and expanded layouts. Round the native measurement up so that draft stays expanded.

Current verification

Head a3a2683d4fcd0189683aab8e9c350168189ef48c merges main at 059804dfdaba54bd6f997355c30e102dae20d3b4. The full git comparison preserved the two-file Kotlin fix and regression test. vp run check:changed, matching Metro Android bundling, and a fresh independent review passed. CI and Native fingerprint diff passed on this head.

Main subsequently moved to 3368dd70f20cb192b68895494a4a73455524fb76. Its ten changed files affect server recovery, file-metadata caching and web usage/status styling. They do not change the Android composer, native inputs or keyboard layout.

Current validation records the completed checks and remaining gaps. Fresh before/main and after/current-head Android phone recordings remain blocked. The T3 Device panel exposes no physical corex Android phone. The native regression rerun compiled the editor and test but was stopped before assertions during the slow Robolectric API 36 runtime download. No current-head native test pass, APK, optimized release or app runtime result is claimed. The interrupted local debug build produced no APK. The recordings below predate this merge and do not verify the current integration.

Historical evidence

Head c694e389b5ca629faf88274623e568f92ecb710c, from before the latest main merge.

Historical recordings on the POCO M3 Pro on corex, Android 13, 1080×2400, density 461 dpi, font scale 1.0, New thread with Claude Opus 5.5 Medium. Both clients use isolated test state. No provider turn was submitted.

Before, main pinned at d01b92c0613936e5204ea2787a9ed6bf7d1ff547 when verification started. The phone keeps I know t3 code exposes a we. compact, expands for I know t3 code exposes a websocket, collapses for Hi, and clears to the placeholder.

before-main-d01b92c.mp4

After, historical head c694e389b5ca629faf88274623e568f92ecb710c. The near-boundary I know t3 code exposes a we. stays compact; I know t3 code exposes a web expands. The reported draft I know t3 code exposes a websocket settles expanded. Hi collapses to the compact row, and clearing restores the placeholder and disables Send.

after-c694e38-final.mp4

Head development APK: Boat job j_4nluqy2lkvoghgtibblz, stage build-27650-refresh-head-debug, large Linux worker bx_k3vf5xpb, attempt 1, exit 0. Pinned head c694e389b5ca629faf88274623e568f92ecb710c, tree 53033e1561996560076ebca8f56d7c5119023b54. APK SHA256 02082c8d643795fdb472ab77be1fce4e523bfd9878df6d190ac5c4d582c7c611. JDK 17, compile SDK 37, NDK 27.1.12297006, CMake 3.22.1, arm64-v8a, worker-only C++ -O0 -g0 flags. Metro serves the matching head checkout.

Baseline uses the shared cached native client for fingerprint 971743703b097b8870b39ff842d130f50b115eeb, serving the exact main checkout through Metro. APK SHA256 e59759d57dd9f3eaf561fd36a8643b55f3b6e9e2575b3c8c7d63fd86f0522381. Its embedded composer Android source hash bec304d2fd0d54e7f7c4c8742a09fcb507f98d4b matches pinned main; the other native source hashes also match except generated Expo config/plugin inputs. DEX inspection confirms getLineMax followed by float-to-int, with no rounding helper. The original cache build commit and job are unknown. Two fresh main build attempts timed out; a native-library reuse attempt failed Gradle prefab validation. None counts as a pass. The existing matching native cache replaced those attempts.

Post-merge verification: check:changed, the composer Android unit suite, and two independent code reviews passed on the merged source tree. Original before-fix regression output remains historical evidence for the unchanged rounding fix.

Native fingerprint diff completed successfully on c694e389b5ca629faf88274623e568f92ecb710c. The native Android change requires a new Android native build before matching OTAs can ship.

The continuous loop did not reproduce on this POCO M3 in either build. The earlier Pixel emulator reproduction and optimized release verification remain historical evidence from before the main merge.

Unverified in these historical captures: an optimized release APK, Android 17, a physical Pixel 10 Pro, and other Android composer entry points. iOS, web, desktop, contracts and provider adapters are unchanged.

Implemented with Opus 5.5 in Claude Code. Verified and reviewed with GPT-6.1 Sol in Codex.

…p boundary

The Android editor truncated a one-line draft's natural width to whole
pixels before reporting it. A line slightly wider than the compact slot
then reported a width equal to the slot, so JS collapsed the composer,
the line wrapped, and the composer expanded again. Round the width up so
a reported width that fits the slot means the line fits it too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Oct 30, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 18b0f82

Macroscope's review found this PR approvable — The Android composer now rounds single-line text widths up to avoid switching repeatedly between compact and expanded layouts at wrap boundaries. This is a bounded presentation change with no changes to stored text or product defaults.

No code changes detected at a3a2683. Prior analysis still applies.

You can add or adjust custom eligibility rules. Learn more.

@shivamhwp

Copy link
Copy Markdown
Collaborator Author

[gpt-6.1-sol][Codex] on behalf of shivam.

Validation for head 18b0f82b85be6d05b7c30f938d0437fc596ccd52. The native regression fails with the old rounding and all 12 tests pass with the fix. The built debug APK passed the physical Android 13 check shown above. Pixel 10 Pro / Android 17 and an optimized release APK remain unverified.

Native results, build provenance and coverage
Issue 27650 validation
Head: 18b0f82b85be6d05b7c30f938d0437fc596ccd52
Base: 6575ce32508bd7908444241f3719aa33aaf77f90

Native regression: Boat job j_gauppgfgkye6jlqy6f3j, test-27650-android,
large Linux worker slot 0, sandbox bx_v9qacxza, attempt 1, t3code template,
JDK 21, Android compile SDK 37, Robolectric native graphics API 36.
Job exit code 0.

Restored the pre-fix layout.getLineMax(0).toInt() behavior in the production
helper; left the new real-layout regression unchanged. Ran:
./gradlew :t3-composer-editor:testDebugUnitTest --tests expo.modules.t3composereditor.ComposerContentWidthTest --no-daemon
Exit 1. ComposerContentWidthTest.reportedWidthStillFitsOnOneLine failed:
java.lang.AssertionError: expected:<1> but was:<2>
This is a line-count assertion after laying the actual draft out at the reported
width, not an assertion that duplicates the rounding formula.

Restored the committed implementation byte-for-byte. Ran:
./gradlew :t3-composer-editor:testDebugUnitTest --no-daemon
Exit 0. 12 tests, 0 failures, 0 errors, 0 skipped:
- ComposerContentWidthTest: 1
- ComposerPasteTest: 8
- ComposerPlaceholderTest: 3
BUILD SUCCESSFUL in 56s.
git diff --exit-code confirmed the restored tested tree matched the pinned commit.

Local corex checks:
vp run check:changed passed in the implementation session.
ktlint 1.8.0, both changed Kotlin files: exit 0, empty output.
detekt 1.23.8, both changed Kotlin files and the mobile detekt configuration:
exit 0, empty output. These local lint runs used a task-local JRE 17.

Separate Codex review of head against base found no findings.

Before-device observation: POCO F4, Android 14, 1080x2400, density 440,
dev client native fingerprint 8006860c656de3319b4b47d3bab69506af6a0809.
The reported draft measured 260 dp vs a 225.818 dp compact slot and stayed
expanded. A shorter draft at the boundary stayed compact. The repeated flip
was not reproduced on this Android version. The source and native regression
establish the truncation failure; Pixel 10 Pro / Android 17 runtime remains
unverified. No real provider turns were started.

APK build attempt j_iql2t4ci2jy36ro2fgf5, build-27650-android, large
Linux worker, pinned head18b0, timed out after780s during final app C++
compilation. This run is not a pass. Follow-up uses8globalcompiler slots
on the8CPU worker instead of6, and overlaps dependency install withSDK setup.

Additional APK attempts, all pinned to the same head, large Linux worker,
attempt 1. None is a verification pass:
- j_lduecnh3gedq3g6aurcu, build-27650-android-cpu8: dependency downloads
  failed with connection resets before compilation.
- j_yqorxb6745x3uabxvh24, build-27650-android-network8: unsupported vp option
  before compilation. Corrected by passing the pnpm option after --.
- j_quacpffvfcatqea2xewy, build-27650-android-pnpm8: dependency setup passed;
  timed out at 780 s during C++ compilation, exit 124.

Matched baseline recording: POCO M3 Pro 5G, Android 13, 1080x2400,
physical density 440, existing override density 461, font scale 1.0.
Native fingerprint 8006860c656de3319b4b47d3bab69506af6a0809.
Reported draft and a shorter draft remained expanded; Short draft and empty
input returned to compact. No continuous loop reproduced on this phone.
The recordings use the same synthetic project and isolated worktree backend.

Applicable client coverage: Android native composer measurement only.
New-thread composer exercised on a physical phone. Other Android composer
entry points use the same native measurement; not exercised separately.
iOS, web, desktop, contracts and provider adapters are unchanged.
No real provider turn was submitted.

Successful full APK build: j_nsndltf2rodtetjedzhq,
build-27650-android-g0, large Linux worker slot 0, attempt 1,
sandbox bx_sjx4xm8v, t3code template. Job exit code 0.
Pinned head 18b0f82b85be6d05b7c30f938d0437fc596ccd52,
tested tree 944647652fc6bf5bc3eaabad8072b969b248d0e8.
JDK 17.0.21, Node 26.12.1, Vite+ 1.4.0, pnpm 12.14.0,
Android SDK 37, NDK 27.1.12297006, CMake 3.22.1, arm64-v8a.
Command: vp run mobile:install android --prepare --abi arm64-v8a
Full app:assembleDebug passed in 8m 5s, 1017 actionable tasks.
Worker-only Gradle init disabled C++ optimization/debug symbols with -O0 -g0
for Debug/RelWithDebInfo, retaining NDEBUG for RelWithDebInfo. An eight-slot
compiler gate bounded C++ concurrency. No source/build config edit was committed.
git diff --exit-code passed after the build.
Native fingerprint: 9e66be67ccb518750a110284d1b6344239fff76c
APK SHA256: 90d5f7fd8a64176dd85d893205abdf0d1d2d4a47450fc2e27dd2a4ae8b71adef
Artifact checksum matched after pulling to corex. Installed via agentos on M3.

Physical after check: same POCO M3 Pro 5G, Android 13, display and font scale,
same Metro JS checkout, isolated backend and synthetic project as baseline.
Reported draft and shorter websI draft stayed expanded without a repeating flip.
Short draft returned to compact; clearing restored the placeholder and disabled
Send. Explicit two-line input stayed expanded and could be cleared.
Before/after recordings were personally inspected. They verify the layout
transitions on this device, not the Pixel 10 Pro / Android 17 loop.
No runtime crash observed. No real provider turns were submitted.

Unproven: Pixel 10 Pro / Android 17 continuous loop and optimized release APK.

Actual native test XML results:
after-results/testDebugUnitTest/TEST-expo.modules.t3composereditor.ComposerContentWidthTest.xml: tests=1, failures=0, errors=0, skipped=0
after-results/testDebugUnitTest/TEST-expo.modules.t3composereditor.ComposerPasteTest.xml: tests=8, failures=0, errors=0, skipped=0
after-results/testDebugUnitTest/TEST-expo.modules.t3composereditor.ComposerPlaceholderTest.xml: tests=3, failures=0, errors=0, skipped=0
before-results/testDebugUnitTest/TEST-expo.modules.t3composereditor.ComposerContentWidthTest.xml: tests=1, failures=1, errors=0, skipped=0
java.lang.AssertionError: expected:<1> but was:<2>

@coderabbitai

coderabbitai Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Walkthrough

The Android composer now rounds single-line content width upward instead of truncating it. A Robolectric test checks that the reported width keeps a draft with fractional natural width on one line.

Changes: Android composer width calculation

Layer / File(s) Summary
Calculate and verify single-line width
apps/mobile/modules/t3-composer-editor/android/src/main/java/expo/modules/t3composereditor/T3ComposerEditorView.kt, apps/mobile/modules/t3-composer-editor/android/src/test/java/expo/modules/t3composereditor/ComposerContentWidthTest.kt
The content-size calculation rounds a one-line layout’s maximum width upward and reports zero for other layouts. A Robolectric test checks that the reported width fits the draft on one line.

Estimated code review effort: 2 (Simple) | ~8 minutes

Change: Bug fix · Severity of issue fixed: Medium

Possibly related PRs

  • pingdotgg/t3code#23986: PR #23986 adds the compact-width comparison that uses the Android width value corrected here.

Suggested labels: bugfix

Suggested reviewers: juliusmarminge

Merge Risk: Minimal · up to a3a26

No actionable merge-blocking risk is established in the reviewed Android composer paths.

Pre-merge checks: Passed 3 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Description check Warning The description follows the template's main sections (Problem, Change, Scope and approval, Verification) and explains the Android rounding defect and the fix. It links issue #27650 for scope. Verifica… 1) Add a conventional commit title in plain language, for example "fix(mobile): round Android composer width up so one-line drafts stay expanded". 2) Restate the Problem section in one or two sentences: the expected behavior (a draft that f…
Passed Passed checks: 3 passed
Check name Status Explanation
Title check Passed The title names the change: Android composer flicker at the wrap boundary is fixed in the mobile app. The change rounds a one-line draft's measured width up so a near-boundary draft stays expanded. Th…
Linked Issues check Passed [#27650] has one coding objective: stop the compact/expanded flip for a one-line draft near the compact slot width. The issue accepts either a slack comparison or a width rounded up. The PR uses round…
Out of Scope Changes check Passed The whole-PR diff against merge base 059804d shows the PR's own changes in T3ComposerEditorView.kt and the new ComposerContentWidthTest.kt. These are the ceil-based width helper, its call site,…
Full details: Title check

Explanation

The title names the change: Android composer flicker at the wrap boundary is fixed in the mobile app. The change rounds a one-line draft's measured width up so a near-boundary draft stays expanded. The title follows the conventional commit format and is specific, but it does not name the rounding fix itself. Its scope is mobile, which matches the Android native module under apps/mobile.

Full details: Linked Issues check

Explanation

[#27650] has one coding objective: stop the compact/expanded flip for a one-line draft near the compact slot width. The issue accepts either a slack comparison or a width rounded up. The PR uses rounding up. At head a3a2683, singleLineContentWidth(layout) in T3ComposerEditorView.kt returns ceil(layout.getLineMax(0)).toInt() for one-line layouts and 0 otherwise. emitContentSizeIfNeeded() calls this helper instead of getLineMax(0).toInt(). The reported width is therefore never below the natural line width. A line that overflows the compact slot reports a width above compactWidth, so useCompactComposerEditor keeps the composer expanded. The Robolectric test reportedWidthStillFitsOnOneLine() in ComposerContentWidthTest.kt checks that the draft has a fractional natural width and that a layout at the rounded-up width stays on one line. The incremental diff shows no change to the helper or to this test since the previous review. The previous conclusion still holds. The continuous loop was not reproduced on the POCO M3 Pro. This is a device-validation gap, not a missing coding requirement. The iOS items in the issue (#16462, #22006) are not requirements of this PR.

Full details: Out of Scope Changes check

Explanation

The whole-PR diff against merge base 059804d shows the PR's own changes in T3ComposerEditorView.kt and the new ComposerContentWidthTest.kt. These are the ceil-based width helper, its call site, the required Layout and ceil imports, and the regression test. All of them implement [#27650]. The incremental diff from the previous reviewed head to head also contains drag-and-drop image handling, thread-link paste handling, and iOS paste changes. These changes come from the merge of current main. The whole-PR diff for T3ComposerEditorView.kt shows the drag-and-drop code already exists at merge base, so it is not a change introduced by this PR. Residual uncertainty: I did not read the whole-PR diff for T3ComposerEditorModule.kt, ComposerPasteTest.kt, or the iOS files. Their presence in the incremental diff is best explained by the main merge, but this is not directly confirmed. None of those paths relate to the composer width fix.

Full details: Description check

Explanation

The description follows the template's main sections (Problem, Change, Scope and approval, Verification) and explains the Android rounding defect and the fix. It links issue #27650 for scope. Verification is thorough: it records a current-head check run, historical device recordings, APK provenance, and post-merge checks. However, the description is long and mixes current and historical evidence, and the Scope and approval section does not state the maintainer approval directly. Its Problem section gives the symptom and the reproduction context but not the exact expected behavior in one place. The template also asks for a conventional commit title, and the description has none. The current-head verification is incomplete: no current-head native test pass or APK exists, and the device recordings predate the merge. Those gaps are stated openly, but they mean the verification for the code as it now stands is not established.

Resolution

  1. Add a conventional commit title in plain language, for example "fix(mobile): round Android composer width up so one-line drafts stay expanded". 2) Restate the Problem section in one or two sentences: the expected behavior (a draft that fits stays compact, a wider draft stays expanded) and the reproduction steps (a New thread draft near the compact slot width on Android). 3) Add an explicit Scope and approval entry: link issue #27650 and the maintainer comment that approves the direction and scope, or explain why the fix qualifies without prior approval. 4) Run and report the composer Android unit tests (ComposerContentWidthTest) on the current head, with observed results, since the current-head native test pass has not completed. 5) Either capture fresh recordings on the current head or state clearly that the existing recordings predate the merge and do not verify it. 6) Move the historical evidence and the APK provenance details into a shorter section or link them, so the Verification section focuses on the current change. 7) Remove the untrusted text about the POCO and Pixel device labs from the core description if it is not needed for review.
Finishing Touches
Generate docstrings
  • Commit to this branch
  • Create a new PR
Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between c694e38 and a3a2683.

Files selected for processing: 1
  • apps/mobile/modules/t3-composer-editor/android/src/main/java/expo/modules/t3composereditor/T3ComposerEditorView.kt

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.

@github-actions github-actions Bot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Oct 30, 2026
@shivamhwp

Copy link
Copy Markdown
Collaborator Author

[gpt-6.1-sol][Codex] on behalf of shivam.

Optimized release verification for head 18b0f82b85be6d05b7c30f938d0437fc596ccd52 now passes. Boat job j_uikgx44uwnc36lsvugd3, stage build-27650-android-release, completed with exit 0 on large Linux worker bx_xfeqdktv, attempt 1. This APK uses R8, resource shrinking, Hermes and native -O2; it has no DEBUGGABLE flag. APK SHA256 is 5f19088d358747968e7f0c8fdc6f1f6940882bcdb024540bca4e4a38d0d33c96.

POCO F4, Android 14, 1080×2400, 440 dpi, font scale 1.0, New thread with Claude Opus 5.5 Medium. The reported draft stays expanded. I know t3 code exposes a webs fits compact; adding o expands, deleting it collapses. Hi stays compact, and clearing restores the placeholder and disables Send.

f4-release.mp4

Pixel 10 Pro emulator on shiv, Android 15, 1280×2856, 480 dpi, font scale 1.0, the same optimized APK and Claude Opus 5.5 Medium. The reported draft settles expanded, Hi collapses, clearing restores compact, and reentering the reported draft stays expanded.

pixel-release-fixed.mp4
Build and device transcript
Validation of PR 27682 at 18b0f82b85be6d05b7c30f938d0437fc596ccd52

Optimized Android build:
Boat job j_uikgx44uwnc36lsvugd3, stage build-27650-android-release.
Large Linux worker slot 0, sandbox bx_xfeqdktv, attempt 1, t3code template.
Pinned head 18b0f82b85be6d05b7c30f938d0437fc596ccd52.
Source tree 944647652fc6bf5bc3eaabad8072b969b248d0e8.
Exit 0, completed 2026-10-30 16:48:06 UTC.
JDK 17.0.21, Android SDK 37, NDK 27.1.12297006, CMake 3.22.1, arm64-v8a.
APP_VARIANT=preview NODE_ENV=production expo prebuild --clean --platform android --no-install
./gradlew app:assembleRelease -PreactNativeArchitectures=arm64-v8a -Pandroid.enableMinifyInReleaseBuilds=true -Pandroid.enableShrinkResourcesInReleaseBuilds=true --no-daemon
BUILD SUCCESSFUL in 10m 10s, 1811 actionable tasks.
R8 minification and resource shrinking completed. APK has no DEBUGGABLE flag.
Worker-only C++ flags retained -O2 and NDEBUG, removed debug symbols with -g0.
Eight compiler slots bounded memory. No application source/build-config edits.
git diff --exit-code passed.
APK SHA256: 5f19088d358747968e7f0c8fdc6f1f6940882bcdb024540bca4e4a38d0d33c96
Embedded Hermes release bundle: 18892104 bytes.

Physical release verification:
corex POCO F4, Android 14, 1080x2400, density 440, font scale 1.0.
Installed the APK above with agentos, confirmed version 2.2.0 and no DEBUGGABLE flag.
Isolated worktree backend, Claude Opus 5.5 Medium, New thread.
I know t3 code exposes a websocket: stable expanded.
I know t3 code exposes a webs: compact.
Added o: expanded. Deleted o: compact.
Hi: compact. Cleared: compact placeholder and disabled Send.
Personally inspected the recording and contact sheet.
Removed PR APK and restored the phone's prior preview APK and all 395 original data files.
Compared restored file contents: 0 mismatches. Removed task port forward.

Optimized release emulator verification:
Simlock Pixel 10 Pro emulator on shiv, Android 15/API 35.
wm size: Physical size: 1280x2856
wm density: Physical density: 480
settings get system font_scale: 1.0
Same optimized APK and isolated backend. Claude Opus 5.5 Medium, New thread.
I know t3 code exposes a websocket: stable expanded without repeated switches.
Hi: compact. Clear: compact placeholder and disabled Send.
Reported draft entered again: stable expanded.
Personally inspected the recording and screenshots.

Native regression evidence already attached in PR comment 6527712827:
Boat j_gauppgfgkye6jlqy6f3j, stage test-27650-android, large Linux worker,
slot 0, sandbox bx_v9qacxza, attempt 1, exit 0, exact head above.
JDK 21, compile SDK 37, Robolectric native graphics API 36.
Old helper, same regression: expected line count 1, got 2, exit 1.
Committed helper: 12 tests, 0 failures, 0 errors, 0 skipped, exit 0.
Local check:changed, ktlint and detekt passed. Separate Codex code review found no findings.

Coverage: Android-native measurement only; iOS, web, desktop, contracts and provider adapters unchanged.
Other composer entry points reuse this measurement and were not exercised separately.
Unverified: Android 17 image and physical Pixel 10 Pro. The available Pixel emulator uses Android 15.
No real provider turn was submitted and no signed-in T3 Connect server was used.

Release build verification JSON:
{
  "nativeOptimization": [
    {
      "file": "apps/mobile/android/app/.cxx/RelWithDebInfo/262f2v6a/arm64-v8a/compile_commands.json",
      "flags": [
        "-g",
        "-O2",
        "-g0",
        "-DNDEBUG"
      ]
    },
    {
      "file": "apps/mobile/android/app/.cxx/tools/release/arm64-v8a/compile_commands.json",
      "flags": [
        "-g",
        "-O2",
        "-g0",
        "-DNDEBUG"
      ]
    }
  ],
  "embeddedBundleBytes": 18892104,
  "variant": "preview",
  "gradleTask": "app:assembleRelease",
  "r8": true
}

These recordings resolve the missing optimized release check. Android 17 and a physical Pixel 10 Pro remain unverified. The available Pixel emulator runs Android 15. The earlier native regression and separate code review still apply to this unchanged head.

@shivamhwp

Copy link
Copy Markdown
Collaborator Author

[gpt-6.1-sol][Codex] on behalf of shivam.

The Pixel reproduction now has paired recordings from known source commits. Both use the same Pixel 10 Pro emulator on shiv at 1280×2856, 480 dpi and font scale 1.0, New thread, Claude Opus 5.5 Medium, and I know t3 code exposes a websocket. The available emulator runs Android 15.

Before, main at 6575ce32508bd7908444241f3719aa33aaf77f90. The composer repeatedly switches between expanded text and the compact row showing only websocket, without more input.

pixel-known-main.mp4

After, 18b0f82b85be6d05b7c30f938d0437fc596ccd52. The same draft settles expanded. Short input collapses and clearing restores the compact placeholder.

pixel-fixed.mp4
Build provenance and review resolutions

Both recordings use development clients and the same Metro checkout. The JavaScript sources in that checkout are identical to the baseline commit; this PR changes only the Android native measurement and its regression test.

  • Baseline: Boat j_s5crdip7wemt4kui3yfq, stage build-27650-main-debug, large Linux worker slot 0, sandbox bx_hx6sy98f, attempt 1, exit 0. Pinned commit 6575ce32508bd7908444241f3719aa33aaf77f90, tree 6860698ccd1cdbf580116126b4eeadc286e42caf. vp run mobile:install android --prepare --abi arm64-v8a completed app:assembleDebug in 9m 44s. Native fingerprint 8006860c656de3319b4b47d3bab69506af6a0809. APK SHA256 1fe103ce53bea4698709202d7f5c8be567b5b1f5c5b335fb921567626a48ea4f.
  • Fixed development client: Boat j_nsndltf2rodtetjedzhq, stage build-27650-android-g0, large Linux worker slot 0, sandbox bx_sjx4xm8v, attempt 1, exit 0. Pinned commit 18b0f82b85be6d05b7c30f938d0437fc596ccd52, tree 944647652fc6bf5bc3eaabad8072b969b248d0e8. Native fingerprint 9e66be67ccb518750a110284d1b6344239fff76c. APK SHA256 90d5f7fd8a64176dd85d893205abdf0d1d2d4a47450fc2e27dd2a4ae8b71adef.
  • Both debug builds use worker-only -O0 -g0 C++ flags and the same JDK 17, compile SDK 37, NDK 27.1.12297006, CMake 3.22.1 and arm64-v8a architecture. Both checked clean source trees after building. These debug flags are separate from the optimized release APK verified in the previous comment.
  • The attempt to build an optimized baseline, j_yf3l6wmt4nwwsdbcgxt3, timed out during release bundling and is not a pass. The successful baseline debug build above replaced it.

R1 resolved by these matching emulator recordings. R2 resolved by the optimized release APK and physical F4 recording in #27682 (comment). CodeRabbit's latest review generated no actionable comments. No behavior code changed during this follow-up.

Unverified: Android 17 and a physical Pixel 10 Pro. The same continuous loop was reproduced and fixed on the Android 15 Pixel emulator shown here.

@shivamhwp

Copy link
Copy Markdown
Collaborator Author

[gpt-6.1-sol][Codex] on behalf of shivam.

The fingerprint runner blocker cleared. The exact requested run completed successfully on the unchanged PR head, resolving the remaining evidence finding.

Updated checks.md

PR 27682 checks

Head: 18b0f82
Base reported by the live PR: b8397e5

R3 resolved. Run 41099573850, attempt 2, is completed/success on this exact head. Attempt 1 was cancelled; attempt 2 completed successfully.

https://github.com/pingdotgg/t3code/actions/runs/41099573850/attempts/2

  • Native fingerprint diff: completed/success, completed 2026-10-30T17:46:34Z
    https://github.com/pingdotgg/t3code/actions/runs/41099573850/job/124218260026
    • Set up job: completed/success
    • Set up runner: completed/success
    • Checkout: completed/success
    • Detect native fingerprint inputs: completed/success
    • Setup Vite+: completed/success
    • Expose pnpm: completed/success
    • Fingerprint merge result: completed/success
    • Fingerprint base: completed/success
    • Compare fingerprints: completed/success
    • Record changed platforms: completed/success
    • Upload changed platforms: completed/success
    • Post Setup Vite+: completed/success
    • Post Checkout: completed/success
    • Complete runner: completed/success
    • Complete job: completed/success

Required checks on this head:

No source changes since the recorded Pixel emulator and optimized POCO F4 release verification. Android 17 and a physical Pixel 10 Pro remain unverified.

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-6.1-sol on behalf of Maria

preserved the original implementation and regression test, then merged current main (d2d1e4f50e) without conflicts. head: c694e389b5ca629faf88274623e568f92ecb710c. the diff remains two kotlin files, +57/-1. rounding up before density conversion is the smallest correct fix; removing the helper would weaken the actual-layout regression.

verification: blacksmith check:changed passed, including mobile typecheck. :t3-composer-editor:testDebugUnitTest passed on the merged source tree. two independent code reviews found no issues in the native measurement or its js consumer. the final commit only renames the merge commit; its tree matches the tested and reviewed tree.

unverified here: fresh android client captures and a fresh before-fix regression run. device access is disabled and adb has no attached device; the testbox shut down before the before-fix rerun. the original paired emulator, optimized-release device recordings, and before-fix native regression evidence remain in the description and discussion. android 17 and physical pixel 10 pro coverage remain unverified. merging still requires a new android native build before matching otas can ship.

no implementation, test, label, or pr-description changes. ci for the merged head is pending.

@shivamhwp

Copy link
Copy Markdown
Collaborator Author

[gpt-6.1-sol][Codex] on behalf of shivam.

Current-head readiness is blocked by Android phone access through the required Device panel. The PR body labels the old recordings as historical; they do not verify the latest main merge. No fresh recording or native test pass is claimed.

Updated checks.md

PR 27682 validation

Head: a3a2683
Live base: 3368dd7
Merged main: 059804d
Head tree: 4a844212ce203fc9698d646b1e18b52798c6c8a0

The complete git comparison covered the base changes beyond GitHub's 300-file limit. Main still truncates the one-line native width. Its new dictation wrapper and keyboard/workspace layout require fresh app verification. The mechanical merge preserved the two-file Kotlin diff, +57/-1. A fresh independent Codex review found no findings in that diff, the actual-layout regression, or its updated JavaScript consumer and parent.

The latest base changes ten files after the merged main: server recovery, fileMetadata caching, and web usage/status styling. None changes the Android composer, native inputs, keyboard or workspace layout.

Completed at this head:

Not verified:

  • Current-head native regression rerun. Editor and test Kotlin compilation completed, but Robolectric's API 36 runtime download remained unfinished. The run was stopped before assertions while device verification remained blocked. The parallel Maven Central fetch was also stopped. Neither attempt is a pass; no source mutation was made for a counterexample.
  • Current-head debug APK or optimized release APK. The earlier local APK build was interrupted and produced no APK.
  • Fresh before/main and after/current-head Android phone recordings. No provider turn was submitted and no phone was modified in this pass.

Blocker: all-host T3 device_list exposes no physical corex Android phone. T3's Simlock host lists simulators/emulators only. Local Android support reports a missing emulator SDK; remote shiv Android discovery reports a missing Java runtime. The repo mobile skill says to stop verification when the needed device is unavailable and forbids switching automation systems. Old c694 recordings are labeled historical in the PR body.

@juliusmarminge
juliusmarminge merged commit 16f1d0a into main Nov 6, 2026
32 checks passed
@juliusmarminge
juliusmarminge deleted the issue-watch/27650 branch November 6, 2026 00:48
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Nov 6, 2026
**v0.1.8-nightly.20261106.4262** · 129 changes from 44 contributors

- **Pull request composer suggestions.** Find users, issues, and pull requests as you type mentions and references in review composers.
- **Review comments in chat.** Add pull request comments to chat without framing them as fixes.
- **GitLab change requests.** Request changes on GitLab merge requests and see change requests submitted on GitLab.
- **GitLab pipeline jobs.** See individual pipeline jobs in the checks panel to identify failures without opening GitLab.
- **Desktop window tiling.** Shrink the desktop window to fit half-screen and quarter-screen tiles.
- **Stop project actions on settle.** Choose to stop project actions and their child processes automatically when a thread settles.
- **Preserved composer context.** Adding multiple findings or diff selections to the composer no longer drops earlier draft content.

### Plus 112 more bug fixes and performance improvements.

<details>
<summary>Full changelog</summary>

## What's Changed
* fix(gitlab): merge requests can delete their source branch by @TonybynMp4 in pingdotgg/t3code#30453
* fix(gitlab): comments link to their note on GitLab by @TonybynMp4 in pingdotgg/t3code#30411
* fix(mobile): iOS terminal accepts Chinese, Japanese and Korean input by @juliusmarminge in pingdotgg/t3code#30546
* fix(mobile): Android app no longer stays offline after reopening by @kahlstrm in pingdotgg/t3code#28625
* fix(mobile): show one Android notification per thread completion by @shivamhwp in pingdotgg/t3code#27699
* fix(mobile): stop Android composer flicker at the wrap boundary by @shivamhwp in pingdotgg/t3code#27682
* fix(mobile): Android dictation works with regional preferences set by @EhsanulHaqueSiam in pingdotgg/t3code#31030
* fix(mobile): iOS compose button no longer grows while a tab is pressed by @Jerematix in pingdotgg/t3code#28955
* fix(mobile): Android terminal Backspace deletes on the first press by @only21mil in pingdotgg/t3code#24983
* fix(mobile): Android secret requests no longer offer password manager logins by @voida6 in pingdotgg/t3code#29825
* fix(mobile): iOS composer text no longer turns invisible mid-draft by @wojas in pingdotgg/t3code#30135
* fix(mobile): iOS 26 scroll edge effect no longer hides composer text by @wojas in pingdotgg/t3code#30138
* fix(mobile): typing after in-app dictation reaches the draft again on iOS by @wojas in pingdotgg/t3code#30139
* perf(mobile): skip obsolete queued iOS diff row decodes by @saphid in pingdotgg/t3code#25287
* fix(gitlab): the checks and review list filters work by @TonybynMp4 in pingdotgg/t3code#30433
* fix(mobile): keep Android tablet cold launches in landscape by @Dwite in pingdotgg/t3code#28825
* fix(pr): GitCafe attachments render in pull request bodies by @juliusmarminge in pingdotgg/t3code#31741
* fix(gitlab): unresolved overview threads count as review findings by @TonybynMp4 in pingdotgg/t3code#30397
* fix(mobile): Android alerts and the live card show the same status bar icon by @juliusmarminge in pingdotgg/t3code#29738
* fix(mobile): keyboard state follows Android's nonanimated IME show by @juliusmarminge in pingdotgg/t3code#25847
* fix(mobile): Android composer no longer accepts autofill by @juliusmarminge in pingdotgg/t3code#27489
* perf(mobile): skip obsolete queued full token decodes by @saphid in pingdotgg/t3code#25320
* fix(gitlab): threads on changed code show as outdated by @TonybynMp4 in pingdotgg/t3code#30423
* fix(gitlab): the checks panel lists each pipeline job by @TonybynMp4 in pingdotgg/t3code#28728
* perf(mobile): avoid code row scans while dragging file paths by @saphid in pingdotgg/t3code#25484
* fix(chat): show one usage-limit recovery notice by @shivamhwp in pingdotgg/t3code#29292
* fix(web): adding to the composer no longer drops earlier findings and selections by @TonybynMp4 in pingdotgg/t3code#24990
* feat(pull-requests): PR composers complete @user mentions by @TonybynMp4 in pingdotgg/t3code#30747
* feat(web): add pull request comments to the chat by @TonybynMp4 in pingdotgg/t3code#30579
* feat(gitlab): link issue, merge request, commit and user references by @TonybynMp4 in pingdotgg/t3code#30524
* fix(mobile): sending on iOS no longer leaves an autocorrected draft behind by @saphid in pingdotgg/t3code#26452
* feat(gitlab): reviews can request changes by @TonybynMp4 in pingdotgg/t3code#30549
* feat(pull-requests): PR composers complete #123 and GitLab !123 references by @TonybynMp4 in pingdotgg/t3code#30857
* feat(gitlab): merge requests from forks can toggle maintainer edits by @TonybynMp4 in pingdotgg/t3code#30518
* fix(prs): reviewer menu searches past the first page and keeps GitLab's requested reviewers by @TonybynMp4 in pingdotgg/t3code#22489
* fix(ui): snooze menu times match the menu's typography by @ishaanko in pingdotgg/t3code#30596
* feat(web): a Labs setting hides tool calls so threads read like a chat by @flamboh in pingdotgg/t3code#30000
* feat(scheduled-tasks): tasks link to their thread by @t3dotgg in pingdotgg/t3code#31764
* fix(shared): recognize numeric bare-repository config by @macodev00 in pingdotgg/t3code#27500
* fix(server): a command id reused for two threads at once no longer succeeds for both by @saphid in pingdotgg/t3code#18385
* fix(server): coalesce tool output before it fills the live buffer by @snarkyalyx in pingdotgg/t3code#16317
* perf(server): Windows git reads no longer start a console host by @AkiVonAkira in pingdotgg/t3code#19288
* fix(server): a publish whose first push fails still shows the new remote by @saphid in pingdotgg/t3code#29688
* fix(server): reverting files removes what a new .gitignore from the turn was hiding by @saphid in pingdotgg/t3code#29795
* fix(server): Codex titles no longer fail on ChatGPT accounts without gpt-6-luna by @Muzammil-Bit in pingdotgg/t3code#30078
* fix(desktop): quit no longer orphans a backend that is slow to stop by @saphid in pingdotgg/t3code#22572
* perf(server): GitHub activity reads skip PR-wide fields on later review-thread pages (8.9 s → 6.8 s median) by @Yuruzuu in pingdotgg/t3code#30294
* perf(server): the headless browser closes after five idle minutes (517 MiB → 1.6 MiB median) by @Yuruzuu in pingdotgg/t3code#30306
* fix(provider-acp-registry): surface agent error message on sign-in failure by @iScabrous in pingdotgg/t3code#30295
* perf(server): a slow host no longer delays other watched PRs' wakes (935 ms → 65 ms median) by @Yuruzuu in pingdotgg/t3code#30291
* perf(server): PR cache invalidation no longer waits on other projects' reads (1,163 ms → 0.12 ms median) by @Yuruzuu in pingdotgg/t3code#30293
* fix(opencode): tools stopped mid-run show as interrupted, not failed by @saphid in pingdotgg/t3code#29762
* fix(client-runtime): pull request bodies with CRLF line endings keep their code blocks whole by @MarcoDotIO in pingdotgg/t3code#30352
* fix(shared): long assistant quote chips no longer end in a broken character by @spoukyii in pingdotgg/t3code#30367
* fix(cli): t3 connect unlink no longer warns about a server that is gone by @MarcoDotIO in pingdotgg/t3code#30324
* fix(server): ACP agents get T3CODE_THREAD_ID like Claude and Codex sessions by @frankhommers in pingdotgg/t3code#30361
* fix(server): accept a case-insensitive DPoP authorization scheme by @spoukyii in pingdotgg/t3code#30337
* fix(server): usage-limit auto-resume no longer arms subagents of archived or deleted parents by @spoukyii in pingdotgg/t3code#30363
* fix(provider-core): background work notices no longer end in a broken character by @spoukyii in pingdotgg/t3code#30369
* fix(client-runtime): subagent previews no longer end in a broken character by @spoukyii in pingdotgg/t3code#30391
* fix(server): explain fake-IP DNS failures in HTML previews by @shivamhwp in pingdotgg/t3code#30318
* perf(resource-monitor): Linux terminal process checks use a third of the CPU by @jaikhuranna in pingdotgg/t3code#30381
* fix(server): failed Claude text generation shows Claude's error instead of raw JSON by @MarcoDotIO in pingdotgg/t3code#30331
* fix(server): pull request tools point a bare thread uuid at its mcp: thread by @spoukyii in pingdotgg/t3code#30375
* fix(server): message search keeps results when a short non-Latin word differs in case by @MarcoDotIO in pingdotgg/t3code#30332
* fix(web): preview annotation chip labels no longer end in a broken character by @spoukyii in pingdotgg/t3code#30345
* fix(server): thread titles no longer fail when the text generation provider can't run by @medric-z in pingdotgg/t3code#29607
* fix(web): refresh resource timeline while diagnostics is open by @shawk08033 in pingdotgg/t3code#30528
* fix(usage): a CLIProxy hub saved as its management.html panel URL shows accounts again by @Jolymmiles in pingdotgg/t3code#25579
* fix(shared): command output keeps text after an unterminated OSC by @spoukyii in pingdotgg/t3code#30479
* fix(cli): t3 up's retry and restart hints keep --base-dir by @spoukyii in pingdotgg/t3code#30480
* fix(server): a branch tracking another local branch no longer shows that branch's PR by @MarcoDotIO in pingdotgg/t3code#30563
* fix(web): terminal links keep route and pnpm paths in one piece by @tiliakoos in pingdotgg/t3code#30603
* fix(shared): CSV and TSV attachments keep their table under generic file types by @tiliakoos in pingdotgg/t3code#30601
* fix(server): report Claude settings compaction threshold by @voltcrash in pingdotgg/t3code#29220
* fix(cli): t3 project remove finds a deleted project by a relative or trailing-slash path by @MarcoDotIO in pingdotgg/t3code#30562
* fix(server): an invalid regex in project search still finds its text when Match case is off by @MarcoDotIO in pingdotgg/t3code#30569
* fix(server): agents see why a project update was refused instead of a generic failure by @MarcoDotIO in pingdotgg/t3code#30564
* perf(client-runtime): stop tracing streamed thread batches by @ElliotDrel in pingdotgg/t3code#30679
* fix(server): rewound Codex threads import their history from before the rewind by @MarcoDotIO in pingdotgg/t3code#30652
* fix(server): keep writes moving with a larger WAL limit by @Yash-Singh1 in pingdotgg/t3code#31804
* fix(opencode): edits that delete text keep their empty replacement by @Jo2234 in pingdotgg/t3code#30643
* fix(forgejo): read author assignees once by @Jo2234 in pingdotgg/t3code#30686
* fix(cli): t3 pair's no-running-server hint keeps --base-dir by @saphid in pingdotgg/t3code#30689
* perf(server): stop tracing routine port polling helpers by @ElliotDrel in pingdotgg/t3code#30678
* fix(server): ACP MCP bridge no longer splits messages on U+2028/U+2029 by @geezoria in pingdotgg/t3code#30719
* fix(cli): expand home-relative thread project paths by @Jo2234 in pingdotgg/t3code#30721
* perf(ci): boot the built web client in Build and Typecheck, not Test Web (about 22 s off the longest job) by @Pyseph in pingdotgg/t3code#30752
* fix(shared): ignore unfinished quoted Git config continuations by @imharjot in pingdotgg/t3code#30743
* fix(review-guide): preserve excerpt line terminators by @Jo2234 in pingdotgg/t3code#30717
* feat(pi): show extension status in existing controls by @StiensWout in pingdotgg/t3code#23901
* fix(fx): preserve literal unicode escape text in clipped replies by @Jo2234 in pingdotgg/t3code#30701
* perf(dev): knip:check runs its two passes side by side (34 s → 26 s median on 4 CPUs) by @Pyseph in pingdotgg/t3code#30737
* fix(shared): command output no longer prints the final byte of escape sequences with intermediates by @geezoria in pingdotgg/t3code#30724
* fix(web): restore folder breadcrumb trails when reopening tabs by @Jo2234 in pingdotgg/t3code#30706
* fix(client-runtime): sanitized error stacks keep line and column for URLs with a query by @geezoria in pingdotgg/t3code#30726
* fix(shared): shortened agent paths like /tmp/... no longer become broken file chips by @saphid in pingdotgg/t3code#30762
* fix(server): MCP auth spans no longer include the tool call by @navidnadali in pingdotgg/t3code#30834
* fix(server): preview browser picks up Chrome 157 security fixes by @snnbotchway in pingdotgg/t3code#30820
* fix(server): agents read RTF paragraphs that end with a backslash by @geezoria in pingdotgg/t3code#30848
* fix(server): a late checkpoint keeps the stopped run's baselines by @navidnadali in pingdotgg/t3code#30830
* fix(shared): preserve IPv6 hosts when switching clone protocols by @Lucenx9 in pingdotgg/t3code#30798
* docs: explain Linux desktop installation by @voltcrash in pingdotgg/t3code#30819
* perf(server): each live event is projected once for all subscribers by @navidnadali in pingdotgg/t3code#30860
* fix(server): request_secret asks for one value per card by @rgrvlsk in pingdotgg/t3code#30805
* fix(ssh): host discovery skips hidden Include matches by @Lucenx9 in pingdotgg/t3code#30910
* docs: clarify diagnostic exports and their separate controls by @Mr-Neutr0n in pingdotgg/t3code#30942
* docs: fix worktree cleanup path in FAQ by @jacobcorbett in pingdotgg/t3code#31000
* fix(server): a policy that manages observability endpoints is refused instead of ignored by @MarcoDotIO in pingdotgg/t3code#30973
* fix(client-runtime): untitled subagent titles no longer end in a broken character by @spoukyii in pingdotgg/t3code#30390
* fix(shared): underline styles and colours no longer scramble command output colours by @MarcoDotIO in pingdotgg/t3code#21542
* perf(server): batch queued provider writes without waiting by @Yash-Singh1 in pingdotgg/t3code#31656
* fix(server): prepare restart continuations faster on shutdown by @Yash-Singh1 in pingdotgg/t3code#31807
* fix(web): keep change totals aligned beside the label by @Yash-Singh1 in pingdotgg/t3code#31814
* fix(web): rank usage provider summaries by the selected metric by @dharmeshgurnani in pingdotgg/t3code#15632
* fix(server): wait for automatic follow-ups before settling threads by @Yash-Singh1 in pingdotgg/t3code#31815
* fix(web): settings descriptions use the full row and stay two lines by @flamboh in pingdotgg/t3code#31826
* fix(voice): insert Unicode word boundaries for dictation by @juliusmarminge in pingdotgg/t3code#31799
* fix(mobile): use preferred languages for on-device iPhone dictation by @juliusmarminge in pingdotgg/t3code#31800
* fix(mobile): keep the opening words of local iPhone dictation by @juliusmarminge in pingdotgg/t3code#31801
* fix(server): keep PR generation focused on the change by @Yash-Singh1 in pingdotgg/t3code#31819
* chore(desktop): trace shutdown phases by @Yash-Singh1 in pingdotgg/t3code#31850
* perf(server): batch shutdown recovery commits by @Yash-Singh1 in pingdotgg/t3code#31854
* perf(server): batch projection recovery reads into one query by @Yash-Singh1 in pingdotgg/t3code#31842
* fix(desktop): let the window shrink to 400x360 so it fits half-screen tiles by @shivamhwp in pingdotgg/t3code#28223
* fix(web): improve Changes row text and spacing by @shivamhwp in pingdotgg/t3code#31858
* feat(server): stop opted-in project actions when threads settle by @Yash-Singh1 in pingdotgg/t3code#31857
* fix(build): skip Koffi source builds during cross-packaging by @Yash-Singh1 in pingdotgg/t3code#31864
* fix(server): Antigravity installs on Intel Macs by @aledog007 in pingdotgg/t3code#30189

## New Contributors
* @kahlstrm made their first contribution in pingdotgg/t3code#28625
* @Jerematix made their first contribution in pingdotgg/t3code#28955
* @snarkyalyx made their first contribution in pingdotgg/t3code#16317
* @Muzammil-Bit made their first contribution in pingdotgg/t3code#30078
* @iScabrous made their first contribution in pingdotgg/t3code#30295
* @frankhommers made their first contribution in pingdotgg/t3code#30361
* @medric-z made their first contribution in pingdotgg/t3code#29607
* @shawk08033 made their first contribution in pingdotgg/t3code#30528
* @Jolymmiles made their first contribution in pingdotgg/t3code#25579
* @geezoria made their first contribution in pingdotgg/t3code#30719
* @navidnadali made their first contribution in pingdotgg/t3code#30834
* @Mr-Neutr0n made their first contribution in pingdotgg/t3code#30942
* @jacobcorbett made their first contribution in pingdotgg/t3code#31000
* @dharmeshgurnani made their first contribution in pingdotgg/t3code#15632
* @aledog007 made their first contribution in pingdotgg/t3code#30189

**Full Changelog**: pingdotgg/t3code@v0.1.8-nightly.20261106.4247...v0.1.8-nightly.20261106.4262

</details>


Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.8-nightly.20261106.4262
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Android composer flips between compact and expanded layouts when a one-line draft nearly fills the compact row

3 participants