Skip to content

fix(mobile): use a platform neutral session follow label - #8478

Merged
iscekic merged 8 commits into
mainfrom
drain/platform-neutral-session-follow-label
Oct 24, 2026
Merged

iscekic merged 8 commits into
mainfrom
drain/platform-neutral-session-follow-label

Conversation

@iscekic

@iscekic iscekic commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Evidence

Evidence: demonstrated — ran the Android dev client at head 514823c on this VM against the local dev stack with an owned fake account: the control's accessibility label read Follow session before the tap and Unfollow session after 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:

Key Before After
agentChat.session.follow Follow on Lock Screen Follow session
agentChat.session.unfollow Stop following on Lock Screen Unfollow session
glanceable.followFailed Couldn't show this agent on the Lock Screen. Couldn't follow this session.

The 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.

  • One neutral label on both platforms, no Platform.OS split: keys, placeholders, key order and call sites are unchanged.
  • All 86 translated catalogs carry a new translation of the same three keys, derived from each catalog's current value so verb, noun and register stay the locale's own. Each catalog's established noun for "session" was used (for example Sitzung, Relácia, Seanss, Seanca, វគ្គ, 工作階段).
  • Value-only change: a flattened diff of all 87 catalogs against main reports exactly the three keys changed, no key added or removed.
  • apps/mobile/AGENTS.md Translations 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.
  • Out of scope, unchanged: notifications.liveActivitySubtitle and glanceable.activityKitDisabledBody already 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.ts keeps the class closed. Each catalog already carries a deliberate pair of platform twins, notifications.liveActivitySubtitle and notifications.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 that main carried before this change.

Base merge

main rewrote several catalogs since the branch was cut and conflicted once, in zh-Hans.json. Resolved with this branch's two neutral values and main's unrelated couldNotLoad edit; 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 matches en.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.
  • The guard itself, both ways: with the catalogs of four locales staged back to their pre-fix values it fails on those four, and with the current catalogs it passes.
  • Throwaway runtime smoke (deleted before the commit): initialised the app's own i18next instance with compatibilityJSON: 'v4' and fallbackLng: 'en', then for all 87 languages asserted i18n.t(key, { returnDetails: true }).exactUsedKey === key and 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 4cd714f and CI re-ran the same check names on the current head 514823c (mobile-test shards, i18n-leftover, format-check, typecheck, lint): 100 checks pass, none pending. The only commit between the two touches apps/mobile/AGENTS.md, and the catalog, plural and formatting checkers do not read that file (oxfmt does not format Markdown).

Android emulator, local dev stack, owned fake account on this VM, all of it on the current head 514823c:

  1. Opened the session screen of a seeded working session. The Follow control's content-desc reads Follow session (uiautomator dump, button bounds [725,190][851,316]).
  2. Tapped it. The control now reads Unfollow session, and the platform posted the session's ongoing notification, which is the Android surface the old label miscalled a Lock Screen.
  3. Switched the app language to Khmer in Preferences → Account → Language and reopened the session: ឈប់តាមដានវគ្គ (unfollow), then after tapping, តាមដានវគ្គ (follow) — the catalog's own word for a session (វគ្គ), with no lock-screen term anywhere.

