Repository navigation
fix(mobile): use a platform neutral session follow label - #8478
Conversation
The session Follow control is mounted on both iOS and Android, and the card it starts is a Live Activity on iOS but an ongoing notification on Android. Its two accessibility labels and its refusal toast named the Lock Screen, so the Android control described a surface it does not have. Name the action instead of the surface: Follow session, Unfollow session, and a refusal toast that says it could not follow the session. Every translated catalog carries the same three values, so the neutral wording reaches each language rather than only English.
|
bot: Android proof for the session Follow control's new label, exercised on the local dev stack with a seeded working session. The label is an accessibility label, not drawn text, so the control's App language English:
App language Khmer, same session:
Not exercised: the refusal toast's on-screen rendering. The control is only drawn while the notification permission is granted, and the follow action refuses for exactly the conditions that hide it, so the toast is unreachable from the running screen. The toast reads the same changed key, and the language smoke asserts the new value resolves in all 87 languages. |
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit Assumptions: Files Reviewed (1 file)
Previous Review Summaries (5 snapshots, latest commit 4cd714f)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 4cd714f)Status: 1 Issue Found | Recommendation: Address before merge Executive SummaryThe guard refinement in Assumptions: Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (88 files)
Fix these issues in Kilo Cloud Previous reviewStatus: 1 Issue Found | Recommendation: Address before merge Executive SummaryThe incremental commit only narrows the surface-name heuristic in Assumptions: Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (2 files)
Fix these issues in Kilo Cloud Previous review (commit e83f2dd)Status: 1 Issue Found | Recommendation: Address before merge Executive SummaryThe incremental change—the new Assumptions: Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (3 files)
Fix these issues in Kilo Cloud Previous review (commit 8ecad91)Status: 1 Issue Found | Recommendation: Address before merge Executive SummaryThe incremental fix in Assumptions: Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (2 files)
Fix these issues in Kilo Cloud Previous review (commit cdbc760)Status: 2 Issues Found | Recommendation: Address before merge Executive SummaryThe copy change correctly removes the iOS-only "Lock Screen" wording from the Follow control and its failure toast on both platforms; the only findings are a repo-policy deviation in hand-editing all 86 translated catalogs and one Odia spelling divergence. Assumptions: Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (87 files)All 87
Reviewed by deepseek-flash-latest · Input: 34.2K · Output: 5.8K · Cached: 309.9K Review guidance: REVIEW.md from base branch |
…copy The catalog spells the noun ସେସନ୍ everywhere else, so the three new values use the same spelling instead of a variant.
…l-session-follow-label # Conflicts: # apps/mobile/src/i18n/locales/fi.json
…l-session-follow-label # Conflicts: # apps/mobile/src/i18n/locales/km.json
…l-session-follow-label # Conflicts: # apps/mobile/src/i18n/locales/zh-Hans.json
|
bot: Re-ran the Android label check on the current head Environment: local dev stack,
Checks on this head: Not exercised: the refusal toast's visible rendering, which is unreachable on Android while the control is drawn, and iOS, since nothing in this change is iOS-specific. |
The Follow control is one component on both platforms, so its labels read the same on iOS and Android. Derive each catalog's name for the Lock Screen from the platform-specific twin sentences already in the catalogs, and fail when a follow label repeats it.
…es not share Dropping the words both notification sentences use keeps the derived term to the surface name itself, so a catalog that phrases the two sentences differently still guards against the follow labels repeating it.
|
bot: The carried-forward catalog note is answered in its thread and stays an owner decision: the proxy chose the whole-catalog slice over an English-only change, because an English-only edit leaves 86 languages still naming one platform's surface on the shared control. Nothing in this head changes that scope. The new guard addresses the translation-quality half that was raised with it. It does not hard-code translations; it derives each language's own name for the surface from the two platform twin sentences already in the catalog, so a reworded or renamed surface keeps working without a glossary. Checked both ways: no catalog trips it as it stands, and it flags every follow label the base branch carried before the change. On the residual gap in the review notes: when a language's surface noun also appears in the Android twin sentence, that word is dropped from the terms, but the whole derived fragment is always kept as a term and the labels never contain the fragment, so the check stays sound for the class it guards rather than for every possible synonym. Alternative wordings of the shared label remain a human review question, which is what the catalogs' review already covers. |
|
bot: Re-ran the Android label check on this head ( English, session screen: the follow control's accessibility label reads Khmer, same screen and session: Checks on this head: |
…nges The Translations section allowed only a mistranslation fix in a translated catalog, so changing the English copy that every catalog translates had no documented path. Name that second value-level case and keep the same constraints: key name, placeholders and surrounding entries stay, and the pull request says so.
|
bot: Re-ran the Android label check on this head after the documentation commit, so the proof covers the current head. Environment: local dev stack, English, session screen: the Follow control's accessibility label reads Khmer, same screen and session: the control read These labels are accessibility labels rather than drawn text, so the observation for each state is its The Translations section of |








Evidence
Evidence: demonstrated — ran the Android dev client at head
514823con this VM against the local dev stack with an owned fake account: the control's accessibility label readFollow sessionbefore the tap andUnfollow sessionafter it, the tap posted the session's ongoing notification, and in Khmer the same control readឈប់តាមដានវគ្គthenតាមដានវគ្គ, with no lock-screen wording in either state. The guard fails on the pre-fix catalog values and passes on this tree.Summary
The per-session Follow control (
apps/mobile/src/components/agents/session-follow-button.tsx) mounts the same control on iOS and Android. On iOS the card it starts is a Live Activity on the Lock Screen; on Android it is an ongoing notification. Its copy named the iOS surface on both platforms:agentChat.session.followagentChat.session.unfollowglanceable.followFailedThe labels are accessibility labels, so the surface name was the only thing a screen reader announced for a control whose Android result is a notification.
Platform.OSsplit: keys, placeholders, key order and call sites are unchanged.Sitzung,Relácia,Seanss,Seanca,វគ្គ,工作階段).mainreports exactly the three keys changed, no key added or removed.apps/mobile/AGENTS.mdTranslations section now records the second value-level case this change needed. A change to the meaning of the English copy, or to the surface it names, leaves every catalog's existing value describing the old meaning, so that value is updated in each catalog, using the catalog's own wording, with key names, placeholders and surrounding entries unchanged and the pull request saying so. The section previously named only a confirmed mistranslation as a value-level edit, which left this class of copy change without a documented path.notifications.liveActivitySubtitleandglanceable.activityKitDisabledBodyalready resolve on the iOS branch at their call site (components/notifications-screen.tsx:79-81).Guard against the same slip in new copy
apps/mobile/src/i18n/session-follow-copy.test.tskeeps the class closed. Each catalog already carries a deliberate pair of platform twins,notifications.liveActivitySubtitleandnotifications.liveUpdateSubtitle; whatever those two sentences do not share, minus the words they both use, is that language's name for the Lock Screen. The test derives those terms per catalog and fails when a follow label repeats one, so no glossary is needed and a catalog that renames the surface keeps the guard working. Measured both ways: it reports no term in any of the 87 catalogs as they stand, and it flags all 261 follow-label values thatmaincarried before this change.Base merge
mainrewrote several catalogs since the branch was cut and conflicted once, inzh-Hans.json. Resolved with this branch's two neutral values andmain's unrelatedcouldNotLoadedit; a per-catalog comparison against the pre-merge head shows the three keys unchanged in all 87 catalogs, so the merge took no part of the fix with it.Verification
Run on this VM against the local dev stack:
pnpm --filter kilo-app check:i18n— oxlint i18n config plus the catalog checker: 87 languages, every catalog matchesen.json, 0 warnings, 0 errors.pnpm --filter kilo-app check:plurals— every counted message and every locale declares its plural categories.pnpm --filter kilo-app format:check— no file differs.pnpm --filter kilo-app exec vitest run src/i18n— 18 files, 1790 tests pass, the new guard included.pnpm --filter kilo-app run typecheck— clean.compatibilityJSON: 'v4'andfallbackLng: 'en', then for all 87 languages assertedi18n.t(key, { returnDetails: true }).exactUsedKey === keyand that the resolved value equals the catalog value and differs from English, for all three keys. No language fell back to English.The list above ran on
4cd714fand CI re-ran the same check names on the current head514823c(mobile-test shards,i18n-leftover,format-check,typecheck,lint): 100 checks pass, none pending. The only commit between the two touchesapps/mobile/AGENTS.md, and the catalog, plural and formatting checkers do not read that file (oxfmtdoes not format Markdown).Android emulator, local dev stack, owned fake account on this VM, all of it on the current head
514823c:content-descreads Follow session (uiautomator dump, button bounds[725,190][851,316]).វគ្គ), with no lock-screen term anywhere.These labels are accessibility labels rather than drawn text, so each state's observation is its
content-descfrom the uiautomator dump; a screenshot of the control shows only the bell icon, so no image is attached for them.Not exercised: the refusal toast's visible rendering. On Android the control is only drawn while the notification permission is granted, and
followSessionrefuses for exactly the conditions that hide the control, so the toast is not reachable from the running screen. The toast reads the same changed key atsession-follow-button.tsx:102, and the smoke above proves the new value resolves in every language. iOS was not run: nothing in this change is iOS-specific, and the change is catalog values plus a unit guard.Production prerequisites
None.
Proxy answers
The owner's proxy gave these answers in the owner's place.
Answer: One neutral label on both platforms
Confidence: 0.80 · Precedent: Speed and least work: "do the least amount of work possible, with no drop in quality" (7f3470e0ba6f); the work item title asks for a platform-neutral label
Answer: Follow session / Unfollow session
Confidence: 0.60 · Precedent: UX and design quality: keep similar elements consistent across surfaces (a247f3c19b1e); matches the session screen's noun and the spec's Follow/Unfollow vocabulary
Answer: Include it
Confidence: 0.80 · Precedent: Autonomy: "fix class of issue" (7f3470e0ba6f) and "if you saw a gap, fix it" (89824a222897)
glanceable.followFailed(shown on both platforms when Follow is refused) must drop 'on the Lock Screen'. Which neutral English wording?Answer: Couldn't follow this session.
Confidence: 0.75 · Precedent: UX and design quality: remove redundant copy and keep similar elements consistent across surfaces (session a247f3c19b1e, "remove the redundant 'context' copy")
Answer: All 86 translated catalogs
Confidence: 0.88 · Precedent: Autonomy and decisions: fix the class of the issue on every affected surface (session 00eb2a1d3e4b, "if anything repeats the same mistake over and over again, fix the class"); UX: "the mobile app always must respect i18n" (session dcb3f9170164)
Answer: Add a guard test commit
Confidence: 0.65 · Precedent: Never accept blocked as an end state; fix the class: session 2f71af3a787e, "a work item must converge"; session 00eb2a1d3e4b, "if anything repeats the same mistake over and over again, fix the class"
apps/mobile/AGENTS.md:186says "Add and edit copy inen.jsononly. Never hand-edit another catalog". Because its summary still says "Recommendation: Address before merge", the drain readiness status stayspending: kilobot-not-ready(otherwise identical PRs showsuccess). Its stated facts are true, and the proxy already chose the whole-catalog slice over an English-only change. No catalog is reachable from English copy without editing the catalogs, so how should this converge?Answer: Document the existing exception in apps/mobile/AGENTS.md, then push
Confidence: 0.72 · Precedent: Keep
AGENTS.mdcurrent and terse (session 05f959cc4baa: "if any of the docs are stale, we should update them"); never accept blocked as an end state (session 2f71af3a787e: "a work item must converge")