Skip to content

fix(mobile,web): restore duplicate-PR tests and clear bottom chrome - #6415

Open
iscekic wants to merge 3 commits into
mainfrom
kwf/explorer-restore-tests-duplicate-prs-carried-c0v3r1-b72b
Open

iscekic wants to merge 3 commits into
mainfrom
kwf/explorer-restore-tests-duplicate-prs-carried-c0v3r1-b72b

Conversation

@iscekic

@iscekic iscekic commented Sep 20, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • Bottom-center toasts on mobile sit above the software keyboard, the floating tab bar, and the device bottom chrome instead of being clipped behind them.
  • The sign-in screen keeps its action above the keyboard through a brief iOS interruption (Control Center, the app switcher, a call banner, or a system alert), as well as above the navigation bar and the home indicator.
  • The manual review form scrolls its Start button above the keyboard, so a review can be started while an input is focused.
  • The agent session composer sits flush on the software keyboard, with no navigation-bar-height gap, and the transcript still scrolls.
  • On Android, the comment bar on a pull request discussion keeps its button one clearance above the software keyboard instead of a navigation-bar height higher.
  • Starting a manual review from a public GitHub pull request or GitLab merge request now shows a specific missing, rate-limited, or unreachable-provider error instead of a generic failure.

Changelog for maintainers

  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx:114 — accepted: the screen-bottom-anchored occlusion counted the bottom inset the composer already pads inside the view, floating the composer a navigation-bar height above the keyboard. The new contentReservesBottomInset opt-in adds only the raw platform metric; ConversationScreen uses it, and a mounted test asserts the Android raw height and the iOS passthrough.
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx:112 — accepted: the discussion CTA bar pads the bottom inset itself through useDetailScreenBottomPadding(), so the default occlusion double-counted it and floated the button higher. The bar now opts into contentReservesBottomInset; the CTA test asserts the Android raw lift and rejects the double count.
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts:108 — accepted: the rate-limited GitLab case called captureError() with no overrides, so it ran the GitHub path. It now passes { platform: 'gitlab', url: GITLAB_MR_URL } and asserts the GitLab rate-limit copy, so the name matches what runs. The public-source path maps provider failures to NOT_FOUND, TOO_MANY_REQUESTS, or BAD_GATEWAY; existing TRPCErrors pass through.
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx:89 — accepted: containerReservesBottomInset subtracts the inset the session screen's trailing spacer and the new-session form's parent padding already reserve, so both callers resolve the space once. The shared view now resolves the default through resolveKeyboardBottomPadding, matching the Toaster and the login screen.
  • apps/mobile/src/lib/toast-offset.ts:54 — accepted: the keyboard branch applied Android's raw keyboard height, so the toast's last line could hide behind the IME's navigation row. AppToaster now resolves the height through resolveKeyboardBottomPadding; the resting rule is unchanged.
  • apps/mobile/src/components/login-screen.tsx:159 — accepted: the app-state listener now runs on iOS, so a transient inactive no longer collapses the reserved padding. resolveAppAwareKeyboardPadding clears the padding only on background.
  • apps/mobile/src/components/app-unlock-screen.test-helpers.tsx:111 — accepted: the mocked Keyboard.addListener keeps a set per direction, so each remove() deletes only its own subscription and the Toaster and a screen listener no longer detach each other.
  • Tests ported from closed fix(mobile): keep sign-in actions above the bottom safe area #6380, fix(mobile): lift Android error toast above the keyboard #6392, and fix(web): map manual review provider failures to client errors #6405 cover the transient-inactive padding, the multi-subscriber keyboard harness, toast offsets, and the review error mapping. Review the inset-once rule first (container-reserved versus content-reserved), then the transient-inactive padding and the multi-subscriber mock. The live Android captures for the flush-composer check (agent-session caller, collected 2026-09-21) and the discussion-CTA check replace the earlier claim that those captures were not collected; the kilo-chat ConversationScreen caller still needs a KiloClaw sandbox conversation the pack does not seed, so only the agent-session caller of the shared view was driven. Verification recorded android, not the requested iOS, so the iOS live check is skipped and pending owner verification; the transient-interruption captures (android/emulator-5554, collected 2026-09-20, soft IME enabled as a fixture because the harness leaves it off) still replace the earlier Android sign-in capture, and the manual-review toast and error-mapping captures still stand.

E2E proof

[e1] Sign-in screen keeps its action above the keyboard through a transient app interruption (proved on android) — e2e-mobile-app/e1-after-interrupt.png

[e1] iOS: on the sign-in screen, focus the email field so the keyboard opens, then reveal Control Center (or take a call) so the app goes briefly inactive, and dismiss it; the form stays scrollable and… — e1-kb.png

[e1] iOS: on the sign-in screen, focus the email field so the keyboard opens, then reveal Control Center (or take a call) so the app goes briefly inactive, and dismiss it; the form stays scrollable and… — prior/e1-shade.png

[e1] iOS: on the sign-in screen, focus the email field so the keyboard opens, then reveal Control Center (or take a call) so the app goes briefly inactive, and dismiss it; the form stays scrollable and… — e1-shade.png

[e1] Android: Code Reviewer manual review — failed submit error toast clears the bottom chrome — e2e-mobile-app/e1.png

[e3] Web: manual Code Reviewer job with a nonexistent public GitHub PR URL — prior/e3.png

[e2] PR review discussion: focus the comment field so the keyboard opens — the 'Comment on this pull request' CTA bar sits one clearance above the keyboard (not a nav-bar height higher) and the thread… — e2e-mobile-app/e2-reply-kbd.png

Owner request

Explorer finding: restore the tests that duplicate pull requests carried

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

Flow: coverage

Repro:

  1. read the closed PR named beside each test
  2. take that test from its branch
  3. run it against the keeper PR's implementation and adjust it to that implementation

Observed: 3 closed PRs each carried a test the kept PR does not have. Each pair fixed one defect two ways, so the smaller PR was closed; its test was the only thing it had that the keeper lacks, and a note on a human-ready PR is not picked up by the workflow: apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding-state.test.ts: from closed #6380, keeper #6388 (sign-in cut off at the bottom) apps/mobile/src/components/app-unlock-screen.mounted.test.tsx and apps/mobile/src/lib/case-guard.test.ts: from closed #6392, keeper #6330 (error toast under the keyboard) apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts: from closed #6405, keeper #6325 (manual review 500)
Expected: each named test exists and passes against the behaviour its keeper PR implements; take the test from the closed PR's branch where it still applies

Evidence (from the device run):

  • (no evidence file recorded)

E2E proof — log excerpts

[e1] Agent chat: open a conversation and focus the composer so the keyboard open -> pass :: android emulator-5554: with the IME open the composer block ends at the keyboard top with zero gap (e1scroll-scene.xml bounds="[0,1224][1080,1517]"; keyboard-ime-open.log mInputShown=true, touchable region=SkRegion((0,1517,1080,2400))), where the double-counted inset would leave the 63 px navigation bar gap; the transcript is still a scrollable view (e1scroll-scene.xml class="android.widget.ScrollView" ... scrollable="true" ... bounds="[0,305][1080,1224]") whose first message is scrolled out while the last tool row is on screen. The kilo-chat ConversationScreen caller needs a KiloClaw sandbox conversation the pack does not seed, so only the agent-session caller of the shared view was driven.
[e2] PR review discussion: focus the comment field so the keyboard opens — the ' -> pass :: android emulator-5554 with the github stub (kilo-stub/discussion-mixed#1): focusing the thread's comment field raised the keyboard (keyboard-ime-open.log touchable region=SkRegion((0,1517,1080,2400))) and the CTA button sits 42 px above it (e2-reply-kbd.txt bounds="[37,1360][1043,1475]", label Comment on this pull request [349,1394][786,1440]) — the same 42 px it clears the navigation-bar top (2337) by at rest (e2-disc-atrest.txt bounds="[37,2180][1043,2295]"), so the inset is counted once; after a scroll the list showed Conversation comment at T+2 [72,1066][1010,1129] with the CTA unchanged (e2-scrolled-kbd.txt), so the thread list stays scrollable.
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-19e5/e2e-mobile-app/keyboard-ime-open.log
== display size
Physical size: 1080x2400
== ime shown
  mCurMethodId=com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME
  mInputShown=true
== ime window touchable region (top = keyboard top)
    mGivenContentInsets=[0,1389][0,0] mGivenVisibleInsets=[0,1389][0,0]
    touchable region=SkRegion((0,1517,1080,2400))
== navigation bar insets
        InsetsSource id=a4b60001 type=navigationBars frame=[0,2337][1080,2400] visible=true flags=SUPPRESS_SCRIM|ANIMATE_RESIZING sideHint=BOTTOM boundingRects=null
        InsetsSourceControl: {a4b60001 mType=navigationBars initiallyVisible mSurfacePosition=Point(0, 2337) mInsetsHint=Insets{left=0, top=0, right=0, bottom=63}}
        mSource=InsetsSource id=a4b60001 type=navigationBars frame=[0,2337][1080,2400] visible=true flags=SUPPRESS_SCRIM|ANIMATE_RESIZING sideHint=BOTTOM boundingRects=null
        mControl=InsetsSourceControl mId=a4b60001 mType=navigationBars mLeash=Surface(name=Surface(name=eac1ffe Taskbar)/@0x5ef36f8 - animation-leash of insets_animation)/@0x25d2be3 mInitiallyVisible=
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-19e5/e2e-mobile-app/e2-reply-kbd.txt
<redacted>
                                          </android.widget.Button>
                                        </android.view.ViewGroup>
                                      </android.view.ViewGroup>
                                    </android.widget.ScrollView>
                                  </android.view.ViewGroup>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-19e5/e2e-mobile-app/e2-disc-atrest.txt
<redacted>
                                          </android.widget.Button>
                                        </android.view.ViewGroup>
                                      </android.view.ViewGroup>
                                    </android.widget.ScrollView>
                                  </android.view.ViewGroup>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-19e5/e2e-mobile-app/e2-scrolled-kbd.txt
<redacted>
                                          </android.widget.Button>
                                        </android.view.ViewGroup>
                                      </android.view.ViewGroup>
                                    </android.widget.ScrollView>
                                  </android.view.ViewGroup>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>

Comment thread apps/mobile/src/components/login-screen.tsx
Comment thread apps/mobile/src/components/app-unlock-screen.test-helpers.tsx Outdated
@kilo-code-bot

kilo-code-bot Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The incremental commit resolves all three prior findings: the new contentReservesBottomInset opt-in stops the conversation composer and the discussion CTA from double-counting Android's bottom inset, and the GitLab rate-limit case now exercises the GitLab path. No new issues were found in the changed code.

Files Reviewed (7 files)
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.mounted.test.tsx
  • apps/mobile/src/components/kilo-chat/conversation-screen.tsx
  • apps/mobile/src/components/kilo-chat/conversation-screen.composer-keyboard.mounted.test.tsx
  • apps/mobile/src/components/pr-review/discussion/pr-comment-cta.tsx
  • apps/mobile/src/components/pr-review/discussion/pr-comment-cta.test.tsx
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts
Previous Review Summaries (4 snapshots, latest commit de93c3c)

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

Previous review (commit de93c3c)

Status: 3 Issues Found | Recommendation: Address before merge

Executive Summary

The new screen-bottom-anchored keyboard occlusion resolves the inset once per screen only for the two callers that opted in — two unchanged AppAwareKeyboardPaddingView callers (conversation-screen, pr-comment-cta) now double-count the Android bottom inset and float their composer/CTA a nav-bar height above the keyboard.

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx 114 Unchanged caller conversation-screen.tsx double-counts the Android bottom inset: MessageInput pads the inset inside the default-prop view, so the chat composer floats a nav-bar height above the keyboard.
apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx 112 Unchanged caller pr-comment-cta.tsx pads useDetailScreenBottomPadding() (includes the inset) inside the default-prop view, so the Discussion CTA floats an extra nav-bar height above the keyboard on Android.

SUGGESTION

File Line Issue
apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts 108 The "rate-limited GitLab maps to TOO_MANY_REQUESTS" case runs the GitHub path (no platform override), so a GitLab-specific 429 regression would pass.
Files Reviewed (23 files)
  • apps/mobile/src/components/agents/new-session-configure-form.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/app-root-providers.toaster-a11y.mounted.test.tsx
  • apps/mobile/src/components/app-root-providers.tsx
  • apps/mobile/src/components/app-unlock-screen.mounted.test.tsx
  • apps/mobile/src/components/app-unlock-screen.test-helpers.tsx
  • apps/mobile/src/components/code-reviewer/manual-review-screen.tsx
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding-state.test.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding-state.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.mounted.test.tsx
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.test.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx - 2 issues
  • apps/mobile/src/components/kilo-chat/use-reveal-end-on-keyboard.test.ts
  • apps/mobile/src/components/kilo-chat/use-reveal-end-on-keyboard.ts
  • apps/mobile/src/components/login-screen-state.ts
  • apps/mobile/src/components/login-screen.test.ts
  • apps/mobile/src/components/login-screen.tsx
  • apps/mobile/src/components/tab-screen.tsx
  • apps/mobile/src/lib/toast-offset.test.ts
  • apps/mobile/src/lib/toast-offset.ts
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts - 1 issue
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.ts
  • apps/web/src/routers/code-reviews-router.test.ts

Fix these issues in Kilo Cloud

Previous review

Status: No Issues Found | Recommendation: Merge

Executive Summary

The incremental change resolves the previously flagged Android toast occlusion: AppToaster now feeds the keyboard height through resolveKeyboardBottomPadding, so Android adds the bottom inset and iOS passes its height through. No new issues were found in the changed code.

Files Reviewed (4 files)
  • apps/mobile/src/components/app-root-providers.toaster-a11y.mounted.test.tsx
  • apps/mobile/src/components/app-root-providers.tsx
  • apps/mobile/src/lib/toast-offset.test.ts
  • apps/mobile/src/lib/toast-offset.ts

Previous review (commit 377116e)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
apps/mobile/src/lib/toast-offset.ts 54 The keyboard branch computes keyboardHeight + TOAST_BOTTOM_GAP without the Android navigation-bar inset, so a toast raised while the IME is open can still sit behind the IME navigation row on Android.
Files Reviewed (21 files)
  • apps/mobile/src/components/app-root-providers.toaster-a11y.mounted.test.tsx
  • apps/mobile/src/components/app-root-providers.tsx
  • apps/mobile/src/components/app-unlock-screen.mounted.test.tsx
  • apps/mobile/src/components/app-unlock-screen.test-helpers.tsx
  • apps/mobile/src/components/code-reviewer/manual-review-screen.tsx
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding-state.test.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding-state.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.test.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx
  • apps/mobile/src/components/kilo-chat/use-reveal-end-on-keyboard.test.ts
  • apps/mobile/src/components/kilo-chat/use-reveal-end-on-keyboard.ts
  • apps/mobile/src/components/login-screen-state.ts
  • apps/mobile/src/components/login-screen.test.ts
  • apps/mobile/src/components/login-screen.tsx
  • apps/mobile/src/components/tab-screen.tsx
  • apps/mobile/src/lib/case-guard.test.ts
  • apps/mobile/src/lib/toast-offset.test.ts
  • apps/mobile/src/lib/toast-offset.ts - 1 issue
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.ts
  • apps/web/src/routers/code-reviews-router.test.ts

Fix these issues in Kilo Cloud

Previous review (commit bf775eb)

Status: 2 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/login-screen.tsx 159 The app-state listener now runs on iOS and collapses keyboard padding on transient inactive, which can leave the form under a still-visible keyboard.
apps/mobile/src/components/app-unlock-screen.test-helpers.tsx 111 Mocked Keyboard.addListener stores one listener per direction and remove() clears both, so multiple keyboard consumers (now including AppToaster) are not modelled.
Files Reviewed (20 files)
  • apps/mobile/src/components/app-root-providers.toaster-a11y.mounted.test.tsx
  • apps/mobile/src/components/app-root-providers.tsx
  • apps/mobile/src/components/app-unlock-screen.mounted.test.tsx
  • apps/mobile/src/components/app-unlock-screen.test-helpers.tsx - 1 issue
  • apps/mobile/src/components/code-reviewer/manual-review-screen.tsx
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding-state.test.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding-state.ts
  • apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx
  • apps/mobile/src/components/kilo-chat/use-reveal-end-on-keyboard.test.ts
  • apps/mobile/src/components/kilo-chat/use-reveal-end-on-keyboard.ts
  • apps/mobile/src/components/login-screen-state.ts
  • apps/mobile/src/components/login-screen.test.ts
  • apps/mobile/src/components/login-screen.tsx - 1 issue
  • apps/mobile/src/components/tab-screen.tsx
  • apps/mobile/src/lib/case-guard.test.ts
  • apps/mobile/src/lib/toast-offset.test.ts
  • apps/mobile/src/lib/toast-offset.ts
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts
  • apps/web/src/lib/code-reviews/manual-code-review-jobs.ts
  • apps/web/src/routers/code-reviews-router.test.ts

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 marked this pull request as draft September 20, 2026 04:07
@iscekic
iscekic force-pushed the kwf/explorer-restore-tests-duplicate-prs-carried-c0v3r1-b72b branch from bf775eb to 377116e Compare September 20, 2026 05:32
@iscekic

iscekic commented Sep 20, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Rejected, no code change (kwf kwf-fix-platform-6eed).

Why: (already implemented, verified live: no change needed: Refuted the platform-fork finding: the two flagged lines are imports of cross-platform libraries the app already uses on both platforms, the toaster path is one platform-free implementation, and the only per-platform branches are the capability-named ones the task permits. No code

@iscekic
iscekic marked this pull request as ready for review September 20, 2026 06:12
Comment thread apps/mobile/src/lib/toast-offset.ts
@iscekic
iscekic marked this pull request as draft September 20, 2026 06:29
@iscekic
iscekic force-pushed the kwf/explorer-restore-tests-duplicate-prs-carried-c0v3r1-b72b branch from 377116e to 8475249 Compare September 20, 2026 07:10
@iscekic
iscekic marked this pull request as ready for review September 20, 2026 07:29
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 20, 2026
@iscekic iscekic self-assigned this Sep 20, 2026
@iscekic
iscekic force-pushed the kwf/explorer-restore-tests-duplicate-prs-carried-c0v3r1-b72b branch from 8475249 to 2543d3d Compare September 20, 2026 18:16
Comment thread apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx Outdated
Comment thread apps/mobile/src/components/kilo-chat/app-aware-keyboard-padding.tsx Outdated
Comment thread apps/web/src/lib/code-reviews/manual-code-review-jobs.test.ts
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.

1 participant