These labels are accessibility labels rather than drawn text, so each state's observation is its content-desc from 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 followSession refuses 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 at session-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.

  1. Question: Label approach: How should the Android follow control stop naming the Lock Screen?
    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
  2. Question: English wording: Which neutral English accessibility labels should replace 'Follow on Lock Screen' / 'Stop following on Lock Screen'?
    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
  3. Question: Failure toast: The same button's refusal toast (glanceable.followFailed: 'Couldn't show this agent on the Lock Screen.') is also shown on Android. Include it in this fix?
    Answer: Include it
    Confidence: 0.80 · Precedent: Autonomy: "fix class of issue" (7f3470e0ba6f) and "if you saw a gap, fix it" (89824a222897)
  4. Question: Toast copy: The refusal toast 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")
  5. Question: Catalog scope: How wide should the catalog update be? Every translated catalog currently carries the Lock Screen wording, so an English-only change leaves 86 locales still naming the iOS surface for the Android control.
    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)
  6. Question: Head review: This PR's head is a merge of main, and kilobot does not review merge-commit heads: its check suite for this head (and for the previous merge head, since 2026-10-22) stays queued with no run. CI is otherwise green, the review is APPROVED, and no threads are open. The host's end check wants a completed kilobot review of the head. How should I proceed?
    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"
  7. Question: Converge: PR fix(mobile): use a platform neutral session follow label #8478 is green and APPROVED with no open threads, but kilobot re-reports one SUGGESTION on every review: all 86 catalogs were hand-edited even though apps/mobile/AGENTS.md:186 says "Add and edit copy in en.json only. Never hand-edit another catalog". Because its summary still says "Recommendation: Address before merge", the drain readiness status stays pending: kilobot-not-ready (otherwise identical PRs show success). 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.md current 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")

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.
@iscekic iscekic added drain Work item from the findings drain janitor:i18n Janitor finding: mobile copy and catalog checks labels Oct 21, 2026
@iscekic

iscekic commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

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 content-desc from uiautomator dump is the observation; a screenshot cannot show it. No images are attached for that reason.

App language English:

  • Follow state: content-desc="Follow session" at bounds [767,212][851,296].
  • After tapping it: content-desc="Unfollow session", and the platform posted the session's ongoing notification (dumpsys notification: id=26662 tag=session, flags=ONGOING_EVENT|ONLY_ALERT_ONCE|SILENT). That notification is the Android surface the previous label described as a Lock Screen.

App language Khmer, same session:

  • Followed state: content-desc="ឈប់តាមដានវគ្គ" (unfollow session).
  • After tapping it: content-desc="តាមដានវគ្គ" (follow session), using the catalog's own word for a session (វគ្គ); no lock-screen term.

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.

Comment thread apps/mobile/src/i18n/locales/de.json
Comment thread apps/mobile/src/i18n/locales/or.json Outdated
@kilo-code-bot

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

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The incremental commit 514823c4 only rewrites the Translations exception in apps/mobile/AGENTS.md (11 added / 6 removed lines) so that a meaning or surface change to English copy has a documented path to update every catalog; the wording is internally consistent with the placeholder, key-name and parity-check rules stated in the same section, and the previously carried-forward hand-edited-catalog note is resolved because the guideline it cited now names this case.

Assumptions: [INFERENCE] check:i18n, check:plurals and the i18n vitest suite were not executed in this read-only session; the two script names referenced by the new bullet exist in apps/mobile/package.json. Catalog values were not re-audited: the incremental diff touches documentation only, so the 86 catalogs are outside this pass. The remaining policy question, whether bulk catalog edits should require a native-speaker or translator pass, is an owner decision the new text leaves open, not a defect in the changed lines.

Files Reviewed (1 file)
  • apps/mobile/AGENTS.md - no issues; the changed bullet keeps the key-name, placeholder-set and surrounding-entry constraints, retains the screen verification requirement for mistranslation fixes, and points at check:i18n / check:plurals for the new meaning-change case
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 Summary

The guard refinement in apps/mobile/src/i18n/session-follow-copy.test.ts adds no new defect; the only open item is the acknowledged deviation of hand-editing all 86 translated catalogs, which apps/mobile/AGENTS.md reserves for a confirmed single-value mistranslation.

