Skip to content

perf(mobile): cut redundant repo, retry, search and presign work - #6631

Merged
iscekic merged 1 commit into
mainfrom
kwf/mobile-perf-lib-cache-d10e
Sep 23, 2026
Merged

iscekic merged 1 commit into
mainfrom
kwf/mobile-perf-lib-cache-d10e

Conversation

@iscekic

@iscekic iscekic commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator

Changelog for users

  • Reopening the new-session form within five minutes shows the GitHub, GitLab, and Bitbucket repository lists immediately instead of refetching all three.
  • A tool summary whose translation fails keeps its source text, retries on a shared growing interval, and pauses while the device is offline.
  • The repository error row's action now reads "Refresh repositories" instead of "Retry", visible and for screen readers.

Changelog for maintainers

  • src/lib/use-new-session-repos.ts:51 (also :62, :74) — accepted. The three provider list queries now pass a five-minute staleTime in both the personal and organization branches. The explicit refresh paths still write fresh results into the same forceRefresh: false keys, so the cache keys are unchanged.
  • src/lib/tool-summary-translation/use-translated-tool-summary.ts:104 — accepted. The per-row interval is gone. One module-level timer serves every mounted unresolved row, doubles its wait from 10 s to a 300 s cap, and stays quiet while onlineManager reports offline. A reconnect resets the wait and replays once through the runtime's retryUnresolvedTranslations.
  • src/lib/system-search-collect.ts:140 — accepted. A per-client WeakMap memo keyed by queryHash reuses documents while data, status, and maxPages are unchanged. Entries the cache no longer holds are pruned; planSystemSearchUpdate remains the only per-run diff.
  • src/components/agents/file-part-url-resolver.ts:24-26 (also :100-123) — accepted. The backend already issues a 900 s TTL and an explicit expiresAt. The client replaces the fixed 30 s sweep with one timeout at the earliest due renew, floored at 30 s, capped at the runtime's maximum delay, and safe against a non-finite expiry.
  • QueryError gains an optional retryLabel defaulting to common.retry; the repository error row passes agentChat.newSession.refreshRepositories. No new dependency.
  • Review first: the resolver's re-arm path (nextRenewDelayMs to scheduleRenewSweep, including the post-presign re-arm) and the shared retry's module state and online listener. New tests cover memo identity, the backoff and offline gate, the timer cap and NaN fallback, and the provider staleTime.

E2E proof

Owner request

Surface: mobile-app

Fix the mobile performance audit findings below. The audit is static: every finding was confirmed by reading the source, not by profiling. Confirm each finding in the current tree before you change it. If a finding is already fixed or no longer applies, say so and skip it; do not invent work.

Audit revision: the report was written against apps/mobile at commit 3fbc18a3b2 on main (2026-09-22). The worktree is newer. Re-locate every cited line by content, never by line number.

Constraints:

  • Change product behaviour only where a finding asks for it. A performance fix must not change what the user sees, except where the finding says the perceived performance improves.
  • No new dependency, and no new test-only runtime support, unless the owner allowed it.
  • Keep the existing test suites green: pnpm --filter @kilocode/mobile test, plus the mounted suite the section runbook names.
  • Proof: quote the decisive log lines from the run in the scenario note. Add a screenshot when the change has a visible surface. A performance fix with no visible surface is proved from a log line that shows the reduced work, for example a request count, a fetch count, or a parse count.

This item: mobile-perf-lib-cache

Fixes

Fix 10. Cache the repository lists the new-session form mounts

  • Severity S2 · Checks P5 · Effort S
  • Files src/lib/use-new-session-repos.ts
  • Impact Opening the new-session form refetches GitHub, GitLab, and Bitbucket repository lists every time, because none of the three queries sets a staleTime (the recents query beside them uses 60 seconds).
  • Detail G8, finding for use-new-session-repos.ts

