Repository navigation
fix(mobile): show and control review memory state in the app - #8253
Conversation
The review memory screen now renders an enabled-state row above the proposals: it states that review memory is on and exposes the same on/off control as the web panel, calling useSetReviewMemoryEnabled with the next value. The row reflects the stored value as soon as the mutation settles, stays visible above the proposals list, the empty state and the load error, and renders inert with the permission explanation for a reader who cannot edit. Adds the codeReviewer.reviewMemory.on copy key and its translations for every catalog.
|
bot: Android emulator proof for the review memory control, exercised through Profile > Code Reviewer > GitHub > Review memory on the local dev stack with a throwaway test account.
The same run's UI dump reported |
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe follow-up commit makes the summary query the single source of truth by writing the settled mutation value into its cache, adds tab-bar clearance to the proposals list, and covers the new toggle row and hook with tests; the previously reported findings are resolved and no new problems were found in the changed lines. Files Reviewed (91 files)
Previous Review Summary (commit 6c9d7f9)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 6c9d7f9)Status: 5 Issues Found | Recommendation: Address before merge Executive SummaryThe new proposals list viewport now extends under the absolutely positioned tab bar, hiding the last row and pagination footer, and the toggle's mutation value permanently overrides fresher summary state. Overview
Issue Details (click to expand)WARNING
SUGGESTION
Files Reviewed (89 files)
Reviewed by deepseek-v4.1-flash-1017 · Input: 84.2K · Output: 19.2K · Cached: 1.6M Review guidance: REVIEW.md from base branch |
- The on-state row exposes a single switch role over the label, so a tap anywhere on the row moves the value, and the native switch stays out of the accessibility tree — the shape PreferenceRow already uses. - The proposals list reserves the tab bar band so the last row scrolls clear of it. - The settled mutation writes the stored value into the cached dashboard summary, so the screen keeps one source and the refetch replaces it instead of a value that outlives the request. - The read-only copy now covers changing the setting in either direction, with every catalog updated.
|
bot: Updated Android emulator proof after the review fixes, on the final head, through Profile > Code Reviewer > GitHub > Review memory with a throwaway test account.
The same run's UI dump exposes one switch node for the row, Checks on this VM: catalog parity across 87 catalogs, |
…nabled-control # Conflicts: # apps/mobile/src/i18n/locales/de.json # apps/mobile/src/i18n/locales/sv.json
…nabled-control # Conflicts: # apps/mobile/src/components/code-reviewer/review-memory-screen.tsx
|
bot: Android emulator proof on the merged head, exercised through Profile > Code Reviewer > GitHub > Review memory on the local dev stack with a throwaway test account.
The  |








Change
apps/mobile/src/components/code-reviewer/review-memory-screen.tsxgrows an enabled-state row above the proposals body. It states that review memory is on and offers the same on/off control as the web review memory panel, callinguseSetReviewMemoryEnabled(scope)with the next value.PressablewithaccessibilityRole="switch", the checked/disabled/busy state,min-h-11andflex-1, while the nativeSwitchstays out of the accessibility tree — the shapePreferenceRowuses (apps/mobile/src/components/ui/preference-row.tsx). A tap anywhere on the row moves the value. A reader who cannot edit sees the same row inert, plus the existingcodeReviewer.reviewMemory.readOnlyDescriptionline.useTabBarBottomPaddingfrom@/components/tab-screenas a footer spacer, the shared helper the other tab screens use.useSetReviewMemoryEnablednow writes the stored value into the cached dashboard summary on success and then invalidates that query, so a settled toggle shows immediately, the screen keeps one source, and the refetch replaces the value.Copy: one new key,
codeReviewer.reviewMemory.on("Review memory is on"), translated into all 86 non-English catalogs;codeReviewer.reviewMemory.readOnlyDescriptionbecomes "Only organization owners and billing managers can change review memory.", re-translated everywhere.Tests:
review-memory-screen.mounted.test.tsxcovers the row above the empty proposals state (asserting the order), the row press calling the mutation withfalse, the row disabled while the mutation is pending, the read-only variant and its copy, and the tab-bar clearance spacer's height.use-review-memory.test.tscovers the settled cache write, the invalidation, and the error announcement.End-to-end evidence
Android emulator (
omp36, cached CI dev client) against the local dev stack, signed in with a throwaway local test account:checked="true", spanning the label-and-switch row, with the empty proposals state below it.Checks run on this VM: catalog parity (87 catalogs match
en.json),check:i18n,check:plurals,pnpm --filter kilo-app exec vitest run src/components/code-reviewer src/lib/hooks/use-review-memory.test.ts(12 files, 196 tests),pnpm --filter kilo-app run typecheck(clean),pnpm --filter kilo-app run lint(clean),format:check(clean).mainwas merged into the branch twice. The conflicts were the two locale catalogs that had also gained translation fixes onmain, and the screen's tab-bar clearance line, wheremain's shareduseTabBarBottomPaddinghelper replaced the per-screen height computation; the branch takesmain's helper, so the screen keeps one clearance mechanism, and the mounted test asserts the spacer height it feeds.The change is ordinary JSX with a
Switch: noPlatform.OS-specific behavior beyond the shared tab-bar height helper, no keyboard, safe-area, or text-truncation behavior, so Android proof covers it.Proxy answers
The owner's proxy gave these answers in the owner's place.
Answer: Switch row
Confidence: 0.85 · Precedent: UX: keep similar elements consistent across surfaces — an earlier request was that a thought row should "match the tool call row".
Answer: Above the body, always visible
Confidence: 0.85 · Precedent: Plans cover happy, loading, error, and empty states; the brief requires the control to stay reachable.
Answer: Disabled switch + existing read-only copy
Confidence: 0.85 · Precedent: none
Answer: Mutation result overrides summary
Confidence: 0.70 · Precedent: UX best-in-class, no visible lag or layout shift — "design and UX MUST BE BEST-IN-CLASS".
Answer: One key
Confidence: 0.65 · Precedent: Remove redundant copy — the owner asked to remove redundant "context" copy once before.