Repository navigation
fix(mobile): name admins in organization permission notices - #8165
Conversation
|
bot: Verified on the Android emulator (
Both captures show only the affected settings screen; no account or organization data is visible. |
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe follow-up commit resolves all four prior findings: the Polish and Malagasy GitHub notices now name only owners and admins, the GitLab notice is actionable for read-only viewers (with the selector extracted so the mounted test exercises the real function), and the provider-table test asserts the concrete GitLab copy. The 87 catalogs all parse, carry Overview
Files Reviewed (91 files)
Notes: copy-only change; the new selector holds no state, so there is no memory-leak surface. All 87 catalogs parse and contain both Previous Review Summary (commit b36b26c)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit b36b26c)Status: 4 Issues Found | Recommendation: Address before merge Executive SummaryTwo locale catalogs (Polish, Malagasy) still name billing managers in the GitHub connect notice, and the new GitLab notice tells read-only members to connect while the screen hides the connect card. Overview
Issue Details (click to expand)WARNING
SUGGESTION
Files Reviewed (93 files)
Notes: copy-only change, no memory-leak surface. Server gates verified for the role claims ( Reviewed by deepseek-v4.1-flash-1017 · Input: 52.5K · Output: 7.6K · Cached: 763.9K Review guidance: REVIEW.md from base branch |
…ission-copy # Conflicts: # apps/mobile/src/components/code-reviewer/review-memory-screen.mounted.test.tsx # apps/mobile/src/i18n/locales/af.json # apps/mobile/src/i18n/locales/am.json # apps/mobile/src/i18n/locales/ar.json # apps/mobile/src/i18n/locales/az.json # apps/mobile/src/i18n/locales/be.json # apps/mobile/src/i18n/locales/bg.json # apps/mobile/src/i18n/locales/bn.json # apps/mobile/src/i18n/locales/bs.json # apps/mobile/src/i18n/locales/ca.json # apps/mobile/src/i18n/locales/ckb.json # apps/mobile/src/i18n/locales/cs.json # apps/mobile/src/i18n/locales/cy.json # apps/mobile/src/i18n/locales/da.json # apps/mobile/src/i18n/locales/de.json # apps/mobile/src/i18n/locales/el.json # apps/mobile/src/i18n/locales/en.json # apps/mobile/src/i18n/locales/es.json # apps/mobile/src/i18n/locales/et.json # apps/mobile/src/i18n/locales/eu.json # apps/mobile/src/i18n/locales/fa.json # apps/mobile/src/i18n/locales/fi.json # apps/mobile/src/i18n/locales/fil.json # apps/mobile/src/i18n/locales/fr.json # apps/mobile/src/i18n/locales/ga.json # apps/mobile/src/i18n/locales/gl.json # apps/mobile/src/i18n/locales/gu.json # apps/mobile/src/i18n/locales/ha.json # apps/mobile/src/i18n/locales/he.json # apps/mobile/src/i18n/locales/hi.json # apps/mobile/src/i18n/locales/hr.json # apps/mobile/src/i18n/locales/ht.json # apps/mobile/src/i18n/locales/hu.json # apps/mobile/src/i18n/locales/hy.json # apps/mobile/src/i18n/locales/id.json # apps/mobile/src/i18n/locales/ig.json # apps/mobile/src/i18n/locales/is.json # apps/mobile/src/i18n/locales/it.json # apps/mobile/src/i18n/locales/ja.json # apps/mobile/src/i18n/locales/ka.json # apps/mobile/src/i18n/locales/kk.json # apps/mobile/src/i18n/locales/km.json # apps/mobile/src/i18n/locales/kn.json # apps/mobile/src/i18n/locales/ko.json # apps/mobile/src/i18n/locales/lo.json # apps/mobile/src/i18n/locales/lt.json # apps/mobile/src/i18n/locales/lv.json # apps/mobile/src/i18n/locales/mg.json # apps/mobile/src/i18n/locales/mi.json # apps/mobile/src/i18n/locales/mk.json # apps/mobile/src/i18n/locales/ml.json # apps/mobile/src/i18n/locales/mn.json # apps/mobile/src/i18n/locales/mr.json # apps/mobile/src/i18n/locales/ms.json # apps/mobile/src/i18n/locales/mt.json # apps/mobile/src/i18n/locales/my.json # apps/mobile/src/i18n/locales/nb.json # apps/mobile/src/i18n/locales/ne.json # apps/mobile/src/i18n/locales/nl.json # apps/mobile/src/i18n/locales/om.json # apps/mobile/src/i18n/locales/or.json # apps/mobile/src/i18n/locales/pa.json # apps/mobile/src/i18n/locales/pl.json # apps/mobile/src/i18n/locales/ps.json # apps/mobile/src/i18n/locales/pt-BR.json # apps/mobile/src/i18n/locales/pt.json # apps/mobile/src/i18n/locales/ro.json # apps/mobile/src/i18n/locales/ru.json # apps/mobile/src/i18n/locales/si.json # apps/mobile/src/i18n/locales/sk.json # apps/mobile/src/i18n/locales/sl.json # apps/mobile/src/i18n/locales/so.json # apps/mobile/src/i18n/locales/sq.json # apps/mobile/src/i18n/locales/sr.json # apps/mobile/src/i18n/locales/sv.json # apps/mobile/src/i18n/locales/sw.json # apps/mobile/src/i18n/locales/ta.json # apps/mobile/src/i18n/locales/te.json # apps/mobile/src/i18n/locales/th.json # apps/mobile/src/i18n/locales/tr.json # apps/mobile/src/i18n/locales/uk.json # apps/mobile/src/i18n/locales/ur.json # apps/mobile/src/i18n/locales/uz.json # apps/mobile/src/i18n/locales/vi.json # apps/mobile/src/i18n/locales/yo.json # apps/mobile/src/i18n/locales/zh-Hans.json # apps/mobile/src/i18n/locales/zh-Hant.json # apps/mobile/src/i18n/locales/zu.json


Summary
Organization
adminholds the same authority as an owner on every surface inpackages/app-shared/src/organizations/roles.ts(ORGANIZATION_BILLING_ROLES, andORGANIZATION_MANAGE_ROLESfor GitHub installs), but the mobile permission notices named only "organization owners and billing managers". This change names admins wherever the server accepts them, and makes each connect notice match its provider's real gate.ORGANIZATION_BILLING_ROLES).ORGANIZATION_MANAGE_ROLES).codeReviewer.gitlab.notConnectedReadOnly: asks an organization owner, admin, or billing manager to connect it, without claiming exclusive access, because GitLab's first connect route admits any member and reconnect admits billing roles. The screen picks it for the GitLab platform.organizations.bitbucket.connectisorganizationBillingProcedure).Server gates
securityAgent.sla.permissionNoteorganizationBillingProcedure/…MutationProceduresecurityAgent.settingsOverview.disabledNoManagecanManageSecurityAgent→canManageOrganizationBillingsecurityAgent.dismiss.cannotDismissDescriptionorganizationBillingMutationProcedure(dismissFinding)securityAgent.auditReport.unavailableDescriptionorganizationBillingProcedure(getAuditReport)codeReviewer.reviewMemory.readOnlyDescriptionreviewMemory.setEnabled→ORGANIZATION_BILLING_ROLEScodeReviewer.notConnectedReadOnly(GitHub)ORGANIZATION_MANAGE_ROLEScodeReviewer.gitlab.notConnectedReadOnly(new)codeReviewer.bitbucket.notConnectedReadOnlyorganizations.bitbucket.connect→organizationBillingProcedureorganization.members.emptyDescriptionCannotInviteisMoneyRole=canManageOrganizationBillingVerification
pnpm --filter kilo-app check:i18n→check-catalogs: 87 languages, every catalog matches en.jsonnode tools/i18n/check-plurals.mjs→ every counted message and locale declares its plural categoriespnpm --filter kilo-app exec vitest run src/i18n src/components/security-agent src/components/code-reviewer src/components/organization→ 56 files, 2151 tests passedpnpm --filter kilo-app run typecheck,pnpm --filter kilo-app run lint,pnpm --filter kilo-app format:check→ cleanchangeLanguage('hi')rendered the settings notice containing "एडमिन" for admins and bound{{platform}}in both connect strings; English and Hindi resolved every changed key with no placeholder left unbound.omp36, dev client from themobile-native-androidartifact) against the local dev stack, signed in with an owned fake account whose organization membership role ismember:Proxy answers
The owner's proxy gave these answers in the owner's place.
Answer: Full iOS proof path (Recommended)
Confidence: 0.75 · Precedent: Proof and verification: valid e2e proof is required on every PR (session 55c9c80332a7, "logs and/or screenshots are mandatory proof"). An iOS lane opens only when it is asked for (session 2f71af3a787e, "iOS lane must specifically be asked for"), and this brief asks for iOS.
Answer: Name only owners and admins on connect strings
Confidence: 0.60 · Precedent: Autonomy: if you see a gap or an error, fix it (session 89824a222897, "if you saw a gap, fix it"). Also fix the class, not the symptom (session 00eb2a1d3e4b). The copy should match the actual server check.
Answer: Yes, add admin there too (Recommended)
Confidence: 0.85 · Precedent: Fix the class of the issue on every affected surface (session 75f8833fe8c1, "fix this for all ... on all surfaces").
Answer: Split per provider
Confidence: 0.55 · Precedent: Fix the root cause and the class of the issue on every affected surface (session 00eb2a1d3e4b: "fix the class"). The earlier owners-and-admins answer predates the per-provider server facts. Each string should match its server check.
Answer: Include it
Confidence: 0.85 · Precedent: If you see a gap or an error, fix it (session 89824a222897: "if you saw a gap, fix it"). It is the same false-copy class and the same role authority.
Answer: Android emulator + runtime i18n smoke
Confidence: 0.60 · Precedent: Use Android on the work VM by default and open an iOS lane only when the agent asks for it (session 2f71af3a787e: "iOS lane must specifically be asked for by the agent, otherwise android is used on the vm"). The change is copy-only, and a refused lease call is wasted work.