Fix 12. Replace the per-row 10-second translation retry with one shared, backed-off retry

  • Severity S2 · Checks P4 · Effort M
  • Files src/lib/tool-summary-translation/use-translated-tool-summary.ts
  • Impact A failed translation leaves every mounted tool row asking the gateway every 10 seconds, forever, with no backoff, no offline gate, and no sign-out gate.
  • Detail G8, finding for use-translated-tool-summary.ts

Fix 21. Diff the system-search index instead of decoding the whole query cache

  • Severity S3 · Checks P3 · Effort M
  • Files src/lib/system-search-collect.ts
  • Impact Every cache-write burst and every foreground decodes every cached query through zod and fingerprints every document with JSON.stringify, on the JS thread. Cost scales with cached history.
  • Detail G8, finding for system-search-collect.ts

Fix 24. Ask the backend for longer-lived attachment URLs

  • Severity S3 · Checks P5, P9 · Effort S (backend)
  • Files src/components/agents/file-part-url-resolver.ts
  • Impact A shared 30-second sweep re-presigns every cached attachment whose URL expires within 120 seconds, so a transcript with several attachments keeps a timer alive and issues recurring round trips.
  • Detail Section 11.1

Files this item owns

This item owns exactly the files listed below. Every other audited file belongs to a different workflow item; do not edit a file outside this list.

  • src/lib/use-new-session-repos.ts
  • src/lib/tool-summary-translation/use-translated-tool-summary.ts
  • src/lib/system-search-collect.ts
  • src/components/agents/file-part-url-resolver.ts

Findings in the source

Each bullet is the audited evidence for one file. Read the file, confirm the finding, then apply the fix.

src/lib/use-new-session-repos.ts

  • [S2] [P5] src/lib/use-new-session-repos.ts:51 (also :62 and :74) — the GitHub, GitLab, and Bitbucket repository-list queries are mounted with no staleTime (and useRecentAgentRepositories next to them already uses 60 s, hooks/use-agent-sessions.ts:172). Under the query client's zero default every one of them is stale on mount, so each visit to app/(app)/agent-chat/new.tsx refetches all three provider lists in the background.
    Impact: three control-plane requests (and whatever provider fan-out they trigger) per open of the new-session screen, for data that changes at the rate of a repository being connected. The payload is a full repository list, so the cost grows with the account's repo count, and it lands on the interaction that is supposed to feel instant.
    Fix: give the three provider list queries a staleTime (5 minutes is in line with the recents query), keeping refreshReposForceFresh and the connect/return flow as the explicit invalidation paths — that flow already writes fresh results into the same cache keys.

src/lib/tool-summary-translation/use-translated-tool-summary.ts

  • [S2] [P4] src/lib/tool-summary-translation/use-translated-tool-summary.ts:104 — each mounted row whose summary is still untranslated arms its own setInterval at TOOL_SUMMARY_TRANSLATION_RETRY_MS (10 s, :31), with no backoff, no shared scheduler, and no connectivity or sign-out gate. A settled request that returned no translation leaves translated === undefined, so the timer keeps firing for the life of the mount: in a long transcript the retry population is every visible tool row whose translation failed.
    Impact: a fixed 10 s per-row wakeup that re-keys and re-enqueues into the runtime forever on a failing gateway. It survives backgrounding (JS timers resume) and keeps issuing gateway calls while offline, where the correct behaviour is to wait for the reconnect retry that tool-summary-translation-retry-mount.tsx already owns — so the offline case pays network attempts and battery that the retry-mount design already covers.
    Fix: hand the retry to the runtime instead of the row — one global backoff timer (exponential, capped, paused while onlineManager reports offline) that replays the unresolved keys — or at minimum make the per-row interval back off and stop once a retry has failed while disconnected. The runtime already de-duplicates ticks per key, so the global timer costs nothing extra.