Assumptions: [INFERENCE] check:i18n, check:plurals, format:check and the i18n vitest suite were not executed in this read-only session; verification relied on reading the diff, the catalogs, and the guard logic. Translation quality was checked for script, noun consistency, and residual surface wording, not native-speaker review. The new word filter can only shrink the derived term list (the whole fragment is always retained), so this delta cannot introduce a new false failure on the current catalogs; a surface noun that also appears in the Android twin sentence is dropped as a word term, which the retained fragment covers.

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/i18n/locales/de.json 1642 Carried forward: all 86 translated catalogs are hand-edited despite apps/mobile/AGENTS.md ("Add and edit copy in en.json only. Never hand-edit another catalog"), and check:i18n cannot catch translation-quality slips. The author replied that the whole-catalog slice is intentional and chosen by the owner's proxy, so this remains a reviewer note only; the existing inline thread is not duplicated.
Files Reviewed (88 files)
  • apps/mobile/src/i18n/session-follow-copy.test.ts (delta 9+/5-) - no issues; the added notificationsWords filter only removes word terms and keeps the derived fragment, and catalogValue/prefix/suffix derivation match the current catalog pairs
  • apps/mobile/src/i18n/locales/de.json - 1 carried-forward suggestion at line 1642
  • apps/mobile/src/i18n/locales/or.json - previous ସେଶନ୍ spelling finding resolved; no occurrences remain, ସେସନ୍ used throughout
  • the other 85 catalogs - no issues; exactly the three keys changed (261 added / 261 removed values), no key or placeholder edits, no English fallbacks, no residual lock-screen wording

Fix these issues in Kilo Cloud

Previous review

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

The incremental commit only narrows the surface-name heuristic in session-follow-copy.test.ts, and it introduces no new defect; the sole open item remains the carried-forward, author-acknowledged deviation of hand-editing all 86 translated catalogs.

Assumptions: [INFERENCE] pnpm check:i18n, check:plurals, and vitest run src/i18n were not executed in this read-only session. The new !notificationsWords.has(word) filter was evaluated by reading it against the sampled catalog pairs (en, de, fr, es, ja, ko, ar, hi, th, pl, cs, sk, ru, pt, it, nl, tr, vi, id); it can only drop single-word terms, never the whole fragment, which stays in the term list, so the guard cannot regress to a false negative on the observed data. One residual heuristic gap: if a locale's surface noun also appears in notifications.liveUpdateSubtitle, that word term is dropped, so a label repeating only that word would pass.

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/i18n/locales/de.json 1642 Carried forward: all 86 translated catalogs are hand-edited despite apps/mobile/AGENTS.md:174 ("Add and edit copy in en.json only. Never hand-edit another catalog"); check:i18n cannot catch translation-quality slips. The author replied that this slice is intentional and chosen by the owner's proxy, so this stays a reviewer note only.
Files Reviewed (2 files)
  • apps/mobile/src/i18n/session-follow-copy.test.ts (incremental, 9+/5-) - no new issues; word filter only weakens per-word terms while the full fragment term is always retained
  • apps/mobile/src/i18n/locales/de.json - targeted re-check of the carried finding; line 1642 still reads "follow": "Sitzung verfolgen" and the hand-edit deviation stands

Fix these issues in Kilo Cloud

Previous review (commit e83f2dd)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

The incremental change—the new session-follow-copy.test.ts guard plus the re-verified Odia fix—introduces no new defect; the only open item is the carried-forward deviation of hand-editing all 86 translated catalogs despite apps/mobile/AGENTS.md:174.

Assumptions: [INFERENCE] pnpm check:i18n, check:plurals, and vitest run src/i18n were not executed in this read-only session; the guard was evaluated by reading its logic against every catalog's notifications.liveActivitySubtitle/liveUpdateSubtitle pair. Its heuristic can miss a surface synonym or sub-4-character spelling variant (the class of slip the earlier Odia finding caught), and it asserts on a copy pair unrelated to the follow labels, so a legitimate edit to those notification sentences can fail it.

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/i18n/locales/de.json 1642 All 86 translated catalogs are hand-edited despite apps/mobile/AGENTS.md:174 ("Add and edit copy in en.json only. Never hand-edit another catalog"); check:i18n cannot catch translation-quality slips. The author replied that this slice is intentional and chosen by the owner's proxy, so the deviation remains a reviewer note only.
Files Reviewed (3 files)
  • apps/mobile/src/i18n/session-follow-copy.test.ts (new, 117 lines) - no issues; derivation, dedupe, and diff-safe assertions checked against all 87 catalogs
  • apps/mobile/src/i18n/locales/de.json - targeted re-check; 1 carried-forward suggestion at line 1642
  • apps/mobile/src/i18n/locales/or.json - targeted re-check after the main merge; ସେସନ୍ used consistently, 0 remaining ସେଶନ୍; previous finding resolved

Fix these issues in Kilo Cloud

Previous review (commit 8ecad91)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

The incremental fix in or.json is correct: the follow label, unfollow label and failure toast now all use the catalog's established ସେସନ୍, and no ସେଶନ୍ occurrences remain in the catalog. The only carried-forward item is the repo-policy deviation of hand-editing all 86 translated catalogs, which the author has declared intentional.

Assumptions: [INFERENCE] pnpm check:i18n was not executed in this read-only session; verification relied on diff inspection plus the checks reported in the PR. Translation quality was assessed for script, noun and residual surface wording consistency, not full native-speaker review of all 86 languages.

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/i18n/locales/de.json 1587 All 86 translated catalogs are hand-edited despite apps/mobile/AGENTS.md:174 ("Add and edit copy in en.json only. Never hand-edit another catalog"); check:i18n cannot catch translation-quality slips. The author replied that this slice is intentional and chosen by the owner's proxy, and de.json is unchanged, so the deviation still stands as a reviewer note.
Files Reviewed (2 files)
  • apps/mobile/src/i18n/locales/or.json - fix verified; previous Odia spelling finding resolved
  • apps/mobile/src/i18n/locales/de.json - targeted re-check; 1 carried-forward suggestion

Fix these issues in Kilo Cloud

Previous review (commit cdbc760)

Status: 2 Issues Found | Recommendation: Address before merge

Executive Summary

The 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: [INFERENCE] pnpm check:i18n was not executed in this read-only session; verification relied on diff inspection plus the checks reported in the PR. Translation quality was assessed for script, noun and residual surface wording consistency, not full native-speaker review of all 86 languages.

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/i18n/locales/de.json 1587 All 86 translated catalogs are hand-edited despite apps/mobile/AGENTS.md:174 ("Add and edit copy in en.json only. Never hand-edit another catalog"); check:i18n cannot catch translation-quality slips.
apps/mobile/src/i18n/locales/or.json 2102 New Odia copy uses ସେଶନ୍ while the catalog uses ସେସନ୍ in 112 other places (also lines 2103 and 3194), mixing two spellings of the same noun.
Files Reviewed (87 files)

All 87 apps/mobile/src/i18n/locales/*.json catalogs (en.json plus 86 translations), three value changes each: agentChat.session.follow, agentChat.session.unfollow, glanceable.followFailed.

  • apps/mobile/src/i18n/locales/de.json - 1 issue
  • apps/mobile/src/i18n/locales/or.json - 1 issue
  • the other 85 catalogs - no issues; no residual lock-screen wording, no English fallbacks, no key or placeholder changes

Reviewed by deepseek-flash-latest · Input: 34.2K · Output: 5.8K · Cached: 309.9K

Review guidance: REVIEW.md from base branch main

…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
@iscekic iscekic added merge:blocked Agent-owned readiness prerequisites remain unresolved; do not merge. merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head labels Oct 21, 2026
…l-session-follow-label

# Conflicts:
#	apps/mobile/src/i18n/locales/km.json
@iscekic iscekic added merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. and removed merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head labels Oct 22, 2026
…l-session-follow-label

# Conflicts:
#	apps/mobile/src/i18n/locales/zh-Hans.json
@iscekic iscekic removed merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head labels Oct 23, 2026
@iscekic

iscekic commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Re-ran the Android label check on the current head bb5c678 after merging main, which had rewritten several catalogs. The merge conflicted once, in zh-Hans.json: resolved with this branch's two neutral values and main's unrelated couldNotLoad edit; a per-catalog comparison against the pre-merge head shows the three keys unchanged in all 87 catalogs.

Environment: local dev stack, omp36 emulator, dev client installed from the native CI artifact, owned fake account, notification permission granted, one live session seeded for the run.

  • Session screen, English: the follow control's accessibility label reads Follow session (bounds [725,190][851,316]); after tapping it the same control reads Unfollow session.
  • That tap posted the session's ongoing notification, which is the Android surface this control starts (the dump lists it as an ongoing, silent, only-once-alert notification tagged session).
  • App language Khmer, same screen and same session: ឈប់តាមដានវគ្គ while followed, តាមដានវគ្គ after unfollowing, with no lock-screen term in either.

Checks on this head: check:i18n (87 languages, catalogs match en.json), check:plurals, format:check, and vitest run src/i18n (17 files, 1615 tests) pass.

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.

Session screen follow control in English

Same control after following in English

Same control in Khmer while followed

Same control in Khmer after unfollowing

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.
@iscekic

iscekic commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

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.

@iscekic

iscekic commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Re-ran the Android label check on this head (4cd714f) with Metro serving this worktree. Same local dev stack, omp36 emulator, dev client from the native CI artifact, owned fake account, one live session seeded for the run.

English, session screen: the follow control's accessibility label reads Follow session before the tap and Unfollow session after it, and that tap posts the session's ongoing notification (zero session notifications before, one after, ongoing and silent).

Khmer, same screen and session: ឈប់តាមដានវគ្គ while followed and តាមដានវគ្គ after unfollowing, with no lock-screen term in either.

Checks on this head: check:i18n, check:plurals, format:check, mobile typecheck, and vitest run src/i18n (18 files, 1790 tests) pass; the new guard fails when four catalogs are staged back to their pre-fix values and passes on this tree.

Session screen follow control in English

Same control after following in English

Same control in Khmer while followed

Same control in Khmer after unfollowing

@iscekic iscekic added merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. merge:blocked:judge-unavailable Risk assessment unavailable and removed merge:blocked:judge-unavailable Risk assessment unavailable merge:blocked Agent-owned readiness prerequisites remain unresolved; do not merge. labels Oct 23, 2026
…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.
@iscekic iscekic added merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. and removed merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head labels Oct 24, 2026
@iscekic

iscekic commented Oct 24, 2026

Copy link
Copy Markdown
Collaborator Author

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, omp36 emulator at its default text size and density, dev client from the native CI artifact, owned fake account signed in through the app's own sign-in flow, one seeded working session in the Agents tray.

English, session screen: the Follow control's accessibility label reads Follow session before the tap and Unfollow session after it (same bounds, [725,190][851,316]). That tap posted the session's ongoing notification (zero session notifications before, one after, ongoing and silent); the same control again read the neutral label with the card running.

Khmer, same screen and session: the control read ឈប់តាមដានវគ្គ while followed, then តាមដានវគ្គ after unfollowing, and the ongoing notification cleared. Neither state contains a lock-screen term.

These labels are accessibility labels rather than drawn text, so the observation for each state is its content-desc from the uiautomator dump; a screenshot of the control shows only the bell icon, so no image is attached.

The Translations section of apps/mobile/AGENTS.md now records the value-level catalog case this change needed, alongside the existing mistranslation case, so the documented process matches what shipped. CI on this head is green.

@iscekic
iscekic added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit 02992e9 Oct 24, 2026
106 checks passed
@iscekic
iscekic deleted the drain/platform-neutral-session-follow-label branch October 24, 2026 23:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

drain Work item from the findings drain janitor:i18n Janitor finding: mobile copy and catalog checks merge:bot Bot-owned review; merge when ready once readiness passes and a review approves.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants