Skip to content

fix(mobile): render Android alert dialog actions in sentence case - #6493

Merged
iscekic merged 1 commit into
mainfrom
kwf/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf
Sep 23, 2026
Merged

iscekic merged 1 commit into
mainfrom
kwf/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf

Conversation

@iscekic

@iscekic iscekic commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • Android alert dialogs now draw action labels in sentence case: the new-session discard confirm shows "Keep editing" and "Discard", not their ALL-CAPS forms.
  • The theme-level fix reaches every Android alert dialog action, so all of them match the sentence case used elsewhere in the app.
  • Label text still comes from the active translation; the change only removes the system's automatic uppercase transform.
  • Action order and destructive styling are unchanged.
  • "Keep editing" keeps the draft; "Discard" clears it and completes the back navigation.

Changelog for maintainers

  • New prebuild plugin withAndroidAlertDialogButtonCase renders Android alert dialog actions in sentence case by setting android:textAllCaps=false; it ships on a rebuild, not an OTA update.
  • The plugin retargets the three buttonBar*ButtonStyle attrs on AppTheme to AppAlertDialogButton, keeping the stock parent so metrics and colors stay unchanged; review that rewrite first, as a wrong attr or prebuild ordering leaves ALL-CAPS.
  • The plugin runs through withAndroidStyles and leaves a styles tree without AppTheme untouched.
  • app.config.ts registers the plugin once, and scripts/assert-expo-config.mjs fails the build if that registration is missing.
  • A contract test evaluates the plugin and pins the attrs, the stock parent, the absent-theme no-op, one styles mod, and the single shared Alert.alert call site without a platform fork.
  • The discard confirm code is unchanged: one Alert.alert using common.keepEditing and common.discard, with no catalog edits.
  • The Arabic mounted test's icon mock gains KeyRound to match the account settings screen; this repairs an existing test break.
  • Device proof covers Android only; the iOS path renders the same Alert.alert call and was not proved on device.

E2E proof