src/lib/system-search-collect.ts

  • [S3] [P3] src/lib/system-search-collect.ts:140 — collectSystemSearchDocuments walks the entire query cache (getQueryCache().getAll()), and for every matching query decodes each page and row with zod (:216, :225, …) and rebuilds each document through buildDocument, which computes a JSON.stringify fingerprint per document (system-search-entries.ts:123). The sync that calls it re-runs on every cache-write burst (750 ms trailing debounce, 5 s max wait) and on every foreground transition (system-search-index-mount.tsx:65-69).
    Impact: a full decode of every cached page plus one serialized fingerprint per indexed session/finding/PR, on the JS thread, triggered by ordinary app usage — a fetch of the next session page, a heartbeat write, a foreground. The cost is proportional to the account's cached history, and it competes with the same thread that is drawing the list that just triggered it.
    Fix: keep the collect incremental. Fingerprint the cached query payload once per dataUpdatedAt and reuse the previous documents when the payload identity has not changed, so the common case is a cache-version comparison instead of a full decode; keep only the diff (planSystemSearchUpdate) doing per-run work.

src/components/agents/file-part-url-resolver.ts

  • [S3] [P5, P9] src/components/agents/file-part-url-resolver.ts:24-26 and :100-123 — the module keeps a shared 30-second sweep and re-presigns every cached entry whose URL expires within 120 seconds.
    Impact: a transcript with several attachments keeps a timer alive and issues recurring presign round trips, plus a periodic JS-thread sweep.
    Fix: ask the backend for longer-lived attachment URLs. Change cloudAgentNext.getAttachmentDownloadUrl (services/cloud-agent-next) to issue a longer TTL, or to return an explicit expiry the client can trust. Then let the resolver rely on that expiry instead of the 120-second re-presign window.

Proof

Proof for this item is a request count and a log excerpt. Count the requests the new-session form, the tool-summary retry, and the system-search collect issue with pnpm dev:capture nextjs. Quote the before and after counts.

[e8] ux-check: On the new-session form, connect a provider repository and return: the newly connected repository appears in the list without the user pressing refresh. — android emulator-5554. Run: signed in as the fresh worktree account e2e-empty-mobile-perf-lib-cache-d10e@example.com (login.sh fixture); its new-session form showed the connect cards 'Connect GitHub' and 'Connect GitLab' with no Repository row (capture e8-before-connect-empty.png). Tapping 'Open GitHub' opened the system browser (local dev-login page at 127.0.0.1:4400); the app's browser leg cannot complete in this environment (it ends at real GitHub OAuth, Cloudflare-blocked), so the connected state was created with the named harness fixture `github-installation.sh…

[e8] ux-check: On the new-session form, connect a provider repository and return: the newly connected repository appears in the list without the user pressing refresh. — e2e-mobile-app/e8-after-connect-github-repos.png

[e8] ux-check: On the new-session form, connect a provider repository and return: the newly connected repository appears in the list without the user pressing refresh.

[e8] ux-check: On the new-session form, connect a provider repository and return: the newly connected repository appears in the list without the user pressing refresh. — e2e-mobile-app/e8-before-connect-empty.png

[e6] A provider-list failure shows the repository error row and its refresh CTA in the new-session form (needs:fault: $KILO_WORKFLOW/e2e/fault.sh <worktree> down nextjs before opening the form, then… — android. nextjs faulted down (e6-fault-down3.log: 'nextjs killed (port 4400 refuses') then app cold-opened: e6-scene.log L4 'SCENE e6 OK' with L17 'Die GitHub-Repositorys konnten nicht geladen werden.' and L19 'Button Repositorys aktualisieren' on that row (e6-error.txt/e6-error.png). After e6-fault-up3.log 'nextjs up (port 4400', tapping the CTA gives e6-scene.log L27 'SCENE e6 OK' with L41 'Code-Repository: Repository wählen' (e6-recovered.txt/e6-recovered.png) and the picker lists real repos iscekic/panon-deking etc. (e6-repo-list.txt/e6-repo-list.png). UX audit: changed surface renders…

[e6] A provider-list failure shows the repository error row and its refresh CTA in the new-session form (needs:fault: $KILO_WORKFLOW/e2e/fault.sh <worktree> down nextjs before opening the form, then… — e2e-mobile-app/e6-repo-list.png

[e6] A provider-list failure shows the repository error row and its refresh CTA in the new-session form (needs:fault: $KILO_WORKFLOW/e2e/fault.sh <worktree> down nextjs before opening the form, then…

[e6] A provider-list failure shows the repository error row and its refresh CTA in the new-session form (needs:fault: $KILO_WORKFLOW/e2e/fault.sh <worktree> down nextjs before opening the form, then… — e2e-mobile-app/e6-recovered.png

[e8] A fresh account with no past sessions shows the connect rows in the new-session form (empty-repos state; fixture: Profile -> Sign Out, then `$KILO_WORKFLOW/e2e/login.sh … — android emulator-5554. Fixture: signed out, then login.sh with the worktree address e2e-empty-mobile-perf-lib-cache-d10e@example.com; the login fixture auto-connected the shared GitHub App, so the empty-repos state was created with github-disconnect.sh (named stub), then state agent-picker + the scene (e8.replay.json) gave 'SCENE e8 OK'. The digest (e8-digest.log) shows the connect row 'Connect GitHub' with 'Open GitHub' and 'Connect GitHub in your browser, then return here to pick a repository.' plus the GitLab connect row, and no repository picker/name entry; screenshot…

[e8] A fresh account with no past sessions shows the connect rows in the new-session form (empty-repos state; fixture: Profile -> Sign Out, then `$KILO_WORKFLOW/e2e/login.sh <udid>… — prior/e8-empty-repos-form.png

[e9] ux-check: transcript with several image attachments stays rendered over minutes and shows no sustained CPU/battery timer (android emulator-5604) — android emulator-5604, fresh cloud session opened with two photos attached and sent; kept open 3 min: e9-attachments.log holds the t0 (T0 04:38:47) and t3 (T3 04:41:47) chip lines content-desc="Open 9f482027-e5e6-4d8d-9957-eb249518fe91.png" and content-desc="Open 44d8f1e0-43a4-497c-8acf-690d17378e07.png" with text="Queued" unchanged (same lines in e9-attachments-t0.txt and e9-attachments-t3.txt), battery temperature: 250 at both reads with level 15 / status 3 discharging, and getAttachmentDownloadUrl= at :0 in both e9-window-nextjs.log and e9-presign-window.log i.e. zero attachment presign…

[e9] ux-check: transcript with several image attachments stays rendered over minutes and shows no sustained CPU/battery timer (android emulator-5604) — e2e-mobile-app/e9-attachments-t3.png

[e10] ux-check: open the new-session form, leave, and reopen within five minutes — repository list renders with no provider-list refetch — The cold open's mount batch 'POST /api/trpc/modelPreferences.get,agentProfiles.list,cloudAgentNext.listGitHubRepositories,cloudAgentNext.listGitLabRepositories,cliSessionsV2.recentRepositories,activeSessions.listInstances?batch=1' is the only provider fetch, and the traffic recorded after the reopen (through line 1178, 'POST /api/trpc/activeSessions.list') contains no provider procedure; e10-s2-nextjs.log shows the same one-off cold fetch and the picker digests (e10-second-open-picker.png) show 'RECENTLY USED' + real repos rendering immediately on the second open.

[e10] ux-check: open the new-session form, leave, and reopen within five minutes — repository list renders with no provider-list refetch — e10-second-open-picker.png

[e13] ux-check: tool-summary translation failure keeps the original text, recovers on connectivity, and the gateway request count does not grow by one request every 10 seconds — android emulator-5554. Fixture: session ses_f34acd1dfffdgrwTk370kZo4d9 created with session.sh cloud on kilo/fake-deterministic, translation model Fake Deterministic, fake-llm taken down and back up with fault.sh (named stub). While it failed, e13-unresolved-digest.txt shows 'Button "e13-notes.txt-Tool, completed"' and 'TextView "e13-notes.txt"' (the source summary, no blank/error state) while e13-nextjs.log carries 'gateway/chat/completions' lines with '503'. The 2 s sample (e13-samples-final.log -> e13-gaps.log) shows gaps of 'gap 10s', 'gap 20s', 'gap 41s', 'gap 80s', 'gap 161s' (count 81…

[e13] ux-check: tool-summary translation failure keeps the original text, recovers on connectivity, and the gateway request count does not grow by one request every 10 seconds — e13-unresolved.png

[e13] ux-check: tool-summary translation failure keeps the original text, recovers on connectivity, and the gateway request count does not grow by one request every 10 seconds

[e13] ux-check: tool-summary translation failure keeps the original text, recovers on connectivity, and the gateway request count does not grow by one request every 10 seconds — e13-recovery.png

[p1] With the translation preference on, a transcript with tool rows still renders every row and issues one translation line, and the pending rows keep their single-line layout (state session-open; Setup… — android emulator-5606: with 'Translate tool summaries' on (p1-prefs-on.txt: content-desc="Translate tool summaries" checkable="true" checked="true") and app language Deutsch, a cloud transcript (session.sh cloud-enter, fake:read-edit-then-gate) re-opened after a cold start renders every tool row — p1-scene.log reads 'SCENE p1 OK', two rows 'Wöchentliche Deployment-Checkliste.txt-Tool, error' (translated filename proves translation fired), the composer 'EditText Nachricht' and the pending row 'Wägt die nächsten Schritte ab' — and the batch issued exactly one translation line…

[p1] With the translation preference on, a transcript with tool rows still renders every row and issues one translation line, and the pending rows keep their single-line layout (state session-open; Setup… — p1.png

[e2] An offline device issues no translation replay and exactly one replay after the network returns (needs:fault: sim-tool.sh --device <serial> --platform android network off on an open transcript with… — android emulator-5554, app language Deutsch, tool-summary translation on (model Fake Deterministic), fake-llm faulted down (fault.sh . down fake-llm) so the transcript's tool summary stays unresolved: every failed translation is a POST /api/gateway/chat/completions 503 in 60ms line in e2-nextjs-pane.log, dated by the monotone arrival counter in e2-counts.log and the fault epochs in e2-timeline.log. The count is flat at 7 from 1790146730 to 1790146916 (190 s offline; the pre-fault cadence had just been one arrival per 10 s then 20 s, so a shared-timer wake was due 40 s in) — no replay…

[e2] An offline device issues no translation replay and exactly one replay after the network returns (needs:fault: sim-tool.sh --device <serial> --platform android network off on an open transcript with… — e2-reconnected.png

[e9] ux-check: transcript with several image attachments stays rendered over minutes and shows no sustained CPU/battery timer (android emulator-5604)

[e9] ux-check: transcript with several image attachments stays rendered over minutes and shows no sustained CPU/battery timer (android emulator-5604) — e9-attachments-t0.png

[e8] ux-check: On the new-session form, connect a provider repository and return: the newly connected repository appears in the list without the user pressing refresh.

[e8] ux-check: On the new-session form, connect a provider repository and return: the newly connected repository appears in the list without the user pressing refresh. — e8-after-connect.png

[e5] new-session form lists repositories from cache on open and issues no provider-list line on reopen — Live on android emulator-5604, state agent-picker (STATE HIT in e5-state.log): first open of the form issued all three provider lists - e5-org-nextjs.log lines 836/837/838 carry path organizations.cloudAgentNext.listGitHubRepositories, organizations.cloudAgentNext.listGitLabRepositories and organizations.cloudAgentNext.listBitbucketRepositories (batch req-mudli1zx-8q5lc3kt289, POST line 840) and the list-line count was 4 at 848 lines; after Back -> New coding task the form rendered again (assert OK) and the count was still 4 at 871 lines, i.e. no provider-list line on reopen; e5-nextjs.log…

[e5] new-session form lists repositories from cache on open and issues no provider-list line on reopen — e5-org-open2.png

[e6] A provider-list failure shows the repository error row and its refresh CTA in the new-session form (needs:fault: $KILO_WORKFLOW/e2e/fault.sh <worktree> down nextjs before opening the form, then…

[e6] A provider-list failure shows the repository error row and its refresh CTA in the new-session form (needs:fault: $KILO_WORKFLOW/e2e/fault.sh <worktree> down nextjs before opening the form, then… — e6-error.png

[p1] With the translation preference on, a transcript with tool rows still renders every row and issues one translation line, and the pending rows keep their single-line layout (state session-open; Setup…

[p1] With the translation preference on, a transcript with tool rows still renders every row and issues one translation line, and the pending rows keep their single-line layout (state session-open; Setup… — p1-transcript.png

[p3] ux-check: Open the new-session form, leave, and reopen it within five minutes: the repository list (GitHub/GitLab/Bitbucket) renders immediately with no skeleton and the captured request count shows… — Re-ran the repaired parked scene on emulator-5604 (android, 2026-09-23): 'SCENE p3 OK' after open, back, reopen; the reopened form's digest shows the loaded row 'android.widget.Button Repository: Select repository tappable [37,1240][1043,1356]' and the picker 'android.widget.TextView RECENTLY USED tappable [0,1533][1080,1617]' with no skeleton/duplicate/error state in the digest (no UX-DEFECT observed; layout is the visual reviewer's, capture p3.png). Request count in p3-request-count.log: first open batched '04:52:21.559 cloudAgentNext.listGitHubRepositories…

[p3] ux-check: Open the new-session form, leave, and reopen it within five minutes: the repository list (GitHub/GitLab/Bitbucket) renders immediately with no skeleton and the captured request count shows… — p3.png

[e5] new-session form lists repositories from cache on open and issues no provider-list line on reopen

[e5] new-session form lists repositories from cache on open and issues no provider-list line on reopen — e5-org-open1.png

Follow-ups (not changed here)

Open findings (not fixed here)

  • [e7] A provider-list failure shows the repository error row and its refresh CTA in the new-session form (needs:fault: $KILO_WORKFLOW/e2e/fault.sh <worktree> down nextjs before opening the form, then up; proof: the digest shows 'Couldn't load GitHub repositories' with the 'Refresh repositories' c
  • [e7] $KILO_WORKFLOW/e2e/appium.sh script /home/igor_kilocode_ai/.local/share/kwf/sections/mobile-perf-lib-cache-d10e/e2e-mobile-app/repro-e7.json --out /home/igor_kilocode_ai/.local/share/kwf/sections/mobile-perf-lib-cache-d10e/e2e-mobile-app/repro-e7
  • [e7] A provider-list failure shows the repository error row and its refresh CTA in the new-session form: Android emulator-5554, nextjs faulted down with fault.sh <wt> down nextjs ('nextjs port 4400 down') before opening the form; the cold-open new-session form's digest does show the error row 'Cou
  • not fully verified: some optional checks did not run
  • the '## E2E proof' section carries no log excerpt, so nothing shows the change was driven end to end

@iscekic
iscekic marked this pull request as draft September 23, 2026 07:47
Comment thread apps/mobile/src/components/agents/file-part-url-resolver.ts
@kilo-code-bot

kilo-code-bot Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

Full re-review at HEAD 17ba28b0d (prior review commit was force-rewritten away) found no new issues in the changed mobile perf code; the earlier non-finite-expiry, reconnect-reschedule, and test-isolation concerns are addressed in the current source.

Files Reviewed (12 files)
  • apps/mobile/src/components/agents/file-part-url-resolver.ts
  • apps/mobile/src/components/agents/file-part-url-resolver.test.ts
  • apps/mobile/src/components/agents/new-session-repository-section.tsx
  • apps/mobile/src/components/agents/new-session-repository-section.test.ts
  • apps/mobile/src/components/query-error.tsx
  • apps/mobile/src/components/query-error.mounted.test.tsx
  • apps/mobile/src/lib/system-search-collect.ts
  • apps/mobile/src/lib/system-search-collect.test.ts
  • apps/mobile/src/lib/tool-summary-translation/use-translated-tool-summary.ts
  • apps/mobile/src/lib/tool-summary-translation/use-translated-tool-summary.mounted.test.tsx
  • apps/mobile/src/lib/use-new-session-repos.ts
  • apps/mobile/src/lib/use-new-session-repos.test.ts
Previous Review Summary (commit c83df05)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit c83df05)

Status: 3 Issues Found | Recommendation: Address before merge

Executive Summary

The attachment-URL renew sweep mishandles a non-finite cached expiry, collapsing the shared sweep to a 30 s cadence for every entry, and the shared translation retry cannot reschedule an already-armed backed-off timer on reconnect.

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/agents/file-part-url-resolver.ts 128 A non-finite urlExpiresAt poisons the earliest-due reduction, pinning the whole sweep to the 30 s floor and never being renewed
apps/mobile/src/lib/tool-summary-translation/use-translated-tool-summary.ts 102 The reconnect edge cannot reschedule an already-armed backed-off timer, so the first replay after a short outage can be delayed up to the cap

SUGGESTION

File Line Issue
apps/mobile/src/lib/tool-summary-translation/use-translated-tool-summary.mounted.test.tsx 371 Shared-retry module state is not reset between cases, so one failure can cascade
Files Reviewed (12 files)
  • apps/mobile/src/components/agents/file-part-url-resolver.ts - 1 issue
  • apps/mobile/src/components/agents/file-part-url-resolver.test.ts - 0 issues
  • apps/mobile/src/lib/tool-summary-translation/use-translated-tool-summary.ts - 1 issue
  • apps/mobile/src/lib/tool-summary-translation/use-translated-tool-summary.mounted.test.tsx - 1 issue
  • apps/mobile/src/lib/system-search-collect.ts - 0 issues
  • apps/mobile/src/lib/system-search-collect.test.ts - 0 issues
  • apps/mobile/src/lib/use-new-session-repos.ts - 0 issues
  • apps/mobile/src/lib/use-new-session-repos.test.ts - 0 issues
  • apps/mobile/src/components/query-error.tsx - 0 issues
  • apps/mobile/src/components/query-error.mounted.test.tsx - 0 issues
  • apps/mobile/src/components/agents/new-session-repository-section.tsx - 0 issues
  • apps/mobile/src/components/agents/new-session-repository-section.test.ts - 0 issues

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic
iscekic force-pushed the kwf/mobile-perf-lib-cache-d10e branch from 85e92fb to 17ba28b Compare September 23, 2026 09:01
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 09:20
@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: - [e12] ux-check: transcript with several image attachments stays rendered for a few minutes with no sustained CPU/battery from a repeating timer: reported skip, so nothing proves it (Ran from STATE HIT agent-picker on android/emulator-5606: built a transcript with three image attachments (sent fake:echo:image attachments check), set the ) — reported not_applicable: the plan names a branch the product does not contain

A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision.

@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic iscekic self-assigned this Sep 23, 2026
@iscekic iscekic removed the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic
iscekic marked this pull request as draft September 23, 2026 10:05
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 10:14
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic
iscekic requested a review from eshurakov September 23, 2026 10:27
@iscekic
iscekic merged commit 6969579 into main Sep 23, 2026
29 checks passed
@iscekic
iscekic deleted the kwf/mobile-perf-lib-cache-d10e branch September 23, 2026 10:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants