fix(mobile): honor a session's organization on notification tap and default to an organization at login - #6611
Conversation
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe incremental review of the 7 files changed since Files Reviewed (7 files)
Verified Fixes
Previous Review Summaries (4 snapshots, latest commit 5fe7bdf)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 5fe7bdf)Status: No Issues Found | Recommendation: Merge Executive SummaryThe fallback full review of the 26 changed files at commit 5fe7bdf finds no new defects. The earlier circular-import and default-organization persistence findings are fixed at this HEAD, and the declined legacy explicit-Personal observation is unchanged. Files Reviewed (26 files)
Previous review (commit 61673b1)Status: No Issues Found | Recommendation: Merge Files Reviewed (27 files)
The previously reported circular import is resolved: Previous review (commit 0a88468)Status: 2 Issues Found | Recommendation: Address before merge Executive SummaryThe prior storage-persistence finding is fixed; the remaining observations are non-blocking: a newly introduced circular import between the organization provider and its query hook module, and the one-time migration of pre-existing explicit-Personal selections to the first organization. Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (26 files)
Fix these issues in Kilo Cloud Previous review (commit 5588aa8)Status: 1 Issue Found | Recommendation: Address before merge Overview
Issue Details (click to expand)WARNING
Files Reviewed (26 files)
Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
…efault to an organization at login #6611
cb5aa96 to
0a88468
Compare
…efault to an organization at login #6611
c824acd to
61673b1
Compare
|
kilo-review — independent audit of the published diff. Status: 3 Issues
|
|
bot: Accepted. Pushed 8eb093e (kwf What changed:
|
…efault to an organization at login #6611
e9380a0 to
5fe7bdf
Compare
… fails The restore path read the organization key and the Personal marker with one `Promise.all`, so a marker-read rejection discarded a readable saved organization: the restore reported an error and left the provider unresolved. The organization key is now read on its own, since it stands alone, and the marker is only consulted when no organization is stored. A marker failure with nothing stored stays the existing restore error. #6611
…hat captured it A session notification stashed its destination as an ordinary notification, so a record captured before the account settled stayed account-independent: it could later restore (or survive a sign-in) for a different account and switch the app to the session's organization, which the pending-slot consumer applies without a membership check. Session destinations now carry the slot's existing `sessionBound` identity binding, so a capture with no account identity is dropped and a record bound to one account never restores for another. The organization still rides along for the account that owns the session. #6611
…4554) ## Automated docs sync — 2026-09-25 This PR keeps kilo.ai/docs in sync with features merged to [Kilo-Org/cloud](https://github.com/Kilo-Org/cloud) and [Kilo-Org/kilocode](https://github.com/Kilo-Org/kilocode). Every change below links to the merged PR it documents. - Window: `2026-09-24T07:08:33.639Z` → `2026-09-25T07:05:29.302Z` - Verification (docs build + tests): **passing** ### Surface: `cloud-mobile` - Assignees / requested reviewers: @iscekic and @eshurakov - Derivation: Derived from the repository layout. A product surface is a package under packages/ that ships a distinct client, plugin, backend, or hosted service: cli = packages/opencode/ + packages/tui/ + packages/server/ + packages/sdk/ + packages/plugin/; vscode = packages/kilo-vscode/ + packages/kilo-web-ui/ + packages/kilo-ui/; jetbrains = packages/kilo-jetbrains/; gateway = packages/kilo-gateway/; web = packages/kilo-console/ + packages/kilo-indexing/ + packages/kilo-memory/ + packages/kilo-sandbox/. Docs route from the IA tree packages/kilo-docs/pages/ plus docs/jetbrains-vscode-settings-parity.md: each surface lists the pages sections that document it, and the per-platform pages under packages/kilo-docs/pages/code-with-ai/platforms/ map to the matching extension surface (the vscode/ directory to vscode, jetbrains.md to jetbrains). A doc path belongs to the surface with the longest matching prefix; a path that matches none of those prefixes falls to `other` (the explicit other prefixes are listed under other.docs). The cloud surfaces are derived the same way from the Kilo-Org/cloud layout: cloud-mobile = apps/mobile/, cloud-web = apps/web/, cloud-extension = apps/extension/, and cloud-agent = the cloud-agent packages under packages/ (packages/cloud-agent-sdk/ + packages/cloud-agent-profile/). A cloud source names its repository while a bare string still means this repository. The pages under packages/kilo-docs/pages/collaborate/ document the cloud web app (app.kilo.ai: teams dashboard, billing, SSO, adoption dashboard), so they route to cloud-web. No page under packages/kilo-docs/pages/ documents the browser side-panel extension yet, so cloud-extension lists no docs prefix. - Map: `.github/docs-sync/surfaces.json` - Surface map: `cli`, `vscode`, `jetbrains`, `gateway`, `web`, `cloud-mobile`, `cloud-web`, `cloud-extension`, `cloud-agent`, `other` - Source prefixes: `apps/mobile/` (Kilo-Org/cloud) - Doc prefixes: `packages/kilo-docs/pages/code-with-ai/platforms/mobile.md` - Paths that fall to `other`: `packages/kilo-docs/pages/community/`, `packages/kilo-docs/pages/kiloclaw/`, `packages/kilo-docs/pages/contributing/`, `packages/kilo-docs/LEARNINGS.md`, `docs/` - Reviewers are ranked from `Kilo-Org/cloud`; the workflow needs a token with `contents: read` on that repository (repository secret `CROSS_REPO_ACCESS_TOKEN`, exposed to the upsert step as `CLOUD_REPO_TOKEN`). - How the two were computed: Reviewers for `cloud-mobile` are ranked from `Kilo-Org/cloud` git history over `apps/mobile/` (a commit 180 days old counts half as much, half-life 180 days). Bots (author type "Bot" or a login matching /\[bot\]$/i) and people without admin, write, or maintain permission are excluded. ### Changes <!-- docs-sync:changes:start --> | Docs change | Source | | --- | --- | | updated pages/code-with-ai/platforms/mobile.md | [Kilo-Org/cloud#6386](Kilo-Org/cloud#6386) | | updated pages/ai-providers/openai-chatgpt-plus-pro.md | [Kilo-Org/cloud#6702](Kilo-Org/cloud#6702) | | updated pages/code-with-ai/platforms/cloud-agent.md | [Kilo-Org/cloud#6683](Kilo-Org/cloud#6683) | | updated pages/getting-started/byok.md | [Kilo-Org/cloud#6692](Kilo-Org/cloud#6692) | <!-- docs-sync:changes:end --> ### Pending — will retry <!-- docs-sync:pending:start --> _None._ <!-- docs-sync:pending:end --> ### Considered, no docs change needed <!-- docs-sync:skipped:start --> | PR | Reason | | --- | --- | | [Kilo-Org/cloud#6658](Kilo-Org/cloud#6658) | Internal sandbox lifecycle fix with no user-visible workflow or setting. | | [Kilo-Org/cloud#6673](Kilo-Org/cloud#6673) | Internal container CA trust plumbing, no user-facing behavior. | | [Kilo-Org/cloud#6672](Kilo-Org/cloud#6672) | Internal sandbox launch/recovery fix with no documented workflow change. | | [Kilo-Org/cloud#6660](Kilo-Org/cloud#6660) | Internal cloud-agent queue delivery fix; no new command, setting, or workflow for users. | | [Kilo-Org/cloud#6226](Kilo-Org/cloud#6226) | Internal gateway alias-routing change, not user-visible. | | [#14490](#14490) | Tool-call animation and streaming UI polish; users do not need to learn a new workflow. | | [#14530](#14530) | Bug fix restoring intended worktree-pool behavior, no doc change needed. | | [#14529](#14529) | Bug fix restoring tab/panel state across project switches. | | [#14531](#14531) | Reconnect recovery bug fix, restores already-documented behavior. | | [#14532](#14532) | Bug fix keeping session tab title in sync on rename. | | [Kilo-Org/cloud#6088](Kilo-Org/cloud#6088) | Removes internal/admin model-experiment surfaces, not public product docs. | | [Kilo-Org/cloud#6682](Kilo-Org/cloud#6682) | Internal control-socket reconnect race fix, no user-facing change. | | [#14534](#14534) | Transcript re-render performance bug fix. | | [#14535](#14535) | Bug fix preserving the loaded browser page across context switches. | | [Kilo-Org/cloud#6684](Kilo-Org/cloud#6684) | Reverted by Kilo-Org/cloud#6685. | | [Kilo-Org/cloud#6678](Kilo-Org/cloud#6678) | Dead-code constant removal, no user-visible effect. | | [Kilo-Org/cloud#6687](Kilo-Org/cloud#6687) | Removes internal model-experiment maintenance and retains tables, no user-facing change. | | [#14515](#14515) | JetBrains plugin unload crash fix, no documented behavior change. | | [#14520](#14520) | JetBrains transcript/list rendering performance work. | | [Kilo-Org/cloud#6614](Kilo-Org/cloud#6614) | Mobile PR Review header and session title bug fix, no doc change needed. | | [Kilo-Org/cloud#6625](Kilo-Org/cloud#6625) | Internal mobile secure-store error-handling refactor. | | [Kilo-Org/cloud#6624](Kilo-Org/cloud#6624) | Mobile auth bug fix that stops a retry loop; restores expected sign-in behavior with no new setting or workflow. | | [#14310](#14310) | Contributor/CI fix making the kilo-v2 checkout installable; not user-visible product behavior. | | [Kilo-Org/cloud#6611](Kilo-Org/cloud#6611) | Mobile notification-tap fix that selects the session's organization; restores correct behavior rather than adding a learnable feature. | | [Kilo-Org/cloud#6644](Kilo-Org/cloud#6644) | Mobile sign-in layout/alignment polish; no change to what a user must do. | | [Kilo-Org/cloud#6601](Kilo-Org/cloud#6601) | Mobile layout fix keeping empty states clear of the tab bar; purely visual. | | [#14543](#14543) | CI/release infrastructure adding Windows binary code signing; no public docs impact. | | [Kilo-Org/cloud#6616](Kilo-Org/cloud#6616) | Mobile visual defect fixes and a session-title fallback; no new user workflow or setting. | | [Kilo-Org/cloud#6630](Kilo-Org/cloud#6630) | Reports an edge-case partial worktree restore; failure-path plumbing with no new user-facing workflow, target setting, or config. | | [Kilo-Org/cloud#6699](Kilo-Org/cloud#6699) | Cloud Agent e2e stabilization plus internal idle-sandbox capacity handling; not user-visible. | | [#14545](#14545) | Automated JetBrains release/changelog PR; underlying user-facing changes are triaged from their own PRs. | | [Kilo-Org/cloud#6708](Kilo-Org/cloud#6708) | Internal AI-gateway request-logging policy change in the admin panel; no existing public docs surface and no change to how users run Kilo Code. | | [#14533](#14533) | Documentation already shipped with the merged PR. The experimental.task_model_selection flag is gone from the current source, and pages/code-with-ai/agents/model-selection.md, pages/code-with-ai/agents/context-mentions.md, and pages/getting-started/settings/index.md already describe per-task selection as default-on with no stale experiment references. | | [#14510](#14510) | Documentation already shipped with the merged PR. Marketplace companion-skill support is present in the current source (packages/opencode/src/kilocode/marketplace/companions.ts and installer), and pages/customize/marketplace.md already documents installing, publishing, and removing MCP servers with companion skills. | <!-- docs-sync:skipped:end --> --- (bot) Generated by the docs-sync workflow. Humans review and merge; while this PR stays open, the next daily run appends new changes here. Branch: `docs/auto-sync-2026-09-25`. <!-- docs-sync: processed-through 2026-09-25T07:05:29.302Z -->
Changelog for users
Changelog for maintainers
apps/mobile/src/lib/organization-context.tsx:146— accepted: a paused (offline) organizations list never fetches, so waiting on it leftisLoadedfalse forever; the provider now settles on Personal and stays usable, keeps the default fence armed, and applies the first organization when the list arrives.apps/mobile/src/lib/organization-context.tsx:212— accepted: choosing Personal while already on an auto-resolved Personal returned early without recording the choice, so a later list with organizations moved the person back on relaunch; the explicit-Personal marker is now written even when the published id does not change.services/session-ingest/.dev.vars.example:1— accepted: the example carriedDIRECT_INGEST_PERCENT="100"for the E2E session fixture, putting verification-only runtime config in the product diff; it is restored to"0".apps/mobile/src/lib/organization-context.tsx:139— accepted: the default organization reached React state only, so glanceable scope, widget actions, voice input, and tool-summary translation kept resolving Personal from the stored key; the default now persists through the existing save path.cloud_agent_sessionpush data carries an optionalorganizationId; absent means Personal, so old producers still validate in a rolling deploy, and both server builders plus the app-posted raise attach the session's organization.organizationId; records written before this release default to null and switch nothing; the single consumer switches before navigating — check this effect first for race risk.E2E proof
Owner request
E2E proof — log excerpts
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-review-1381/e2e-mobile-app/scripted-e1.logReview fixes — head 12ef2ff
apps/mobile/src/lib/organization-context.tsx:92— a marker-read failure discarded a readable saved organizationcd apps/mobile && pnpm exec vitest run src/lib/organization-context.mounted.test.tsxhonors a saved organization when the Personal marker read failsfailed before the fix withwaitFor: condition not met after 50 attempts(the marker rejection took thecatchand publishederror: 'restore'withisLoadedfalse); it passes with the organization key read on its own.reports a restore error when the marker read fails with no saved organizationpins the retained error.apps/mobile/src/lib/notification-actions.ts:261— a session notification could restore and switch organization under another accountcd apps/mobile && pnpm exec vitest run src/lib/notification-actions.test.ts src/lib/notifications.test.tsBefore the fix,
never restores an anonymous session tap for another accountfailed withexpected { href: "/(app)/agent-chat/ses_1?via=push", organizationId: "org-9" } to be null, anddrops a session tap captured with no account identity when the account settles signed outplusdrops a session push captured before a signed-out settlefailed because the anonymous destination stayed stashed. A session destination now carries the pending slot's existingsessionBoundidentity binding.Full suite:
cd apps/mobile && pnpm test