Android-only path and the casing proof (AppCompat AlertDialog; iOS's UIAlertController has no casing override, so this is the only platform-specific piece). — e3.png

[e5] ux-check: on the discard-draft dialog neither action label is truncated, ellipsized or clipped and the button row fits within the dialog width (android emulator-5554) — STATE HIT agent-picker (state-agent-picker.log) then typed a draft and the header back raised the confirm; e5-dialog.log shows both actions as complete sentence-case labels ('Keep editing' at [523,1261][791,1403] and 'Discard' at [791,1261][978,1403], adjacent, clickable) inside the dialog panel [70,985][1010,1414] and its buttonPanel [70,1250][1014,1414], on one stock-height row (142px, identical y) — row fits, no wrap, no ALL-CAPS; screenshots e5-discard-dialog.png / e5-dialog-hierarchy.png / e5-composer-after.png left to the visual reviewer for the pixel-level anti-ellipsis judgement; no…

[e5] ux-check: on the discard-draft dialog neither action label is truncated, ellipsized or clipped and the button row fits within the dialog width (android emulator-5554) — prior/e5-composer-after.png

[e5] ux-check: on the discard-draft dialog neither action label is truncated, ellipsized or clipped and the button row fits within the dialog width (android emulator-5554)

[e5] ux-check: on the discard-draft dialog neither action label is truncated, ellipsized or clipped and the button row fits within the dialog width (android emulator-5554) — prior/e5-discard-dialog.png

[e1] ux-check: dialog action order/prominence unchanged, Keep editing keeps the draft, Discard clears it and completes back navigation — android: live scene e1-keep-editing OK (e1-live.log) showed the 'Discard draft?' dialog, 'Keep editing' dismissed it and the draft survived (e1-keep-editing-digest.log: 'SCENE e1-keep-editing-digest OK' then 'android.widget.EditText e2edraft'), and 'Discard' completed the back navigation to the Agents tab with the reopened composer holding only the placeholder (e1-live.log: 'android.widget.EditText What would you like to work on?'), so both taps behave as before; the dialog's action order is unchanged — one buttonPanel row holds 'android.widget.Button Keep editing tappable…

[e1] ux-check: dialog action order/prominence unchanged, Keep editing keeps the draft, Discard clears it and completes back navigation — e2e-mobile-app/e1-keep-editing-digest.png

[e4] ux-check discard-draft dialog actions — Android emulator-5554, APK installed from this worktree's native artifact (resource.log: 'mobile-remote-native: installed remote artifact mobile-native-android-67a21c2b6c8ea4fa9223ac7454b214f87c6da310'); composer with draft 'e2edraft' + Android hardware back showed the AppCompat button bar with text="Keep editing" resource-id="android:id/button2" and text="Discard" resource-id="android:id/button1" (e4-dialog.txt; still e4-dialog.png) — the app's sentence-case translated copy, no all-caps action text; dialog reached, dismiss and destructive paths work; no UX-DEFECT observed (pixel casing is…

[e4] ux-check discard-draft dialog actions — prior/e4-dialog.png

[e8] ux-check other Android Alert regression — Android emulator-5554: a second Alert.alert ('Delete account?') renders its AppCompat button bar with text="Delete account" resource-id="android:id/button1" and text="Cancel" resource-id="android:id/button2" (e8-scene.xml; still e8.png, scene 'SCENE e8 OK'); non-dialog buttons on the Profile screen keep their labels and bounds (e8-profile.txt), and files/change.diff scopes the plugin to the three buttonBar*ButtonStyle items on AppTheme only, so no other app button is touched; no UX-DEFECT observed (pixel-level casing/size/colour is the visual reviewer's on e8.png and e8-profile.png).

[e8] ux-check other Android Alert regression — prior/e8-profile.png

[e8] ux-check other Android Alert regression

[e8] ux-check other Android Alert regression — prior/e8.png

E2E proof — log excerpts

[e1] ux-check: dialog action order/prominence unchanged, Keep editing keeps the  -> pass :: android: live scene e1-keep-editing OK (e1-live.log) showed the 'Discard draft?' dialog, 'Keep editing' dismissed it and the draft survived (e1-keep-editing-digest.log: 'SCENE e1-keep-editing-digest OK' then 'android.widget.EditText e2edraft'), and 'Discard' completed the back navigation to the Agents tab with the reopened composer holding only the placeholder (e1-live.log: 'android.widget.EditText What would you like to work on?'), so both taps behave as before; the dialog's action order is unchanged — one buttonPanel row holds 'android.widget.Button Keep editing tappable [523,1261][791,1403]' left of 'android.widget.Button Discard tappable [791,1261][978,1403]' (e1-live.log) — while button
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf/e2e-mobile-app/e1-live.log
android.widget.Button Refresh repositories [888,1552][1004,1667]
android.widget.TextView Changes tappable [37,1753][1045,1799]
android.view.View Changes tappable [37,1817][1043,1936]
android.widget.RadioButton Leave changes tappable [46,1826][540,1927]
android.widget.TextView Leave changes tappable [182,1853][403,1899]
android.widget.RadioButton Commit and push tappable [540,1826][1034,1927]
android.widget.TextView Commit and push tappable [656,1853][917,1899]
android.widget.TextView Environment tappable [37,1982][1045,2028]
android.widget.TextView Default environment tappable [37,2046][1045,2092]
android.widget.Button Start session [37,2148][1043,2264]
android.widget.TextView Start session tappable [442,2182][638,2228]
SCENE e1-dialog-digest OK
android.widget.FrameLayout com.kilocode.kiloapp:id/action_bar_root tappable [70,985][1010,1414]
android.widget.FrameLayout android:id/content tappable [70,985][1010,1414]
androidx.appcompat.widget.LinearLayoutCompat com.kilocode.kiloapp:id/parentPanel tappable [70,985][1010,1414]
android.widget.LinearLayout com.kilocode.kiloapp:id/topPanel tappable [70,985][1010,1124]
android.widget.TextView Discard draft? tappable [133,1032][947,1103]
android.view.View com.kilocode.kiloapp:id/titleDividerNoCustom tappable [70,1103][1010,1124]
android.widget.FrameLayout com.kilocode.kiloapp:id/contentPanel tappable [70,1124][1010,1250]
android.widget.ScrollView com.kilocode.kiloapp:id/scrollView tappable [70,1124][1010,1181]
android.widget.TextView Your prompt will be lost. tappable [70,1124][1010,1181]
android.widget.ScrollView com.kilocode.kiloapp:id/buttonPanel tappable [70,1250][1010,1414]
android.widget.Button Keep editing tappable [523,1261][791,1403]
android.widget.Button Discard tappable [791,1261][978,1403]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf/e2e-mobile-app/e1-keep-editing-digest.log
android.widget.TextView Run on tappable [37,792][1045,838]
android.widget.Button Run on: Cloud Agent tappable [37,856][909,972]
android.widget.TextView Cloud Agent tappable [67,886][844,942]
android.widget.Button Refresh tappable [928,856][1043,972]
android.widget.TextView Run `kilo remote` on your computer, or `/remote` in a running CLI session, to control a local kilo process. tappable [36,991][1044,1065]
android.widget.TextView Repository tappable [37,1111][1045,1157]
android.widget.Button Repository: Select repository tappable [37,1175][1043,1291]
android.widget.TextView Select repository tappable [67,1205][978,1261]
android.widget.Button Connect GitLab tappable [76,1358][1004,1404]
android.widget.TextView Connect GitLab tappable [76,1358][944,1404]
android.widget.TextView Connect GitLab in your browser, then return here to pick a repository. tappable [76,1432][1004,1524]
android.widget.Button Open GitLab tappable [76,1552][870,1667]
android.widget.TextView Open GitLab tappable [412,1586][594,1632]
android.widget.Button Refresh repositories tappable [888,1552][1004,1667]
android.widget.TextView Changes tappable [37,1753][1045,1799]
android.view.View Changes tappable [37,1817][1043,1936]
android.widget.RadioButton Leave changes tappable [46,1826][540,1927]
android.widget.TextView Leave changes tappable [182,1853][403,1899]
android.widget.RadioButton Commit and push tappable [540,1826][1034,1927]
android.widget.TextView Commit and push tappable [656,1853][917,1899]
android.widget.TextView Environment tappable [37,1982][1045,2028]
android.widget.TextView Default environment tappable [37,2046][1045,2092]
android.widget.Button Start session [37,2148][1043,2264]
android.widget.TextView Start session tappable [442,2182][638,2228]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf/e2e-mobile-app/scripted-e1.log
android.widget.TextView Run on tappable [37,792][1045,838]
android.widget.Button Run on: Cloud Agent tappable [37,856][909,972]
android.widget.TextView Cloud Agent tappable [67,886][844,942]
android.widget.Button Refresh tappable [928,856][1043,972]
android.widget.TextView Run `kilo remote` on your computer, or `/remote` in a running CLI session, to control a local kilo process. tappable [36,991][1044,1065]
android.widget.TextView Repository tappable [37,1111][1045,1157]
android.widget.Button Repository: Select repository tappable [37,1175][1043,1291]
android.widget.TextView Select repository tappable [67,1205][978,1261]
android.widget.Button Connect GitLab tappable [76,1358][1004,1404]
android.widget.TextView Connect GitLab tappable [76,1358][944,1404]
android.widget.TextView Connect GitLab in your browser, then return here to pick a repository. tappable [76,1432][1004,1524]
android.widget.Button Open GitLab tappable [76,1552][870,1667]
android.widget.TextView Open GitLab tappable [412,1586][594,1632]
android.widget.Button Refresh repositories tappable [888,1552][1004,1667]
android.widget.TextView Changes tappable [37,1753][1045,1799]
android.view.View Changes tappable [37,1817][1043,1936]
android.widget.RadioButton Leave changes tappable [46,1826][540,1927]
android.widget.TextView Leave changes tappable [182,1853][403,1899]
android.widget.RadioButton Commit and push tappable [540,1826][1034,1927]
android.widget.TextView Commit and push tappable [656,1853][917,1899]
android.widget.TextView Environment tappable [37,1982][1045,2028]
android.widget.TextView Default environment tappable [37,2046][1045,2092]
android.widget.Button Start session [37,2148][1043,2264]
android.widget.TextView Start session tappable [442,2182][638,2228]
Owner request

Explorer finding: discard-draft-dialog: Both dialog actions are stock ALL-CAPS labels while every other button in the app ("Mantieni modifiche", "Commit e push", "Apri GitLab", "Avvia sessione") is sentence case.

The user-agent explorer found this while using the app like a user.
One finding per item; the explorer never edits product code.

Flow: discard-draft-dialog
Found on revision: f2181ae

Repro:

  1. set this state first: uimode night; reviews 4; credits 15; battery 72 charging; relaunch; back; resume; the device in dark mode
  2. open the app on emulator-5602
  3. reach discard-draft-dialog
  4. the capture shows the defect named below

Observed: Both dialog actions are stock ALL-CAPS labels while every other button in the app ("Mantieni modifiche", "Commit e push", "Apri GitLab", "Avvia sessione") is sentence case.
Expected: the screen renders without this defect

Evidence (from the device run):

[e7] ux-check: dark mode repeat of the dialog — android emulator-5606 in dark mode; e7-scene.log reads 'android.widget.Button Keep editing tappable [523,1294][791,1436]' and 'android.widget.Button Discard tappable [791,1294][978,1436]', sentence case (e7-scene.xml same, e7.png is the dark still for the visual reviewer); device dark mode proved by e7-nightmode.log 'Switch "Dark theme" [checked]'; the label colour/contrast is the visual reviewer's, not claimed here; no UX-DEFECT seen.

[e7] ux-check: dark mode repeat of the dialog — e7.png

Follow-ups (not changed here)

  • not proved live: Android-only path (same AppCompat button style as the first scenario; the casing itself is proved by the last scenario, which ends with the confirm open). The cancel action keeps the draft: from the new-session screen with a typed draft the header back raises 'Discard draft?', tapping the sentence-case 'Keep editing' dismisses the confirm without leaving, and the composer still shows the draft — so the scene ends back on the new-session screen. (no capture cited it)
  • not proved live: Android-only path (the ALL-CAPS actions are AppCompat's AlertDialog button style; iOS renders the same Alert.alert as UIAlertController and draws the copy as given, with no casing override to target — no iOS half exists). The confirm's destructive action still works under the re-cased button row: from the new-session screen with a typed draft the header back raises 'Discard draft?', and tapping the sentence-case 'Discard' clears the draft and replays the leave, so the app lands back on the tab bar; the scene then re-opens the new session, so it ends on the clean picker that the next scenarios start from. The app runs its English copy (the harness pins en-US; on the finding's it-IT device the same labels read 'Continua a modificare' / 'Scarta'). (no capture cited it)
  • not proved live: ux-check: On Android emulator-5602, using the build from this revision (clean native rebuild, since the fix is a prebuild config plugin), open the new-session composer, enter a non-empty draft, then press Android hardware back to reach the discard-draft dialog. PASS if the dialog's two action labels render in sentence case as the app's translated copy gives them (it: 'Continua a modificare' / 'Scarta'; en: 'Keep editing' / 'Discard') and NOT in ALL-CAPS; FAIL if either label is still uppercase. (no capture cited it)
  • not proved live: ux-check: On that same dialog, PASS if neither action label is truncated, ellipsized, or clipped and the button row still fits within the dialog width; FAIL if a label is cut off or wraps. (no capture cited it)
  • not proved live: ux-check: PASS if the action order and prominence are unchanged from before the fix (cancel/keep-editing and the destructive discard action appear in the same positions), and tapping 'Keep editing' dismisses the dialog with the draft intact while tapping 'Discard' clears the draft and completes the back navigation; FAIL if either tap changes behavior. (no capture cited it)
  • not proved live: ux-check: Regression check: trigger one other Android Alert.alert in the app (e.g. the settings back guard). PASS if its actions are also sentence case and no other app button's casing, size, or color changed; FAIL if any non-dialog button is affected. (no capture cited it)
  • not proved live: ux-check: With the device in dark mode (uimode night), repeat the same dialog. PASS if the actions are sentence case and the label color/contrast is unchanged from the pre-fix dark build; FAIL if casing regresses or the label becomes unreadable. (no capture cited it)

Open findings (not fixed here)

  • not proved live: discard-draft-dialog.png is no longer on the host that took it, so no publish can carry it

e5-dialog-hierarchy

@iscekic
iscekic marked this pull request as draft September 21, 2026 16:03
Comment thread apps/mobile/plugins/withAndroidAlertDialogButtonCase.js
Comment thread apps/mobile/src/lib/alert-dialog-button-case.test.ts
@kilo-code-bot

kilo-code-bot Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The only changed line since the previous review is the alert-dialog guard's PLATFORM_BRANCH refactor, which resolves the prior finding; no new issues found on HEAD d91a5a60b.

Files Reviewed (5 files)
  • apps/mobile/app.config.ts
  • apps/mobile/plugins/withAndroidAlertDialogButtonCase.js
  • apps/mobile/scripts/assert-expo-config.mjs
  • apps/mobile/src/lib/alert-dialog-button-case.test.ts
  • apps/mobile/src/lib/route-layout-guard.test.ts
Previous Review Summaries (4 snapshots, latest commit 21f787c)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 21f787c)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

One changed-file suggestion: the new guard test rejects any capital-Platform token across the whole app.config.ts, so an unrelated edit would fail it; the alert-dialog plugin change itself is sound on current HEAD.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/lib/alert-dialog-button-case.test.ts 180 The \bPlatform\b guard runs over the entire app.config.ts; an unrelated capital-Platform token fails the test.
Files Reviewed (5 files)
  • apps/mobile/app.config.ts - 0 issues
  • apps/mobile/plugins/withAndroidAlertDialogButtonCase.js - 0 issues
  • apps/mobile/scripts/assert-expo-config.mjs - 0 issues
  • apps/mobile/src/lib/alert-dialog-button-case.test.ts - 1 issue
  • apps/mobile/src/lib/route-layout-guard.test.ts - 0 issues
Review notes

Full review: the previous review SHA b4367374 is no longer an ancestor (history was force-pushed), so gh pr diff 6493 was read in full.

The two previously open findings — that the buttonBar*ButtonStyle overrides on AppTheme cannot reach the AppCompat AlertDialog — do not reproduce on current HEAD. Base main registers ./plugins/withAndroidAlertDialogTheme, which writes alertDialogTheme on AppTheme pointing at AppAlertDialogTheme (parent ThemeOverlay.AppCompat.Dialog.Alert). That overlay chain defines none of the three buttonBar*ButtonStyle attrs, so their lookups fall through to AppTheme and this plugin's values do reach the dialog. The prior inline comments on withAndroidAlertDialogButtonCase.js:92 and alert-dialog-button-case.test.ts:129 are superseded rather than blockers, and no duplicate was posted on those lines.

Fix these issues in Kilo Cloud

Previous review (commit b436737)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

One changed-file suggestion: the new Expo Router typed-routes guard duplicates the already-merged route-layout-guard.test.ts and is looser than it; the two previously open alert-dialog findings no longer reproduce on the rebased base.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/lib/expo-router-typed-routes.test.ts 56 Duplicates the merged route-layout-guard.test.ts and is looser (_layout.ios.foo.tsx is not flagged).
Files Reviewed (5 files)
  • apps/mobile/app.config.ts - 0 issues
  • apps/mobile/plugins/withAndroidAlertDialogButtonCase.js - 0 new issues (unchanged since the previous review)
  • apps/mobile/scripts/assert-expo-config.mjs - 0 issues
  • apps/mobile/src/lib/alert-dialog-button-case.test.ts - 0 new issues (unchanged since the previous review)
  • apps/mobile/src/lib/expo-router-typed-routes.test.ts - 1 issue
Review notes

Incremental mode. 5414cb3b is no longer an ancestor of the branch (rebased), so the full gh pr diff was re-read and the changed files were checked in full.

The two previously open findings — that the buttonBar*ButtonStyle overrides on AppTheme cannot reach the AppCompat AlertDialog — no longer reproduce on current HEAD. Base main now registers ./plugins/withAndroidAlertDialogTheme, which writes alertDialogTheme on AppTheme pointing at AppAlertDialogTheme (parent ThemeOverlay.AppCompat.Dialog.Alert). That overlay defines none of the three buttonBar*ButtonStyle attrs, so their lookups fall through to AppTheme and the new plugin's values do reach the dialog; the AppCompat default called out earlier is no longer the resolved dialog theme. The author's rebuttal is correct for the current tree, so the prior inline comments are superseded rather than blockers. The device evidence remains textual (uiautomator reports TextView.getText()), so a rendered-pixel check is still the only direct proof of the casing.

Fix these issues in Kilo Cloud

Previous review (commit 5414cb3)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

CRITICAL

File Line Issue
apps/mobile/plugins/withAndroidAlertDialogButtonCase.js 92 The three buttonBar*ButtonStyle overrides are written on AppTheme, which only reaches the dialog if alertDialogTheme resolves to the ThemeOverlay.AppCompat.Dialog.Alert overlay. AppCompat's default is the full Theme.AppCompat.DayNight.Dialog.Alert theme, whose chain supplies the stock ALL-CAPS button-bar values and shadows the activity theme, so the actions likely stay ALL-CAPS. The device evidence does not settle it: uiautomator text= reports TextView.getText(), the pre-transform copy. Verify from rendered pixels. The author rebutted without changing the carrier theme.

WARNING

File Line Issue
apps/mobile/src/lib/alert-dialog-button-case.test.ts 129 The assertion that nothing writes alertDialogTheme pins the assumption behind the CRITICAL. If the override moves onto a dialog theme, this assertion and the AppTheme lookup at line 113 must be retargeted.
Files Reviewed (4 files)
  • apps/mobile/app.config.ts - 0 issues
  • apps/mobile/plugins/withAndroidAlertDialogButtonCase.js - 1 issue
  • apps/mobile/scripts/assert-expo-config.mjs - 0 issues
  • apps/mobile/src/lib/alert-dialog-button-case.test.ts - 1 issue
Review notes

This run was incremental from 81dcb60, but that commit was rebased out of the branch, so the current PR diff was reviewed in full (the same four files). No new findings beyond the two active inline comments. Registration in app.config.ts, the config assertion, the plugin XML mutation, and the absence of a Platform fork were re-checked and are correct.

Fix these issues in Kilo Cloud

Previous review (commit 81dcb60)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

CRITICAL

File Line Issue
apps/mobile/plugins/withAndroidAlertDialogButtonCase.js 76 buttonBar*ButtonStyle overrides are written on AppTheme, but the AppCompat AlertDialog resolves those attrs from alertDialogTheme (an AppCompat dialog theme layered over the activity theme) whose own values shadow them, so the ALL-CAPS action rendering is likely unchanged. Move the attrs onto a dialog theme and point alertDialogTheme at it.

WARNING

File Line Issue
apps/mobile/src/lib/alert-dialog-button-case.test.ts 121 The test pins the incorrect invariant that the plugin must not write alertDialogTheme; no other writer of that attr exists in the repo, so this assertion would block the correct fix.
Files Reviewed (4 files)
  • apps/mobile/app.config.ts - 0 issues
  • apps/mobile/plugins/withAndroidAlertDialogButtonCase.js - 1 issue
  • apps/mobile/scripts/assert-expo-config.mjs - 0 issues
  • apps/mobile/src/lib/alert-dialog-button-case.test.ts - 1 issue

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic

iscekic commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Cross-platform fix. Pushed dba79a0 (kwf kwf-fix-platform-cd5e).

What changed:

  • One implementation serves both platforms: the discard confirm is a single shared Alert.alert call, and the only platform-specific piece is the Android theme override.
  • Comments now name Android as the capability gap: AppCompat's stock button bar forces ALL-CAPS, while iOS's UIAlertController draws the shared copy as given and exposes no casing transform.
  • The plugin JSDoc, the app.config.ts registration comment, and the config-assertion comment state that single shared path; the assertion script's checks are unchanged.
  • The parity test now rejects any Platform reference in the registration and in the discard call site, covering Platform.OS, Platform.select, and platform-specific imports, not only the two literals.
  • Review the comment wording first: the plugin keeps its Android name because only the AppTheme override is platform-specific, while the alert call stays shared.
  • The plugin still ships on a native rebuild, not an OTA update.
  • Device proof covers Android; the iOS render path was not proved on device.

@iscekic
iscekic force-pushed the kwf/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf branch from dba79a0 to 5414cb3 Compare September 22, 2026 01:00
@iscekic
iscekic marked this pull request as ready for review September 22, 2026 01:19
@iscekic
iscekic marked this pull request as draft September 22, 2026 01:26
@iscekic
iscekic force-pushed the kwf/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf branch from ff28574 to b436737 Compare September 23, 2026 04:43
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 05:32
Comment thread apps/mobile/src/lib/expo-router-typed-routes.test.ts Outdated
@iscekic
iscekic marked this pull request as draft September 23, 2026 05:43
@iscekic
iscekic force-pushed the kwf/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf branch from 6175f86 to 21f787c Compare September 23, 2026 06:32
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 06:43
Comment thread apps/mobile/src/lib/alert-dialog-button-case.test.ts Outdated
@iscekic
iscekic marked this pull request as draft September 23, 2026 06:55
@iscekic
iscekic force-pushed the kwf/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf branch from d1aa167 to d91a5a6 Compare September 23, 2026 07:36
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 07:57
@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: Android-only path (same AppCompat button style as the first scenario; the casing itself is proved by the last scenario, which ends with the confirm open). The cancel action keeps the draft: from the new-session screen with a typed draft the header back raises 'Discard draft?', tapping the sentence-case 'Keep editing' dismisses the confirm without leaving, and the composer still shows the draft — so the scene ends back on the new-session screen. (no capture cited it)

A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision.

@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic iscekic self-assigned this Sep 23, 2026
@iscekic
iscekic merged commit 0efbc42 into main Sep 23, 2026
29 checks passed
@iscekic
iscekic deleted the kwf/explorer-discard-draft-dialog-both-dialog-actions-are-sto-c5b58-7aaf branch September 23, 2026 10:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants