2026-10-23T20:45:30.6951559Z Current runner version: '2.337.0' 2026-10-23T20:45:30.6954855Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-jittcsteygfwmajw' 2026-10-23T20:45:30.6955537Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-23T20:45:30.6956257Z Machine name: 'ip-172-31-73-130' 2026-10-23T20:45:30.6957813Z ##[group]GITHUB_TOKEN Permissions 2026-10-23T20:45:30.6959121Z Contents: read 2026-10-23T20:45:30.6959508Z Metadata: read 2026-10-23T20:45:30.6959898Z ##[endgroup] 2026-10-23T20:45:30.6961191Z Secret source: Actions 2026-10-23T20:45:30.6962022Z Cache mode: write 2026-10-23T20:45:30.6962572Z Prepare workflow directory 2026-10-23T20:45:30.7135110Z Prepare all required actions 2026-10-23T20:45:30.7160322Z Getting action download info 2026-10-23T20:45:30.9028937Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-23T20:45:30.9400912Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-23T20:45:31.0456831Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-23T20:45:31.0494942Z Complete job name: Lint 2026-10-23T20:45:31.0808519Z A job started hook has been configured by the self-hosted runner administrator 2026-10-23T20:45:31.0868731Z ##[group]Run '/setup.sh' 2026-10-23T20:45:31.0877214Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T20:45:31.0877627Z env: 2026-10-23T20:45:31.0877852Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:31.0878143Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:31.0878424Z BLACKSMITH_CHECK_RUN_ID: 120647473462 2026-10-23T20:45:31.0878708Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-23T20:45:31.0878981Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-23T20:45:31.0879239Z ##[endgroup] 2026-10-23T20:45:31.1092747Z Logging daemon started (blacksmithd for logs) 2026-10-23T20:45:31.1192425Z Results daemon started (blacksmithd for results) 2026-10-23T20:45:31.1317475Z Background adoption and SSH setup started (PID: 3107) 2026-10-23T20:45:31.1320692Z 2026-10-23T20:45:31.1321195Z ---------------------------------------- 2026-10-23T20:45:31.1321927Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40021663605/jobs/120647473462 2026-10-23T20:45:31.1322517Z SSH Access (using your GitHub SSH key): 2026-10-23T20:45:31.1322947Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-jittcsteygfwmajw.vm.blacksmith.sh 2026-10-23T20:45:31.1323332Z 2026-10-23T20:45:31.1323454Z No GitHub SSH key? Add one at: 2026-10-23T20:45:31.1323943Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-23T20:45:31.1324346Z 2026-10-23T20:45:31.1324450Z ---------------------------------------- 2026-10-23T20:45:31.1324625Z 2026-10-23T20:45:31.1324766Z VM ID: blacksmith-8vcpu-ubuntu-2404-jittcsteygfwmajw 2026-10-23T20:45:31.1325085Z Host: production-152.236.39.253-x8664 2026-10-23T20:45:31.1325353Z Host Agent PID: 3426002 2026-10-23T20:45:31.1325595Z Host Agent Git SHA: af74fd76b 2026-10-23T20:45:31.1325854Z Host CPU Manufacturer: AuthenticAMD 2026-10-23T20:45:31.1326131Z Blacksmith Host Generation: gen 2 2026-10-23T20:45:31.1326403Z Petname: production-in-puma-e2a491a5 2026-10-23T20:45:31.1326670Z Region: us-east 2026-10-23T20:45:31.1326897Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-23T20:45:31.1334073Z OS Version: Ubuntu 24.04.4 LTS 2026-10-23T20:45:31.1334783Z 2026-10-23T20:45:31.1334953Z Enabling Blacksmith transparent cache 2026-10-23T20:45:31.1634827Z ##[group]Run actions/checkout@v6 2026-10-23T20:45:31.1635146Z with: 2026-10-23T20:45:31.1635517Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-23T20:45:31.1636061Z sparse-checkout-cone-mode: false 2026-10-23T20:45:31.1636343Z repository: pingdotgg/t3code 2026-10-23T20:45:31.1638299Z token: *** 2026-10-23T20:45:31.1638517Z ssh-strict: true 2026-10-23T20:45:31.1638735Z ssh-user: git 2026-10-23T20:45:31.1638958Z persist-credentials: true 2026-10-23T20:45:31.1639383Z clean: true 2026-10-23T20:45:31.1640019Z fetch-depth: 1 2026-10-23T20:45:31.1640387Z fetch-tags: false 2026-10-23T20:45:31.1640670Z show-progress: true 2026-10-23T20:45:31.1640956Z lfs: false 2026-10-23T20:45:31.1641215Z submodules: false 2026-10-23T20:45:31.1641493Z set-safe-directory: true 2026-10-23T20:45:31.1641812Z allow-unsafe-pr-checkout: false 2026-10-23T20:45:31.1642130Z env: 2026-10-23T20:45:31.1642429Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:31.1642786Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:31.1643133Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:31.1643461Z ##[endgroup] 2026-10-23T20:45:31.2624131Z Syncing repository: pingdotgg/t3code 2026-10-23T20:45:31.2625072Z ##[group]Getting Git version info 2026-10-23T20:45:31.2625417Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-23T20:45:31.2625919Z [command]/usr/local/bin/git version 2026-10-23T20:45:31.2690510Z git version 2.55.0 2026-10-23T20:45:31.2700536Z ##[endgroup] 2026-10-23T20:45:31.2705869Z Temporarily overriding HOME='/home/runner/_work/_temp/c662f3cd-ff2b-4b8c-8c0d-c1c86666c62c' before making global git config changes 2026-10-23T20:45:31.2706560Z Adding repository directory to the temporary git global config as a safe directory 2026-10-23T20:45:31.2708457Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-23T20:45:31.2741055Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-23T20:45:31.2742548Z ##[group]Determining repository object format 2026-10-23T20:45:31.2743552Z ##[endgroup] 2026-10-23T20:45:31.2743925Z ##[group]Initializing the repository 2026-10-23T20:45:31.2745633Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-23T20:45:31.2780393Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-23T20:45:31.2780917Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-23T20:45:31.2781395Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-23T20:45:31.2781762Z hint: call: 2026-10-23T20:45:31.2781964Z hint: 2026-10-23T20:45:31.2782225Z hint: git config --global init.defaultBranch 2026-10-23T20:45:31.2782527Z hint: 2026-10-23T20:45:31.2782807Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-23T20:45:31.2783259Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-23T20:45:31.2783640Z hint: 2026-10-23T20:45:31.2783851Z hint: git branch -m 2026-10-23T20:45:31.2784082Z hint: 2026-10-23T20:45:31.2784390Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-23T20:45:31.2784871Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-23T20:45:31.2785798Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-23T20:45:31.2814325Z ##[endgroup] 2026-10-23T20:45:31.2814728Z ##[group]Disabling automatic garbage collection 2026-10-23T20:45:31.2816577Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-23T20:45:31.2840189Z ##[endgroup] 2026-10-23T20:45:31.2840530Z ##[group]Setting up auth 2026-10-23T20:45:31.2840873Z Removing SSH command configuration 2026-10-23T20:45:31.2844259Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-23T20:45:31.2866785Z [command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" 2026-10-23T20:45:31.2989784Z Removing HTTP extra header 2026-10-23T20:45:31.2992722Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-23T20:45:31.3014039Z [command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" 2026-10-23T20:45:31.3108911Z Removing includeIf entries pointing to credentials config files 2026-10-23T20:45:31.3112316Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-23T20:45:31.3132285Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-23T20:45:31.3222347Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-b9a1b01d-def6-4b21-aba2-76e09a8da332.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-23T20:45:31.3245211Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-b9a1b01d-def6-4b21-aba2-76e09a8da332.config 2026-10-23T20:45:31.3264815Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-b9a1b01d-def6-4b21-aba2-76e09a8da332.config 2026-10-23T20:45:31.3283395Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-b9a1b01d-def6-4b21-aba2-76e09a8da332.config 2026-10-23T20:45:31.3302178Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-b9a1b01d-def6-4b21-aba2-76e09a8da332.config 2026-10-23T20:45:31.3318663Z ##[endgroup] 2026-10-23T20:45:31.3319043Z ##[group]Fetching the repository 2026-10-23T20:45:31.3322633Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +0837c394f6d515d33ddc8268c7b13da0f2928da2:refs/remotes/pull/24229/merge 2026-10-23T20:45:31.6885559Z From https://github.com/pingdotgg/t3code 2026-10-23T20:45:31.6886342Z * [new ref] 0837c394f6d515d33ddc8268c7b13da0f2928da2 -> pull/24229/merge 2026-10-23T20:45:31.6909146Z ##[endgroup] 2026-10-23T20:45:31.6910169Z ##[group]Determining the checkout info 2026-10-23T20:45:31.6910655Z ##[endgroup] 2026-10-23T20:45:31.6911098Z ##[group]Setting up sparse checkout 2026-10-23T20:45:31.6914813Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-23T20:45:31.6941310Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-23T20:45:31.6960002Z .git/info/sparse-checkout 2026-10-23T20:45:31.6965103Z ##[endgroup] 2026-10-23T20:45:31.6965552Z ##[group]Checking out the ref 2026-10-23T20:45:31.6969131Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24229/merge 2026-10-23T20:45:42.1433059Z Updating files: 0% (1/6309) 2026-10-23T20:45:42.1459874Z Updating files: 1% (64/6309) 2026-10-23T20:45:42.1476844Z Updating files: 2% (127/6309) 2026-10-23T20:45:42.1499709Z Updating files: 3% (190/6309) 2026-10-23T20:45:42.1521115Z Updating files: 4% (253/6309) 2026-10-23T20:45:42.1551245Z Updating files: 5% (316/6309) 2026-10-23T20:45:42.1571875Z Updating files: 6% (379/6309) 2026-10-23T20:45:42.1627537Z Updating files: 7% (442/6309) 2026-10-23T20:45:42.1656666Z Updating files: 8% (505/6309) 2026-10-23T20:45:42.1678515Z Updating files: 9% (568/6309) 2026-10-23T20:45:42.1947563Z Updating files: 10% (631/6309) 2026-10-23T20:45:42.1963827Z Updating files: 11% (694/6309) 2026-10-23T20:45:42.1974606Z Updating files: 12% (758/6309) 2026-10-23T20:45:42.1989374Z Updating files: 13% (821/6309) 2026-10-23T20:45:42.2005030Z Updating files: 14% (884/6309) 2026-10-23T20:45:42.2022690Z Updating files: 15% (947/6309) 2026-10-23T20:45:42.2041182Z Updating files: 16% (1010/6309) 2026-10-23T20:45:42.2055859Z Updating files: 17% (1073/6309) 2026-10-23T20:45:42.2075107Z Updating files: 18% (1136/6309) 2026-10-23T20:45:42.2089559Z Updating files: 19% (1199/6309) 2026-10-23T20:45:42.2112285Z Updating files: 20% (1262/6309) 2026-10-23T20:45:42.2130845Z Updating files: 21% (1325/6309) 2026-10-23T20:45:42.2149563Z Updating files: 22% (1388/6309) 2026-10-23T20:45:42.2162895Z Updating files: 23% (1452/6309) 2026-10-23T20:45:42.2175516Z Updating files: 24% (1515/6309) 2026-10-23T20:45:42.2190896Z Updating files: 25% (1578/6309) 2026-10-23T20:45:42.2204442Z Updating files: 26% (1641/6309) 2026-10-23T20:45:42.2217793Z Updating files: 27% (1704/6309) 2026-10-23T20:45:42.2237536Z Updating files: 28% (1767/6309) 2026-10-23T20:45:42.2270839Z Updating files: 29% (1830/6309) 2026-10-23T20:45:42.2290895Z Updating files: 30% (1893/6309) 2026-10-23T20:45:42.2313995Z Updating files: 31% (1956/6309) 2026-10-23T20:45:42.2344936Z Updating files: 32% (2019/6309) 2026-10-23T20:45:42.2373846Z Updating files: 33% (2082/6309) 2026-10-23T20:45:42.2442485Z Updating files: 34% (2146/6309) 2026-10-23T20:45:42.2500070Z Updating files: 35% (2209/6309) 2026-10-23T20:45:42.2533864Z Updating files: 36% (2272/6309) 2026-10-23T20:45:42.2564906Z Updating files: 37% (2335/6309) 2026-10-23T20:45:42.2606572Z Updating files: 38% (2398/6309) 2026-10-23T20:45:42.2632595Z Updating files: 39% (2461/6309) 2026-10-23T20:45:42.2663519Z Updating files: 40% (2524/6309) 2026-10-23T20:45:42.2694944Z Updating files: 41% (2587/6309) 2026-10-23T20:45:42.2711919Z Updating files: 42% (2650/6309) 2026-10-23T20:45:42.2721434Z Updating files: 43% (2713/6309) 2026-10-23T20:45:42.2744118Z Updating files: 44% (2776/6309) 2026-10-23T20:45:42.2772998Z Updating files: 45% (2840/6309) 2026-10-23T20:45:42.2797497Z Updating files: 46% (2903/6309) 2026-10-23T20:45:42.2823538Z Updating files: 47% (2966/6309) 2026-10-23T20:45:42.2852869Z Updating files: 48% (3029/6309) 2026-10-23T20:45:42.2879094Z Updating files: 49% (3092/6309) 2026-10-23T20:45:42.2909647Z Updating files: 50% (3155/6309) 2026-10-23T20:45:42.2924034Z Updating files: 51% (3218/6309) 2026-10-23T20:45:42.2960144Z Updating files: 52% (3281/6309) 2026-10-23T20:45:42.2984970Z Updating files: 53% (3344/6309) 2026-10-23T20:45:42.3004903Z Updating files: 54% (3407/6309) 2026-10-23T20:45:42.3028724Z Updating files: 55% (3470/6309) 2026-10-23T20:45:42.3046170Z Updating files: 56% (3534/6309) 2026-10-23T20:45:42.3063058Z Updating files: 57% (3597/6309) 2026-10-23T20:45:42.3081270Z Updating files: 58% (3660/6309) 2026-10-23T20:45:42.3448388Z Updating files: 59% (3723/6309) 2026-10-23T20:45:42.3462990Z Updating files: 60% (3786/6309) 2026-10-23T20:45:42.3479358Z Updating files: 61% (3849/6309) 2026-10-23T20:45:42.3498203Z Updating files: 62% (3912/6309) 2026-10-23T20:45:42.3519239Z Updating files: 63% (3975/6309) 2026-10-23T20:45:42.3544866Z Updating files: 64% (4038/6309) 2026-10-23T20:45:42.3566764Z Updating files: 65% (4101/6309) 2026-10-23T20:45:42.3582590Z Updating files: 66% (4164/6309) 2026-10-23T20:45:42.3607448Z Updating files: 67% (4228/6309) 2026-10-23T20:45:42.3620061Z Updating files: 68% (4291/6309) 2026-10-23T20:45:42.3638834Z Updating files: 69% (4354/6309) 2026-10-23T20:45:42.3651637Z Updating files: 70% (4417/6309) 2026-10-23T20:45:42.3668438Z Updating files: 71% (4480/6309) 2026-10-23T20:45:42.3685172Z Updating files: 72% (4543/6309) 2026-10-23T20:45:42.3710671Z Updating files: 73% (4606/6309) 2026-10-23T20:45:42.3965218Z Updating files: 74% (4669/6309) 2026-10-23T20:45:42.4148129Z Updating files: 75% (4732/6309) 2026-10-23T20:45:42.4171432Z Updating files: 76% (4795/6309) 2026-10-23T20:45:42.4191400Z Updating files: 77% (4858/6309) 2026-10-23T20:45:42.4217271Z Updating files: 78% (4922/6309) 2026-10-23T20:45:42.4235899Z Updating files: 79% (4985/6309) 2026-10-23T20:45:42.4253879Z Updating files: 80% (5048/6309) 2026-10-23T20:45:42.4272940Z Updating files: 81% (5111/6309) 2026-10-23T20:45:42.4291152Z Updating files: 82% (5174/6309) 2026-10-23T20:45:42.4308736Z Updating files: 83% (5237/6309) 2026-10-23T20:45:42.4330572Z Updating files: 84% (5300/6309) 2026-10-23T20:45:42.4349708Z Updating files: 85% (5363/6309) 2026-10-23T20:45:42.4371948Z Updating files: 86% (5426/6309) 2026-10-23T20:45:42.4440688Z Updating files: 87% (5489/6309) 2026-10-23T20:45:42.4472182Z Updating files: 88% (5552/6309) 2026-10-23T20:45:42.4489632Z Updating files: 89% (5616/6309) 2026-10-23T20:45:42.4515998Z Updating files: 90% (5679/6309) 2026-10-23T20:45:42.4549662Z Updating files: 91% (5742/6309) 2026-10-23T20:45:42.4564756Z Updating files: 92% (5805/6309) 2026-10-23T20:45:42.4581022Z Updating files: 93% (5868/6309) 2026-10-23T20:45:42.4602539Z Updating files: 94% (5931/6309) 2026-10-23T20:45:42.4625620Z Updating files: 95% (5994/6309) 2026-10-23T20:45:42.4678467Z Updating files: 96% (6057/6309) 2026-10-23T20:45:42.4703522Z Updating files: 97% (6120/6309) 2026-10-23T20:45:42.4749413Z Updating files: 98% (6183/6309) 2026-10-23T20:45:42.4769285Z Updating files: 99% (6246/6309) 2026-10-23T20:45:42.4769445Z Updating files: 100% (6309/6309) 2026-10-23T20:45:42.4919242Z Updating files: 100% (6309/6309), done. 2026-10-23T20:45:42.4919518Z Note: switching to 'refs/remotes/pull/24229/merge'. 2026-10-23T20:45:42.4919778Z 2026-10-23T20:45:42.4919907Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-23T20:45:42.4920196Z changes and commit them, and you can discard any commits you make in this 2026-10-23T20:45:42.4920487Z state without impacting any branches by switching back to a branch. 2026-10-23T20:45:42.4920651Z 2026-10-23T20:45:42.4920770Z If you want to create a new branch to retain commits you create, you may 2026-10-23T20:45:42.4921046Z do so (now or later) by using -c with the switch command. Example: 2026-10-23T20:45:42.4921199Z 2026-10-23T20:45:42.4921277Z git switch -c 2026-10-23T20:45:42.4921386Z 2026-10-23T20:45:42.4921456Z Or undo this operation with: 2026-10-23T20:45:42.4921560Z 2026-10-23T20:45:42.4921622Z git switch - 2026-10-23T20:45:42.4921718Z 2026-10-23T20:45:42.4921856Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-23T20:45:42.4922034Z 2026-10-23T20:45:42.4922248Z HEAD is now at 0837c39 Merge 0b0e5e2715c6aa46246abe43d1e6e5ca6f7d0fd5 into e340aaeeb98bc6ac623c2e70ac8eca8bcbddfe1b 2026-10-23T20:45:42.4931708Z ##[endgroup] 2026-10-23T20:45:42.4964018Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-23T20:45:42.4982888Z 0837c394f6d515d33ddc8268c7b13da0f2928da2 2026-10-23T20:45:42.5058962Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-23T20:45:42.5059184Z files="$(git ls-files .github/pr-assets)" 2026-10-23T20:45:42.5059364Z if test -n "$files"; then 2026-10-23T20:45:42.5059576Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-23T20:45:42.5059781Z  exit 1 2026-10-23T20:45:42.5059887Z fi 2026-10-23T20:45:42.5069670Z shell: /usr/bin/bash -e {0} 2026-10-23T20:45:42.5069799Z env: 2026-10-23T20:45:42.5069912Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:42.5070070Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:42.5070211Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:42.5070345Z ##[endgroup] 2026-10-23T20:45:42.5210089Z Prepare all required actions 2026-10-23T20:45:42.5210434Z Getting action download info 2026-10-23T20:45:42.6137193Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-23T20:45:42.7244492Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-23T20:45:42.7244650Z env: 2026-10-23T20:45:42.7244771Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:42.7244916Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:42.7245060Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:42.7245193Z ##[endgroup] 2026-10-23T20:45:42.7322892Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-23T20:45:42.7365665Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T20:45:42.7366131Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-23T20:45:42.7366424Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T20:45:42.7366659Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-23T20:45:42.7377185Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T20:45:42.7377446Z env: 2026-10-23T20:45:42.7377622Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:42.7377851Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:42.7378072Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:42.7378284Z ##[endgroup] 2026-10-23T20:45:42.7449437Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=12] 2026-10-23T20:45:42.7451401Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-23T20:45:42.7496961Z ##[group]Run actions/cache@v6 2026-10-23T20:45:42.7497107Z with: 2026-10-23T20:45:42.7497210Z path: ~/.vite-plus 2026-10-23T20:45:42.7497439Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T20:45:42.7497752Z enableCrossOsArchive: false 2026-10-23T20:45:42.7497969Z fail-on-cache-miss: false 2026-10-23T20:45:42.7498160Z lookup-only: false 2026-10-23T20:45:42.7498270Z save-always: false 2026-10-23T20:45:42.7498378Z env: 2026-10-23T20:45:42.7498485Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:42.7498633Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:42.7498814Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:42.7498945Z ##[endgroup] 2026-10-23T20:45:42.9540952Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T20:45:43.3364609Z Received 170349591 of 170349591 (100.0%), 450.0 MBs/sec 2026-10-23T20:45:43.3366250Z Cache Size: ~162 MB (170349591 B) 2026-10-23T20:45:43.3387514Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/d2a67be3-7752-44f6-9f5d-1417c150b078/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T20:45:43.9680862Z Cache restored successfully 2026-10-23T20:45:43.9814278Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-23T20:45:43.9892199Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1244] 2026-10-23T20:45:43.9894485Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-23T20:45:43.9915689Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T20:45:43.9915907Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-23T20:45:43.9916078Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-23T20:45:43.9926344Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T20:45:43.9926506Z env: 2026-10-23T20:45:43.9926624Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:43.9926770Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:43.9926914Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:43.9927058Z ##[endgroup] 2026-10-23T20:45:43.9961039Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-23T20:45:43.9967798Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=7] 2026-10-23T20:45:43.9968993Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-23T20:45:43.9972507Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-23T20:45:43.9973563Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-23T20:45:43.9985727Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-23T20:45:43.9985979Z store_path="$(vp pm cache dir)" 2026-10-23T20:45:43.9986171Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-23T20:45:43.9995652Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T20:45:44.0007628Z env: 2026-10-23T20:45:44.0007760Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:44.0007909Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:44.0008276Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:44.0008450Z ##[endgroup] 2026-10-23T20:45:44.0129569Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=15] 2026-10-23T20:45:44.0130826Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-23T20:45:44.0658164Z ##[group]Run actions/cache@v6 2026-10-23T20:45:44.0658307Z with: 2026-10-23T20:45:44.0658432Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-23T20:45:44.0658691Z key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T20:45:44.0658945Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-23T20:45:44.0659093Z enableCrossOsArchive: false 2026-10-23T20:45:44.0659227Z fail-on-cache-miss: false 2026-10-23T20:45:44.0659349Z lookup-only: false 2026-10-23T20:45:44.0659460Z save-always: false 2026-10-23T20:45:44.0659567Z env: 2026-10-23T20:45:44.0659676Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:44.0659832Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:44.0659967Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:44.0660099Z ##[endgroup] 2026-10-23T20:45:44.2789801Z Cache hit for: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T20:45:45.3100954Z Received 620756992 of 994615207 (62.4%), 589.1 MBs/sec 2026-10-23T20:45:45.9004460Z Received 994615207 of 994615207 (100.0%), 594.3 MBs/sec 2026-10-23T20:45:45.9004917Z Cache Size: ~949 MB (994615207 B) 2026-10-23T20:45:45.9022248Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/f5d727c5-a73f-410f-8613-5f5fdeb4ea55/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T20:45:51.0083812Z Cache restored successfully 2026-10-23T20:45:51.0554745Z Cache restored from key: pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c 2026-10-23T20:45:51.0642638Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7051] 2026-10-23T20:45:51.0644847Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-23T20:45:51.0656244Z ##[group]Run vp install 2026-10-23T20:45:51.0656387Z vp install 2026-10-23T20:45:51.0666367Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-23T20:45:51.0666529Z env: 2026-10-23T20:45:51.0666646Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:51.0666788Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:51.0666929Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:51.0667060Z ##[endgroup] 2026-10-23T20:45:51.1014887Z Scope: all 33 workspace projects 2026-10-23T20:45:51.1940972Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-23T20:45:51.4035270Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-23T20:45:51.4035667Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-23T20:45:51.4035884Z Virtual store is at: node_modules/.pnpm 2026-10-23T20:45:55.4279605Z ✓ Lockfile passes supply-chain policies (2088 entries in 4.2s) 2026-10-23T20:45:55.4279868Z Lockfile is up to date, resolution step is skipped 2026-10-23T20:45:55.4434440Z Packages: +1721 2026-10-23T20:45:55.4434715Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-23T20:45:55.4874531Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-23T20:45:56.3723645Z . prepare$ vp config --no-agent 2026-10-23T20:45:56.4643230Z . prepare: Done 2026-10-23T20:45:56.4654926Z 2026-10-23T20:45:56.4655071Z devDependencies: 2026-10-23T20:45:56.4655249Z + @coderabbitai/config 1.1.0 2026-10-23T20:45:56.4655388Z + @shadcn/lint 0.1.5 2026-10-23T20:45:56.4655498Z + @types/node 24.12.4 2026-10-23T20:45:56.4655606Z + knip 6.34.0 2026-10-23T20:45:56.4655746Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-23T20:45:56.4655885Z + vite-plus 1.3.0 2026-10-23T20:45:56.4655954Z 2026-10-23T20:45:56.4669342Z Done in 5.4s using pnpm v12.14.0 2026-10-23T20:45:56.4796040Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=5415] 2026-10-23T20:45:56.5295612Z ##[group]Run actions/cache@v6 2026-10-23T20:45:56.5295799Z with: 2026-10-23T20:45:56.5295908Z path: ~/.cache/electron 2026-10-23T20:45:56.5296143Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T20:45:56.5296372Z enableCrossOsArchive: false 2026-10-23T20:45:56.5296505Z fail-on-cache-miss: false 2026-10-23T20:45:56.5296643Z lookup-only: false 2026-10-23T20:45:56.5296756Z save-always: false 2026-10-23T20:45:56.5296864Z env: 2026-10-23T20:45:56.5296972Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:56.5297256Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:56.5297394Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:56.5297526Z ##[endgroup] 2026-10-23T20:45:56.7282488Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T20:45:56.9015133Z Received 122906203 of 122906203 (100.0%), 746.6 MBs/sec 2026-10-23T20:45:56.9015559Z Cache Size: ~117 MB (122906203 B) 2026-10-23T20:45:56.9054550Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/339b602c-e54f-4abf-902f-97847dafdf15/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-23T20:45:56.9636047Z Cache restored successfully 2026-10-23T20:45:56.9770048Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-23T20:45:56.9881604Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-23T20:45:56.9881987Z vp run --filter @t3tools/desktop ensure:electron 2026-10-23T20:45:56.9896197Z shell: /usr/bin/bash -e {0} 2026-10-23T20:45:56.9896335Z env: 2026-10-23T20:45:56.9896451Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:56.9896605Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:56.9896747Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:56.9896883Z ##[endgroup] 2026-10-23T20:45:57.1560256Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-23T20:45:57.7252879Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-23T20:45:57.7268124Z 2026-10-23T20:45:57.7349873Z ##[group]Run vp run knip:check 2026-10-23T20:45:57.7350060Z vp run knip:check 2026-10-23T20:45:57.7361120Z shell: /usr/bin/bash -e {0} 2026-10-23T20:45:57.7361282Z env: 2026-10-23T20:45:57.7361513Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:45:57.7361717Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:45:57.7361887Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:45:57.7373889Z ##[endgroup] 2026-10-23T20:45:57.8821381Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-23T20:46:01.4760684Z 2026-10-23T20:46:01.4764443Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-23T20:46:09.4004614Z 2026-10-23T20:46:09.4005683Z --- 2026-10-23T20:46:09.4005963Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-23T20:46:09.4075196Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-23T20:46:09.4075506Z vp run --filter @t3tools/source-control-github generate --check 2026-10-23T20:46:09.4086566Z shell: /usr/bin/bash -e {0} 2026-10-23T20:46:09.4086709Z env: 2026-10-23T20:46:09.4086821Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:46:09.4086969Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:46:09.4087111Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:46:09.4087249Z ##[endgroup] 2026-10-23T20:46:09.5510203Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-23T20:46:09.7321597Z 2026-10-23T20:46:09.7416049Z ##[group]Run vp run --filter t3 generate --check 2026-10-23T20:46:09.7416257Z vp run --filter t3 generate --check 2026-10-23T20:46:09.7426618Z shell: /usr/bin/bash -e {0} 2026-10-23T20:46:09.7426745Z env: 2026-10-23T20:46:09.7426869Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:46:09.7427016Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:46:09.7427157Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:46:09.7427288Z ##[endgroup] 2026-10-23T20:46:09.8861050Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-23T20:46:10.0359294Z 2026-10-23T20:46:10.0423860Z ##[group]Run vp check 2026-10-23T20:46:10.0424040Z vp check 2026-10-23T20:46:10.0434118Z shell: /usr/bin/bash -e {0} 2026-10-23T20:46:10.0434269Z env: 2026-10-23T20:46:10.0434381Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 285 2026-10-23T20:46:10.0434526Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 408 2026-10-23T20:46:10.0434693Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-23T20:46:10.0434826Z ##[endgroup] 2026-10-23T20:46:10.5983966Z pass: All 5666 files are correctly formatted (420ms, 8 threads) 2026-10-23T20:46:15.5100776Z warn: Lint warnings found 2026-10-23T20:46:15.5101526Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5101871Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-23T20:46:15.5102105Z 276 │ 2026-10-23T20:46:15.5102392Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-23T20:46:15.5102676Z 278 │ │ ...nativeProps, 2026-10-23T20:46:15.5102936Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-23T20:46:15.5103187Z 280 │ │ ref: nativeRef, 2026-10-23T20:46:15.5103429Z 281 │ ├─▶ }); 2026-10-23T20:46:15.5103855Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5104132Z 282 │ } 2026-10-23T20:46:15.5104260Z ╰──── 2026-10-23T20:46:15.5104851Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5105613Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5105900Z 2026-10-23T20:46:15.5106321Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5106773Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-23T20:46:15.5106996Z 345 │ 2026-10-23T20:46:15.5107163Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-23T20:46:15.5107375Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5107648Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-23T20:46:15.5107894Z 347 │ ProviderAdapterRegistryV2, 2026-10-23T20:46:15.5108046Z ╰──── 2026-10-23T20:46:15.5108211Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5108330Z 2026-10-23T20:46:15.5108529Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-23T20:46:15.5108886Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-23T20:46:15.5109125Z 1782 │ assert.equal( 2026-10-23T20:46:15.5109362Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-23T20:46:15.5109618Z ·  ────────────────────────── 2026-10-23T20:46:15.5109809Z 1784 │ stored.attachments[0]?.id, 2026-10-23T20:46:15.5109962Z ╰──── 2026-10-23T20:46:15.5110197Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-23T20:46:15.5110374Z 2026-10-23T20:46:15.5110538Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5110854Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-23T20:46:15.5111115Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-23T20:46:15.5111397Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-23T20:46:15.5111810Z ·  ─────┬──── 2026-10-23T20:46:15.5112144Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5112354Z 179 │ } 2026-10-23T20:46:15.5112473Z ╰──── 2026-10-23T20:46:15.5112809Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5113363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5113639Z 2026-10-23T20:46:15.5113841Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-23T20:46:15.5114200Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-23T20:46:15.5114491Z 24 │ import * as Schema from "effect/Schema"; 2026-10-23T20:46:15.5114721Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-23T20:46:15.5114960Z ·  ─────┬───── 2026-10-23T20:46:15.5115203Z · ╰── 'HostProcess' is imported here 2026-10-23T20:46:15.5115395Z 26 │ 2026-10-23T20:46:15.5115514Z ╰──── 2026-10-23T20:46:15.5115666Z  help: Consider removing this import. 2026-10-23T20:46:15.5115781Z 2026-10-23T20:46:15.5116055Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5116467Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-23T20:46:15.5116720Z 123 │ const path = yield* Path.Path; 2026-10-23T20:46:15.5116954Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T20:46:15.5117168Z ·  ──────┬───── 2026-10-23T20:46:15.5117404Z · ╰── 'serverConfig' is declared here 2026-10-23T20:46:15.5117679Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T20:46:15.5117882Z ╰──── 2026-10-23T20:46:15.5118041Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5118157Z 2026-10-23T20:46:15.5118430Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5118846Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-23T20:46:15.5119125Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-23T20:46:15.5119392Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-23T20:46:15.5119629Z ·  ───────┬────── 2026-10-23T20:46:15.5119864Z · ╰── 'serverSettings' is declared here 2026-10-23T20:46:15.5120141Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-23T20:46:15.5120338Z ╰──── 2026-10-23T20:46:15.5120497Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5120612Z 2026-10-23T20:46:15.5121078Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5121722Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-23T20:46:15.5122019Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-23T20:46:15.5122352Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-23T20:46:15.5122676Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-23T20:46:15.5122925Z 137 │ │ if (predicate(lastState)) { 2026-10-23T20:46:15.5123142Z 138 │ │ return lastState; 2026-10-23T20:46:15.5123327Z 139 │ │ } 2026-10-23T20:46:15.5123521Z 140 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5123757Z 141 │ ╰─▶ } 2026-10-23T20:46:15.5123962Z 142 │ return yield* Effect.die( 2026-10-23T20:46:15.5124107Z ╰──── 2026-10-23T20:46:15.5124175Z 2026-10-23T20:46:15.5124327Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5124621Z ╭─[apps/mobile/src/native/StackHeader.tsx:184:9] 2026-10-23T20:46:15.5124818Z 183 │ "options", 2026-10-23T20:46:15.5124997Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T20:46:15.5125218Z ·  ────────────────┬─────────────── 2026-10-23T20:46:15.5125520Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5125799Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T20:46:15.5125962Z ╰──── 2026-10-23T20:46:15.5126493Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5127202Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5127482Z 2026-10-23T20:46:15.5127629Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5127894Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-23T20:46:15.5128115Z 184 │ latestOptionFunctionsRef.current, 2026-10-23T20:46:15.5128314Z 185 │ optionFunctionWrappersRef.current, 2026-10-23T20:46:15.5128531Z ·  ────────────────┬──────────────── 2026-10-23T20:46:15.5128827Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5129103Z 186 │ ) as NativeStackNavigationOptions) 2026-10-23T20:46:15.5129263Z ╰──── 2026-10-23T20:46:15.5129778Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5130473Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5130957Z 2026-10-23T20:46:15.5131172Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T20:46:15.5131866Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6] 2026-10-23T20:46:15.5132290Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T20:46:15.5132592Z 226 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5132795Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5133349Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5133823Z 227 │ mostRecentEventCount, 2026-10-23T20:46:15.5133971Z 228 │ ); 2026-10-23T20:46:15.5134159Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T20:46:15.5134452Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T20:46:15.5134783Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5135057Z 230 │ const assumedValue = props.value; 2026-10-23T20:46:15.5135210Z ╰──── 2026-10-23T20:46:15.5135438Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T20:46:15.5135914Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5136208Z 2026-10-23T20:46:15.5136420Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T20:46:15.5136758Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7] 2026-10-23T20:46:15.5137042Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T20:46:15.5137279Z 237 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5137483Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5138034Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5138530Z 238 │ controlledEventCount, 2026-10-23T20:46:15.5138686Z 239 │ assumedValue, 2026-10-23T20:46:15.5138826Z 240 │ ); 2026-10-23T20:46:15.5139046Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T20:46:15.5139345Z ·  ───────────┬────────── 2026-10-23T20:46:15.5139686Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T20:46:15.5139974Z 242 │ const acceptNativeEvent = useCallback( 2026-10-23T20:46:15.5140135Z ╰──── 2026-10-23T20:46:15.5140717Z  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5141434Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5141727Z 2026-10-23T20:46:15.5141870Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5142155Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T20:46:15.5142421Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T20:46:15.5142732Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T20:46:15.5143000Z ·  ─────────────┬──────────── 2026-10-23T20:46:15.5143285Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5143497Z 163 │ }); 2026-10-23T20:46:15.5143618Z ╰──── 2026-10-23T20:46:15.5144129Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5144867Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5145143Z 2026-10-23T20:46:15.5145292Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5145582Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29] 2026-10-23T20:46:15.5145847Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T20:46:15.5146104Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T20:46:15.5146346Z ·  ─────────────┬──────────── 2026-10-23T20:46:15.5146674Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5146919Z 163 │ }); 2026-10-23T20:46:15.5147039Z ╰──── 2026-10-23T20:46:15.5147558Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5148266Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5148537Z 2026-10-23T20:46:15.5148683Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5148970Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23] 2026-10-23T20:46:15.5149172Z 163 │ }); 2026-10-23T20:46:15.5149329Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T20:46:15.5149557Z ·  ─────────┬────────────┬─── 2026-10-23T20:46:15.5149868Z · │ ╰── Cannot update ref value during render 2026-10-23T20:46:15.5150207Z · ╰── This value is a ref 2026-10-23T20:46:15.5150431Z 165 │ return JSON.stringify( 2026-10-23T20:46:15.5150575Z ╰──── 2026-10-23T20:46:15.5151088Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5151797Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5152075Z 2026-10-23T20:46:15.5152222Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5152512Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5] 2026-10-23T20:46:15.5152735Z 205 │ mostRecentEventCount, 2026-10-23T20:46:15.5152915Z 206 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5153127Z ·  ───────────────┬─────────────── 2026-10-23T20:46:15.5153422Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5153654Z 207 │ ); 2026-10-23T20:46:15.5153770Z ╰──── 2026-10-23T20:46:15.5154284Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5155022Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5155309Z 2026-10-23T20:46:15.5155463Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5155758Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5] 2026-10-23T20:46:15.5155975Z 211 │ mostRecentEventCount, 2026-10-23T20:46:15.5156158Z 212 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5156368Z ·  ───────────────┬─────────────── 2026-10-23T20:46:15.5156668Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5156901Z 213 │ ); 2026-10-23T20:46:15.5157018Z ╰──── 2026-10-23T20:46:15.5157551Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5158275Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5158556Z 2026-10-23T20:46:15.5158743Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T20:46:15.5159066Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6] 2026-10-23T20:46:15.5159334Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T20:46:15.5159585Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T20:46:15.5159821Z ·  ─────────┬──────── 2026-10-23T20:46:15.5160493Z · ╰── Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5160995Z 163 │ }); 2026-10-23T20:46:15.5161162Z 164 │ confirmedTokensRef.current = tokens; 2026-10-23T20:46:15.5161345Z 165 │ return JSON.stringify( 2026-10-23T20:46:15.5161606Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T20:46:15.5161849Z 167 │ const record = 2026-10-23T20:46:15.5162023Z 168 │ token.type === "context" 2026-10-23T20:46:15.5162292Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T20:46:15.5162531Z 170 │ : undefined; 2026-10-23T20:46:15.5162729Z 171 │ const presentation = contextChipPresentation( 2026-10-23T20:46:15.5162973Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-23T20:46:15.5163176Z 173 │ record, 2026-10-23T20:46:15.5163318Z 174 │ ); 2026-10-23T20:46:15.5163483Z 175 │ const icon = contextChipIcon( 2026-10-23T20:46:15.5163660Z 176 │ presentation, 2026-10-23T20:46:15.5163899Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T20:46:15.5164116Z 178 │ ); 2026-10-23T20:46:15.5164257Z 179 │ return { 2026-10-23T20:46:15.5164422Z 180 │ type: token.type, 2026-10-23T20:46:15.5164628Z 181 │ source: token.source, 2026-10-23T20:46:15.5164804Z 182 │ start: token.start, 2026-10-23T20:46:15.5164965Z 183 │ end: token.end, 2026-10-23T20:46:15.5180847Z 184 │ accent: presentation.accent, 2026-10-23T20:46:15.5181097Z 185 │ label: 2026-10-23T20:46:15.5181272Z 186 │ token.type === "skill" 2026-10-23T20:46:15.5181496Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T20:46:15.5181714Z 188 │ : token.type === "context" 2026-10-23T20:46:15.5182066Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T20:46:15.5182385Z 190 │ : basename(token.value), 2026-10-23T20:46:15.5182638Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T20:46:15.5182890Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-23T20:46:15.5183092Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-23T20:46:15.5183258Z 194 │ }; 2026-10-23T20:46:15.5183386Z 195 │ }), 2026-10-23T20:46:15.5183512Z 196 │ ); 2026-10-23T20:46:15.5183684Z 197 │ }, [props.value, props.context, skillLabels]); 2026-10-23T20:46:15.5183937Z ·  ────────────────────┬──────────────────── 2026-10-23T20:46:15.5184268Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5184655Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T20:46:15.5184861Z ╰──── 2026-10-23T20:46:15.5185137Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T20:46:15.5185682Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5185997Z 2026-10-23T20:46:15.5186191Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T20:46:15.5186651Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5] 2026-10-23T20:46:15.5186966Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T20:46:15.5187211Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T20:46:15.5187420Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5187985Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5188484Z 253 │ eventCount: acknowledgedEventCount, 2026-10-23T20:46:15.5188658Z 254 │ value, 2026-10-23T20:46:15.5188813Z 255 │ selection: nextSelection, 2026-10-23T20:46:15.5188971Z 256 │ }); 2026-10-23T20:46:15.5189130Z 257 │ return acknowledgedEventCount; 2026-10-23T20:46:15.5189293Z 258 │ }, 2026-10-23T20:46:15.5189413Z 259 │ [], 2026-10-23T20:46:15.5189551Z ·  ─┬ 2026-10-23T20:46:15.5189812Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5190047Z 260 │ ); 2026-10-23T20:46:15.5190166Z ╰──── 2026-10-23T20:46:15.5190425Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T20:46:15.5190943Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5191238Z 2026-10-23T20:46:15.5191438Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5191791Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-23T20:46:15.5192045Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-23T20:46:15.5192240Z 257 │ }, [props.path, targetIndex]); 2026-10-23T20:46:15.5192415Z ·  ─────┬──── 2026-10-23T20:46:15.5192655Z · ╰── Unnecessary dependency `props.path` 2026-10-23T20:46:15.5192854Z 258 │ 2026-10-23T20:46:15.5192965Z ╰──── 2026-10-23T20:46:15.5193314Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5193900Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5194193Z 2026-10-23T20:46:15.5194422Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T20:46:15.5194765Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-23T20:46:15.5194994Z 292 │ 2026-10-23T20:46:15.5197308Z ·  ─────────── 2026-10-23T20:46:15.5197479Z 310 │ {body} 2026-10-23T20:46:15.5197615Z ╰──── 2026-10-23T20:46:15.5197812Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T20:46:15.5197964Z 2026-10-23T20:46:15.5198230Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5198618Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-23T20:46:15.5198822Z 150 │ 2026-10-23T20:46:15.5198950Z 151 │ useEffect(() => { 2026-10-23T20:46:15.5199118Z ·  ────┬──── 2026-10-23T20:46:15.5199341Z · ╰── This is the containing effect 2026-10-23T20:46:15.5199561Z 152 │ if (!controlledSelectedPath) { 2026-10-23T20:46:15.5199731Z 153 │ return; 2026-10-23T20:46:15.5199861Z 154 │ } 2026-10-23T20:46:15.5200011Z 155 │ setExpandedPaths((current) => { 2026-10-23T20:46:15.5200201Z ·  ────────┬─────── 2026-10-23T20:46:15.5200471Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5200762Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-23T20:46:15.5200953Z ╰──── 2026-10-23T20:46:15.5201618Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5202479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5202786Z 2026-10-23T20:46:15.5203044Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5203462Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-23T20:46:15.5203687Z 118 │ 2026-10-23T20:46:15.5203815Z 119 │ useEffect(() => { 2026-10-23T20:46:15.5203972Z ·  ────┬──── 2026-10-23T20:46:15.5204195Z · ╰── This is the containing effect 2026-10-23T20:46:15.5204528Z 120 │ if (orientationSettled) return; 2026-10-23T20:46:15.5204773Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-23T20:46:15.5204980Z 122 │ if (orientation === null) { 2026-10-23T20:46:15.5205161Z 123 │ setOrientationSettled(true); 2026-10-23T20:46:15.5205357Z ·  ──────────┬────────── 2026-10-23T20:46:15.5205634Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5205872Z 124 │ return; 2026-10-23T20:46:15.5206001Z ╰──── 2026-10-23T20:46:15.5206673Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5207541Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5207848Z 2026-10-23T20:46:15.5208112Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5208540Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-23T20:46:15.5208773Z 292 │ 2026-10-23T20:46:15.5208901Z 293 │ useEffect(() => { 2026-10-23T20:46:15.5209060Z ·  ────┬──── 2026-10-23T20:46:15.5209282Z · ╰── This is the containing effect 2026-10-23T20:46:15.5209484Z 294 │ if ( 2026-10-23T20:46:15.5209620Z 295 │ scene === null || 2026-10-23T20:46:15.5209792Z 296 │ requestedScene === null || 2026-10-23T20:46:15.5209972Z 297 │ scene !== requestedScene || 2026-10-23T20:46:15.5210141Z 298 │ !hasFixture || 2026-10-23T20:46:15.5210302Z 299 │ !orientationSettled || 2026-10-23T20:46:15.5210466Z 300 │ !themeApplied || 2026-10-23T20:46:15.5211062Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-23T20:46:15.5211336Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-23T20:46:15.5211543Z 303 │ ) { 2026-10-23T20:46:15.5211683Z 304 │ setReadyScene(null); 2026-10-23T20:46:15.5211861Z ·  ──────┬────── 2026-10-23T20:46:15.5212131Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5212369Z 305 │ return; 2026-10-23T20:46:15.5212499Z ╰──── 2026-10-23T20:46:15.5213180Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5214051Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5214395Z 2026-10-23T20:46:15.5214678Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5215118Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-23T20:46:15.5215445Z 127 │ let cancelled = false; 2026-10-23T20:46:15.5215676Z 128 │ let lastOutcome: string | null = null; 2026-10-23T20:46:15.5215876Z ·  ─────┬───── 2026-10-23T20:46:15.5216120Z · ╰── 'lastOutcome' is declared here 2026-10-23T20:46:15.5216452Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-23T20:46:15.5216693Z ╰──── 2026-10-23T20:46:15.5216864Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5216986Z 2026-10-23T20:46:15.5217226Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-23T20:46:15.5217629Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-23T20:46:15.5217857Z 1397 │ 2026-10-23T20:46:15.5218017Z 1398 │ function assertUserMessagesExclude( 2026-10-23T20:46:15.5218245Z ·  ────────────┬──────────── 2026-10-23T20:46:15.5218539Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-23T20:46:15.5218828Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-23T20:46:15.5219009Z ╰──── 2026-10-23T20:46:15.5219177Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5219299Z 2026-10-23T20:46:15.5219500Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-23T20:46:15.5219848Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-23T20:46:15.5220150Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-23T20:46:15.5220424Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-23T20:46:15.5220642Z ·  ──┬── 2026-10-23T20:46:15.5220876Z · ╰── 'Image' is imported here 2026-10-23T20:46:15.5221071Z 18 │ 2026-10-23T20:46:15.5221189Z ╰──── 2026-10-23T20:46:15.5221347Z  help: Consider removing this import. 2026-10-23T20:46:15.5221473Z 2026-10-23T20:46:15.5221689Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T20:46:15.5222040Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6] 2026-10-23T20:46:15.5222364Z 223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-23T20:46:15.5222631Z 224 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5222838Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5223439Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5223941Z 225 │ mostRecentEventCount, 2026-10-23T20:46:15.5224096Z 226 │ ); 2026-10-23T20:46:15.5224292Z 227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-23T20:46:15.5224618Z ·  ──────────────────────────┬────────────────────────── 2026-10-23T20:46:15.5224972Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5225259Z 228 │ const assumedValue = props.value; 2026-10-23T20:46:15.5225420Z ╰──── 2026-10-23T20:46:15.5225655Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T20:46:15.5226222Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5226566Z 2026-10-23T20:46:15.5226792Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T20:46:15.5227157Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7] 2026-10-23T20:46:15.5227464Z 234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-23T20:46:15.5227716Z 235 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5227928Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5228514Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5229017Z 236 │ controlledEventCount, 2026-10-23T20:46:15.5229180Z 237 │ assumedValue, 2026-10-23T20:46:15.5229328Z 238 │ ); 2026-10-23T20:46:15.5229562Z 239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-23T20:46:15.5229880Z ·  ───────────┬────────── 2026-10-23T20:46:15.5230238Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-23T20:46:15.5230533Z 240 │ const acceptNativeEvent = useCallback( 2026-10-23T20:46:15.5230699Z ╰──── 2026-10-23T20:46:15.5231242Z  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5231966Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5232275Z 2026-10-23T20:46:15.5232438Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5232748Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T20:46:15.5233038Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T20:46:15.5233296Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T20:46:15.5233560Z ·  ─────────────┬──────────── 2026-10-23T20:46:15.5233867Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5234097Z 161 │ }); 2026-10-23T20:46:15.5234222Z ╰──── 2026-10-23T20:46:15.5234798Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5235538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5235828Z 2026-10-23T20:46:15.5235984Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5236289Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29] 2026-10-23T20:46:15.5236630Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T20:46:15.5236914Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T20:46:15.5237174Z ·  ─────────────┬──────────── 2026-10-23T20:46:15.5237515Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5237775Z 161 │ }); 2026-10-23T20:46:15.5237895Z ╰──── 2026-10-23T20:46:15.5238428Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5239165Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5239453Z 2026-10-23T20:46:15.5239606Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5239908Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23] 2026-10-23T20:46:15.5240125Z 161 │ }); 2026-10-23T20:46:15.5240287Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T20:46:15.5240529Z ·  ─────────┬────────────┬─── 2026-10-23T20:46:15.5240856Z · │ ╰── Cannot update ref value during render 2026-10-23T20:46:15.5241161Z · ╰── This value is a ref 2026-10-23T20:46:15.5241368Z 163 │ return JSON.stringify( 2026-10-23T20:46:15.5241517Z ╰──── 2026-10-23T20:46:15.5242060Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5242790Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5243075Z 2026-10-23T20:46:15.5243227Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5243531Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5] 2026-10-23T20:46:15.5243764Z 203 │ mostRecentEventCount, 2026-10-23T20:46:15.5243952Z 204 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5244178Z ·  ───────────────┬─────────────── 2026-10-23T20:46:15.5244611Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5244889Z 205 │ ); 2026-10-23T20:46:15.5245008Z ╰──── 2026-10-23T20:46:15.5245545Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5246269Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5246554Z 2026-10-23T20:46:15.5246706Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5247006Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5] 2026-10-23T20:46:15.5247241Z 209 │ mostRecentEventCount, 2026-10-23T20:46:15.5247427Z 210 │ nativeEventSnapshotsRef.current, 2026-10-23T20:46:15.5247649Z ·  ───────────────┬─────────────── 2026-10-23T20:46:15.5247957Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5248202Z 211 │ ); 2026-10-23T20:46:15.5248319Z ╰──── 2026-10-23T20:46:15.5248852Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5249575Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5249868Z 2026-10-23T20:46:15.5250066Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T20:46:15.5250400Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6] 2026-10-23T20:46:15.5250733Z 159 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-23T20:46:15.5250992Z 160 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-23T20:46:15.5251240Z ·  ─────────┬──────── 2026-10-23T20:46:15.5251838Z · ╰── Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5252315Z 161 │ }); 2026-10-23T20:46:15.5252484Z 162 │ confirmedTokensRef.current = tokens; 2026-10-23T20:46:15.5252674Z 163 │ return JSON.stringify( 2026-10-23T20:46:15.5252936Z 164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-23T20:46:15.5253185Z 165 │ const record = 2026-10-23T20:46:15.5253354Z 166 │ token.type === "context" 2026-10-23T20:46:15.5253624Z 167 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-23T20:46:15.5253873Z 168 │ : undefined; 2026-10-23T20:46:15.5254076Z 169 │ const presentation = contextChipPresentation( 2026-10-23T20:46:15.5254324Z 170 │ token.type === "context" ? token.kind : token.type, 2026-10-23T20:46:15.5254548Z 171 │ record, 2026-10-23T20:46:15.5254695Z 172 │ ); 2026-10-23T20:46:15.5254857Z 173 │ const icon = contextChipIcon( 2026-10-23T20:46:15.5255107Z 174 │ presentation, 2026-10-23T20:46:15.5255386Z 175 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-23T20:46:15.5255602Z 176 │ ); 2026-10-23T20:46:15.5255739Z 177 │ return { 2026-10-23T20:46:15.5255893Z 178 │ type: token.type, 2026-10-23T20:46:15.5256067Z 179 │ source: token.source, 2026-10-23T20:46:15.5256240Z 180 │ start: token.start, 2026-10-23T20:46:15.5256405Z 181 │ end: token.end, 2026-10-23T20:46:15.5256582Z 182 │ accent: presentation.accent, 2026-10-23T20:46:15.5256753Z 183 │ label: 2026-10-23T20:46:15.5256916Z 184 │ token.type === "skill" 2026-10-23T20:46:15.5257131Z 185 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-23T20:46:15.5257344Z 186 │ : token.type === "context" 2026-10-23T20:46:15.5257697Z 187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-23T20:46:15.5258016Z 188 │ : basename(token.value), 2026-10-23T20:46:15.5258291Z 189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-23T20:46:15.5258550Z 190 │ iconUri: contextChipIconUri(icon), 2026-10-23T20:46:15.5258759Z 191 │ tintsIcon: icon.kind === "chip", 2026-10-23T20:46:15.5258933Z 192 │ }; 2026-10-23T20:46:15.5259069Z 193 │ }), 2026-10-23T20:46:15.5259197Z 194 │ ); 2026-10-23T20:46:15.5259367Z 195 │ }, [props.value, props.context, skillLabels]); 2026-10-23T20:46:15.5259621Z ·  ────────────────────┬──────────────────── 2026-10-23T20:46:15.5259959Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5260305Z 196 │ // Every render resolves against the snapshot history, so a render whose 2026-10-23T20:46:15.5260510Z ╰──── 2026-10-23T20:46:15.5260784Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T20:46:15.5261320Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5261625Z 2026-10-23T20:46:15.5261820Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T20:46:15.5262165Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5] 2026-10-23T20:46:15.5262452Z 249 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-23T20:46:15.5262713Z 250 │ nativeEventSnapshotsRef.current.push({ 2026-10-23T20:46:15.5262935Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5263515Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5264030Z 251 │ eventCount: acknowledgedEventCount, 2026-10-23T20:46:15.5264210Z 252 │ value, 2026-10-23T20:46:15.5264382Z 253 │ selection: nextSelection, 2026-10-23T20:46:15.5264568Z 254 │ }); 2026-10-23T20:46:15.5264725Z 255 │ return acknowledgedEventCount; 2026-10-23T20:46:15.5264888Z 256 │ }, 2026-10-23T20:46:15.5265012Z 257 │ [], 2026-10-23T20:46:15.5265155Z ·  ─┬ 2026-10-23T20:46:15.5265492Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5265763Z 258 │ ); 2026-10-23T20:46:15.5265883Z ╰──── 2026-10-23T20:46:15.5266152Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T20:46:15.5266681Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5266986Z 2026-10-23T20:46:15.5267465Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5268055Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-23T20:46:15.5268280Z 27 │ ) { 2026-10-23T20:46:15.5268560Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T20:46:15.5268907Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-23T20:46:15.5269195Z 30 │ │ if (predicate(available)) return available; 2026-10-23T20:46:15.5269440Z 31 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5269689Z 32 │ ╰─▶ } 2026-10-23T20:46:15.5270007Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-23T20:46:15.5270249Z ╰──── 2026-10-23T20:46:15.5270306Z 2026-10-23T20:46:15.5270547Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T20:46:15.5270948Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-23T20:46:15.5271191Z 1997 │ assert.equal( 2026-10-23T20:46:15.5271439Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-23T20:46:15.5271682Z ·  ────── 2026-10-23T20:46:15.5271863Z 1999 │ "authoritative answer", 2026-10-23T20:46:15.5272018Z ╰──── 2026-10-23T20:46:15.5272252Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T20:46:15.5272434Z 2026-10-23T20:46:15.5272916Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5273514Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-23T20:46:15.5273873Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-23T20:46:15.5274273Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-23T20:46:15.5274631Z 3952 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5274901Z 3953 │ ╰─▶ } 2026-10-23T20:46:15.5275169Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-23T20:46:15.5275359Z ╰──── 2026-10-23T20:46:15.5275422Z 2026-10-23T20:46:15.5275955Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5276586Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-23T20:46:15.5276854Z 6061 │ .pipe(Effect.forkScoped); 2026-10-23T20:46:15.5277158Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-23T20:46:15.5277457Z 6063 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5277727Z 6064 │ ╰─▶ } 2026-10-23T20:46:15.5278041Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-23T20:46:15.5278270Z ╰──── 2026-10-23T20:46:15.5278330Z 2026-10-23T20:46:15.5278804Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5279399Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-23T20:46:15.5279661Z 6196 │ .pipe(Effect.forkScoped); 2026-10-23T20:46:15.5279957Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-23T20:46:15.5280251Z 6198 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5280511Z 6199 │ ╰─▶ } 2026-10-23T20:46:15.5280822Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-23T20:46:15.5281047Z ╰──── 2026-10-23T20:46:15.5281107Z 2026-10-23T20:46:15.5281351Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-23T20:46:15.5281713Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-23T20:46:15.5281988Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-23T20:46:15.5282365Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-23T20:46:15.5282715Z 986 │ │ (approval) => approval.requestId, 2026-10-23T20:46:15.5282984Z 987 │ ╰─▶ ); 2026-10-23T20:46:15.5283262Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-23T20:46:15.5283473Z ╰──── 2026-10-23T20:46:15.5283614Z  help: Switch to `Set` 2026-10-23T20:46:15.5283715Z 2026-10-23T20:46:15.5283877Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-23T20:46:15.5284168Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-23T20:46:15.5284434Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-23T20:46:15.5284690Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-23T20:46:15.5284905Z ·  ───────────────────────────── 2026-10-23T20:46:15.5285150Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-23T20:46:15.5285344Z ╰──── 2026-10-23T20:46:15.5285560Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-23T20:46:15.5285728Z 2026-10-23T20:46:15.5286258Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5286848Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-23T20:46:15.5287051Z 93 │ ) { 2026-10-23T20:46:15.5287324Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T20:46:15.5287690Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-23T20:46:15.5287988Z 96 │ │ if (predicate(project)) return project; 2026-10-23T20:46:15.5288222Z 97 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5288472Z 98 │ ╰─▶ } 2026-10-23T20:46:15.5288758Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-23T20:46:15.5288968Z ╰──── 2026-10-23T20:46:15.5289026Z 2026-10-23T20:46:15.5289229Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-23T20:46:15.5289518Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-23T20:46:15.5289719Z  9 │ import * as Effect from "effect/Effect"; 2026-10-23T20:46:15.5289911Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-23T20:46:15.5290091Z ·  ──┬── 2026-10-23T20:46:15.5290320Z · ╰── 'Fiber' is imported here 2026-10-23T20:46:15.5290561Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-23T20:46:15.5290788Z ╰──── 2026-10-23T20:46:15.5290951Z  help: Consider removing this import. 2026-10-23T20:46:15.5291067Z 2026-10-23T20:46:15.5291269Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-23T20:46:15.5291563Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-23T20:46:15.5291753Z 16 │ import * as Ref from "effect/Ref"; 2026-10-23T20:46:15.5291945Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-23T20:46:15.5292138Z ·  ────┬─── 2026-10-23T20:46:15.5292367Z · ╰── 'Schedule' is imported here 2026-10-23T20:46:15.5292593Z 18 │ import * as Schema from "effect/Schema"; 2026-10-23T20:46:15.5292747Z ╰──── 2026-10-23T20:46:15.5292904Z  help: Consider removing this import. 2026-10-23T20:46:15.5293019Z 2026-10-23T20:46:15.5293334Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5293723Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-23T20:46:15.5293991Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-23T20:46:15.5294385Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-23T20:46:15.5294696Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5294988Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-23T20:46:15.5295329Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-23T20:46:15.5295559Z ╰──── 2026-10-23T20:46:15.5295721Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5295840Z 2026-10-23T20:46:15.5296101Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5296469Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-23T20:46:15.5296786Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-23T20:46:15.5297048Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-23T20:46:15.5297242Z ·  ┬ 2026-10-23T20:46:15.5297473Z · ╰── '_' is declared here 2026-10-23T20:46:15.5297710Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-23T20:46:15.5297880Z ╰──── 2026-10-23T20:46:15.5298037Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5298157Z 2026-10-23T20:46:15.5298351Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5298672Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-23T20:46:15.5298879Z 133 │ ); 2026-10-23T20:46:15.5299060Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-23T20:46:15.5299283Z ·  ┬ 2026-10-23T20:46:15.5299536Z · ╰── '_' is declared here 2026-10-23T20:46:15.5299750Z 135 │ Effect.succeed( 2026-10-23T20:46:15.5299884Z ╰──── 2026-10-23T20:46:15.5300040Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5300155Z 2026-10-23T20:46:15.5300341Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5300666Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-23T20:46:15.5300871Z 177 │ }); 2026-10-23T20:46:15.5301037Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-23T20:46:15.5301239Z ·  ┬ 2026-10-23T20:46:15.5301474Z · ╰── '_' is declared here 2026-10-23T20:46:15.5301711Z 179 │ switch (options.continuation ?? "queued") { 2026-10-23T20:46:15.5301877Z ╰──── 2026-10-23T20:46:15.5302036Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5302150Z 2026-10-23T20:46:15.5302336Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5302656Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-23T20:46:15.5302856Z 202 │ ); 2026-10-23T20:46:15.5303078Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-23T20:46:15.5303313Z ·  ┬ 2026-10-23T20:46:15.5303553Z · ╰── '_' is declared here 2026-10-23T20:46:15.5303776Z 204 │ options.removeWorktreeFails 2026-10-23T20:46:15.5303932Z ╰──── 2026-10-23T20:46:15.5304093Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5304212Z 2026-10-23T20:46:15.5304427Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5304751Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-23T20:46:15.5304954Z 207 │ ); 2026-10-23T20:46:15.5305129Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-23T20:46:15.5305347Z ·  ┬ 2026-10-23T20:46:15.5305606Z · ╰── '_' is declared here 2026-10-23T20:46:15.5305835Z 209 │ options.deleteLocalBranchFails 2026-10-23T20:46:15.5305999Z ╰──── 2026-10-23T20:46:15.5306159Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5306276Z 2026-10-23T20:46:15.5306465Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5306786Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-23T20:46:15.5306989Z 212 │ ); 2026-10-23T20:46:15.5307173Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-23T20:46:15.5307406Z ·  ┬ 2026-10-23T20:46:15.5307670Z · ╰── '_' is declared here 2026-10-23T20:46:15.5307905Z 214 │ options.fetchWorktreeBaseFails 2026-10-23T20:46:15.5308070Z ╰──── 2026-10-23T20:46:15.5308228Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5308345Z 2026-10-23T20:46:15.5308536Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5308855Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-23T20:46:15.5309060Z 253 │ ); 2026-10-23T20:46:15.5309219Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-23T20:46:15.5309422Z ·  ┬ 2026-10-23T20:46:15.5309663Z · ╰── '_' is declared here 2026-10-23T20:46:15.5309868Z 255 │ Effect.succeed({ 2026-10-23T20:46:15.5310009Z ╰──── 2026-10-23T20:46:15.5310171Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5310293Z 2026-10-23T20:46:15.5310479Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5310801Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-23T20:46:15.5311006Z 263 │ ); 2026-10-23T20:46:15.5311223Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-23T20:46:15.5311482Z ·  ┬ 2026-10-23T20:46:15.5311731Z · ╰── '_' is declared here 2026-10-23T20:46:15.5312020Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-23T20:46:15.5312234Z ╰──── 2026-10-23T20:46:15.5312402Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5312520Z 2026-10-23T20:46:15.5312930Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5313442Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-23T20:46:15.5313670Z 1443 │ 2026-10-23T20:46:15.5313860Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-23T20:46:15.5314118Z ·  ───────────────────┬─────────────────── 2026-10-23T20:46:15.5314487Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-23T20:46:15.5314814Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-23T20:46:15.5315009Z ╰──── 2026-10-23T20:46:15.5315181Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5315312Z 2026-10-23T20:46:15.5315580Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5315999Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-23T20:46:15.5316224Z 1679 │ 2026-10-23T20:46:15.5316370Z 1680 │ const layer: Layer.Layer< 2026-10-23T20:46:15.5316538Z ·  ──┬── 2026-10-23T20:46:15.5316756Z · ╰── 'layer' is declared here 2026-10-23T20:46:15.5316989Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T20:46:15.5317157Z ╰──── 2026-10-23T20:46:15.5317322Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5317442Z 2026-10-23T20:46:15.5317750Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5318161Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-23T20:46:15.5318358Z 217 │ 2026-10-23T20:46:15.5318573Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-23T20:46:15.5318829Z ·  ──────────┬────────── 2026-10-23T20:46:15.5319095Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-23T20:46:15.5319444Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-23T20:46:15.5319696Z ╰──── 2026-10-23T20:46:15.5319858Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5319982Z 2026-10-23T20:46:15.5320303Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5320728Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-23T20:46:15.5320923Z 220 │ 2026-10-23T20:46:15.5321119Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-23T20:46:15.5321375Z ·  ──────────────┬────────────── 2026-10-23T20:46:15.5321666Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-23T20:46:15.5322009Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-23T20:46:15.5322233Z ╰──── 2026-10-23T20:46:15.5322398Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5322515Z 2026-10-23T20:46:15.5322843Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-23T20:46:15.5323311Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-23T20:46:15.5323550Z 959 │ 2026-10-23T20:46:15.5323730Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-23T20:46:15.5323976Z ·  ──────────────────┬───────────────── 2026-10-23T20:46:15.5324306Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-23T20:46:15.5324668Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-23T20:46:15.5324846Z ╰──── 2026-10-23T20:46:15.5325015Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5325139Z 2026-10-23T20:46:15.5325403Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5325835Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-23T20:46:15.5326067Z 10577 │ 2026-10-23T20:46:15.5326209Z 10578 │ const layer: Layer.Layer< 2026-10-23T20:46:15.5326379Z ·  ──┬── 2026-10-23T20:46:15.5326603Z · ╰── 'layer' is declared here 2026-10-23T20:46:15.5326837Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T20:46:15.5327012Z ╰──── 2026-10-23T20:46:15.5327178Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5327299Z 2026-10-23T20:46:15.5327514Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-23T20:46:15.5327828Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-23T20:46:15.5328096Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-23T20:46:15.5328372Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-23T20:46:15.5328596Z ·  ──────┬────── 2026-10-23T20:46:15.5328845Z · ╰── 'HookForwarder' is imported here 2026-10-23T20:46:15.5329094Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-23T20:46:15.5329271Z ╰──── 2026-10-23T20:46:15.5329431Z  help: Consider removing this import. 2026-10-23T20:46:15.5329548Z 2026-10-23T20:46:15.5329822Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5330250Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-23T20:46:15.5330486Z 76 │ 2026-10-23T20:46:15.5330861Z 77 │ useEffect(() => { 2026-10-23T20:46:15.5331030Z ·  ────┬──── 2026-10-23T20:46:15.5331253Z · ╰── This is the containing effect 2026-10-23T20:46:15.5331523Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-23T20:46:15.5331733Z 79 │ setHostInput(host); 2026-10-23T20:46:15.5331905Z ·  ──────┬───── 2026-10-23T20:46:15.5332171Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5332410Z 80 │ setCodeInput(code); 2026-10-23T20:46:15.5332558Z ╰──── 2026-10-23T20:46:15.5333313Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5334246Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5334602Z 2026-10-23T20:46:15.5334870Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5335300Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-23T20:46:15.5335534Z 82 │ 2026-10-23T20:46:15.5335661Z 83 │ useEffect(() => { 2026-10-23T20:46:15.5335821Z ·  ────┬──── 2026-10-23T20:46:15.5336047Z · ╰── This is the containing effect 2026-10-23T20:46:15.5336276Z 84 │ if (routePairingUrl.length === 0) { 2026-10-23T20:46:15.5336455Z 85 │ return; 2026-10-23T20:46:15.5336588Z 86 │ } 2026-10-23T20:46:15.5336710Z 87 │ 2026-10-23T20:46:15.5336888Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-23T20:46:15.5337094Z 89 │ setHostInput(host); 2026-10-23T20:46:15.5337260Z ·  ──────┬───── 2026-10-23T20:46:15.5337521Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5337757Z 90 │ setCodeInput(code); 2026-10-23T20:46:15.5337896Z ╰──── 2026-10-23T20:46:15.5338565Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5339444Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5339753Z 2026-10-23T20:46:15.5340018Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5340444Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-23T20:46:15.5340674Z 92 │ 2026-10-23T20:46:15.5340802Z 93 │ useEffect(() => { 2026-10-23T20:46:15.5340960Z ·  ────┬──── 2026-10-23T20:46:15.5341179Z · ╰── This is the containing effect 2026-10-23T20:46:15.5341403Z 94 │ if (pairingConnectionError) { 2026-10-23T20:46:15.5341580Z 95 │ setIsSubmitting(false); 2026-10-23T20:46:15.5341768Z ·  ───────┬─────── 2026-10-23T20:46:15.5342049Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5342275Z 96 │ } 2026-10-23T20:46:15.5342392Z ╰──── 2026-10-23T20:46:15.5349053Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5349982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5350292Z 2026-10-23T20:46:15.5350666Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5351078Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-23T20:46:15.5351267Z 168 │ 2026-10-23T20:46:15.5351407Z 169 │ const layerTest = Layer.succeed( 2026-10-23T20:46:15.5351589Z ·  ────┬──── 2026-10-23T20:46:15.5351818Z · ╰── 'layerTest' is declared here 2026-10-23T20:46:15.5352024Z 170 │ UsageService, 2026-10-23T20:46:15.5352157Z ╰──── 2026-10-23T20:46:15.5352319Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5352441Z 2026-10-23T20:46:15.5352605Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5352934Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-23T20:46:15.5353201Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-23T20:46:15.5353410Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-23T20:46:15.5353603Z ·  ──────┬────── 2026-10-23T20:46:15.5353841Z · ╰── `pulseProgress` originates here 2026-10-23T20:46:15.5354042Z 55 │ 2026-10-23T20:46:15.5354170Z 56 │ useEffect(() => { 2026-10-23T20:46:15.5354320Z 57 │ if (pulse) { 2026-10-23T20:46:15.5354523Z 58 │ pulseProgress.value = withRepeat( 2026-10-23T20:46:15.5354714Z ·  ──────┬────── 2026-10-23T20:46:15.5354961Z · ╰── `pulseProgress` cannot be modified 2026-10-23T20:46:15.5355176Z 59 │ withTiming(1, { 2026-10-23T20:46:15.5355318Z ╰──── 2026-10-23T20:46:15.5355656Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5356239Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5356533Z 2026-10-23T20:46:15.5357005Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5357564Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-23T20:46:15.5357806Z 2382 │ let orphanedAt: number | undefined; 2026-10-23T20:46:15.5358218Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-23T20:46:15.5358589Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-23T20:46:15.5358876Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-23T20:46:15.5359166Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-23T20:46:15.5359409Z 2387 │ │ flush: () => { 2026-10-23T20:46:15.5359651Z 2388 │ │ let task: (() => void) | undefined; 2026-10-23T20:46:15.5359941Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-23T20:46:15.5360177Z 2390 │ │ }, 2026-10-23T20:46:15.5360363Z 2391 │ │ }; 2026-10-23T20:46:15.5360531Z 2392 │ │ 2026-10-23T20:46:15.5360793Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-23T20:46:15.5361068Z 2394 │ │ let requestChecks = 0; 2026-10-23T20:46:15.5361323Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-23T20:46:15.5361577Z 2396 │ │ executionMode: "async", 2026-10-23T20:46:15.5361826Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-23T20:46:15.5362074Z 2398 │ │ shouldYield: (fiber) => { 2026-10-23T20:46:15.5362336Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-23T20:46:15.5362585Z 2400 │ │ requestChecks += 1; 2026-10-23T20:46:15.5362853Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-23T20:46:15.5363120Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-23T20:46:15.5363350Z 2403 │ │ return true; 2026-10-23T20:46:15.5363547Z 2404 │ │ }, 2026-10-23T20:46:15.5363725Z 2405 │ │ }; 2026-10-23T20:46:15.5363897Z 2406 │ │ 2026-10-23T20:46:15.5364110Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-23T20:46:15.5364338Z 2408 │ │ ...WINDOW, 2026-10-23T20:46:15.5364612Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-23T20:46:15.5364950Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-23T20:46:15.5365221Z 2411 │ │ }; 2026-10-23T20:46:15.5365440Z 2412 │ │ const first = yield* service 2026-10-23T20:46:15.5365676Z 2413 │ │ .readSummary(input) 2026-10-23T20:46:15.5365885Z 2414 │ │ .pipe( 2026-10-23T20:46:15.5366090Z 2415 │ │ Effect.exit, 2026-10-23T20:46:15.5366368Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T20:46:15.5366639Z 2417 │ │ Effect.forkChild, 2026-10-23T20:46:15.5366838Z 2418 │ │ ); 2026-10-23T20:46:15.5367042Z 2419 │ │ requestFiber = first; 2026-10-23T20:46:15.5367267Z 2420 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5367495Z 2421 │ │ dispatcher.flush(); 2026-10-23T20:46:15.5367747Z 2422 │ │ 2026-10-23T20:46:15.5368022Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-23T20:46:15.5368278Z 2424 │ │ Effect.match({ 2026-10-23T20:46:15.5368524Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-23T20:46:15.5368785Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-23T20:46:15.5369007Z 2427 │ │ }), 2026-10-23T20:46:15.5369268Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-23T20:46:15.5369536Z 2429 │ │ Effect.forkChild, 2026-10-23T20:46:15.5369736Z 2430 │ │ ); 2026-10-23T20:46:15.5369944Z 2431 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5370173Z 2432 │ │ dispatcher.flush(); 2026-10-23T20:46:15.5370421Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-23T20:46:15.5370749Z 2434 │ │ if (secondExit === undefined) { 2026-10-23T20:46:15.5370996Z 2435 │ │ second.interruptUnsafe(); 2026-10-23T20:46:15.5371239Z 2436 │ │ orphanedAt = interruptAt; 2026-10-23T20:46:15.5371452Z 2437 │ │ break; 2026-10-23T20:46:15.5371639Z 2438 │ │ } 2026-10-23T20:46:15.5371860Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-23T20:46:15.5372161Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-23T20:46:15.5372409Z 2441 │ │ } 2026-10-23T20:46:15.5372663Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-23T20:46:15.5372957Z 2443 │ ╰─▶ } 2026-10-23T20:46:15.5373155Z 2444 │ 2026-10-23T20:46:15.5373276Z ╰──── 2026-10-23T20:46:15.5373336Z 2026-10-23T20:46:15.5373602Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5373984Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5] 2026-10-23T20:46:15.5374323Z 153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-23T20:46:15.5374613Z 154 │ useLayoutEffect(() => { 2026-10-23T20:46:15.5374785Z ·  ───────┬─────── 2026-10-23T20:46:15.5375027Z · ╰── This is the containing effect 2026-10-23T20:46:15.5375258Z 155 │ if (faviconRequest === null) return; 2026-10-23T20:46:15.5375420Z 156 │ 2026-10-23T20:46:15.5375615Z 157 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-23T20:46:15.5375859Z 158 │ setActiveFaviconRequest(faviconRequest); 2026-10-23T20:46:15.5376070Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5376354Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5376593Z 159 │ return endRequest; 2026-10-23T20:46:15.5376738Z ╰──── 2026-10-23T20:46:15.5377486Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5378394Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5378704Z 2026-10-23T20:46:15.5378915Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T20:46:15.5379294Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-23T20:46:15.5379539Z 14 │ } from "@t3tools/contracts"; 2026-10-23T20:46:15.5379727Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-23T20:46:15.5379907Z ·  ── 2026-10-23T20:46:15.5380180Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-23T20:46:15.5380423Z ╰──── 2026-10-23T20:46:15.5380567Z  help: Remove empty braces 2026-10-23T20:46:15.5380678Z 2026-10-23T20:46:15.5380946Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5381347Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-23T20:46:15.5381560Z 61 │ }, []); 2026-10-23T20:46:15.5381697Z 62 │ useEffect(() => { 2026-10-23T20:46:15.5381854Z ·  ────┬──── 2026-10-23T20:46:15.5382073Z · ╰── This is the containing effect 2026-10-23T20:46:15.5382364Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-23T20:46:15.5382649Z ·  ───────┬────── 2026-10-23T20:46:15.5382993Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5383265Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-23T20:46:15.5383420Z ╰──── 2026-10-23T20:46:15.5384081Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5384979Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5385286Z 2026-10-23T20:46:15.5385498Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-23T20:46:15.5385801Z ╭─[apps/web/src/types.ts:22:3] 2026-10-23T20:46:15.5385984Z 21 │ EnvironmentThreadShell, 2026-10-23T20:46:15.5386147Z 22 │ ThreadRunSummary, 2026-10-23T20:46:15.5386315Z ·  ────────┬─────── 2026-10-23T20:46:15.5386558Z · ╰── 'ThreadRunSummary' is imported here 2026-10-23T20:46:15.5386780Z 23 │ ThreadRuntimeSummary, 2026-10-23T20:46:15.5386924Z ╰──── 2026-10-23T20:46:15.5387081Z  help: Consider removing this import. 2026-10-23T20:46:15.5387201Z 2026-10-23T20:46:15.5387468Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5387916Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-23T20:46:15.5388204Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-23T20:46:15.5388389Z 67 │ useEffect(() => { 2026-10-23T20:46:15.5388545Z ·  ────┬──── 2026-10-23T20:46:15.5388770Z · ╰── This is the containing effect 2026-10-23T20:46:15.5388975Z 68 │ setUri(null); 2026-10-23T20:46:15.5389126Z ·  ───┬── 2026-10-23T20:46:15.5389381Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5389608Z 69 │ setError(null); 2026-10-23T20:46:15.5389744Z ╰──── 2026-10-23T20:46:15.5390412Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5391287Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5391592Z 2026-10-23T20:46:15.5391799Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5392147Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-23T20:46:15.5392351Z 90 │ }; 2026-10-23T20:46:15.5392497Z 91 │ }, [attachmentId, fileUri]); 2026-10-23T20:46:15.5392714Z ·  ──────┬───── ───┬─── 2026-10-23T20:46:15.5393023Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-23T20:46:15.5393356Z · ╰── Unnecessary dependency `attachmentId` 2026-10-23T20:46:15.5393649Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-23T20:46:15.5393844Z ╰──── 2026-10-23T20:46:15.5394200Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5394837Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5395137Z 2026-10-23T20:46:15.5395356Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T20:46:15.5395712Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-23T20:46:15.5395938Z 212 │ useEffect(() => { 2026-10-23T20:46:15.5396144Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-23T20:46:15.5396377Z ·  ──┬── 2026-10-23T20:46:15.5396642Z · ╰── Missing dependency `props` 2026-10-23T20:46:15.5396904Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-23T20:46:15.5397140Z ·  ──────────┬───────── 2026-10-23T20:46:15.5397499Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-23T20:46:15.5397786Z 215 │ const { source } = props; 2026-10-23T20:46:15.5397932Z ╰──── 2026-10-23T20:46:15.5398480Z  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5399222Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5399525Z 2026-10-23T20:46:15.5399698Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T20:46:15.5400014Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-23T20:46:15.5400221Z 185 │ 2026-10-23T20:46:15.5400387Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-23T20:46:15.5400580Z ·  ── 2026-10-23T20:46:15.5400722Z 187 │ } 2026-10-23T20:46:15.5400836Z ╰──── 2026-10-23T20:46:15.5401134Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T20:46:15.5401367Z 2026-10-23T20:46:15.5401540Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T20:46:15.5401853Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-23T20:46:15.5402126Z 188 │ 2026-10-23T20:46:15.5402254Z 189 │ for (const {} of [ 2026-10-23T20:46:15.5402410Z ·  ── 2026-10-23T20:46:15.5402592Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-23T20:46:15.5402756Z ╰──── 2026-10-23T20:46:15.5403042Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T20:46:15.5403270Z 2026-10-23T20:46:15.5403446Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T20:46:15.5403758Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-23T20:46:15.5403960Z 310 │ 2026-10-23T20:46:15.5404150Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-23T20:46:15.5404369Z ·  ── 2026-10-23T20:46:15.5404544Z 312 │ } 2026-10-23T20:46:15.5404656Z ╰──── 2026-10-23T20:46:15.5404944Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T20:46:15.5405173Z 2026-10-23T20:46:15.5405343Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T20:46:15.5405655Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-23T20:46:15.5405857Z 313 │ 2026-10-23T20:46:15.5405985Z 314 │ for (const {} of [ 2026-10-23T20:46:15.5406143Z ·  ── 2026-10-23T20:46:15.5406291Z 315 │ { 2026-10-23T20:46:15.5406406Z ╰──── 2026-10-23T20:46:15.5406692Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T20:46:15.5406919Z 2026-10-23T20:46:15.5407127Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5407459Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-23T20:46:15.5407657Z 81 │ }, 2026-10-23T20:46:15.5407789Z 82 │ [draftKey], 2026-10-23T20:46:15.5407943Z ·  ────┬─── 2026-10-23T20:46:15.5408176Z · ╰── Unnecessary dependency `draftKey` 2026-10-23T20:46:15.5408378Z 83 │ ); 2026-10-23T20:46:15.5408494Z ╰──── 2026-10-23T20:46:15.5408943Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5409582Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5409884Z 2026-10-23T20:46:15.5410153Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5410584Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:7] 2026-10-23T20:46:15.5410912Z 330 │ }; 2026-10-23T20:46:15.5411050Z 331 │ useEffect(() => { 2026-10-23T20:46:15.5411212Z ·  ────┬──── 2026-10-23T20:46:15.5411443Z · ╰── This is the containing effect 2026-10-23T20:46:15.5411689Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T20:46:15.5411905Z 333 │ requestedSection.current = "overview"; 2026-10-23T20:46:15.5412194Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T20:46:15.5412447Z 335 │ setSection("overview"); 2026-10-23T20:46:15.5412619Z ·  ─────┬──── 2026-10-23T20:46:15.5412892Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5413118Z 336 │ } 2026-10-23T20:46:15.5413239Z ╰──── 2026-10-23T20:46:15.5413916Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5414834Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5415147Z 2026-10-23T20:46:15.5415359Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T20:46:15.5415740Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:337:6] 2026-10-23T20:46:15.5416019Z 332 │ if (!guidesEnabled && section === "guide") { 2026-10-23T20:46:15.5416234Z 333 │ requestedSection.current = "overview"; 2026-10-23T20:46:15.5416432Z ·  ────────┬─────── 2026-10-23T20:46:15.5417062Z · ╰── Missing dependency `requestedSection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5417673Z 334 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-23T20:46:15.5418008Z ·  ─────────┬───────── ──────┬────── 2026-10-23T20:46:15.5418665Z · │ ╰── Missing dependency `scrollOffsets`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5419565Z · ╰── Missing dependency `currentScrollOffset`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5420057Z 335 │ setSection("overview"); 2026-10-23T20:46:15.5420209Z 336 │ } 2026-10-23T20:46:15.5420373Z 337 │ }, [guidesEnabled, section, insets.top]); 2026-10-23T20:46:15.5420605Z ·  ──────────────────┬───────────────── 2026-10-23T20:46:15.5420924Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5421203Z 338 │ const tabContent = activityContent; 2026-10-23T20:46:15.5421363Z ╰──── 2026-10-23T20:46:15.5421593Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T20:46:15.5422096Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5422403Z 2026-10-23T20:46:15.5422616Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-23T20:46:15.5422994Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6] 2026-10-23T20:46:15.5423229Z 856 │ if ( 2026-10-23T20:46:15.5423417Z 857 │ lastSelection.current.path === route.params.path && 2026-10-23T20:46:15.5423632Z ·  ──────┬────── 2026-10-23T20:46:15.5424171Z · ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5424730Z 858 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-23T20:46:15.5424932Z 859 │ ) 2026-10-23T20:46:15.5425066Z 860 │ return; 2026-10-23T20:46:15.5425321Z 861 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-23T20:46:15.5425643Z 862 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-23T20:46:15.5425885Z 863 │ setJumpPath(route.params.path); 2026-10-23T20:46:15.5426069Z 864 │ setSelectedRowId(null); 2026-10-23T20:46:15.5426243Z 865 │ jumpStarted.current = false; 2026-10-23T20:46:15.5426496Z 866 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-23T20:46:15.5426751Z 867 │ if (!file || !nativeView.current) return; 2026-10-23T20:46:15.5426955Z ·  ─────┬──── 2026-10-23T20:46:15.5427561Z · ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5428113Z 868 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-23T20:46:15.5428333Z 869 │ jumpStarted.current = true; 2026-10-23T20:46:15.5428572Z 870 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-23T20:46:15.5428809Z 871 │ jumpStarted.current = false; 2026-10-23T20:46:15.5428969Z 872 │ }); 2026-10-23T20:46:15.5429239Z 873 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-23T20:46:15.5429655Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-23T20:46:15.5430076Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5430400Z 874 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-23T20:46:15.5430581Z ╰──── 2026-10-23T20:46:15.5430809Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-23T20:46:15.5431306Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5431608Z 2026-10-23T20:46:15.5431759Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5432073Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-23T20:46:15.5432417Z 151 │ 2026-10-23T20:46:15.5432689Z 152 │ {props.children(open)} 2026-10-23T20:46:15.5432884Z ·  ──┬─ 2026-10-23T20:46:15.5433150Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5433369Z 153 │ 2026-10-23T20:46:15.5433502Z ╰──── 2026-10-23T20:46:15.5434038Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5434805Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5435092Z 2026-10-23T20:46:15.5435301Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-23T20:46:15.5435658Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-23T20:46:15.5435901Z 139 │ if (action.id !== undefined) { 2026-10-23T20:46:15.5436087Z 140 │ props.onPressAction?.({ 2026-10-23T20:46:15.5436259Z ·  ──┬── 2026-10-23T20:46:15.5436486Z · ╰── Missing dependency `props` 2026-10-23T20:46:15.5436723Z 141 │ nativeEvent: { event: action.id }, 2026-10-23T20:46:15.5436986Z 142 │ } as Parameters>[0]); 2026-10-23T20:46:15.5437199Z 143 │ } 2026-10-23T20:46:15.5437323Z 144 │ }, 2026-10-23T20:46:15.5437473Z 145 │ [close, props.onPressAction], 2026-10-23T20:46:15.5437674Z ·  ─────────┬───────── 2026-10-23T20:46:15.5438063Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-23T20:46:15.5438356Z 146 │ ); 2026-10-23T20:46:15.5438473Z ╰──── 2026-10-23T20:46:15.5439017Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI. Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often 2026-10-23T20:46:15.5439780Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5440081Z 2026-10-23T20:46:15.5440564Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5441143Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-23T20:46:15.5441437Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-23T20:46:15.5441737Z 133 │ ╭─▶ for ( 2026-10-23T20:46:15.5441990Z 134 │ │ let attempt = 0; 2026-10-23T20:46:15.5442285Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-23T20:46:15.5442557Z 136 │ │ attempt += 1 2026-10-23T20:46:15.5442758Z 137 │ │ ) { 2026-10-23T20:46:15.5442983Z 138 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5443257Z 139 │ ╰─▶ } 2026-10-23T20:46:15.5443528Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-23T20:46:15.5443720Z ╰──── 2026-10-23T20:46:15.5443777Z 2026-10-23T20:46:15.5443996Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-23T20:46:15.5444335Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-23T20:46:15.5444565Z 78 │ 2026-10-23T20:46:15.5444765Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-23T20:46:15.5445008Z ·  ────────┬─────── 2026-10-23T20:46:15.5445262Z · ╰── 'describeSchedule' is declared here 2026-10-23T20:46:15.5445527Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-23T20:46:15.5445709Z ╰──── 2026-10-23T20:46:15.5445878Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5446003Z 2026-10-23T20:46:15.5446477Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5447092Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-23T20:46:15.5447353Z 520 │ })).delivery; 2026-10-23T20:46:15.5447647Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-23T20:46:15.5447950Z 522 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5448289Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-23T20:46:15.5448580Z 524 │ │ id: task.id, 2026-10-23T20:46:15.5448816Z 525 │ │ deliveryId: deliveryId!, 2026-10-23T20:46:15.5449045Z 526 │ │ })).delivery; 2026-10-23T20:46:15.5449303Z 527 │ ╰─▶ } 2026-10-23T20:46:15.5449564Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-23T20:46:15.5449747Z ╰──── 2026-10-23T20:46:15.5449803Z 2026-10-23T20:46:15.5449954Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5450264Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-23T20:46:15.5450488Z 493 │ > 2026-10-23T20:46:15.5450803Z 494 │ {props.children(close)} 2026-10-23T20:46:15.5451001Z ·  ──┬── 2026-10-23T20:46:15.5451265Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5451498Z 495 │ 2026-10-23T20:46:15.5451648Z ╰──── 2026-10-23T20:46:15.5452182Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5452911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5453199Z 2026-10-23T20:46:15.5453469Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-23T20:46:15.5453876Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-23T20:46:15.5454089Z 1619 │ 2026-10-23T20:46:15.5454375Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-23T20:46:15.5454742Z ·  ──────────────────┬────────────────── 2026-10-23T20:46:15.5455068Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-23T20:46:15.5455345Z 1621 │ const meta = response._meta; 2026-10-23T20:46:15.5455497Z ╰──── 2026-10-23T20:46:15.5455664Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5455787Z 2026-10-23T20:46:15.5456071Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-23T20:46:15.5456441Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-23T20:46:15.5456680Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-23T20:46:15.5456965Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-23T20:46:15.5457259Z 159 │ │ constructor(data: Record) { 2026-10-23T20:46:15.5457520Z 160 │ │ clipboardItemConstructor(data); 2026-10-23T20:46:15.5457725Z 161 │ │ } 2026-10-23T20:46:15.5457948Z 162 │ ╰─▶ }, 2026-10-23T20:46:15.5458149Z 163 │ clipboard: { 2026-10-23T20:46:15.5458284Z ╰──── 2026-10-23T20:46:15.5458518Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-23T20:46:15.5458698Z 2026-10-23T20:46:15.5458964Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5459345Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-23T20:46:15.5459539Z 407 │ 2026-10-23T20:46:15.5459672Z 408 │ const layer: Layer.Layer< 2026-10-23T20:46:15.5459835Z ·  ──┬── 2026-10-23T20:46:15.5460053Z · ╰── 'layer' is declared here 2026-10-23T20:46:15.5460278Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-23T20:46:15.5460443Z ╰──── 2026-10-23T20:46:15.5460603Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5460723Z 2026-10-23T20:46:15.5460943Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-23T20:46:15.5461302Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-23T20:46:15.5461511Z 233 │ 2026-10-23T20:46:15.5461690Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-23T20:46:15.5461908Z ·  ───────┬────── 2026-10-23T20:46:15.5462157Z · ╰── 'nonEmptyString' is declared here 2026-10-23T20:46:15.5462445Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-23T20:46:15.5462649Z ╰──── 2026-10-23T20:46:15.5462808Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5462930Z 2026-10-23T20:46:15.5463099Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-23T20:46:15.5463431Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12] 2026-10-23T20:46:15.5463660Z 1428 │ 2026-10-23T20:46:15.5463788Z 1429 │ for (const [] of [ 2026-10-23T20:46:15.5463950Z ·  ── 2026-10-23T20:46:15.5464113Z 1430 │ ["github", "github.com"], 2026-10-23T20:46:15.5464259Z ╰──── 2026-10-23T20:46:15.5464628Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-23T20:46:15.5464898Z 2026-10-23T20:46:15.5465666Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-23T20:46:15.5466208Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-23T20:46:15.5466499Z 128 │ const secret = "acp-summary-secret"; 2026-10-23T20:46:15.5466753Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-23T20:46:15.5467002Z ·  ────────────────────────── 2026-10-23T20:46:15.5467194Z 130 │ Schema.Struct({ 2026-10-23T20:46:15.5467334Z ╰──── 2026-10-23T20:46:15.5467389Z 2026-10-23T20:46:15.5467772Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5468230Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-23T20:46:15.5468513Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-23T20:46:15.5468858Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-23T20:46:15.5469145Z ·  ────────────────────────── 2026-10-23T20:46:15.5469406Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-23T20:46:15.5469616Z ╰──── 2026-10-23T20:46:15.5469673Z 2026-10-23T20:46:15.5470150Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5470715Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-23T20:46:15.5470927Z 130 │ ) { 2026-10-23T20:46:15.5471221Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T20:46:15.5471554Z 132 │ │ if (subscriptions.length >= count) { 2026-10-23T20:46:15.5471790Z 133 │ │ return; 2026-10-23T20:46:15.5471980Z 134 │ │ } 2026-10-23T20:46:15.5472191Z 135 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5472452Z 136 │ ╰─▶ } 2026-10-23T20:46:15.5472759Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-23T20:46:15.5472980Z ╰──── 2026-10-23T20:46:15.5473038Z 2026-10-23T20:46:15.5473512Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5474074Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-23T20:46:15.5474412Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-23T20:46:15.5474839Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-23T20:46:15.5475184Z 253 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5475440Z 254 │ ╰─▶ } 2026-10-23T20:46:15.5475703Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-23T20:46:15.5475890Z ╰──── 2026-10-23T20:46:15.5475947Z 2026-10-23T20:46:15.5476477Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5477062Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-23T20:46:15.5477262Z 257 │ 2026-10-23T20:46:15.5477578Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T20:46:15.5477921Z 259 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5478174Z 260 │ ╰─▶ } 2026-10-23T20:46:15.5478421Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T20:46:15.5478593Z ╰──── 2026-10-23T20:46:15.5478652Z 2026-10-23T20:46:15.5479126Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5479688Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-23T20:46:15.5479896Z 321 │ ); 2026-10-23T20:46:15.5480233Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-23T20:46:15.5480580Z 323 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5480834Z 324 │ ╰─▶ } 2026-10-23T20:46:15.5481028Z 325 │ 2026-10-23T20:46:15.5481144Z ╰──── 2026-10-23T20:46:15.5481201Z 2026-10-23T20:46:15.5481672Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5482225Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-23T20:46:15.5482535Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-23T20:46:15.5482960Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-23T20:46:15.5483299Z 331 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5483551Z 332 │ ╰─▶ } 2026-10-23T20:46:15.5483797Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-23T20:46:15.5483968Z ╰──── 2026-10-23T20:46:15.5484026Z 2026-10-23T20:46:15.5484403Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5484836Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-23T20:46:15.5485133Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-23T20:46:15.5485428Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-23T20:46:15.5485648Z ·  ───────── 2026-10-23T20:46:15.5485806Z 19 │ expect( 2026-10-23T20:46:15.5485933Z ╰──── 2026-10-23T20:46:15.5485991Z 2026-10-23T20:46:15.5486331Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5486823Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-23T20:46:15.5487045Z 19 │ expect( 2026-10-23T20:46:15.5487286Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-23T20:46:15.5487537Z ·  ───────── 2026-10-23T20:46:15.5487696Z 21 │ ).toBe(true); 2026-10-23T20:46:15.5487830Z ╰──── 2026-10-23T20:46:15.5487884Z 2026-10-23T20:46:15.5488353Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-23T20:46:15.5488903Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-23T20:46:15.5489092Z 499 │ 2026-10-23T20:46:15.5489279Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-23T20:46:15.5489534Z ·  ────────────────────────── 2026-10-23T20:46:15.5489772Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-23T20:46:15.5489950Z ╰──── 2026-10-23T20:46:15.5490008Z 2026-10-23T20:46:15.5490483Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5491105Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-23T20:46:15.5491308Z 225 │ ) { 2026-10-23T20:46:15.5491586Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T20:46:15.5491903Z 227 │ │ const socket = sockets[index]; 2026-10-23T20:46:15.5492123Z 228 │ │ if (socket) { 2026-10-23T20:46:15.5492327Z 229 │ │ return socket; 2026-10-23T20:46:15.5492514Z 230 │ │ } 2026-10-23T20:46:15.5492714Z 231 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5492964Z 232 │ ╰─▶ } 2026-10-23T20:46:15.5493276Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-23T20:46:15.5493510Z ╰──── 2026-10-23T20:46:15.5493569Z 2026-10-23T20:46:15.5494036Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5494650Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-23T20:46:15.5494855Z 239 │ ) { 2026-10-23T20:46:15.5495129Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T20:46:15.5495537Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-23T20:46:15.5495842Z 242 │ │ if (request) { 2026-10-23T20:46:15.5496049Z 243 │ │ return request; 2026-10-23T20:46:15.5496239Z 244 │ │ } 2026-10-23T20:46:15.5496437Z 245 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5496686Z 246 │ ╰─▶ } 2026-10-23T20:46:15.5497062Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-23T20:46:15.5497327Z ╰──── 2026-10-23T20:46:15.5497383Z 2026-10-23T20:46:15.5497535Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5497811Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-23T20:46:15.5498122Z 53 │ const child = children as ReactElement>; 2026-10-23T20:46:15.5498483Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-23T20:46:15.5498760Z 55 │ │ onTouchStart: (event) => { 2026-10-23T20:46:15.5499047Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-23T20:46:15.5499375Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-23T20:46:15.5499672Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-23T20:46:15.5499982Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-23T20:46:15.5500268Z 60 │ │ pendingPress.current = null; 2026-10-23T20:46:15.5500520Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-23T20:46:15.5500731Z 62 │ │ }, 2026-10-23T20:46:15.5500932Z 63 │ │ onPress: (event) => { 2026-10-23T20:46:15.5501219Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-23T20:46:15.5501534Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-23T20:46:15.5501856Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-23T20:46:15.5502225Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-23T20:46:15.5502508Z 68 │ │ return; 2026-10-23T20:46:15.5502695Z 69 │ │ } 2026-10-23T20:46:15.5502937Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-23T20:46:15.5503258Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-23T20:46:15.5503600Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-23T20:46:15.5503875Z 73 │ │ event.persist(); 2026-10-23T20:46:15.5504157Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-23T20:46:15.5504422Z 75 │ │ return; 2026-10-23T20:46:15.5504636Z 76 │ │ } 2026-10-23T20:46:15.5504851Z 77 │ │ child.props.onPress?.(event); 2026-10-23T20:46:15.5505054Z 78 │ │ }, 2026-10-23T20:46:15.5505284Z 79 │ ├─▶ }); 2026-10-23T20:46:15.5505664Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5505997Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-23T20:46:15.5506175Z ╰──── 2026-10-23T20:46:15.5506772Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5507538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5507821Z 2026-10-23T20:46:15.5508165Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5508627Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-23T20:46:15.5508948Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-23T20:46:15.5509291Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T20:46:15.5509563Z ·  ───────── 2026-10-23T20:46:15.5509848Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T20:46:15.5510086Z ╰──── 2026-10-23T20:46:15.5510144Z 2026-10-23T20:46:15.5510481Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5510942Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-23T20:46:15.5511266Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-23T20:46:15.5511621Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-23T20:46:15.5511896Z ·  ───────── 2026-10-23T20:46:15.5512051Z 52 │ } 2026-10-23T20:46:15.5512174Z ╰──── 2026-10-23T20:46:15.5512234Z 2026-10-23T20:46:15.5512568Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5513020Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-23T20:46:15.5513237Z 54 │ assert.equal( 2026-10-23T20:46:15.5513496Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T20:46:15.5513747Z ·  ───────── 2026-10-23T20:46:15.5513897Z 56 │ true, 2026-10-23T20:46:15.5514019Z ╰──── 2026-10-23T20:46:15.5514075Z 2026-10-23T20:46:15.5514449Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5514949Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-23T20:46:15.5515195Z 58 │ assert.equal( 2026-10-23T20:46:15.5515458Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-23T20:46:15.5515717Z ·  ───────── 2026-10-23T20:46:15.5515862Z 60 │ true, 2026-10-23T20:46:15.5515983Z ╰──── 2026-10-23T20:46:15.5516039Z 2026-10-23T20:46:15.5516375Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5516831Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-23T20:46:15.5517045Z 102 │ 2026-10-23T20:46:15.5517277Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-23T20:46:15.5517544Z ·  ───────── 2026-10-23T20:46:15.5517700Z 104 │ }); 2026-10-23T20:46:15.5517817Z ╰──── 2026-10-23T20:46:15.5517871Z 2026-10-23T20:46:15.5518073Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T20:46:15.5518418Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-23T20:46:15.5518686Z 266 │ {record.elements?.map((element, index) => ( 2026-10-23T20:46:15.5518983Z 267 │ 2026-10-23T20:46:15.5519308Z ·  ─────────────────────────────────────────────────────── 2026-10-23T20:46:15.5519533Z 268 │ { 2026-10-23T20:46:15.5557710Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-23T20:46:15.5557928Z ·  ────┬─── 2026-10-23T20:46:15.5558173Z · ╰── `progress` cannot be modified 2026-10-23T20:46:15.5558384Z 69 │ }, [expanded, progress]); 2026-10-23T20:46:15.5558524Z ╰──── 2026-10-23T20:46:15.5558845Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5559408Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5559700Z 2026-10-23T20:46:15.5559909Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-23T20:46:15.5560242Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-23T20:46:15.5560481Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-23T20:46:15.5560827Z 24 │ import * as Duration from "effect/Duration"; 2026-10-23T20:46:15.5561056Z ·  ────┬─── 2026-10-23T20:46:15.5561285Z · ╰── 'Duration' is imported here 2026-10-23T20:46:15.5561507Z 25 │ import * as Effect from "effect/Effect"; 2026-10-23T20:46:15.5561659Z ╰──── 2026-10-23T20:46:15.5561810Z  help: Consider removing this import. 2026-10-23T20:46:15.5561921Z 2026-10-23T20:46:15.5562079Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5562401Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-23T20:46:15.5562622Z 90 │ }) { 2026-10-23T20:46:15.5562792Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-23T20:46:15.5562986Z ·  ────┬─── 2026-10-23T20:46:15.5563209Z · ╰── `rotation` originates here 2026-10-23T20:46:15.5563409Z 92 │ useLayoutEffect(() => { 2026-10-23T20:46:15.5563633Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-23T20:46:15.5563848Z ·  ────┬─── 2026-10-23T20:46:15.5564059Z · ╰── `rotation` cannot be modified 2026-10-23T20:46:15.5564267Z 94 │ }, [props.hidden, rotation]); 2026-10-23T20:46:15.5564422Z ╰──── 2026-10-23T20:46:15.5564766Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5565314Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5565603Z 2026-10-23T20:46:15.5565763Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5566084Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-23T20:46:15.5566348Z 266 │ const variant = props.variant ?? "plain"; 2026-10-23T20:46:15.5566584Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-23T20:46:15.5566807Z ·  ────────┬──────── 2026-10-23T20:46:15.5567048Z · ╰── `loadingVisibility` originates here 2026-10-23T20:46:15.5567257Z 268 │ useLayoutEffect(() => { 2026-10-23T20:46:15.5567496Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-23T20:46:15.5567737Z ·  ────────┬──────── 2026-10-23T20:46:15.5567984Z · ╰── `loadingVisibility` cannot be modified 2026-10-23T20:46:15.5568221Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-23T20:46:15.5568374Z ╰──── 2026-10-23T20:46:15.5568685Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5569230Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5569513Z 2026-10-23T20:46:15.5569666Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5569984Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-23T20:46:15.5570205Z 325 │ }) { 2026-10-23T20:46:15.5570471Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-23T20:46:15.5570816Z ·  ─────────┬───────── 2026-10-23T20:46:15.5571068Z · ╰── `recordingVisibility` originates here 2026-10-23T20:46:15.5571279Z 327 │ useLayoutEffect(() => { 2026-10-23T20:46:15.5571548Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-23T20:46:15.5571816Z ·  ─────────┬───────── 2026-10-23T20:46:15.5572063Z · ╰── `recordingVisibility` cannot be modified 2026-10-23T20:46:15.5572300Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-23T20:46:15.5572454Z ╰──── 2026-10-23T20:46:15.5572766Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5573320Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5573607Z 2026-10-23T20:46:15.5573753Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5574057Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-23T20:46:15.5574406Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T20:46:15.5574693Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T20:46:15.5574946Z ·  ───────────┬────────── 2026-10-23T20:46:15.5575239Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5575523Z 123 │ const sessionRef = useRef(null); 2026-10-23T20:46:15.5575704Z ╰──── 2026-10-23T20:46:15.5576219Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5576926Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5577196Z 2026-10-23T20:46:15.5577339Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5577642Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-23T20:46:15.5577853Z 125 │ 2026-10-23T20:46:15.5578022Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T20:46:15.5578227Z ·  ─────────┬──────── 2026-10-23T20:46:15.5578469Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5578712Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T20:46:15.5578874Z ╰──── 2026-10-23T20:46:15.5579385Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5580091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5580363Z 2026-10-23T20:46:15.5580569Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5580903Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-23T20:46:15.5581115Z 125 │ 2026-10-23T20:46:15.5581280Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T20:46:15.5581481Z ·  ─────────┬───────── 2026-10-23T20:46:15.5581719Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5581961Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T20:46:15.5582120Z ╰──── 2026-10-23T20:46:15.5582628Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5583326Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5583600Z 2026-10-23T20:46:15.5583741Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5584043Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-23T20:46:15.5584255Z 125 │ 2026-10-23T20:46:15.5584452Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T20:46:15.5584682Z ·  ─────────┬───────── 2026-10-23T20:46:15.5584960Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5585214Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T20:46:15.5585375Z ╰──── 2026-10-23T20:46:15.5585890Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5586588Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5586858Z 2026-10-23T20:46:15.5586999Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5587298Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-23T20:46:15.5587507Z 125 │ 2026-10-23T20:46:15.5587665Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T20:46:15.5587940Z ·  ──────────┬───────── 2026-10-23T20:46:15.5588244Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5588496Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T20:46:15.5588657Z ╰──── 2026-10-23T20:46:15.5589166Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5589861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5590132Z 2026-10-23T20:46:15.5590273Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5590578Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-23T20:46:15.5590849Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T20:46:15.5591155Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-23T20:46:15.5591505Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T20:46:15.5591631Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-23T20:46:15.5591781Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T20:46:15.5591902Z 131 │ │ isFinished: status.isFinished, 2026-10-23T20:46:15.5592076Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T20:46:15.5592189Z 133 │ │ error: status.error, 2026-10-23T20:46:15.5592288Z 134 │ │ url: status.url, 2026-10-23T20:46:15.5592367Z 135 │ │ }); 2026-10-23T20:46:15.5592444Z 136 │ │ }, 2026-10-23T20:46:15.5592636Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T20:46:15.5592741Z 138 │ │ selectInput: (inputs) => { 2026-10-23T20:46:15.5592892Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T20:46:15.5593035Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T20:46:15.5593195Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T20:46:15.5593334Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-23T20:46:15.5593438Z 143 │ │ if (order !== known) { 2026-10-23T20:46:15.5593574Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T20:46:15.5593688Z 145 │ │ transform: (current) => ({ 2026-10-23T20:46:15.5593886Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T20:46:15.5593971Z 147 │ │ }), 2026-10-23T20:46:15.5594052Z 148 │ │ }); 2026-10-23T20:46:15.5594128Z 149 │ │ } 2026-10-23T20:46:15.5594262Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-23T20:46:15.5594417Z 151 │ │ }, 2026-10-23T20:46:15.5594572Z 152 │ ├─▶ }); 2026-10-23T20:46:15.5594805Z · ╰──── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5594889Z 153 │ recorderRef.current = recorder; 2026-10-23T20:46:15.5594940Z ╰──── 2026-10-23T20:46:15.5595397Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5595684Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5595692Z 2026-10-23T20:46:15.5595841Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5595999Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-23T20:46:15.5596057Z 152 │ }); 2026-10-23T20:46:15.5596140Z 153 │ recorderRef.current = recorder; 2026-10-23T20:46:15.5596253Z ·  ─────┬─────────┬─── 2026-10-23T20:46:15.5596436Z · │ ╰── Cannot update ref value during render 2026-10-23T20:46:15.5596554Z · ╰── This value is a ref 2026-10-23T20:46:15.5596660Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T20:46:15.5596712Z ╰──── 2026-10-23T20:46:15.5597181Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5597473Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5597476Z 2026-10-23T20:46:15.5597620Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5597780Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-23T20:46:15.5597865Z 153 │ recorderRef.current = recorder; 2026-10-23T20:46:15.5598057Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-23T20:46:15.5598149Z 155 │ │ recorder, 2026-10-23T20:46:15.5598282Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T20:46:15.5598398Z 157 │ │ requestPermission: async () => { 2026-10-23T20:46:15.5598564Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T20:46:15.5598759Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T20:46:15.5598836Z 160 │ │ }, 2026-10-23T20:46:15.5598978Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T20:46:15.5599113Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T20:46:15.5599246Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T20:46:15.5599409Z 164 │ │ onStateChange: (nextState) => 2026-10-23T20:46:15.5599526Z 165 │ │ setState({ 2026-10-23T20:46:15.5599627Z 166 │ │ state: nextState, 2026-10-23T20:46:15.5599763Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T20:46:15.5599892Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-23T20:46:15.5599973Z 169 │ │ }), 2026-10-23T20:46:15.5600102Z 170 │ ├─▶ }); 2026-10-23T20:46:15.5600301Z · ╰──── Cannot access ref value during render 2026-10-23T20:46:15.5600358Z 171 │ } 2026-10-23T20:46:15.5600410Z ╰──── 2026-10-23T20:46:15.5600882Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5601175Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5601180Z 2026-10-23T20:46:15.5601325Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5601485Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-23T20:46:15.5601567Z 153 │ recorderRef.current = recorder; 2026-10-23T20:46:15.5601670Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T20:46:15.5601788Z ·  ─────┬────────┬─── 2026-10-23T20:46:15.5601974Z · │ ╰── Cannot update ref value during render 2026-10-23T20:46:15.5602093Z · ╰── This value is a ref 2026-10-23T20:46:15.5602159Z 155 │ recorder, 2026-10-23T20:46:15.5602209Z ╰──── 2026-10-23T20:46:15.5602675Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5602964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5602966Z 2026-10-23T20:46:15.5603118Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5603276Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-23T20:46:15.5603364Z 184 │ return () => subscription.remove(); 2026-10-23T20:46:15.5603430Z 185 │ }, [controller]); 2026-10-23T20:46:15.5603508Z ·  ─────┬──── 2026-10-23T20:46:15.5603652Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5603707Z 186 │ 2026-10-23T20:46:15.5603757Z ╰──── 2026-10-23T20:46:15.5604221Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5604591Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5604619Z 2026-10-23T20:46:15.5604762Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5604918Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-23T20:46:15.5605006Z 184 │ return () => subscription.remove(); 2026-10-23T20:46:15.5605071Z 185 │ }, [controller]); 2026-10-23T20:46:15.5605148Z ·  ──────┬───── 2026-10-23T20:46:15.5605292Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5605345Z 186 │ 2026-10-23T20:46:15.5605396Z ╰──── 2026-10-23T20:46:15.5605872Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5606170Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5606173Z 2026-10-23T20:46:15.5606318Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5606477Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-23T20:46:15.5606535Z 191 │ }, 2026-10-23T20:46:15.5606608Z 192 │ [controller, recorder], 2026-10-23T20:46:15.5606686Z ·  ─────┬──── 2026-10-23T20:46:15.5606832Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5606888Z 193 │ ); 2026-10-23T20:46:15.5606944Z ╰──── 2026-10-23T20:46:15.5607421Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5607714Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5607716Z 2026-10-23T20:46:15.5607863Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5608022Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-23T20:46:15.5608114Z 174 │ const controller = session.controller; 2026-10-23T20:46:15.5608203Z 175 │ const recorder = recorderRef.current; 2026-10-23T20:46:15.5608316Z ·  ─────────┬───────── 2026-10-23T20:46:15.5608477Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5608531Z 176 │ 2026-10-23T20:46:15.5608584Z ╰──── 2026-10-23T20:46:15.5609058Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5609351Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5609354Z 2026-10-23T20:46:15.5609499Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5609709Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-23T20:46:15.5609796Z 191 │ }, 2026-10-23T20:46:15.5609868Z 192 │ [controller, recorder], 2026-10-23T20:46:15.5609958Z ·  ───────────┬────────── 2026-10-23T20:46:15.5610108Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5610163Z 193 │ ); 2026-10-23T20:46:15.5610215Z ╰──── 2026-10-23T20:46:15.5610734Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5611026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5611034Z 2026-10-23T20:46:15.5611184Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5611345Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-23T20:46:15.5611437Z 245 │ return () => clearInterval(intervalId); 2026-10-23T20:46:15.5611548Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T20:46:15.5611638Z ·  ─────┬──── 2026-10-23T20:46:15.5611796Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5611849Z 247 │ 2026-10-23T20:46:15.5611899Z ╰──── 2026-10-23T20:46:15.5612378Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5612675Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5612678Z 2026-10-23T20:46:15.5612824Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5612988Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-23T20:46:15.5613080Z 245 │ return () => clearInterval(intervalId); 2026-10-23T20:46:15.5613190Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-23T20:46:15.5613323Z ·  ────────────────────────┬─────────────────────── 2026-10-23T20:46:15.5613491Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5613547Z 247 │ 2026-10-23T20:46:15.5613598Z ╰──── 2026-10-23T20:46:15.5614071Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5614399Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5614401Z 2026-10-23T20:46:15.5614546Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5614707Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-23T20:46:15.5614777Z 260 │ setOwnerFocused, 2026-10-23T20:46:15.5614840Z 261 │ session, 2026-10-23T20:46:15.5614973Z ·  ───┬─── 2026-10-23T20:46:15.5615151Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5615213Z 262 │ stop, 2026-10-23T20:46:15.5615265Z ╰──── 2026-10-23T20:46:15.5615737Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5616030Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5616032Z 2026-10-23T20:46:15.5616179Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5616342Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-23T20:46:15.5616400Z 250 │ 2026-10-23T20:46:15.5616542Z 251 │ ╭─▶ return { 2026-10-23T20:46:15.5616757Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-23T20:46:15.5616839Z 253 │ │ state, 2026-10-23T20:46:15.5616929Z 254 │ │ audioLevels, 2026-10-23T20:46:15.5617023Z 255 │ │ elapsedSeconds, 2026-10-23T20:46:15.5617156Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-23T20:46:15.5617238Z 257 │ │ ownerKey, 2026-10-23T20:46:15.5617317Z 258 │ │ label, 2026-10-23T20:46:15.5617414Z 259 │ │ focusedOwners, 2026-10-23T20:46:15.5617512Z 260 │ │ setOwnerFocused, 2026-10-23T20:46:15.5617596Z 261 │ │ session, 2026-10-23T20:46:15.5617675Z 262 │ │ stop, 2026-10-23T20:46:15.5617755Z 263 │ │ cancel, 2026-10-23T20:46:15.5617887Z 264 │ ├─▶ }; 2026-10-23T20:46:15.5618092Z · ╰──── Cannot access ref value during render 2026-10-23T20:46:15.5618147Z 265 │ } 2026-10-23T20:46:15.5618199Z ╰──── 2026-10-23T20:46:15.5618718Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5619035Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5619037Z 2026-10-23T20:46:15.5619197Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5619358Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T20:46:15.5619517Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-23T20:46:15.5619643Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-23T20:46:15.5619723Z ·  ─────┬───── 2026-10-23T20:46:15.5619860Z · ╰── `audioLevels` originates here 2026-10-23T20:46:15.5619985Z 123 │ const sessionRef = useRef(null); 2026-10-23T20:46:15.5620135Z 124 │ const recorderRef = useRef | null>(null); 2026-10-23T20:46:15.5620188Z 125 │ 2026-10-23T20:46:15.5620296Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-23T20:46:15.5620395Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-23T20:46:15.5620536Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-23T20:46:15.5620632Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-23T20:46:15.5620752Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-23T20:46:15.5620837Z 131 │ isFinished: status.isFinished, 2026-10-23T20:46:15.5620983Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-23T20:46:15.5621057Z 133 │ error: status.error, 2026-10-23T20:46:15.5621132Z 134 │ url: status.url, 2026-10-23T20:46:15.5621193Z 135 │ }); 2026-10-23T20:46:15.5621251Z 136 │ }, 2026-10-23T20:46:15.5621419Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-23T20:46:15.5621500Z 138 │ selectInput: (inputs) => { 2026-10-23T20:46:15.5621623Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-23T20:46:15.5621737Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-23T20:46:15.5621869Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-23T20:46:15.5621980Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-23T20:46:15.5622057Z 143 │ if (order !== known) { 2026-10-23T20:46:15.5622163Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-23T20:46:15.5622253Z 145 │ transform: (current) => ({ 2026-10-23T20:46:15.5622431Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-23T20:46:15.5622493Z 147 │ }), 2026-10-23T20:46:15.5622556Z 148 │ }); 2026-10-23T20:46:15.5622614Z 149 │ } 2026-10-23T20:46:15.5622723Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-23T20:46:15.5622781Z 151 │ }, 2026-10-23T20:46:15.5622837Z 152 │ }); 2026-10-23T20:46:15.5622922Z 153 │ recorderRef.current = recorder; 2026-10-23T20:46:15.5623022Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-23T20:46:15.5623085Z 155 │ recorder, 2026-10-23T20:46:15.5623185Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-23T20:46:15.5623271Z 157 │ requestPermission: async () => { 2026-10-23T20:46:15.5623448Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-23T20:46:15.5623631Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-23T20:46:15.5623689Z 160 │ }, 2026-10-23T20:46:15.5623800Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-23T20:46:15.5623906Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-23T20:46:15.5624009Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-23T20:46:15.5624091Z 164 │ onStateChange: (nextState) => 2026-10-23T20:46:15.5624157Z 165 │ setState({ 2026-10-23T20:46:15.5624226Z 166 │ state: nextState, 2026-10-23T20:46:15.5624333Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-23T20:46:15.5624473Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-23T20:46:15.5624534Z 169 │ }), 2026-10-23T20:46:15.5624588Z 170 │ }); 2026-10-23T20:46:15.5624647Z 171 │ } 2026-10-23T20:46:15.5624702Z 172 │ 2026-10-23T20:46:15.5624786Z 173 │ const session = sessionRef.current; 2026-10-23T20:46:15.5624876Z 174 │ const controller = session.controller; 2026-10-23T20:46:15.5624964Z 175 │ const recorder = recorderRef.current; 2026-10-23T20:46:15.5625017Z 176 │ 2026-10-23T20:46:15.5625082Z 177 │ useEffect(() => { 2026-10-23T20:46:15.5625235Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-23T20:46:15.5625376Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-23T20:46:15.5625516Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-23T20:46:15.5625621Z 181 │ // calls and route interruptions during capture. 2026-10-23T20:46:15.5625762Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-23T20:46:15.5625820Z 183 │ }); 2026-10-23T20:46:15.5625906Z 184 │ return () => subscription.remove(); 2026-10-23T20:46:15.5625970Z 185 │ }, [controller]); 2026-10-23T20:46:15.5626023Z 186 │ 2026-10-23T20:46:15.5626083Z 187 │ useEffect( 2026-10-23T20:46:15.5626147Z 188 │ () => () => { 2026-10-23T20:46:15.5626218Z 189 │ controller.dispose(); 2026-10-23T20:46:15.5626287Z 190 │ recorder.release(); 2026-10-23T20:46:15.5626342Z 191 │ }, 2026-10-23T20:46:15.5626412Z 192 │ [controller, recorder], 2026-10-23T20:46:15.5626464Z 193 │ ); 2026-10-23T20:46:15.5626516Z 194 │ 2026-10-23T20:46:15.5626580Z 195 │ useEffect(() => { 2026-10-23T20:46:15.5626673Z 196 │ if (state.phase !== "recording") return; 2026-10-23T20:46:15.5626724Z 197 │ 2026-10-23T20:46:15.5626881Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-23T20:46:15.5626988Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-23T20:46:15.5627069Z 200 │ void activation.catch(() => {}); 2026-10-23T20:46:15.5627133Z 201 │ return () => { 2026-10-23T20:46:15.5627284Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-23T20:46:15.5627422Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-23T20:46:15.5627476Z 204 │ }; 2026-10-23T20:46:15.5627555Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-23T20:46:15.5627607Z 206 │ 2026-10-23T20:46:15.5627671Z 207 │ useEffect(() => { 2026-10-23T20:46:15.5627805Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T20:46:15.5627858Z 209 │ 2026-10-23T20:46:15.5628033Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T20:46:15.5628213Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T20:46:15.5628315Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T20:46:15.5628397Z ·  ─────┬───── 2026-10-23T20:46:15.5628538Z · ╰── `audioLevels` cannot be modified 2026-10-23T20:46:15.5628593Z 213 │ } 2026-10-23T20:46:15.5628643Z ╰──── 2026-10-23T20:46:15.5628916Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5629227Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5629230Z 2026-10-23T20:46:15.5629440Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T20:46:15.5629602Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-23T20:46:15.5629653Z 206 │ 2026-10-23T20:46:15.5629718Z 207 │ useEffect(() => { 2026-10-23T20:46:15.5629795Z ·  ───┬─── 2026-10-23T20:46:15.5630015Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-23T20:46:15.5630151Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-23T20:46:15.5630202Z 209 │ 2026-10-23T20:46:15.5630324Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-23T20:46:15.5630478Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-23T20:46:15.5630585Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-23T20:46:15.5630669Z ·  ─────┬───── 2026-10-23T20:46:15.5630804Z · ╰── This modifies `audioLevels` 2026-10-23T20:46:15.5630860Z 213 │ } 2026-10-23T20:46:15.5630910Z ╰──── 2026-10-23T20:46:15.5631252Z  help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead 2026-10-23T20:46:15.5631559Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5631562Z 2026-10-23T20:46:15.5631827Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-23T20:46:15.5631977Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-23T20:46:15.5632136Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-23T20:46:15.5632216Z 12 │ this.onmessage = listener; 2026-10-23T20:46:15.5632297Z ·  ───────── 2026-10-23T20:46:15.5632351Z 13 │ } 2026-10-23T20:46:15.5632403Z ╰──── 2026-10-23T20:46:15.5632719Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-23T20:46:15.5632722Z 2026-10-23T20:46:15.5632929Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T20:46:15.5633073Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-23T20:46:15.5633185Z 15 │ constructor() { 2026-10-23T20:46:15.5633277Z 16 │ source = this; 2026-10-23T20:46:15.5633351Z ·  ────── 2026-10-23T20:46:15.5633404Z 17 │ } 2026-10-23T20:46:15.5633456Z ╰──── 2026-10-23T20:46:15.5633731Z  help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well. 2026-10-23T20:46:15.5633734Z 2026-10-23T20:46:15.5633995Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5634130Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-23T20:46:15.5634182Z 57 │ 2026-10-23T20:46:15.5634247Z 58 │ useEffect(() => { 2026-10-23T20:46:15.5634319Z ·  ────┬──── 2026-10-23T20:46:15.5634495Z · ╰── This is the containing effect 2026-10-23T20:46:15.5634592Z 59 │ const controller = new AbortController(); 2026-10-23T20:46:15.5634665Z 60 │ setLoadState("pending"); 2026-10-23T20:46:15.5634745Z ·  ──────┬───── 2026-10-23T20:46:15.5634915Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5635076Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-23T20:46:15.5635128Z ╰──── 2026-10-23T20:46:15.5635736Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5636066Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5636071Z 2026-10-23T20:46:15.5636274Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5636408Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-23T20:46:15.5636490Z 70 │ return () => controller.abort(); 2026-10-23T20:46:15.5636586Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-23T20:46:15.5636764Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-23T20:46:15.5636993Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-23T20:46:15.5637201Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-23T20:46:15.5637343Z · ╰── Unnecessary dependency `player_0` 2026-10-23T20:46:15.5637394Z 72 │ 2026-10-23T20:46:15.5637443Z ╰──── 2026-10-23T20:46:15.5637740Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5638054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5638057Z 2026-10-23T20:46:15.5638203Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5638419Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-23T20:46:15.5638527Z 26 │ const latestInput = useRef(input); 2026-10-23T20:46:15.5638606Z 27 │ latestInput.current = input; 2026-10-23T20:46:15.5638716Z ·  ─────┬─────────┬─── 2026-10-23T20:46:15.5638898Z · │ ╰── Cannot update ref value during render 2026-10-23T20:46:15.5639013Z · ╰── This value is a ref 2026-10-23T20:46:15.5639089Z 28 │ const mounted = useRef(true); 2026-10-23T20:46:15.5639140Z ╰──── 2026-10-23T20:46:15.5639615Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5639911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5639916Z 2026-10-23T20:46:15.5640178Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5640310Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-23T20:46:15.5640364Z 3404 │ 2026-10-23T20:46:15.5640552Z 3405 │ const layer: Layer.Layer = 2026-10-23T20:46:15.5640626Z ·  ──┬── 2026-10-23T20:46:15.5640752Z · ╰── 'layer' is declared here 2026-10-23T20:46:15.5640820Z 3406 │ Layer.effect( 2026-10-23T20:46:15.5640872Z ╰──── 2026-10-23T20:46:15.5640984Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5640989Z 2026-10-23T20:46:15.5641439Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-23T20:46:15.5641571Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-23T20:46:15.5641710Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-23T20:46:15.5641898Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-23T20:46:15.5642014Z ·  ─────────────────── 2026-10-23T20:46:15.5642109Z 1044 │ expect(encoded).not.toContain(url); 2026-10-23T20:46:15.5642168Z ╰──── 2026-10-23T20:46:15.5642173Z 2026-10-23T20:46:15.5642457Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5642616Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-23T20:46:15.5642667Z 14 │ 2026-10-23T20:46:15.5642738Z 15 │ const legacyCredentials = { 2026-10-23T20:46:15.5642823Z ·  ────────┬──────── 2026-10-23T20:46:15.5642970Z · ╰── 'legacyCredentials' is declared here 2026-10-23T20:46:15.5643040Z 16 │ version: 1 as const, 2026-10-23T20:46:15.5643091Z ╰──── 2026-10-23T20:46:15.5643195Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5643198Z 2026-10-23T20:46:15.5643608Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5643776Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-23T20:46:15.5643912Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-23T20:46:15.5644060Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-23T20:46:15.5644175Z ·  ─────────────────── 2026-10-23T20:46:15.5644239Z 1787 │ cwd, 2026-10-23T20:46:15.5644291Z ╰──── 2026-10-23T20:46:15.5644293Z 2026-10-23T20:46:15.5644548Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T20:46:15.5644689Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-23T20:46:15.5644757Z 20 │ [instanceId]: { 2026-10-23T20:46:15.5644837Z 21 │ ...(state[instanceId] ?? {}), 2026-10-23T20:46:15.5644941Z ·  ──────────────────────────── 2026-10-23T20:46:15.5645012Z 22 │ [model]: options, 2026-10-23T20:46:15.5645063Z ╰──── 2026-10-23T20:46:15.5645332Z  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback. 2026-10-23T20:46:15.5645335Z 2026-10-23T20:46:15.5645573Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-23T20:46:15.5645696Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-23T20:46:15.5645799Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-23T20:46:15.5645944Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-23T20:46:15.5646034Z ·  ─────────────── 2026-10-23T20:46:15.5646088Z 510 │ ) 2026-10-23T20:46:15.5646141Z ╰──── 2026-10-23T20:46:15.5646295Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-23T20:46:15.5646298Z 2026-10-23T20:46:15.5646770Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5646949Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-23T20:46:15.5647020Z 222 │ let idlePasses = 0; 2026-10-23T20:46:15.5647215Z 223 │ ╭─▶ for (;;) { 2026-10-23T20:46:15.5647495Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-23T20:46:15.5647641Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-23T20:46:15.5647736Z 226 │ │ if (!pending) { 2026-10-23T20:46:15.5647831Z 227 │ │ idlePasses++; 2026-10-23T20:46:15.5647939Z 228 │ │ if (idlePasses >= 3) { 2026-10-23T20:46:15.5648039Z 229 │ │ return; 2026-10-23T20:46:15.5648117Z 230 │ │ } 2026-10-23T20:46:15.5648203Z 231 │ │ continue; 2026-10-23T20:46:15.5648280Z 232 │ │ } 2026-10-23T20:46:15.5648374Z 233 │ │ idlePasses = 0; 2026-10-23T20:46:15.5648494Z 234 │ │ const exit = yield* Effect.exit( 2026-10-23T20:46:15.5648711Z 235 │ │ pending.operation as Effect.Effect, 2026-10-23T20:46:15.5648788Z 236 │ │ ); 2026-10-23T20:46:15.5648896Z 237 │ │ yield* Effect.sync(() => { 2026-10-23T20:46:15.5649000Z 238 │ │ pending.resolve(exit); 2026-10-23T20:46:15.5649077Z 239 │ │ }); 2026-10-23T20:46:15.5649208Z 240 │ ╰─▶ } 2026-10-23T20:46:15.5649266Z 241 │ }, 2026-10-23T20:46:15.5649316Z ╰──── 2026-10-23T20:46:15.5649319Z 2026-10-23T20:46:15.5649694Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5649824Z ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17] 2026-10-23T20:46:15.5649958Z 235 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-23T20:46:15.5650089Z 236 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-23T20:46:15.5650196Z ·  ──────────────────────── 2026-10-23T20:46:15.5650336Z 237 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-23T20:46:15.5650389Z ╰──── 2026-10-23T20:46:15.5650391Z 2026-10-23T20:46:15.5650823Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5650953Z ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26] 2026-10-23T20:46:15.5651055Z 254 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-23T20:46:15.5651211Z 255 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-23T20:46:15.5651327Z ·  ──────────────────────── 2026-10-23T20:46:15.5651387Z 256 │ return [ 2026-10-23T20:46:15.5651438Z ╰──── 2026-10-23T20:46:15.5651440Z 2026-10-23T20:46:15.5651641Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-23T20:46:15.5651747Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-23T20:46:15.5651833Z 27 │ import * as Schema from "effect/Schema"; 2026-10-23T20:46:15.5651927Z 28 │ import { identity } from "effect/Function"; 2026-10-23T20:46:15.5652002Z ·  ────┬─── 2026-10-23T20:46:15.5652201Z · ╰── 'identity' is imported here 2026-10-23T20:46:15.5652323Z 29 │ import * as Layer from "effect/Layer"; 2026-10-23T20:46:15.5652375Z ╰──── 2026-10-23T20:46:15.5652472Z  help: Consider removing this import. 2026-10-23T20:46:15.5652474Z 2026-10-23T20:46:15.5652756Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T20:46:15.5652885Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-23T20:46:15.5652942Z 248 │ }, 2026-10-23T20:46:15.5653025Z 249 │ (effect, flow, stopSessions) => 2026-10-23T20:46:15.5653117Z ·  ──────┬───── 2026-10-23T20:46:15.5653265Z · ╰── 'stopSessions' is declared here 2026-10-23T20:46:15.5653336Z 250 │ effect.pipe( 2026-10-23T20:46:15.5653390Z ╰──── 2026-10-23T20:46:15.5653493Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5653496Z 2026-10-23T20:46:15.5653697Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5653812Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-23T20:46:15.5653886Z 28 │ getPendingThreadOrder(); 2026-10-23T20:46:15.5653965Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-23T20:46:15.5654086Z ·  ────┬──── ───────┬────── 2026-10-23T20:46:15.5654278Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T20:46:15.5654458Z · ╰── Unnecessary dependency `nowMinute` 2026-10-23T20:46:15.5654532Z 30 │ return pending; 2026-10-23T20:46:15.5654584Z ╰──── 2026-10-23T20:46:15.5654881Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5655196Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5655199Z 2026-10-23T20:46:15.5655428Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-23T20:46:15.5655546Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-23T20:46:15.5655597Z 11 │ 2026-10-23T20:46:15.5655692Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-23T20:46:15.5655797Z ·  ────────────┬──────────── 2026-10-23T20:46:15.5655966Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-23T20:46:15.5656032Z 13 │ readonly thread: { 2026-10-23T20:46:15.5656084Z ╰──── 2026-10-23T20:46:15.5656189Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5656192Z 2026-10-23T20:46:15.5656392Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5656534Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-23T20:46:15.5656614Z 1314 │ queuedMessagesByThreadKey, 2026-10-23T20:46:15.5656680Z 1315 │ retryTick, 2026-10-23T20:46:15.5656754Z ·  ────┬──── 2026-10-23T20:46:15.5656894Z · ╰── Unnecessary dependency `retryTick` 2026-10-23T20:46:15.5657017Z 1316 │ restoreQueuedMessage, 2026-10-23T20:46:15.5657095Z ╰──── 2026-10-23T20:46:15.5657388Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5657697Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5657700Z 2026-10-23T20:46:15.5657885Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-23T20:46:15.5658021Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-23T20:46:15.5658108Z 14 │ import * as Layer from "effect/Layer"; 2026-10-23T20:46:15.5658198Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-23T20:46:15.5658282Z ·  ──┬── 2026-10-23T20:46:15.5658414Z · ╰── 'Scope' is imported here 2026-10-23T20:46:15.5658501Z 16 │ import * as Stream from "effect/Stream"; 2026-10-23T20:46:15.5658550Z ╰──── 2026-10-23T20:46:15.5658646Z  help: Consider removing this import. 2026-10-23T20:46:15.5658649Z 2026-10-23T20:46:15.5658873Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T20:46:15.5658995Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-23T20:46:15.5659051Z 730 │ ); 2026-10-23T20:46:15.5659224Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-23T20:46:15.5659322Z ·  ────── 2026-10-23T20:46:15.5659441Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-23T20:46:15.5659493Z ╰──── 2026-10-23T20:46:15.5659663Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T20:46:15.5659666Z 2026-10-23T20:46:15.5659874Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-23T20:46:15.5659999Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-23T20:46:15.5660067Z 37 │ get isConnected() { 2026-10-23T20:46:15.5660158Z 38 │ let current: FakeElement | null = this; 2026-10-23T20:46:15.5660232Z ·  ─────── 2026-10-23T20:46:15.5660303Z 39 │ while (current?.parent) { 2026-10-23T20:46:15.5660353Z ╰──── 2026-10-23T20:46:15.5660634Z  help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well. 2026-10-23T20:46:15.5660638Z 2026-10-23T20:46:15.5660858Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T20:46:15.5660989Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-23T20:46:15.5661057Z 113 │ const declared = { 2026-10-23T20:46:15.5661148Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T20:46:15.5661260Z ·  ──────────────────────────────── 2026-10-23T20:46:15.5661364Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T20:46:15.5661415Z ╰──── 2026-10-23T20:46:15.5661676Z  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback. 2026-10-23T20:46:15.5661679Z 2026-10-23T20:46:15.5661949Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T20:46:15.5662107Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-23T20:46:15.5662196Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-23T20:46:15.5662297Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T20:46:15.5662418Z ·  ──────────────────────────────────────── 2026-10-23T20:46:15.5662515Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T20:46:15.5662570Z ╰──── 2026-10-23T20:46:15.5662833Z  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback. 2026-10-23T20:46:15.5662836Z 2026-10-23T20:46:15.5663053Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T20:46:15.5663182Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-23T20:46:15.5663287Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-23T20:46:15.5663381Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-23T20:46:15.5663496Z ·  ──────────────────────────────────── 2026-10-23T20:46:15.5663556Z 117 │ }; 2026-10-23T20:46:15.5663608Z ╰──── 2026-10-23T20:46:15.5663866Z  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback. 2026-10-23T20:46:15.5663869Z 2026-10-23T20:46:15.5664036Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T20:46:15.5664185Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-23T20:46:15.5664238Z 465 │ 2026-10-23T20:46:15.5664360Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-23T20:46:15.5664434Z ·  ── 2026-10-23T20:46:15.5664526Z 467 │ } 2026-10-23T20:46:15.5664578Z ╰──── 2026-10-23T20:46:15.5664808Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T20:46:15.5664811Z 2026-10-23T20:46:15.5665026Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T20:46:15.5665161Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-23T20:46:15.5665229Z 1021 │ instanceId, 2026-10-23T20:46:15.5665372Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-23T20:46:15.5665554Z ·  ────────────────────────────────────────────────── 2026-10-23T20:46:15.5665643Z 1023 │ ]), 2026-10-23T20:46:15.5665695Z ╰──── 2026-10-23T20:46:15.5665956Z  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback. 2026-10-23T20:46:15.5665959Z 2026-10-23T20:46:15.5666125Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5666247Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-23T20:46:15.5666350Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-23T20:46:15.5666507Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-23T20:46:15.5666627Z ·  ─────┬──── 2026-10-23T20:46:15.5666799Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5666884Z 822 │ return AsyncResult.failure( 2026-10-23T20:46:15.5666936Z ╰──── 2026-10-23T20:46:15.5667213Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5667508Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5667510Z 2026-10-23T20:46:15.5667678Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5667798Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-23T20:46:15.5667871Z 708 │ const wokeAt = resolved 2026-10-23T20:46:15.5668010Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-23T20:46:15.5668124Z ·  ─────┬──── 2026-10-23T20:46:15.5668284Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5668346Z 710 │ : null; 2026-10-23T20:46:15.5668396Z ╰──── 2026-10-23T20:46:15.5668672Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5668964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5668967Z 2026-10-23T20:46:15.5669250Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-23T20:46:15.5669382Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-23T20:46:15.5669437Z 284 │ }, 2026-10-23T20:46:15.5669518Z 285 │ (effect, flow, stopSessions) => 2026-10-23T20:46:15.5669613Z ·  ──────┬───── 2026-10-23T20:46:15.5669760Z · ╰── 'stopSessions' is declared here 2026-10-23T20:46:15.5669824Z 286 │ effect.pipe( 2026-10-23T20:46:15.5669880Z ╰──── 2026-10-23T20:46:15.5669983Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5669986Z 2026-10-23T20:46:15.5670460Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-23T20:46:15.5670628Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-23T20:46:15.5670711Z 262 │ ...(update._meta !== undefined 2026-10-23T20:46:15.5670877Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-23T20:46:15.5670963Z ·  ───────── 2026-10-23T20:46:15.5671022Z 264 │ : {}), 2026-10-23T20:46:15.5671074Z ╰──── 2026-10-23T20:46:15.5671076Z 2026-10-23T20:46:15.5671336Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5671466Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-23T20:46:15.5671575Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-23T20:46:15.5671648Z 84 │ useEffect(() => { 2026-10-23T20:46:15.5671720Z ·  ────┬──── 2026-10-23T20:46:15.5671849Z · ╰── This is the containing effect 2026-10-23T20:46:15.5671936Z 85 │ if (!actionState.isRunning) return; 2026-10-23T20:46:15.5672002Z 86 │ setNowMs(Date.now()); 2026-10-23T20:46:15.5672073Z ·  ────┬─── 2026-10-23T20:46:15.5672240Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5672366Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-23T20:46:15.5672416Z ╰──── 2026-10-23T20:46:15.5673023Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5673348Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5673351Z 2026-10-23T20:46:15.5673619Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5673727Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-23T20:46:15.5673780Z 35 │ 2026-10-23T20:46:15.5673911Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-23T20:46:15.5673985Z ·  ─────┬──── 2026-10-23T20:46:15.5674119Z · ╰── 'claudeCaps' is declared here 2026-10-23T20:46:15.5674193Z 37 │ optionDescriptors: [ 2026-10-23T20:46:15.5674245Z ╰──── 2026-10-23T20:46:15.5674384Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5674387Z 2026-10-23T20:46:15.5674544Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5674705Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-23T20:46:15.5674756Z 35 │ 2026-10-23T20:46:15.5674897Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-23T20:46:15.5674982Z ·  ────────┬──────── 2026-10-23T20:46:15.5675131Z · ╰── `inspectorProgress` originates here 2026-10-23T20:46:15.5675223Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T20:46:15.5675404Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T20:46:15.5675482Z 39 │ 2026-10-23T20:46:15.5675563Z 40 │ const onClosed = props.onClosed; 2026-10-23T20:46:15.5675628Z 41 │ useEffect(() => { 2026-10-23T20:46:15.5675717Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T20:46:15.5675798Z ·  ────────┬──────── 2026-10-23T20:46:15.5675947Z · ╰── `inspectorProgress` cannot be modified 2026-10-23T20:46:15.5676025Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T20:46:15.5676076Z ╰──── 2026-10-23T20:46:15.5676345Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5676652Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5676660Z 2026-10-23T20:46:15.5676819Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5676981Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-23T20:46:15.5677073Z 37 │ const { renderedInspectorWidth } = props; 2026-10-23T20:46:15.5677203Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-23T20:46:15.5677294Z ·  ──────────┬───────── 2026-10-23T20:46:15.5677449Z · ╰── `renderedContentWidth` originates here 2026-10-23T20:46:15.5677502Z 39 │ 2026-10-23T20:46:15.5677581Z 40 │ const onClosed = props.onClosed; 2026-10-23T20:46:15.5677644Z 41 │ useEffect(() => { 2026-10-23T20:46:15.5677732Z 42 │ inspectorProgress.value = withTiming( 2026-10-23T20:46:15.5677812Z 43 │ inspectorVisible ? 1 : 0, 2026-10-23T20:46:15.5677886Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-23T20:46:15.5677952Z 45 │ (finished) => { 2026-10-23T20:46:15.5678091Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-23T20:46:15.5678163Z 47 │ runOnJS(onClosed)(); 2026-10-23T20:46:15.5678219Z 48 │ } 2026-10-23T20:46:15.5678275Z 49 │ }, 2026-10-23T20:46:15.5678329Z 50 │ ); 2026-10-23T20:46:15.5678460Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-23T20:46:15.5678540Z 52 │ renderedInspectorWidth.set( 2026-10-23T20:46:15.5678684Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-23T20:46:15.5678738Z 54 │ ); 2026-10-23T20:46:15.5678791Z 55 │ }, [ 2026-10-23T20:46:15.5678861Z 56 │ inspectorProgress, 2026-10-23T20:46:15.5678935Z 57 │ inspectorVisible, 2026-10-23T20:46:15.5679004Z 58 │ inspectorWidth, 2026-10-23T20:46:15.5679063Z 59 │ onClosed, 2026-10-23T20:46:15.5679139Z 60 │ renderedInspectorWidth, 2026-10-23T20:46:15.5679200Z 61 │ resizing, 2026-10-23T20:46:15.5679255Z 62 │ ]); 2026-10-23T20:46:15.5679308Z 63 │ 2026-10-23T20:46:15.5679375Z 64 │ useEffect(() => { 2026-10-23T20:46:15.5679469Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-23T20:46:15.5679554Z 66 │ if (!inspectorVisible || resizing) { 2026-10-23T20:46:15.5679659Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-23T20:46:15.5679752Z ·  ──────────┬───────── 2026-10-23T20:46:15.5679916Z · ╰── `renderedContentWidth` cannot be modified 2026-10-23T20:46:15.5679976Z 68 │ return; 2026-10-23T20:46:15.5680031Z ╰──── 2026-10-23T20:46:15.5680360Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5680696Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5680699Z 2026-10-23T20:46:15.5680920Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T20:46:15.5681027Z ╭─[apps/mobile/src/Stack.tsx:1044:21] 2026-10-23T20:46:15.5681095Z 1043 │ } 2026-10-23T20:46:15.5681375Z ·  ───────────────────────────────────────────── 2026-10-23T20:46:15.5681450Z 1045 │ screenListeners={{ 2026-10-23T20:46:15.5681509Z ╰──── 2026-10-23T20:46:15.5681878Z  help: Move this component definition out of the parent component `AdaptiveRootStack` and pass data as props. If you want to allow component creation in props, set `allowAsProps` option to true. 2026-10-23T20:46:15.5681881Z 2026-10-23T20:46:15.5682087Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5682250Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-23T20:46:15.5682310Z 214 │ } 2026-10-23T20:46:15.5682383Z 215 │ }, [wrappedRender]); 2026-10-23T20:46:15.5682466Z ·  ──────┬────── 2026-10-23T20:46:15.5682619Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-23T20:46:15.5682678Z 216 │ 2026-10-23T20:46:15.5682740Z ╰──── 2026-10-23T20:46:15.5683037Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5683349Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5683355Z 2026-10-23T20:46:15.5683598Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T20:46:15.5683765Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-23T20:46:15.5683826Z 816 │ > 2026-10-23T20:46:15.5683940Z 817 │ 2026-10-23T20:46:15.5684063Z ·  ──────────────────── 2026-10-23T20:46:15.5684162Z 818 │ 2026-10-23T20:46:15.5685491Z 832 │ 2026-10-23T20:46:15.5685702Z ·  ──────────────────── 2026-10-23T20:46:15.5685860Z 833 │ 2026-10-23T20:46:15.5685960Z ╰──── 2026-10-23T20:46:15.5686195Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T20:46:15.5686370Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T20:46:15.5686373Z 2026-10-23T20:46:15.5686874Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-23T20:46:15.5687038Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-23T20:46:15.5687125Z 38 │ JSON.stringify( 2026-10-23T20:46:15.5687279Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-23T20:46:15.5687414Z ·  ──────────────────────── 2026-10-23T20:46:15.5687504Z 40 │ { name: "a" }, 2026-10-23T20:46:15.5687578Z ╰──── 2026-10-23T20:46:15.5687608Z 2026-10-23T20:46:15.5687810Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5688002Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-23T20:46:15.5688097Z 457 │ ): Array { 2026-10-23T20:46:15.5688238Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-23T20:46:15.5688360Z ·  ┬ 2026-10-23T20:46:15.5688541Z · ╰── '_' is declared here 2026-10-23T20:46:15.5688651Z 459 │ for (const b of data) { 2026-10-23T20:46:15.5688727Z ╰──── 2026-10-23T20:46:15.5688864Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5688867Z 2026-10-23T20:46:15.5689091Z ⚠ react(static-components): Cannot create components during render 2026-10-23T20:46:15.5689288Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-23T20:46:15.5689406Z 196 │ const { onInput, onResize } = props; 2026-10-23T20:46:15.5689560Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-23T20:46:15.5689737Z ·  ────────────────┬─────────────── 2026-10-23T20:46:15.5689961Z · ╰── The component is created during render here 2026-10-23T20:46:15.5690172Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-23T20:46:15.5690266Z 199 │ 2026-10-23T20:46:15.5690376Z 200 │ useEffect(() => { 2026-10-23T20:46:15.5690557Z 201 │ terminalDebugLog("native:surface", { 2026-10-23T20:46:15.5690730Z 202 │ terminalKey: props.terminalKey, 2026-10-23T20:46:15.5690822Z 203 │ native: hasNativeSurface, 2026-10-23T20:46:15.5690979Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-23T20:46:15.5691114Z 205 │ bufferLen: props.buffer.length, 2026-10-23T20:46:15.5691224Z 206 │ isRunning: props.isRunning, 2026-10-23T20:46:15.5691293Z 207 │ }); 2026-10-23T20:46:15.5691483Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-23T20:46:15.5691608Z 209 │ const handleNativeInput = useCallback( 2026-10-23T20:46:15.5691766Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-23T20:46:15.5691881Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-23T20:46:15.5691975Z 212 │ return; 2026-10-23T20:46:15.5692059Z 213 │ } 2026-10-23T20:46:15.5692196Z 214 │ terminalDebugLog("native:onInput", { 2026-10-23T20:46:15.5692362Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-23T20:46:15.5692454Z 216 │ }); 2026-10-23T20:46:15.5692575Z 217 │ onInput(event.nativeEvent.data); 2026-10-23T20:46:15.5692714Z 218 │ }, 2026-10-23T20:46:15.5692833Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-23T20:46:15.5692916Z 220 │ ); 2026-10-23T20:46:15.5693041Z 221 │ const handleNativeResize = useCallback( 2026-10-23T20:46:15.5693178Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-23T20:46:15.5693269Z 223 │ onResize({ 2026-10-23T20:46:15.5693399Z 224 │ cols: event.nativeEvent.cols, 2026-10-23T20:46:15.5693517Z 225 │ rows: event.nativeEvent.rows, 2026-10-23T20:46:15.5693609Z 226 │ }); 2026-10-23T20:46:15.5693669Z 227 │ }, 2026-10-23T20:46:15.5693780Z 228 │ [onResize], 2026-10-23T20:46:15.5693863Z 229 │ ); 2026-10-23T20:46:15.5693952Z 230 │ 2026-10-23T20:46:15.5694048Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-23T20:46:15.5694142Z 232 │ return ( 2026-10-23T20:46:15.5694260Z 233 │ 2026-10-23T20:46:15.5694408Z 234 │ { 2026-10-23T20:46:15.5698754Z ·  ────┬──── 2026-10-23T20:46:15.5698916Z · ╰── This is the containing effect 2026-10-23T20:46:15.5699064Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-23T20:46:15.5699152Z 641 │ return; 2026-10-23T20:46:15.5699250Z 642 │ } 2026-10-23T20:46:15.5699354Z 643 │ setPendingLaunchEntry({ 2026-10-23T20:46:15.5699476Z ·  ──────────┬────────── 2026-10-23T20:46:15.5699663Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5699786Z 644 │ key: launchTargetKey, 2026-10-23T20:46:15.5699865Z ╰──── 2026-10-23T20:46:15.5700554Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5700902Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5700905Z 2026-10-23T20:46:15.5701187Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5701400Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-23T20:46:15.5701486Z 648 │ 2026-10-23T20:46:15.5701585Z 649 │ useEffect(() => { 2026-10-23T20:46:15.5701663Z ·  ────┬──── 2026-10-23T20:46:15.5701843Z · ╰── This is the containing effect 2026-10-23T20:46:15.5701988Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-23T20:46:15.5702082Z 651 │ return; 2026-10-23T20:46:15.5702150Z 652 │ } 2026-10-23T20:46:15.5702264Z 653 │ setInitialAttachGridEntry({ 2026-10-23T20:46:15.5702396Z ·  ────────────┬──────────── 2026-10-23T20:46:15.5702606Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5702689Z 654 │ key: launchTargetKey, 2026-10-23T20:46:15.5702822Z ╰──── 2026-10-23T20:46:15.5703504Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5703897Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5703899Z 2026-10-23T20:46:15.5704186Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5704390Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-23T20:46:15.5704491Z 743 │ 2026-10-23T20:46:15.5704604Z 744 │ useEffect(() => { 2026-10-23T20:46:15.5704707Z ·  ────┬──── 2026-10-23T20:46:15.5704866Z · ╰── This is the containing effect 2026-10-23T20:46:15.5704973Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-23T20:46:15.5705091Z 746 │ setLastGridSize({ 2026-10-23T20:46:15.5705203Z ·  ───────┬─────── 2026-10-23T20:46:15.5705405Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5705503Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-23T20:46:15.5705590Z ╰──── 2026-10-23T20:46:15.5706224Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5706577Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5706580Z 2026-10-23T20:46:15.5706812Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5706989Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-23T20:46:15.5707155Z 537 │ }); 2026-10-23T20:46:15.5707313Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-23T20:46:15.5707451Z ·  ───────────┬────────── 2026-10-23T20:46:15.5707716Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-23T20:46:15.5707916Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-23T20:46:15.5708004Z ╰──── 2026-10-23T20:46:15.5708328Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5708669Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5708672Z 2026-10-23T20:46:15.5708876Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5709092Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-23T20:46:15.5709269Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-23T20:46:15.5709397Z 709 │ }, [terminalKey]); 2026-10-23T20:46:15.5709488Z ·  ─────┬───── 2026-10-23T20:46:15.5709665Z · ╰── Unnecessary dependency `terminalKey` 2026-10-23T20:46:15.5709755Z 710 │ 2026-10-23T20:46:15.5709838Z ╰──── 2026-10-23T20:46:15.5710137Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5710517Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5710520Z 2026-10-23T20:46:15.5710771Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5710973Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-23T20:46:15.5711058Z 799 │ }; 2026-10-23T20:46:15.5711251Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-23T20:46:15.5711461Z ·  ────────────┬──────────── ─────┬───── 2026-10-23T20:46:15.5711732Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-23T20:46:15.5711972Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-23T20:46:15.5712053Z 801 │ 2026-10-23T20:46:15.5712110Z ╰──── 2026-10-23T20:46:15.5712449Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5712794Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5712796Z 2026-10-23T20:46:15.5712971Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5713153Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-23T20:46:15.5713242Z 792 │ } 2026-10-23T20:46:15.5713390Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-23T20:46:15.5713533Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5713807Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5713919Z 794 │ 2026-10-23T20:46:15.5714017Z ╰──── 2026-10-23T20:46:15.5714550Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5714868Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5714871Z 2026-10-23T20:46:15.5715146Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5715340Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-23T20:46:15.5715545Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-23T20:46:15.5715642Z 113 │ useEffect(() => { 2026-10-23T20:46:15.5715727Z ·  ────┬──── 2026-10-23T20:46:15.5715882Z · ╰── This is the containing effect 2026-10-23T20:46:15.5716096Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-23T20:46:15.5716185Z 115 │ return; 2026-10-23T20:46:15.5716254Z 116 │ } 2026-10-23T20:46:15.5716404Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-23T20:46:15.5716509Z ·  ────┬─── 2026-10-23T20:46:15.5716714Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5716931Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-23T20:46:15.5717001Z ╰──── 2026-10-23T20:46:15.5717612Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5717969Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5717972Z 2026-10-23T20:46:15.5718228Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-23T20:46:15.5718386Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-23T20:46:15.5718582Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-23T20:46:15.5718712Z 35 │ instanceId === configured ? true : false, 2026-10-23T20:46:15.5718863Z ·  ──────────────────────────────────────── 2026-10-23T20:46:15.5718949Z 36 │ ); 2026-10-23T20:46:15.5719012Z ╰──── 2026-10-23T20:46:15.5719129Z  help: Remove this ternary operator 2026-10-23T20:46:15.5719132Z 2026-10-23T20:46:15.5719435Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5719592Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-23T20:46:15.5719660Z 727 │ 2026-10-23T20:46:15.5719768Z 728 │ const layer = layerWithOptions(); 2026-10-23T20:46:15.5719869Z ·  ──┬── 2026-10-23T20:46:15.5720149Z · ╰── 'layer' is declared here 2026-10-23T20:46:15.5720244Z ╰──── 2026-10-23T20:46:15.5720381Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5720383Z 2026-10-23T20:46:15.5720658Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5720892Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-23T20:46:15.5720973Z 117 │ 2026-10-23T20:46:15.5721053Z 118 │ useEffect(() => { 2026-10-23T20:46:15.5721151Z ·  ────┬──── 2026-10-23T20:46:15.5721314Z · ╰── This is the containing effect 2026-10-23T20:46:15.5721428Z 119 │ void refreshNotifications(); 2026-10-23T20:46:15.5721536Z ·  ──────────┬───────── 2026-10-23T20:46:15.5721741Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5721908Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-23T20:46:15.5722008Z ╰──── 2026-10-23T20:46:15.5722611Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5722956Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5722958Z 2026-10-23T20:46:15.5723243Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5723467Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-23T20:46:15.5723607Z 125 │ 2026-10-23T20:46:15.5723689Z 126 │ useEffect(() => { 2026-10-23T20:46:15.5723790Z ·  ────┬──── 2026-10-23T20:46:15.5723945Z · ╰── This is the containing effect 2026-10-23T20:46:15.5724058Z 127 │ if (!isLoaded) { 2026-10-23T20:46:15.5724160Z 128 │ setLiveActivityStatus("checking"); 2026-10-23T20:46:15.5724280Z ·  ──────────┬────────── 2026-10-23T20:46:15.5724515Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5724615Z 129 │ return; 2026-10-23T20:46:15.5724690Z ╰──── 2026-10-23T20:46:15.5725309Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5725658Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5725660Z 2026-10-23T20:46:15.5725850Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5726023Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-23T20:46:15.5726201Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-23T20:46:15.5726356Z 1996 │ createdAt: new Date().toISOString(), 2026-10-23T20:46:15.5726529Z ·  ─────┬──── 2026-10-23T20:46:15.5730742Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5730875Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-23T20:46:15.5730929Z ╰──── 2026-10-23T20:46:15.5731208Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5731501Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5731504Z 2026-10-23T20:46:15.5731736Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-23T20:46:15.5731860Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-23T20:46:15.5731963Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-23T20:46:15.5732091Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-23T20:46:15.5732248Z ·  ────────────────────────────────────────────────────────────── 2026-10-23T20:46:15.5732306Z 347 │ }; 2026-10-23T20:46:15.5732357Z ╰──── 2026-10-23T20:46:15.5732620Z  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback. 2026-10-23T20:46:15.5732623Z 2026-10-23T20:46:15.5732843Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-23T20:46:15.5732970Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-23T20:46:15.5733042Z 447 │ const favorites = 2026-10-23T20:46:15.5733149Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-23T20:46:15.5733238Z ·  ───┬── 2026-10-23T20:46:15.5733363Z · ╰── For this reduce 2026-10-23T20:46:15.5733444Z 449 │ const exists = current.some( 2026-10-23T20:46:15.5733615Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-23T20:46:15.5733672Z 451 │ ); 2026-10-23T20:46:15.5733745Z 452 │ return change.favorite 2026-10-23T20:46:15.5733807Z 453 │ ? exists 2026-10-23T20:46:15.5733868Z 454 │ ? current 2026-10-23T20:46:15.5734008Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-23T20:46:15.5734096Z ·  ─────┬──── 2026-10-23T20:46:15.5734217Z · ╰── From this spread 2026-10-23T20:46:15.5734284Z 456 │ : current.filter( 2026-10-23T20:46:15.5734336Z ╰──── 2026-10-23T20:46:15.5734579Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-23T20:46:15.5734739Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T20:46:15.5734742Z 2026-10-23T20:46:15.5734927Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T20:46:15.5735044Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-23T20:46:15.5735104Z 464 │ null; 2026-10-23T20:46:15.5735317Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-23T20:46:15.5735443Z ·  ──────────┬───────── 2026-10-23T20:46:15.5735572Z · ╰── From this accumulator 2026-10-23T20:46:15.5735672Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-23T20:46:15.5735739Z ·  ─┬─ 2026-10-23T20:46:15.5735841Z · ╰── For this loop 2026-10-23T20:46:15.5735975Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-23T20:46:15.5736043Z 468 │ hiddenModels: [], 2026-10-23T20:46:15.5736109Z 469 │ modelOrder: [], 2026-10-23T20:46:15.5736164Z 470 │ }; 2026-10-23T20:46:15.5736341Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-23T20:46:15.5736449Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-23T20:46:15.5736528Z 473 │ nextModelPreferences = { 2026-10-23T20:46:15.5736605Z 474 │ ...nextModelPreferences, 2026-10-23T20:46:15.5736702Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5736824Z · ╰── From this spread 2026-10-23T20:46:15.5736935Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-23T20:46:15.5736986Z ╰──── 2026-10-23T20:46:15.5737137Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T20:46:15.5737291Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T20:46:15.5737294Z 2026-10-23T20:46:15.5737761Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5737887Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-23T20:46:15.5737959Z 138 │ Effect.gen(function* () { 2026-10-23T20:46:15.5738153Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-23T20:46:15.5738276Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-23T20:46:15.5738598Z 141 │ │ // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock 2026-10-23T20:46:15.5738776Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-23T20:46:15.5738913Z 143 │ ╰─▶ } 2026-10-23T20:46:15.5739000Z 144 │ return yield* Fiber.join(fiber); 2026-10-23T20:46:15.5739052Z ╰──── 2026-10-23T20:46:15.5739054Z 2026-10-23T20:46:15.5739218Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5739366Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-23T20:46:15.5739497Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-23T20:46:15.5739646Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-23T20:46:15.5739757Z ·  ─────┬──── 2026-10-23T20:46:15.5739916Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5739976Z 373 │ return ( 2026-10-23T20:46:15.5740081Z ╰──── 2026-10-23T20:46:15.5740387Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5740676Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5740679Z 2026-10-23T20:46:15.5740844Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5740988Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-23T20:46:15.5741082Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-23T20:46:15.5741206Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-23T20:46:15.5741315Z ·  ─────┬──── 2026-10-23T20:46:15.5741474Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5741530Z 854 │ } 2026-10-23T20:46:15.5741579Z ╰──── 2026-10-23T20:46:15.5741848Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5742135Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5742137Z 2026-10-23T20:46:15.5742337Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5742467Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:542:25] 2026-10-23T20:46:15.5742598Z 541 │ // range) the boundary string is identical and the chain would die. 2026-10-23T20:46:15.5742691Z 542 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T20:46:15.5742791Z ·  ───────┬────── 2026-10-23T20:46:15.5742951Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T20:46:15.5743084Z 543 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-23T20:46:15.5743135Z ╰──── 2026-10-23T20:46:15.5743425Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5743728Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5743730Z 2026-10-23T20:46:15.5743942Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5744096Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:53] 2026-10-23T20:46:15.5744183Z 532 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T20:46:15.5744340Z 533 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T20:46:15.5744495Z ·  ─────┬──── 2026-10-23T20:46:15.5744660Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5744738Z 534 │ const id = setTimeout(() => { 2026-10-23T20:46:15.5744788Z ╰──── 2026-10-23T20:46:15.5745070Z  help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5745357Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5745360Z 2026-10-23T20:46:15.5745570Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T20:46:15.5745705Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-23T20:46:15.5745829Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-23T20:46:15.5745933Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-23T20:46:15.5746041Z ·  ─────── 2026-10-23T20:46:15.5746151Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-23T20:46:15.5746200Z ╰──── 2026-10-23T20:46:15.5746461Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T20:46:15.5746467Z 2026-10-23T20:46:15.5746830Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownOption(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5746950Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-23T20:46:15.5747008Z 145 │ name, 2026-10-23T20:46:15.5747146Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-23T20:46:15.5747248Z ·  ────────────────────────── 2026-10-23T20:46:15.5747369Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-23T20:46:15.5747420Z ╰──── 2026-10-23T20:46:15.5747423Z 2026-10-23T20:46:15.5747619Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T20:46:15.5747761Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-23T20:46:15.5747847Z 35 │ label.name.trim().toLowerCase()); 2026-10-23T20:46:15.5749100Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-23T20:46:15.5749242Z 188 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-23T20:46:15.5749294Z ╰──── 2026-10-23T20:46:15.5749369Z  help: Switch to `Set` 2026-10-23T20:46:15.5749372Z 2026-10-23T20:46:15.5749551Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T20:46:15.5749708Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-23T20:46:15.5749808Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-23T20:46:15.5749994Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-23T20:46:15.5750138Z ·  ─────┬───── 2026-10-23T20:46:15.5750338Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T20:46:15.5750414Z 101 │ const readEditor = useCallback( 2026-10-23T20:46:15.5750464Z ╰──── 2026-10-23T20:46:15.5750772Z  help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often 2026-10-23T20:46:15.5751084Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5751093Z 2026-10-23T20:46:15.5751273Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T20:46:15.5751429Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-23T20:46:15.5751491Z 120 │ setEditor, 2026-10-23T20:46:15.5751555Z 121 │ startEditor, 2026-10-23T20:46:15.5751629Z ·  ─────┬───── 2026-10-23T20:46:15.5751772Z · ╰── Unnecessary dependency `startEditor` 2026-10-23T20:46:15.5751834Z 122 │ hasChanges, 2026-10-23T20:46:15.5751884Z ╰──── 2026-10-23T20:46:15.5752187Z  help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often 2026-10-23T20:46:15.5752495Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5752499Z 2026-10-23T20:46:15.5752665Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-23T20:46:15.5752853Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-23T20:46:15.5752990Z 219 │ 2026-10-23T20:46:15.5753126Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-23T20:46:15.5753232Z ·  ──┬─ 2026-10-23T20:46:15.5753396Z · ╰── 'U+001B' is a control character. 2026-10-23T20:46:15.5753461Z 221 │ 2026-10-23T20:46:15.5753560Z ╰──── 2026-10-23T20:46:15.5753815Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-23T20:46:15.5753818Z 2026-10-23T20:46:15.5754091Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5754235Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-23T20:46:15.5754289Z 60 │ ) { 2026-10-23T20:46:15.5754495Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-23T20:46:15.5754577Z ·  ──────┬────── 2026-10-23T20:46:15.5754715Z · ╰── 'useDragRegion' is declared here 2026-10-23T20:46:15.5754812Z 62 │ const isInline = props.mode === "inline"; 2026-10-23T20:46:15.5754864Z ╰──── 2026-10-23T20:46:15.5754968Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5754971Z 2026-10-23T20:46:15.5755249Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T20:46:15.5755412Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19] 2026-10-23T20:46:15.5755471Z 386 │ onFilters, 2026-10-23T20:46:15.5755539Z 387 │ authorOptions = [], 2026-10-23T20:46:15.5755614Z ·  ── 2026-10-23T20:46:15.5755680Z 388 │ labelOptions = [], 2026-10-23T20:46:15.5755730Z ╰──── 2026-10-23T20:46:15.5756050Z  help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it. 2026-10-23T20:46:15.5756055Z 2026-10-23T20:46:15.5756333Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T20:46:15.5756500Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18] 2026-10-23T20:46:15.5756565Z 387 │ authorOptions = [], 2026-10-23T20:46:15.5756631Z 388 │ labelOptions = [], 2026-10-23T20:46:15.5756707Z ·  ── 2026-10-23T20:46:15.5756763Z 389 │ host, 2026-10-23T20:46:15.5756812Z ╰──── 2026-10-23T20:46:15.5757124Z  help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it. 2026-10-23T20:46:15.5757127Z 2026-10-23T20:46:15.5757298Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5757435Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-23T20:46:15.5757566Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-23T20:46:15.5757711Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-23T20:46:15.5757834Z ·  ─────┬──── 2026-10-23T20:46:15.5758003Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5758101Z 141 │ onSelect={(selected) => { 2026-10-23T20:46:15.5758150Z ╰──── 2026-10-23T20:46:15.5758484Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5758806Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5758809Z 2026-10-23T20:46:15.5759003Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T20:46:15.5759171Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-23T20:46:15.5759233Z 87 │
  • = Layer.succeed( 2026-10-23T20:46:15.5765887Z ·  ────────┬─────── 2026-10-23T20:46:15.5766040Z · ╰── 'layerUnavailable' is declared here 2026-10-23T20:46:15.5766110Z 12341 │ OrchestratorV2, 2026-10-23T20:46:15.5766162Z ╰──── 2026-10-23T20:46:15.5766269Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5766271Z 2026-10-23T20:46:15.5766458Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5766631Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-23T20:46:15.5766713Z 554 │ assert.deepStrictEqual( 2026-10-23T20:46:15.5766881Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T20:46:15.5767004Z ·  ┬ 2026-10-23T20:46:15.5767220Z · ╰── '_' is declared here 2026-10-23T20:46:15.5767310Z 556 │ [ 2026-10-23T20:46:15.5767361Z ╰──── 2026-10-23T20:46:15.5767465Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5767467Z 2026-10-23T20:46:15.5767651Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-23T20:46:15.5767827Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-23T20:46:15.5767911Z 1154 │ assert.deepStrictEqual( 2026-10-23T20:46:15.5768078Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-23T20:46:15.5768200Z ·  ┬ 2026-10-23T20:46:15.5768369Z · ╰── '_' is declared here 2026-10-23T20:46:15.5768435Z 1156 │ [ 2026-10-23T20:46:15.5768488Z ╰──── 2026-10-23T20:46:15.5768589Z  help: Consider removing this parameter. 2026-10-23T20:46:15.5768592Z 2026-10-23T20:46:15.5768865Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5769005Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-23T20:46:15.5769058Z 913 │ 2026-10-23T20:46:15.5769246Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-23T20:46:15.5769325Z ·  ─────┬───── 2026-10-23T20:46:15.5769466Z · ╰── 'layerDaemon' is declared here 2026-10-23T20:46:15.5769557Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-23T20:46:15.5769607Z ╰──── 2026-10-23T20:46:15.5769710Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5769713Z 2026-10-23T20:46:15.5769872Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5770021Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-23T20:46:15.5770166Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-23T20:46:15.5770303Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-23T20:46:15.5770381Z ·  ────┬─── 2026-10-23T20:46:15.5770516Z · ╰── `rotation` originates here 2026-10-23T20:46:15.5770575Z 172 │ 2026-10-23T20:46:15.5770658Z 173 │ useLayoutEffect(() => { 2026-10-23T20:46:15.5770850Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-23T20:46:15.5770923Z ·  ────┬─── 2026-10-23T20:46:15.5771059Z · ╰── `rotation` cannot be modified 2026-10-23T20:46:15.5771158Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-23T20:46:15.5771210Z ╰──── 2026-10-23T20:46:15.5771480Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5771791Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5771794Z 2026-10-23T20:46:15.5772052Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T20:46:15.5772242Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-23T20:46:15.5772315Z 1245 │ ({ thread, now: Date.now() })); 2026-10-23T20:46:15.5773497Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-23T20:46:15.5773638Z ·  ─────┬──── 2026-10-23T20:46:15.5773825Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5773962Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-23T20:46:15.5774013Z ╰──── 2026-10-23T20:46:15.5774299Z  help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5774648Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5774653Z 2026-10-23T20:46:15.5774823Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5774983Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-23T20:46:15.5775064Z 717 │ const snoozePresets = useMemo( 2026-10-23T20:46:15.5775244Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T20:46:15.5775376Z ·  ─────┬──── 2026-10-23T20:46:15.5775557Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5775678Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T20:46:15.5775731Z ╰──── 2026-10-23T20:46:15.5776009Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5776305Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5776308Z 2026-10-23T20:46:15.5776491Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T20:46:15.5776649Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-23T20:46:15.5776823Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-23T20:46:15.5776995Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-23T20:46:15.5777117Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5777294Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-23T20:46:15.5777349Z 720 │ ); 2026-10-23T20:46:15.5777401Z ╰──── 2026-10-23T20:46:15.5777720Z  help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often 2026-10-23T20:46:15.5778037Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5778039Z 2026-10-23T20:46:15.5778222Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T20:46:15.5778383Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-23T20:46:15.5778456Z 764 │ thread.pinnedAt, 2026-10-23T20:46:15.5778518Z 765 │ variant, 2026-10-23T20:46:15.5778591Z ·  ───┬─── 2026-10-23T20:46:15.5778728Z · ╰── Unnecessary dependency `variant` 2026-10-23T20:46:15.5778785Z 766 │ ], 2026-10-23T20:46:15.5778836Z ╰──── 2026-10-23T20:46:15.5779151Z  help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often 2026-10-23T20:46:15.5779461Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5779464Z 2026-10-23T20:46:15.5779667Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T20:46:15.5779830Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-23T20:46:15.5779958Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-23T20:46:15.5780095Z 1215 │ 2026-10-23T20:46:15.5780209Z ·  ────────────────────────── 2026-10-23T20:46:15.5780320Z 1216 │ 2026-10-23T20:46:15.5780373Z ╰──── 2026-10-23T20:46:15.5780522Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T20:46:15.5780524Z 2026-10-23T20:46:15.5781008Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5781182Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-23T20:46:15.5781286Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-23T20:46:15.5781489Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-23T20:46:15.5781592Z 567 │ │ const nextEvent = { 2026-10-23T20:46:15.5781752Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-23T20:46:15.5781887Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-23T20:46:15.5781984Z 570 │ │ threadId, 2026-10-23T20:46:15.5782145Z 571 │ │ providerInstanceId, 2026-10-23T20:46:15.5782273Z 572 │ │ occurredAt: now, 2026-10-23T20:46:15.5782424Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-23T20:46:15.5782554Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-23T20:46:15.5782670Z 575 │ │ const reader = yield* eventSink 2026-10-23T20:46:15.5782792Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-23T20:46:15.5782926Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-23T20:46:15.5783032Z 578 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5783196Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-23T20:46:15.5783332Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-23T20:46:15.5783452Z 581 │ │ if (Option.isNone(received)) { 2026-10-23T20:46:15.5783655Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-23T20:46:15.5783735Z 583 │ │ } 2026-10-23T20:46:15.5783897Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-23T20:46:15.5784047Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-23T20:46:15.5784177Z 586 │ │ afterSequence = received.value.sequence; 2026-10-23T20:46:15.5784310Z 587 │ ╰─▶ } 2026-10-23T20:46:15.5784407Z 588 │ }), 2026-10-23T20:46:15.5784462Z ╰──── 2026-10-23T20:46:15.5784465Z 2026-10-23T20:46:15.5784936Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5785113Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-23T20:46:15.5785192Z 2326 │ let settled = false; 2026-10-23T20:46:15.5785354Z 2327 │ ╭─▶ while (!settled) { 2026-10-23T20:46:15.5785516Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-23T20:46:15.5785650Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-23T20:46:15.5785740Z 2330 │ │ ); 2026-10-23T20:46:15.5785868Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-23T20:46:15.5786008Z 2332 │ ╰─▶ } 2026-10-23T20:46:15.5786128Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-23T20:46:15.5786180Z ╰──── 2026-10-23T20:46:15.5786182Z 2026-10-23T20:46:15.5786557Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5786671Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-23T20:46:15.5786830Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-23T20:46:15.5787044Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-23T20:46:15.5787176Z ·  ──────────────────────── 2026-10-23T20:46:15.5787243Z 18 │ "review:write", 2026-10-23T20:46:15.5787294Z ╰──── 2026-10-23T20:46:15.5787296Z 2026-10-23T20:46:15.5787663Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5787778Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-23T20:46:15.5787833Z 19 │ ]); 2026-10-23T20:46:15.5787997Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-23T20:46:15.5788105Z ·  ──────────────────────── 2026-10-23T20:46:15.5788242Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-23T20:46:15.5788294Z ╰──── 2026-10-23T20:46:15.5788297Z 2026-10-23T20:46:15.5788661Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const. 2026-10-23T20:46:15.5788773Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-23T20:46:15.5788943Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-23T20:46:15.5789067Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-23T20:46:15.5789176Z ·  ──────────────────────── 2026-10-23T20:46:15.5789246Z 59 │ authenticated: true, 2026-10-23T20:46:15.5789300Z ╰──── 2026-10-23T20:46:15.5789302Z 2026-10-23T20:46:15.5789568Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5789709Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2109:5] 2026-10-23T20:46:15.5789766Z 2107 │ ); 2026-10-23T20:46:15.5789831Z 2108 │ useEffect(() => { 2026-10-23T20:46:15.5789903Z ·  ────┬──── 2026-10-23T20:46:15.5790037Z · ╰── This is the containing effect 2026-10-23T20:46:15.5790112Z 2109 │ setExpandedVideo(null); 2026-10-23T20:46:15.5790196Z ·  ────────┬─────── 2026-10-23T20:46:15.5790369Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5790446Z 2110 │ setExpandedFile(null); 2026-10-23T20:46:15.5790499Z ╰──── 2026-10-23T20:46:15.5791166Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5791526Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5791529Z 2026-10-23T20:46:15.5791759Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-23T20:46:15.5791896Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10] 2026-10-23T20:46:15.5792035Z 61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-23T20:46:15.5792178Z 62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-23T20:46:15.5792278Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5792446Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-23T20:46:15.5792604Z 63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-23T20:46:15.5792654Z ╰──── 2026-10-23T20:46:15.5792753Z  help: Consider removing this import. 2026-10-23T20:46:15.5792756Z 2026-10-23T20:46:15.5792965Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-23T20:46:15.5793099Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3] 2026-10-23T20:46:15.5793157Z 87 │ import { 2026-10-23T20:46:15.5793222Z 88 │ createContext, 2026-10-23T20:46:15.5793304Z ·  ──────┬────── 2026-10-23T20:46:15.5793444Z · ╰── 'createContext' is imported here 2026-10-23T20:46:15.5793501Z 89 │ memo, 2026-10-23T20:46:15.5793551Z ╰──── 2026-10-23T20:46:15.5793650Z  help: Consider removing this import. 2026-10-23T20:46:15.5793653Z 2026-10-23T20:46:15.5793866Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T20:46:15.5794003Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3] 2026-10-23T20:46:15.5794062Z 102 │ import { 2026-10-23T20:46:15.5794130Z 103 │ ActivityIndicator, 2026-10-23T20:46:15.5794213Z ·  ────────┬──────── 2026-10-23T20:46:15.5794369Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T20:46:15.5794426Z 104 │ Image, 2026-10-23T20:46:15.5794512Z ╰──── 2026-10-23T20:46:15.5794611Z  help: Consider removing this import. 2026-10-23T20:46:15.5794613Z 2026-10-23T20:46:15.5794814Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-23T20:46:15.5794949Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3] 2026-10-23T20:46:15.5795010Z 109 │ Pressable, 2026-10-23T20:46:15.5795073Z 110 │ ScrollView, 2026-10-23T20:46:15.5795146Z ·  ─────┬──── 2026-10-23T20:46:15.5795277Z · ╰── 'ScrollView' is imported here 2026-10-23T20:46:15.5795340Z 111 │ StyleSheet, 2026-10-23T20:46:15.5795391Z ╰──── 2026-10-23T20:46:15.5795487Z  help: Consider removing this import. 2026-10-23T20:46:15.5795490Z 2026-10-23T20:46:15.5795740Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-23T20:46:15.5795908Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11] 2026-10-23T20:46:15.5795970Z 111 │ StyleSheet, 2026-10-23T20:46:15.5796038Z 112 │ Text as NativeText, 2026-10-23T20:46:15.5796117Z ·  ─────┬──── 2026-10-23T20:46:15.5796256Z · ╰── 'NativeText' is imported here 2026-10-23T20:46:15.5796325Z 113 │ type ColorValue, 2026-10-23T20:46:15.5796375Z ╰──── 2026-10-23T20:46:15.5796471Z  help: Consider removing this import. 2026-10-23T20:46:15.5796474Z 2026-10-23T20:46:15.5796690Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-23T20:46:15.5796833Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10] 2026-10-23T20:46:15.5796971Z 133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-23T20:46:15.5797097Z 134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-23T20:46:15.5797186Z ·  ─────────┬──────── 2026-10-23T20:46:15.5797342Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-23T20:46:15.5797490Z 135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-23T20:46:15.5797542Z ╰──── 2026-10-23T20:46:15.5797637Z  help: Consider removing this import. 2026-10-23T20:46:15.5797640Z 2026-10-23T20:46:15.5797859Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-23T20:46:15.5797999Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10] 2026-10-23T20:46:15.5798137Z 136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-23T20:46:15.5798262Z 137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-23T20:46:15.5798353Z ·  ─────────┬───────── 2026-10-23T20:46:15.5798507Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-23T20:46:15.5798566Z 138 │ import { 2026-10-23T20:46:15.5798615Z ╰──── 2026-10-23T20:46:15.5798712Z  help: Consider removing this import. 2026-10-23T20:46:15.5798714Z 2026-10-23T20:46:15.5798927Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-23T20:46:15.5799061Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10] 2026-10-23T20:46:15.5799214Z 150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-23T20:46:15.5799351Z 151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-23T20:46:15.5799440Z ·  ────────┬─────── 2026-10-23T20:46:15.5799589Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-23T20:46:15.5799727Z 152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-23T20:46:15.5799778Z ╰──── 2026-10-23T20:46:15.5799874Z  help: Consider removing this import. 2026-10-23T20:46:15.5799876Z 2026-10-23T20:46:15.5800098Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-23T20:46:15.5800230Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3] 2026-10-23T20:46:15.5800312Z 154 │ attachmentVideoPreviewSource, 2026-10-23T20:46:15.5800434Z 155 │ mediaVideoPreviewUri, 2026-10-23T20:46:15.5800547Z ·  ──────────┬───────── 2026-10-23T20:46:15.5800700Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-23T20:46:15.5800772Z 156 │ mediaVideoThumbnailKey, 2026-10-23T20:46:15.5800823Z ╰──── 2026-10-23T20:46:15.5800919Z  help: Consider removing this import. 2026-10-23T20:46:15.5800921Z 2026-10-23T20:46:15.5801145Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-23T20:46:15.5801276Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3] 2026-10-23T20:46:15.5801346Z 155 │ mediaVideoPreviewUri, 2026-10-23T20:46:15.5801416Z 156 │ mediaVideoThumbnailKey, 2026-10-23T20:46:15.5801503Z ·  ───────────┬────────── 2026-10-23T20:46:15.5801666Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-23T20:46:15.5801748Z 157 │ type MediaVideoPreviewSource, 2026-10-23T20:46:15.5801798Z ╰──── 2026-10-23T20:46:15.5801891Z  help: Consider removing this import. 2026-10-23T20:46:15.5801896Z 2026-10-23T20:46:15.5802109Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-23T20:46:15.5802240Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8] 2026-10-23T20:46:15.5802309Z 156 │ mediaVideoThumbnailKey, 2026-10-23T20:46:15.5802388Z 157 │ type MediaVideoPreviewSource, 2026-10-23T20:46:15.5802482Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5802653Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-23T20:46:15.5802743Z 158 │ } from "../../lib/videoPreviewSource"; 2026-10-23T20:46:15.5802794Z ╰──── 2026-10-23T20:46:15.5802888Z  help: Consider removing this import. 2026-10-23T20:46:15.5802891Z 2026-10-23T20:46:15.5803089Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-23T20:46:15.5803221Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15] 2026-10-23T20:46:15.5803399Z 164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-23T20:46:15.5803537Z 165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-23T20:46:15.5803629Z ·  ───────┬─────── 2026-10-23T20:46:15.5803780Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-23T20:46:15.5803844Z 166 │ import { 2026-10-23T20:46:15.5803896Z ╰──── 2026-10-23T20:46:15.5803992Z  help: Consider removing this import. 2026-10-23T20:46:15.5803994Z 2026-10-23T20:46:15.5804223Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-23T20:46:15.5804385Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3] 2026-10-23T20:46:15.5804443Z 179 │ import { 2026-10-23T20:46:15.5804518Z 180 │ resolveMarkdownFontSizes, 2026-10-23T20:46:15.5804608Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5804768Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-23T20:46:15.5804854Z 181 │ resolveNativeMarkdownTypography, 2026-10-23T20:46:15.5804905Z ╰──── 2026-10-23T20:46:15.5805113Z  help: Consider removing this import. 2026-10-23T20:46:15.5805143Z 2026-10-23T20:46:15.5805370Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-23T20:46:15.5805502Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10] 2026-10-23T20:46:15.5805634Z 184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-23T20:46:15.5805770Z 185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-23T20:46:15.5805864Z ·  ───────────┬────────── 2026-10-23T20:46:15.5806027Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-23T20:46:15.5806084Z 186 │ import { 2026-10-23T20:46:15.5806135Z ╰──── 2026-10-23T20:46:15.5806229Z  help: Consider removing this import. 2026-10-23T20:46:15.5806232Z 2026-10-23T20:46:15.5806497Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-23T20:46:15.5806633Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3] 2026-10-23T20:46:15.5806710Z 187 │ normalizeNativeMarkdownUrl, 2026-10-23T20:46:15.5806807Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T20:46:15.5806917Z ·  ──────────────────┬────────────────── 2026-10-23T20:46:15.5807112Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-23T20:46:15.5807186Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T20:46:15.5807237Z ╰──── 2026-10-23T20:46:15.5807332Z  help: Consider removing this import. 2026-10-23T20:46:15.5807334Z 2026-10-23T20:46:15.5807564Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-23T20:46:15.5807700Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-23T20:46:15.5807795Z 188 │ resolveMarkdownInlineCodePresentation, 2026-10-23T20:46:15.5807867Z 189 │ resolveMarkdownLinkIcon, 2026-10-23T20:46:15.5807955Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5808112Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-23T20:46:15.5808199Z 190 │ resolveMarkdownLinkPresentation, 2026-10-23T20:46:15.5808253Z ╰──── 2026-10-23T20:46:15.5808346Z  help: Consider removing this import. 2026-10-23T20:46:15.5808349Z 2026-10-23T20:46:15.5808577Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-23T20:46:15.5808766Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:228:10] 2026-10-23T20:46:15.5808906Z 227 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-23T20:46:15.5809050Z 228 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-23T20:46:15.5809151Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5809319Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-23T20:46:15.5809376Z 229 │ import { 2026-10-23T20:46:15.5809425Z ╰──── 2026-10-23T20:46:15.5809520Z  help: Consider removing this import. 2026-10-23T20:46:15.5809522Z 2026-10-23T20:46:15.5809734Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-23T20:46:15.5809871Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:232:3] 2026-10-23T20:46:15.5809938Z 231 │ useAssetUrl, 2026-10-23T20:46:15.5810006Z 232 │ useAssetUrlState, 2026-10-23T20:46:15.5810086Z ·  ────────┬─────── 2026-10-23T20:46:15.5810230Z · ╰── 'useAssetUrlState' is imported here 2026-10-23T20:46:15.5810297Z 233 │ useRefreshAssetUrl, 2026-10-23T20:46:15.5810350Z ╰──── 2026-10-23T20:46:15.5810447Z  help: Consider removing this import. 2026-10-23T20:46:15.5810449Z 2026-10-23T20:46:15.5810731Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5810864Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2111:7] 2026-10-23T20:46:15.5810938Z 2110 │ setExpandedFile(null); 2026-10-23T20:46:15.5811103Z 2111 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-23T20:46:15.5811328Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-23T20:46:15.5811620Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-23T20:46:15.5811818Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-23T20:46:15.5811984Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T20:46:15.5812125Z 2112 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-23T20:46:15.5812177Z ╰──── 2026-10-23T20:46:15.5812482Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5812803Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5812805Z 2026-10-23T20:46:15.5813008Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5813144Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2578:7] 2026-10-23T20:46:15.5813240Z 2577 │ reportHeaderMaterialVisibility(false); 2026-10-23T20:46:15.5813354Z 2578 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-23T20:46:15.5813436Z ·  ──────┬────── 2026-10-23T20:46:15.5813588Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-23T20:46:15.5813709Z 2579 │ 2026-10-23T20:46:15.5813798Z ╰──── 2026-10-23T20:46:15.5814092Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5814431Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5814434Z 2026-10-23T20:46:15.5814637Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5814770Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2594:7] 2026-10-23T20:46:15.5814828Z 2593 │ } 2026-10-23T20:46:15.5814960Z 2594 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-23T20:46:15.5815044Z ·  ──────┬───── 2026-10-23T20:46:15.5815192Z · ╰── Unnecessary dependency `listMountKey` 2026-10-23T20:46:15.5815247Z 2595 │ 2026-10-23T20:46:15.5815298Z ╰──── 2026-10-23T20:46:15.5815590Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5815898Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5815902Z 2026-10-23T20:46:15.5816100Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5816234Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2751:7] 2026-10-23T20:46:15.5816296Z 2750 │ } 2026-10-23T20:46:15.5816481Z 2751 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-23T20:46:15.5816678Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-23T20:46:15.5816928Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-23T20:46:15.5817133Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-23T20:46:15.5817286Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-23T20:46:15.5817338Z 2752 │ 2026-10-23T20:46:15.5817390Z ╰──── 2026-10-23T20:46:15.5817687Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5818001Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5818003Z 2026-10-23T20:46:15.5818185Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T20:46:15.5818319Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:603:9] 2026-10-23T20:46:15.5818377Z 602 │ }; 2026-10-23T20:46:15.5818493Z 603 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-23T20:46:15.5818683Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-23T20:46:15.5818970Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-23T20:46:15.5819193Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-23T20:46:15.5819356Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-23T20:46:15.5819412Z 604 │ ); 2026-10-23T20:46:15.5819462Z ╰──── 2026-10-23T20:46:15.5819776Z  help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often 2026-10-23T20:46:15.5820087Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5820090Z 2026-10-23T20:46:15.5820354Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5820510Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-23T20:46:15.5820646Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-23T20:46:15.5820712Z 356 │ useEffect(() => { 2026-10-23T20:46:15.5820784Z ·  ────┬──── 2026-10-23T20:46:15.5820914Z · ╰── This is the containing effect 2026-10-23T20:46:15.5821005Z 357 │ if (!isReturningToProjectPicker) { 2026-10-23T20:46:15.5821068Z 358 │ return; 2026-10-23T20:46:15.5821123Z 359 │ } 2026-10-23T20:46:15.5821225Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-23T20:46:15.5821323Z 361 │ setIsReturningToProjectPicker(false); 2026-10-23T20:46:15.5821430Z ·  ──────────────┬────────────── 2026-10-23T20:46:15.5821608Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5821670Z 362 │ return; 2026-10-23T20:46:15.5821721Z ╰──── 2026-10-23T20:46:15.5822324Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5822645Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5822647Z 2026-10-23T20:46:15.5822953Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5823133Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-23T20:46:15.5823185Z 447 │ 2026-10-23T20:46:15.5823253Z 448 │ useEffect(() => { 2026-10-23T20:46:15.5823325Z ·  ────┬──── 2026-10-23T20:46:15.5823456Z · ╰── This is the containing effect 2026-10-23T20:46:15.5823558Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-23T20:46:15.5823618Z 450 │ return; 2026-10-23T20:46:15.5823673Z 451 │ } 2026-10-23T20:46:15.5823815Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-23T20:46:15.5823947Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-23T20:46:15.5824059Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-23T20:46:15.5824117Z 455 │ } 2026-10-23T20:46:15.5824256Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T20:46:15.5824393Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T20:46:15.5824526Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-23T20:46:15.5824598Z 459 │ const directProject = 2026-10-23T20:46:15.5824664Z 460 │ projects.find( 2026-10-23T20:46:15.5824729Z 461 │ (project) => 2026-10-23T20:46:15.5824903Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-23T20:46:15.5824966Z 463 │ ) ?? null; 2026-10-23T20:46:15.5825016Z 464 │ 2026-10-23T20:46:15.5825085Z 465 │ if (directProject) { 2026-10-23T20:46:15.5825230Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-23T20:46:15.5825369Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-23T20:46:15.5825529Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-23T20:46:15.5825664Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-23T20:46:15.5825728Z 470 │ return; 2026-10-23T20:46:15.5825786Z 471 │ } 2026-10-23T20:46:15.5825883Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-23T20:46:15.5825945Z 473 │ if ( 2026-10-23T20:46:15.5826089Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-23T20:46:15.5826190Z 475 │ selectedProject.id !== directProject.id 2026-10-23T20:46:15.5826249Z 476 │ ) { 2026-10-23T20:46:15.5826338Z 477 │ setProject(directProject); 2026-10-23T20:46:15.5826404Z 478 │ return; 2026-10-23T20:46:15.5826463Z 479 │ } 2026-10-23T20:46:15.5826545Z 480 │ if (!flow.draftKey) return; 2026-10-23T20:46:15.5826687Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-23T20:46:15.5826831Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-23T20:46:15.5826941Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-23T20:46:15.5827020Z 484 │ workspaceSelection: { 2026-10-23T20:46:15.5827091Z 485 │ mode: "local", 2026-10-23T20:46:15.5827196Z 486 │ branch: props.initialProjectRef.branch, 2026-10-23T20:46:15.5827332Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-23T20:46:15.5827472Z 488 │ startFromOrigin: false, 2026-10-23T20:46:15.5827560Z 489 │ }, 2026-10-23T20:46:15.5827618Z 490 │ }); 2026-10-23T20:46:15.5827676Z 491 │ } 2026-10-23T20:46:15.5827803Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-23T20:46:15.5827863Z 493 │ if ( 2026-10-23T20:46:15.5828004Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-23T20:46:15.5828102Z 495 │ selectedProject.id === directProject.id 2026-10-23T20:46:15.5828158Z 496 │ ) { 2026-10-23T20:46:15.5828221Z 497 │ return; 2026-10-23T20:46:15.5828278Z 498 │ } 2026-10-23T20:46:15.5828358Z 499 │ setProject(directProject); 2026-10-23T20:46:15.5828419Z 500 │ return; 2026-10-23T20:46:15.5828474Z 501 │ } 2026-10-23T20:46:15.5828526Z 502 │ 2026-10-23T20:46:15.5828610Z 503 │ if (projects.length > 0) { 2026-10-23T20:46:15.5828711Z 504 │ setIsReturningToProjectPicker(true); 2026-10-23T20:46:15.5828819Z ·  ──────────────┬────────────── 2026-10-23T20:46:15.5829002Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5829056Z 505 │ } 2026-10-23T20:46:15.5829109Z ╰──── 2026-10-23T20:46:15.5829709Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5830035Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5830040Z 2026-10-23T20:46:15.5830298Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5830449Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-23T20:46:15.5830503Z 545 │ 2026-10-23T20:46:15.5830569Z 546 │ useEffect(() => { 2026-10-23T20:46:15.5830641Z ·  ────┬──── 2026-10-23T20:46:15.5830769Z · ╰── This is the containing effect 2026-10-23T20:46:15.5830863Z 547 │ const shareId = props.incomingShareId; 2026-10-23T20:46:15.5830948Z 548 │ const draftKey = flow.draftKey; 2026-10-23T20:46:15.5831050Z 549 │ const destinationProject = selectedProject; 2026-10-23T20:46:15.5831194Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-23T20:46:15.5831322Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-23T20:46:15.5831413Z 552 │ const selectedProjectMatchesRoute = 2026-10-23T20:46:15.5831489Z 553 │ !initialEnvironmentId || 2026-10-23T20:46:15.5831559Z 554 │ !initialProjectId || 2026-10-23T20:46:15.5831691Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-23T20:46:15.5831796Z 556 │ destinationProject.id === initialProjectId); 2026-10-23T20:46:15.5831853Z 557 │ if ( 2026-10-23T20:46:15.5831915Z 558 │ !shareId || 2026-10-23T20:46:15.5831980Z 559 │ !draftKey || 2026-10-23T20:46:15.5832052Z 560 │ !destinationProject || 2026-10-23T20:46:15.5832139Z 561 │ !selectedProjectMatchesRoute || 2026-10-23T20:46:15.5832228Z 562 │ cancelledIncomingShareId === shareId 2026-10-23T20:46:15.5832333Z 563 │ ) { 2026-10-23T20:46:15.5832420Z 564 │ return; 2026-10-23T20:46:15.5832474Z 565 │ } 2026-10-23T20:46:15.5832571Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-23T20:46:15.5832627Z 567 │ if ( 2026-10-23T20:46:15.5832738Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-23T20:46:15.5832847Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-23T20:46:15.5832904Z 570 │ ) { 2026-10-23T20:46:15.5832965Z 571 │ return; 2026-10-23T20:46:15.5833019Z 572 │ } 2026-10-23T20:46:15.5833069Z 573 │ 2026-10-23T20:46:15.5833137Z 574 │ if (!incomingShare) { 2026-10-23T20:46:15.5833331Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-23T20:46:15.5833458Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-23T20:46:15.5833527Z 577 │ Dialog.alert( 2026-10-23T20:46:15.5833615Z 578 │ "Shared content unavailable", 2026-10-23T20:46:15.5833789Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-23T20:46:15.5833849Z 580 │ ); 2026-10-23T20:46:15.5833903Z 581 │ } 2026-10-23T20:46:15.5833963Z 582 │ return; 2026-10-23T20:46:15.5834016Z 583 │ } 2026-10-23T20:46:15.5834066Z 584 │ 2026-10-23T20:46:15.5834123Z 585 │ if ( 2026-10-23T20:46:15.5834283Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-23T20:46:15.5834416Z 587 │ selectedEnvironmentServerConfig === null 2026-10-23T20:46:15.5834471Z 588 │ ) { 2026-10-23T20:46:15.5834531Z 589 │ return; 2026-10-23T20:46:15.5834584Z 590 │ } 2026-10-23T20:46:15.5834642Z 591 │ 2026-10-23T20:46:15.5834779Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-23T20:46:15.5834900Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-23T20:46:15.5834955Z 594 │ } 2026-10-23T20:46:15.5835060Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-23T20:46:15.5835129Z 596 │ const draftBackup = 2026-10-23T20:46:15.5835316Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-23T20:46:15.5835455Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-23T20:46:15.5835545Z 599 │ const importToken = Symbol(importKey); 2026-10-23T20:46:15.5835621Z 600 │ let didReserveShare = false; 2026-10-23T20:46:15.5835697Z 601 │ let didConsumeShare = false; 2026-10-23T20:46:15.5835779Z 602 │ let needsDraftRestore = false; 2026-10-23T20:46:15.5835894Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-23T20:46:15.5835977Z 604 │ setImportingShareKey(importKey); 2026-10-23T20:46:15.5836067Z ·  ──────────┬───────── 2026-10-23T20:46:15.5836241Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5836310Z 605 │ void (async () => { 2026-10-23T20:46:15.5836360Z ╰──── 2026-10-23T20:46:15.5836959Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5837332Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5837366Z 2026-10-23T20:46:15.5837569Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5837722Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-23T20:46:15.5837795Z 523 │ props.initialProjectRef, 2026-10-23T20:46:15.5837866Z 524 │ props.incomingShareId, 2026-10-23T20:46:15.5837954Z ·  ──────────┬────────── 2026-10-23T20:46:15.5838122Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-23T20:46:15.5838191Z 525 │ props.pendingTaskId, 2026-10-23T20:46:15.5838243Z ╰──── 2026-10-23T20:46:15.5838544Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5838855Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5838858Z 2026-10-23T20:46:15.5839071Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T20:46:15.5839221Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-23T20:46:15.5839334Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-23T20:46:15.5839403Z 543 │ flow.loadBranches(); 2026-10-23T20:46:15.5839471Z ·  ──┬─ 2026-10-23T20:46:15.5839595Z · ╰── Missing dependency `flow` 2026-10-23T20:46:15.5839694Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-23T20:46:15.5839780Z ·  ────────┬──────── 2026-10-23T20:46:15.5839978Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-23T20:46:15.5840030Z 545 │ 2026-10-23T20:46:15.5840082Z ╰──── 2026-10-23T20:46:15.5840505Z  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5840815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5840817Z 2026-10-23T20:46:15.5841017Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5841173Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-23T20:46:15.5841241Z 765 │ flow.draftKey, 2026-10-23T20:46:15.5841317Z 766 │ hasImportedIncomingShare, 2026-10-23T20:46:15.5841407Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5841584Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-23T20:46:15.5841648Z 767 │ incomingShare, 2026-10-23T20:46:15.5841728Z 768 │ isIncomingShareInboxLoading, 2026-10-23T20:46:15.5841823Z ·  ─────────────┬───────────── 2026-10-23T20:46:15.5842010Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-23T20:46:15.5842090Z 769 │ isIncomingShareUnavailable, 2026-10-23T20:46:15.5842212Z 770 │ props.incomingShareId, 2026-10-23T20:46:15.5842333Z 771 │ props.initialProjectRef?.environmentId, 2026-10-23T20:46:15.5842421Z 772 │ props.initialProjectRef?.projectId, 2026-10-23T20:46:15.5842494Z 773 │ releaseShareReservation, 2026-10-23T20:46:15.5842559Z 774 │ reserveShare, 2026-10-23T20:46:15.5842643Z 775 │ selectedEnvironmentServerConfig, 2026-10-23T20:46:15.5842710Z 776 │ selectedProject, 2026-10-23T20:46:15.5842779Z 777 │ shareImportAttempt, 2026-10-23T20:46:15.5842864Z ·  ─────────┬──────── 2026-10-23T20:46:15.5843027Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-23T20:46:15.5843083Z 778 │ ]); 2026-10-23T20:46:15.5843134Z ╰──── 2026-10-23T20:46:15.5843432Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5843742Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5843745Z 2026-10-23T20:46:15.5843960Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T20:46:15.5844133Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7] 2026-10-23T20:46:15.5844211Z 369 │ mountedRef.current = false; 2026-10-23T20:46:15.5844286Z 370 │ flow.setBranchQuery(""); 2026-10-23T20:46:15.5844364Z ·  ──┬─ 2026-10-23T20:46:15.5844515Z · ╰── Missing dependency `flow` 2026-10-23T20:46:15.5844572Z 371 │ }; 2026-10-23T20:46:15.5844647Z 372 │ }, [flow.setBranchQuery]); 2026-10-23T20:46:15.5844735Z ·  ─────────┬───────── 2026-10-23T20:46:15.5844942Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-23T20:46:15.5844994Z 373 │ 2026-10-23T20:46:15.5845045Z ╰──── 2026-10-23T20:46:15.5845464Z  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5845773Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5845775Z 2026-10-23T20:46:15.5846040Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-23T20:46:15.5846186Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-23T20:46:15.5846239Z 3754 │ 2026-10-23T20:46:15.5846440Z 3755 │ const layer: Layer.Layer = 2026-10-23T20:46:15.5846511Z ·  ──┬── 2026-10-23T20:46:15.5846636Z · ╰── 'layer' is declared here 2026-10-23T20:46:15.5846700Z 3756 │ Layer.effect( 2026-10-23T20:46:15.5846752Z ╰──── 2026-10-23T20:46:15.5846859Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5846861Z 2026-10-23T20:46:15.5847380Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const. 2026-10-23T20:46:15.5847543Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-23T20:46:15.5847678Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-23T20:46:15.5847861Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-23T20:46:15.5847970Z ·  ──────────────────────── 2026-10-23T20:46:15.5848035Z 182 │ version: 1, 2026-10-23T20:46:15.5848085Z ╰──── 2026-10-23T20:46:15.5848088Z 2026-10-23T20:46:15.5848348Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5848516Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-23T20:46:15.5848570Z 100 │ 2026-10-23T20:46:15.5848641Z 101 │ useEffect(() => { 2026-10-23T20:46:15.5848714Z ·  ────┬──── 2026-10-23T20:46:15.5848845Z · ╰── This is the containing effect 2026-10-23T20:46:15.5848950Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-23T20:46:15.5849033Z 103 │ setHighlightedLinesById({}); 2026-10-23T20:46:15.5849124Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5849297Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5849358Z 104 │ return; 2026-10-23T20:46:15.5849407Z ╰──── 2026-10-23T20:46:15.5850013Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5850338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5850340Z 2026-10-23T20:46:15.5850511Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-23T20:46:15.5850770Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-23T20:46:15.5850824Z 52 │ 2026-10-23T20:46:15.5850891Z 53 │ for (const {} of [ 2026-10-23T20:46:15.5850963Z ·  ── 2026-10-23T20:46:15.5851027Z 54 │ { healthy: true }, 2026-10-23T20:46:15.5851080Z ╰──── 2026-10-23T20:46:15.5851373Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-23T20:46:15.5851416Z 2026-10-23T20:46:15.5851675Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5851836Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-23T20:46:15.5851896Z 434 │ : null; 2026-10-23T20:46:15.5851960Z 435 │ useEffect(() => { 2026-10-23T20:46:15.5852032Z ·  ────┬──── 2026-10-23T20:46:15.5852163Z · ╰── This is the containing effect 2026-10-23T20:46:15.5852220Z 436 │ if ( 2026-10-23T20:46:15.5852295Z 437 │ props.active === false || 2026-10-23T20:46:15.5852372Z 438 │ activeDraftKey !== null || 2026-10-23T20:46:15.5852459Z 439 │ editingPendingTask !== null || 2026-10-23T20:46:15.5852536Z 440 │ selectedProject === null 2026-10-23T20:46:15.5852592Z 441 │ ) { 2026-10-23T20:46:15.5852652Z 442 │ return; 2026-10-23T20:46:15.5852705Z 443 │ } 2026-10-23T20:46:15.5852776Z 444 │ setActiveDraftKey( 2026-10-23T20:46:15.5852859Z ·  ────────┬──────── 2026-10-23T20:46:15.5853033Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5853103Z 445 │ createNewTaskDraft({ 2026-10-23T20:46:15.5853155Z ╰──── 2026-10-23T20:46:15.5853758Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5854085Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5854088Z 2026-10-23T20:46:15.5854334Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T20:46:15.5854537Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-23T20:46:15.5854645Z 1243 │ 2026-10-23T20:46:15.5854840Z 1244 │ {props.children} 2026-10-23T20:46:15.5854954Z ·  ───────────── 2026-10-23T20:46:15.5855026Z 1245 │ 2026-10-23T20:46:15.5855078Z ╰──── 2026-10-23T20:46:15.5855308Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T20:46:15.5855452Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T20:46:15.5855454Z 2026-10-23T20:46:15.5855664Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-23T20:46:15.5855803Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-23T20:46:15.5855855Z 21 │ 2026-10-23T20:46:15.5856014Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-23T20:46:15.5856100Z ·  ────────┬─────── 2026-10-23T20:46:15.5856250Z · ╰── 'summarizePayload' is declared here 2026-10-23T20:46:15.5856406Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-23T20:46:15.5856484Z ╰──── 2026-10-23T20:46:15.5856589Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5856594Z 2026-10-23T20:46:15.5856852Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5857027Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-23T20:46:15.5857079Z 55 │ 2026-10-23T20:46:15.5857147Z 56 │ useEffect(() => { 2026-10-23T20:46:15.5857216Z ·  ────┬──── 2026-10-23T20:46:15.5857345Z · ╰── This is the containing effect 2026-10-23T20:46:15.5857411Z 57 │ scheduler.reset(); 2026-10-23T20:46:15.5857510Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-23T20:46:15.5857600Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-23T20:46:15.5857719Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-23T20:46:15.5857800Z ·  ───────┬─────── 2026-10-23T20:46:15.5857972Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5858086Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-23T20:46:15.5858138Z ╰──── 2026-10-23T20:46:15.5858739Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5859069Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5859074Z 2026-10-23T20:46:15.5859276Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5859450Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-23T20:46:15.5859530Z 62 │ return () => scheduler.cancel(); 2026-10-23T20:46:15.5859631Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-23T20:46:15.5859758Z ·  ───┬─── ─────┬───── 2026-10-23T20:46:15.5859950Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-23T20:46:15.5860089Z · ╰── Unnecessary dependency `enabled` 2026-10-23T20:46:15.5860148Z 64 │ 2026-10-23T20:46:15.5860202Z ╰──── 2026-10-23T20:46:15.5860498Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5860810Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5860813Z 2026-10-23T20:46:15.5861072Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5861260Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-23T20:46:15.5861311Z 104 │ 2026-10-23T20:46:15.5861378Z 105 │ useEffect(() => { 2026-10-23T20:46:15.5861501Z ·  ────┬──── 2026-10-23T20:46:15.5861663Z · ╰── This is the containing effect 2026-10-23T20:46:15.5861742Z 106 │ clearReviewCommentTarget(); 2026-10-23T20:46:15.5861842Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T20:46:15.5861950Z ·  ────────────────┬─────────────── 2026-10-23T20:46:15.5862127Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5862198Z 108 │ }, [selectedSection?.id]); 2026-10-23T20:46:15.5862249Z ╰──── 2026-10-23T20:46:15.5862850Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5863175Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5863177Z 2026-10-23T20:46:15.5863436Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5863622Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-23T20:46:15.5863675Z 109 │ 2026-10-23T20:46:15.5863741Z 110 │ useEffect(() => { 2026-10-23T20:46:15.5863812Z ·  ────┬──── 2026-10-23T20:46:15.5863939Z · ╰── This is the containing effect 2026-10-23T20:46:15.5864027Z 111 │ if (activeCommentTarget === null) { 2026-10-23T20:46:15.5864134Z 112 │ setPendingNativeCommentSelection(null); 2026-10-23T20:46:15.5864246Z ·  ────────────────┬─────────────── 2026-10-23T20:46:15.5864431Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5864514Z 113 │ } 2026-10-23T20:46:15.5864567Z ╰──── 2026-10-23T20:46:15.5865167Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5865487Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5865495Z 2026-10-23T20:46:15.5865697Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5865881Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-23T20:46:15.5865977Z 107 │ setPendingNativeCommentSelection(null); 2026-10-23T20:46:15.5866049Z 108 │ }, [selectedSection?.id]); 2026-10-23T20:46:15.5866136Z ·  ─────────┬───────── 2026-10-23T20:46:15.5866300Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-23T20:46:15.5866352Z 109 │ 2026-10-23T20:46:15.5866405Z ╰──── 2026-10-23T20:46:15.5866697Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5867058Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5867089Z 2026-10-23T20:46:15.5867315Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-23T20:46:15.5867459Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-23T20:46:15.5867520Z 227 │ ): string { 2026-10-23T20:46:15.5867674Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-23T20:46:15.5867788Z ·  ────── 2026-10-23T20:46:15.5867920Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-23T20:46:15.5867974Z ╰──── 2026-10-23T20:46:15.5868149Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-23T20:46:15.5868154Z 2026-10-23T20:46:15.5868360Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-23T20:46:15.5868465Z ╭─[packages/contracts/src/rpc.ts:295:8] 2026-10-23T20:46:15.5868533Z 294 │ } from "./device.ts"; 2026-10-23T20:46:15.5868625Z 295 │ import {} from "./previewAutomation.ts"; 2026-10-23T20:46:15.5868694Z ·  ── 2026-10-23T20:46:15.5868754Z 296 │ import { 2026-10-23T20:46:15.5868804Z ╰──── 2026-10-23T20:46:15.5868886Z  help: Remove empty braces 2026-10-23T20:46:15.5868889Z 2026-10-23T20:46:15.5869370Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5869528Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-23T20:46:15.5869621Z 1227 │ yield* harness.replaceSession; 2026-10-23T20:46:15.5869834Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T20:46:15.5869990Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-23T20:46:15.5870079Z 1230 │ │ break; 2026-10-23T20:46:15.5870158Z 1231 │ │ } 2026-10-23T20:46:15.5870267Z 1232 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5870401Z 1233 │ ╰─▶ } 2026-10-23T20:46:15.5870482Z 1234 │ yield* Queue.offer( 2026-10-23T20:46:15.5870537Z ╰──── 2026-10-23T20:46:15.5870539Z 2026-10-23T20:46:15.5871008Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5871163Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-23T20:46:15.5871256Z 1336 │ yield* harness.replaceSession; 2026-10-23T20:46:15.5871461Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-23T20:46:15.5871623Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-23T20:46:15.5871775Z 1339 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5871935Z 1340 │ ╰─▶ } 2026-10-23T20:46:15.5872066Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-23T20:46:15.5872119Z ╰──── 2026-10-23T20:46:15.5872122Z 2026-10-23T20:46:15.5872315Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-23T20:46:15.5872463Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-23T20:46:15.5872519Z  80 │ 2026-10-23T20:46:15.5872790Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-23T20:46:15.5872911Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-23T20:46:15.5873041Z  83 │ │ ): Effect.fn.Return { 2026-10-23T20:46:15.5873209Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-23T20:46:15.5873345Z  85 │ │ const connections = new Map(); 2026-10-23T20:46:15.5873418Z  86 │ │ 2026-10-23T20:46:15.5873630Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-23T20:46:15.5873733Z  88 │ │ Effect.suspend(() => { 2026-10-23T20:46:15.5873870Z  89 │ │ const connection = connections.get(connectionId); 2026-10-23T20:46:15.5873982Z  90 │ │ return connection === undefined 2026-10-23T20:46:15.5874201Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-23T20:46:15.5874315Z  92 │ │ : Effect.succeed(connection); 2026-10-23T20:46:15.5874403Z  93 │ │ }); 2026-10-23T20:46:15.5874499Z  94 │ │ 2026-10-23T20:46:15.5874585Z  95 │ │ const send = ( 2026-10-23T20:46:15.5874686Z  96 │ │ connection: Connection, 2026-10-23T20:46:15.5874779Z  97 │ │ message: unknown, 2026-10-23T20:46:15.5874937Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-23T20:46:15.5875060Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-23T20:46:15.5875168Z 100 │ │ Effect.gen(function* () { 2026-10-23T20:46:15.5875292Z 101 │ │ const body = JSON.stringify(message); 2026-10-23T20:46:15.5875484Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-23T20:46:15.5875723Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-23T20:46:15.5875802Z 104 │ │ } 2026-10-23T20:46:15.5875935Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T20:46:15.5876035Z 106 │ │ try: (signal) => 2026-10-23T20:46:15.5876166Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-23T20:46:15.5876269Z 108 │ │ method: "POST", 2026-10-23T20:46:15.5876362Z 109 │ │ signal, 2026-10-23T20:46:15.5876461Z 110 │ │ headers: { 2026-10-23T20:46:15.5876592Z 111 │ │ "content-type": "application/json", 2026-10-23T20:46:15.5876740Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-23T20:46:15.5876871Z 113 │ │ authorization: options.authorization, 2026-10-23T20:46:15.5876998Z 114 │ │ ...(connection.sessionId === null 2026-10-23T20:46:15.5877095Z 115 │ │ ? {} 2026-10-23T20:46:15.5877239Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-23T20:46:15.5877371Z 117 │ │ ...(connection.protocolVersion === null 2026-10-23T20:46:15.5877464Z 118 │ │ ? {} 2026-10-23T20:46:15.5877633Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T20:46:15.5877719Z 120 │ │ }, 2026-10-23T20:46:15.5877809Z 121 │ │ body, 2026-10-23T20:46:15.5877894Z 122 │ │ }), 2026-10-23T20:46:15.5877997Z 123 │ │ catch: bridgeError, 2026-10-23T20:46:15.5878077Z 124 │ │ }); 2026-10-23T20:46:15.5878289Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-23T20:46:15.5878392Z 126 │ │ if (!response.ok) { 2026-10-23T20:46:15.5878500Z 127 │ │ yield* Effect.promise( 2026-10-23T20:46:15.5878681Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T20:46:15.5878769Z 129 │ │ ); 2026-10-23T20:46:15.5878885Z 130 │ │ return yield* Effect.fail( 2026-10-23T20:46:15.5879092Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-23T20:46:15.5879172Z 132 │ │ ); 2026-10-23T20:46:15.5879253Z 133 │ │ } 2026-10-23T20:46:15.5879462Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-23T20:46:15.5879584Z 135 │ │ for (const payload of payloads) { 2026-10-23T20:46:15.5879798Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-23T20:46:15.5879980Z 137 │ │ } 2026-10-23T20:46:15.5880111Z 138 │ │ return payloads; 2026-10-23T20:46:15.5880235Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-23T20:46:15.5880309Z 140 │ │ ); 2026-10-23T20:46:15.5880379Z 141 │ │ 2026-10-23T20:46:15.5880556Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-23T20:46:15.5880682Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-23T20:46:15.5880864Z 144 │ │ ): Effect.fn.Return { 2026-10-23T20:46:15.5881025Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T20:46:15.5881158Z 146 │ │ connections.delete(request.connectionId); 2026-10-23T20:46:15.5881282Z 147 │ │ const sessionId = connection.sessionId; 2026-10-23T20:46:15.5881383Z 148 │ │ if (sessionId !== null) { 2026-10-23T20:46:15.5881512Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-23T20:46:15.5881610Z 150 │ │ try: (signal) => 2026-10-23T20:46:15.5881744Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-23T20:46:15.5881845Z 152 │ │ method: "DELETE", 2026-10-23T20:46:15.5881935Z 153 │ │ signal, 2026-10-23T20:46:15.5882029Z 154 │ │ headers: { 2026-10-23T20:46:15.5882160Z 155 │ │ authorization: options.authorization, 2026-10-23T20:46:15.5882285Z 156 │ │ "mcp-session-id": sessionId, 2026-10-23T20:46:15.5882419Z 157 │ │ ...(connection.protocolVersion === null 2026-10-23T20:46:15.5882510Z 158 │ │ ? {} 2026-10-23T20:46:15.5882672Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-23T20:46:15.5882757Z 160 │ │ }, 2026-10-23T20:46:15.5882838Z 161 │ │ }), 2026-10-23T20:46:15.5882942Z 162 │ │ catch: bridgeError, 2026-10-23T20:46:15.5883021Z 163 │ │ }); 2026-10-23T20:46:15.5883157Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-23T20:46:15.5883266Z 165 │ │ return yield* Effect.fail( 2026-10-23T20:46:15.5883383Z 166 │ │ new AcpMcpOverAcpError( 2026-10-23T20:46:15.5883569Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-23T20:46:15.5883651Z 168 │ │ ), 2026-10-23T20:46:15.5883729Z 169 │ │ ); 2026-10-23T20:46:15.5883807Z 170 │ │ } 2026-10-23T20:46:15.5883911Z 171 │ │ yield* Effect.promise( 2026-10-23T20:46:15.5884088Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-23T20:46:15.5884164Z 173 │ │ ); 2026-10-23T20:46:15.5884239Z 174 │ │ } 2026-10-23T20:46:15.5884323Z 175 │ │ return {}; 2026-10-23T20:46:15.5884499Z 176 │ │ }); 2026-10-23T20:46:15.5884597Z 177 │ │ 2026-10-23T20:46:15.5884678Z 178 │ │ return { 2026-10-23T20:46:15.5884851Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-23T20:46:15.5884971Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-23T20:46:15.5885079Z 181 │ │ return yield* Effect.fail( 2026-10-23T20:46:15.5885264Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-23T20:46:15.5885345Z 183 │ │ ); 2026-10-23T20:46:15.5885423Z 184 │ │ } 2026-10-23T20:46:15.5885549Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-23T20:46:15.5885764Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-23T20:46:15.5885842Z 187 │ │ } 2026-10-23T20:46:15.5885997Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-23T20:46:15.5886110Z 189 │ │ connections.set(connectionId, { 2026-10-23T20:46:15.5886231Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-23T20:46:15.5886330Z 191 │ │ sessionId: null, 2026-10-23T20:46:15.5886437Z 192 │ │ protocolVersion: null, 2026-10-23T20:46:15.5886538Z 193 │ │ nextRequestId: 0, 2026-10-23T20:46:15.5886617Z 194 │ │ }); 2026-10-23T20:46:15.5886720Z 195 │ │ return { connectionId }; 2026-10-23T20:46:15.5886802Z 196 │ │ }), 2026-10-23T20:46:15.5886973Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-23T20:46:15.5887135Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T20:46:15.5887259Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-23T20:46:15.5888923Z 200 │ │ const payloads = yield* send(connection, { 2026-10-23T20:46:15.5889030Z 201 │ │ jsonrpc: "2.0", 2026-10-23T20:46:15.5889113Z 202 │ │ id, 2026-10-23T20:46:15.5889220Z 203 │ │ method: request.method, 2026-10-23T20:46:15.5889380Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T20:46:15.5889461Z 205 │ │ }); 2026-10-23T20:46:15.5889651Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-23T20:46:15.5889774Z 207 │ │ const envelope = asEnvelope(response); 2026-10-23T20:46:15.5889876Z 208 │ │ if (envelope === null) { 2026-10-23T20:46:15.5889984Z 209 │ │ return yield* Effect.fail( 2026-10-23T20:46:15.5890173Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-23T20:46:15.5890252Z 211 │ │ ); 2026-10-23T20:46:15.5890327Z 212 │ │ } 2026-10-23T20:46:15.5890446Z 213 │ │ if (envelope.error !== undefined) { 2026-10-23T20:46:15.5890947Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-23T20:46:15.5891062Z 215 │ │ } 2026-10-23T20:46:15.5891234Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-23T20:46:15.5891308Z 217 │ │ }), 2026-10-23T20:46:15.5891499Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-23T20:46:15.5891660Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-23T20:46:15.5891765Z 220 │ │ yield* send(connection, { 2026-10-23T20:46:15.5891861Z 221 │ │ jsonrpc: "2.0", 2026-10-23T20:46:15.5891962Z 222 │ │ method: request.method, 2026-10-23T20:46:15.5892124Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-23T20:46:15.5892205Z 224 │ │ }); 2026-10-23T20:46:15.5892280Z 225 │ │ }), 2026-10-23T20:46:15.5892365Z 226 │ │ disconnect, 2026-10-23T20:46:15.5892474Z 227 │ │ dispose: Effect.suspend(() => 2026-10-23T20:46:15.5892571Z 228 │ │ Effect.forEach( 2026-10-23T20:46:15.5892676Z 229 │ │ [...connections.keys()], 2026-10-23T20:46:15.5892843Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-23T20:46:15.5892942Z 231 │ │ { discard: true }, 2026-10-23T20:46:15.5893019Z 232 │ │ ), 2026-10-23T20:46:15.5893100Z 233 │ │ ), 2026-10-23T20:46:15.5893174Z 234 │ │ }; 2026-10-23T20:46:15.5893304Z 235 │ ╰─▶ }); 2026-10-23T20:46:15.5893357Z ╰──── 2026-10-23T20:46:15.5893612Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-23T20:46:15.5893615Z 2026-10-23T20:46:15.5893862Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-23T20:46:15.5893977Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-23T20:46:15.5894029Z 55 │ 2026-10-23T20:46:15.5894128Z 56 │ function normalizeTerminalContextSelection( 2026-10-23T20:46:15.5894239Z ·  ────────────────┬──────────────── 2026-10-23T20:46:15.5894478Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-23T20:46:15.5894571Z 57 │ selection: TerminalContextSelection, 2026-10-23T20:46:15.5894622Z ╰──── 2026-10-23T20:46:15.5894726Z  help: Consider removing this declaration. 2026-10-23T20:46:15.5894729Z 2026-10-23T20:46:15.5894931Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T20:46:15.5895064Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-23T20:46:15.5895137Z 2 │ AuthDiagnosticsReadScope, 2026-10-23T20:46:15.5895205Z 3 │ type AuthSessionState, 2026-10-23T20:46:15.5895289Z ·  ────────┬─────── 2026-10-23T20:46:15.5895435Z · ╰── 'AuthSessionState' is imported here 2026-10-23T20:46:15.5895558Z 4 │ sessionGrantsScope, 2026-10-23T20:46:15.5895636Z ╰──── 2026-10-23T20:46:15.5895733Z  help: Consider removing this import. 2026-10-23T20:46:15.5895736Z 2026-10-23T20:46:15.5895994Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5896158Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-23T20:46:15.5896278Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-23T20:46:15.5896342Z 284 │ useEffect(() => { 2026-10-23T20:46:15.5896413Z ·  ────┬──── 2026-10-23T20:46:15.5896544Z · ╰── This is the containing effect 2026-10-23T20:46:15.5896627Z 285 │ setNow(new Date().toISOString()); 2026-10-23T20:46:15.5896696Z ·  ───┬── 2026-10-23T20:46:15.5896867Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5897007Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-23T20:46:15.5897057Z ╰──── 2026-10-23T20:46:15.5897657Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5897982Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5897984Z 2026-10-23T20:46:15.5898189Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5898356Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-23T20:46:15.5898487Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-23T20:46:15.5898576Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-23T20:46:15.5898677Z ·  ───────┬────── 2026-10-23T20:46:15.5898841Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-23T20:46:15.5898952Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-23T20:46:15.5899002Z ╰──── 2026-10-23T20:46:15.5899294Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5899609Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5899614Z 2026-10-23T20:46:15.5899782Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5899944Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-23T20:46:15.5900029Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-23T20:46:15.5900185Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-23T20:46:15.5900304Z ·  ─────┬──── 2026-10-23T20:46:15.5900466Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5900601Z 357 │ const id = setTimeout(() => { 2026-10-23T20:46:15.5900679Z ╰──── 2026-10-23T20:46:15.5900962Z  help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5901252Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5901255Z 2026-10-23T20:46:15.5901443Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-23T20:46:15.5901576Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-23T20:46:15.5901692Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-23T20:46:15.5901771Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T20:46:15.5901846Z ·  ─┬─ 2026-10-23T20:46:15.5901970Z · ╰── 'Arr' is imported here 2026-10-23T20:46:15.5902052Z 5 │ import * as Order from "effect/Order"; 2026-10-23T20:46:15.5902102Z ╰──── 2026-10-23T20:46:15.5902199Z  help: Consider removing this import. 2026-10-23T20:46:15.5902201Z 2026-10-23T20:46:15.5902397Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-23T20:46:15.5902526Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-23T20:46:15.5902604Z 4 │ import * as Arr from "effect/Array"; 2026-10-23T20:46:15.5902684Z 5 │ import * as Order from "effect/Order"; 2026-10-23T20:46:15.5902756Z ·  ──┬── 2026-10-23T20:46:15.5902884Z · ╰── 'Order' is imported here 2026-10-23T20:46:15.5902941Z 6 │ 2026-10-23T20:46:15.5902991Z ╰──── 2026-10-23T20:46:15.5903087Z  help: Consider removing this import. 2026-10-23T20:46:15.5903089Z 2026-10-23T20:46:15.5903346Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5903523Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-23T20:46:15.5903574Z 58 │ 2026-10-23T20:46:15.5903639Z 59 │ useEffect(() => { 2026-10-23T20:46:15.5903710Z ·  ────┬──── 2026-10-23T20:46:15.5903837Z · ╰── This is the containing effect 2026-10-23T20:46:15.5903916Z 60 │ setMountedModes((current) => { 2026-10-23T20:46:15.5903995Z ·  ───────┬─────── 2026-10-23T20:46:15.5904214Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5904325Z 61 │ if (current.has(props.mode)) { 2026-10-23T20:46:15.5904407Z ╰──── 2026-10-23T20:46:15.5905005Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5905325Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5905328Z 2026-10-23T20:46:15.5905583Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5905737Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-23T20:46:15.5905897Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-23T20:46:15.5905962Z 29 │ useEffect(() => { 2026-10-23T20:46:15.5906032Z ·  ────┬──── 2026-10-23T20:46:15.5906159Z · ╰── This is the containing effect 2026-10-23T20:46:15.5906281Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-23T20:46:15.5906385Z ·  ───┬─── 2026-10-23T20:46:15.5906572Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5906643Z 31 │ }, [key, live, snapshot]); 2026-10-23T20:46:15.5906693Z ╰──── 2026-10-23T20:46:15.5907292Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5907612Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5907615Z 2026-10-23T20:46:15.5907826Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T20:46:15.5907950Z ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28] 2026-10-23T20:46:15.5908029Z 137 │ visit(parser.parse(markdown)); 2026-10-23T20:46:15.5908117Z 138 │ for (const edit of edits.reverse()) 2026-10-23T20:46:15.5908215Z ·  ─────── 2026-10-23T20:46:15.5908380Z 139 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T20:46:15.5908430Z ╰──── 2026-10-23T20:46:15.5908690Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T20:46:15.5908693Z 2026-10-23T20:46:15.5908904Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T20:46:15.5909024Z ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28] 2026-10-23T20:46:15.5909102Z 168 │ visit(parser.parse(markdown)); 2026-10-23T20:46:15.5909183Z 169 │ for (const edit of edits.reverse()) 2026-10-23T20:46:15.5909276Z ·  ─────── 2026-10-23T20:46:15.5909485Z 170 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-23T20:46:15.5909567Z ╰──── 2026-10-23T20:46:15.5909825Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T20:46:15.5909828Z 2026-10-23T20:46:15.5910035Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-23T20:46:15.5910155Z ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38] 2026-10-23T20:46:15.5910232Z 222 │ visit(parser.parse(markdown)); 2026-10-23T20:46:15.5910337Z 223 │ for (const lineStart of lineStarts.reverse()) { 2026-10-23T20:46:15.5910440Z ·  ─────── 2026-10-23T20:46:15.5910607Z 224 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-23T20:46:15.5910661Z ╰──── 2026-10-23T20:46:15.5910916Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-23T20:46:15.5910918Z 2026-10-23T20:46:15.5911114Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-23T20:46:15.5911252Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-23T20:46:15.5911315Z 1 │ import type { 2026-10-23T20:46:15.5911378Z 2 │ EnvironmentId, 2026-10-23T20:46:15.5911452Z ·  ──────┬────── 2026-10-23T20:46:15.5911588Z · ╰── 'EnvironmentId' is imported here 2026-10-23T20:46:15.5911672Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-23T20:46:15.5911721Z ╰──── 2026-10-23T20:46:15.5911825Z  help: Consider removing this import. 2026-10-23T20:46:15.5911829Z 2026-10-23T20:46:15.5912006Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-23T20:46:15.5912127Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-23T20:46:15.5912249Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-23T20:46:15.5912338Z 194 │ const codes = new Array(count); 2026-10-23T20:46:15.5912444Z ·  ──────────────────────── 2026-10-23T20:46:15.5912549Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-23T20:46:15.5912598Z ╰──── 2026-10-23T20:46:15.5913020Z  help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`. 2026-10-23T20:46:15.5913025Z 2026-10-23T20:46:15.5913211Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T20:46:15.5913324Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-23T20:46:15.5913381Z 7 │ () => 2026-10-23T20:46:15.5913445Z 8 │ Gesture.Hover() 2026-10-23T20:46:15.5913521Z ·  ──┬── 2026-10-23T20:46:15.5913654Z · ╰── `Hover` may be a component 2026-10-23T20:46:15.5913727Z 9 │ .manualActivation(true) 2026-10-23T20:46:15.5913776Z ╰──── 2026-10-23T20:46:15.5914055Z  help: Render `Hover` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration 2026-10-23T20:46:15.5914580Z  note: `Hover` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components 2026-10-23T20:46:15.5914614Z 2026-10-23T20:46:15.5914869Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5915020Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-23T20:46:15.5915070Z 55 │ 2026-10-23T20:46:15.5915134Z 56 │ useEffect(() => { 2026-10-23T20:46:15.5915209Z ·  ────┬──── 2026-10-23T20:46:15.5915336Z · ╰── This is the containing effect 2026-10-23T20:46:15.5915403Z 57 │ setDecodedSize(null); 2026-10-23T20:46:15.5915484Z ·  ───────┬────── 2026-10-23T20:46:15.5915654Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5915722Z 58 │ }, [props.sourceKey]); 2026-10-23T20:46:15.5915773Z ╰──── 2026-10-23T20:46:15.5916372Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5916693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5916695Z 2026-10-23T20:46:15.5916956Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5917107Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-23T20:46:15.5917158Z 59 │ 2026-10-23T20:46:15.5917221Z 60 │ useEffect(() => { 2026-10-23T20:46:15.5917291Z ·  ────┬──── 2026-10-23T20:46:15.5917416Z · ╰── This is the containing effect 2026-10-23T20:46:15.5917482Z 61 │ setFailedUri(null); 2026-10-23T20:46:15.5917556Z ·  ──────┬───── 2026-10-23T20:46:15.5917721Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5917786Z 62 │ }, [props.uri]); 2026-10-23T20:46:15.5917836Z ╰──── 2026-10-23T20:46:15.5918437Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5918760Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5918762Z 2026-10-23T20:46:15.5918978Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-23T20:46:15.5919126Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-23T20:46:15.5919251Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-23T20:46:15.5919426Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-23T20:46:15.5919563Z ·  ────────┬──────── 2026-10-23T20:46:15.5919737Z · ╰── 'ActivityIndicator' is imported here 2026-10-23T20:46:15.5919789Z 8 │ 2026-10-23T20:46:15.5919839Z ╰──── 2026-10-23T20:46:15.5919939Z  help: Consider removing this import. 2026-10-23T20:46:15.5919942Z 2026-10-23T20:46:15.5920141Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5920292Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-23T20:46:15.5920360Z 57 │ setDecodedSize(null); 2026-10-23T20:46:15.5920427Z 58 │ }, [props.sourceKey]); 2026-10-23T20:46:15.5920507Z ·  ───────┬─────── 2026-10-23T20:46:15.5920668Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-23T20:46:15.5920722Z 59 │ 2026-10-23T20:46:15.5920772Z ╰──── 2026-10-23T20:46:15.5921064Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5921374Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5921377Z 2026-10-23T20:46:15.5921576Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5921724Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-23T20:46:15.5921791Z 61 │ setFailedUri(null); 2026-10-23T20:46:15.5921853Z 62 │ }, [props.uri]); 2026-10-23T20:46:15.5921932Z ·  ────┬──── 2026-10-23T20:46:15.5922074Z · ╰── Unnecessary dependency `props.uri` 2026-10-23T20:46:15.5922126Z 63 │ 2026-10-23T20:46:15.5922175Z ╰──── 2026-10-23T20:46:15.5922469Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5922778Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5922780Z 2026-10-23T20:46:15.5922967Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T20:46:15.5923120Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-23T20:46:15.5923292Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-23T20:46:15.5923372Z 602 │ const gesture = Gesture.Pan() 2026-10-23T20:46:15.5923458Z ·  ─┬─ 2026-10-23T20:46:15.5923597Z · ╰── `Pan` may be a component 2026-10-23T20:46:15.5923672Z 603 │ .enabled(!props.disabled) 2026-10-23T20:46:15.5923723Z ╰──── 2026-10-23T20:46:15.5923999Z  help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration 2026-10-23T20:46:15.5924470Z  note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components 2026-10-23T20:46:15.5924473Z 2026-10-23T20:46:15.5924777Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5924964Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T20:46:15.5925028Z 259 │ .join("|"); 2026-10-23T20:46:15.5925094Z 260 │ useEffect(() => { 2026-10-23T20:46:15.5925164Z ·  ────┬──── 2026-10-23T20:46:15.5925293Z · ╰── This is the containing effect 2026-10-23T20:46:15.5925354Z 261 │ stop(); 2026-10-23T20:46:15.5925422Z ·  ──┬─ 2026-10-23T20:46:15.5925585Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5925651Z 262 │ }, [orderVersion]); 2026-10-23T20:46:15.5925702Z ╰──── 2026-10-23T20:46:15.5926307Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5926630Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5926632Z 2026-10-23T20:46:15.5926848Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T20:46:15.5927008Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-23T20:46:15.5927072Z 260 │ useEffect(() => { 2026-10-23T20:46:15.5927131Z 261 │ stop(); 2026-10-23T20:46:15.5927200Z ·  ──┬─ 2026-10-23T20:46:15.5927328Z · ╰── Missing dependency `stop` 2026-10-23T20:46:15.5927392Z 262 │ }, [orderVersion]); 2026-10-23T20:46:15.5927470Z ·  ──────┬───── 2026-10-23T20:46:15.5927617Z · ╰── Unnecessary dependency `orderVersion` 2026-10-23T20:46:15.5927679Z 263 │ useEffect( 2026-10-23T20:46:15.5927729Z ╰──── 2026-10-23T20:46:15.5928151Z  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5928466Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5928470Z 2026-10-23T20:46:15.5928616Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5928775Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-23T20:46:15.5928851Z 95 │ const latest = useRef(props); 2026-10-23T20:46:15.5928920Z 96 │ latest.current = props; 2026-10-23T20:46:15.5929027Z ·  ───┬──────┬─── 2026-10-23T20:46:15.5929205Z · │ ╰── Cannot update ref value during render 2026-10-23T20:46:15.5929318Z · ╰── This value is a ref 2026-10-23T20:46:15.5929387Z 97 │ const gesture = useMemo( 2026-10-23T20:46:15.5929436Z ╰──── 2026-10-23T20:46:15.5929962Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5930283Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5930286Z 2026-10-23T20:46:15.5930431Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5930589Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-23T20:46:15.5930699Z 103 │ .runOnJS(true) 2026-10-23T20:46:15.5930802Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T20:46:15.5930920Z ·  ───────────────┬────────────── 2026-10-23T20:46:15.5931125Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5931262Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5931313Z ╰──── 2026-10-23T20:46:15.5931782Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5932075Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5932078Z 2026-10-23T20:46:15.5932222Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5932387Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-23T20:46:15.5932485Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T20:46:15.5932618Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5932758Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T20:46:15.5932972Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5933098Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5933149Z ╰──── 2026-10-23T20:46:15.5933679Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5934008Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5934011Z 2026-10-23T20:46:15.5934155Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5934314Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-23T20:46:15.5934476Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5934597Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5934739Z ·  ──────────────────────────┬───────────────────────── 2026-10-23T20:46:15.5934951Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5935079Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T20:46:15.5935132Z ╰──── 2026-10-23T20:46:15.5935598Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5935889Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5935891Z 2026-10-23T20:46:15.5936037Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5936196Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-23T20:46:15.5936323Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5936448Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T20:46:15.5936586Z ·  ───────────────────────┬────────────────────── 2026-10-23T20:46:15.5936792Z · ╰── Passing a ref to a function may read its value during render 2026-10-23T20:46:15.5936861Z 108 │ [props.disabled], 2026-10-23T20:46:15.5936911Z ╰──── 2026-10-23T20:46:15.5937380Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5937677Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5937683Z 2026-10-23T20:46:15.5937827Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5937984Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-23T20:46:15.5938098Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T20:46:15.5938206Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-23T20:46:15.5938310Z ·  ───┬──────┬─── 2026-10-23T20:46:15.5938491Z · │ ╰── Cannot update ref value during render 2026-10-23T20:46:15.5938604Z · ╰── This value is a ref 2026-10-23T20:46:15.5938658Z 250 │ 2026-10-23T20:46:15.5938756Z ╰──── 2026-10-23T20:46:15.5939250Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5939539Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5939542Z 2026-10-23T20:46:15.5939687Z ⚠ react(refs): Cannot access refs during render 2026-10-23T20:46:15.5939845Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-23T20:46:15.5939964Z 246 │ const [preview, setPreview] = useState(null); 2026-10-23T20:46:15.5940082Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-23T20:46:15.5940213Z ·  ──────────────────┬────────────────── 2026-10-23T20:46:15.5940382Z · ╰── Cannot access ref value during render 2026-10-23T20:46:15.5940493Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-23T20:46:15.5940543Z ╰──── 2026-10-23T20:46:15.5941008Z  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected 2026-10-23T20:46:15.5941298Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-23T20:46:15.5941301Z 2026-10-23T20:46:15.5941477Z ⚠ react(purity): Cannot call impure function during render 2026-10-23T20:46:15.5941640Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-23T20:46:15.5941703Z 323 │ update(0); 2026-10-23T20:46:15.5941783Z 324 │ let last = performance.now(); 2026-10-23T20:46:15.5941881Z ·  ────────┬──────── 2026-10-23T20:46:15.5942022Z · ╰── Cannot call impure function 2026-10-23T20:46:15.5942090Z 325 │ const tick = () => { 2026-10-23T20:46:15.5942140Z ╰──── 2026-10-23T20:46:15.5942443Z  help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-23T20:46:15.5942745Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-23T20:46:15.5942750Z 2026-10-23T20:46:15.5942938Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-23T20:46:15.5943097Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-23T20:46:15.5943156Z  98 │ () => 2026-10-23T20:46:15.5943225Z  99 │ Gesture.Pan() 2026-10-23T20:46:15.5943299Z ·  ─┬─ 2026-10-23T20:46:15.5943428Z · ╰── `Pan` may be a component 2026-10-23T20:46:15.5943508Z 100 │ .enabled(!props.disabled) 2026-10-23T20:46:15.5943559Z ╰──── 2026-10-23T20:46:15.5943887Z  help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration 2026-10-23T20:46:15.5944367Z  note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components 2026-10-23T20:46:15.5944369Z 2026-10-23T20:46:15.5944582Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-23T20:46:15.5944741Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-23T20:46:15.5944809Z 103 │ .runOnJS(true) 2026-10-23T20:46:15.5944906Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-23T20:46:15.5944994Z ·  ───┬── 2026-10-23T20:46:15.5945435Z · ╰── Missing dependency `latest`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values 2026-10-23T20:46:15.5945569Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5945693Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-23T20:46:15.5945817Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-23T20:46:15.5945884Z 108 │ [props.disabled], 2026-10-23T20:46:15.5945968Z ·  ────────┬─────── 2026-10-23T20:46:15.5946158Z · ╰── This dependency list is missing values used by the callback 2026-10-23T20:46:15.5946213Z 109 │ ); 2026-10-23T20:46:15.5946267Z ╰──── 2026-10-23T20:46:15.5946481Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-23T20:46:15.5946798Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5946800Z 2026-10-23T20:46:15.5947274Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5947425Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-23T20:46:15.5947486Z 168 │ }); 2026-10-23T20:46:15.5947686Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T20:46:15.5947884Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-23T20:46:15.5947991Z 171 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5948125Z 172 │ ╰─▶ } 2026-10-23T20:46:15.5948179Z 173 │ 2026-10-23T20:46:15.5948229Z ╰──── 2026-10-23T20:46:15.5948231Z 2026-10-23T20:46:15.5948696Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5948843Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-23T20:46:15.5948953Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-23T20:46:15.5949195Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T20:46:15.5949357Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-23T20:46:15.5949459Z 180 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5949592Z 181 │ ╰─▶ } 2026-10-23T20:46:15.5949645Z 182 │ 2026-10-23T20:46:15.5949694Z ╰──── 2026-10-23T20:46:15.5949699Z 2026-10-23T20:46:15.5950160Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone. 2026-10-23T20:46:15.5950306Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-23T20:46:15.5950436Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-23T20:46:15.5950630Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-23T20:46:15.5950750Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-23T20:46:15.5950945Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-23T20:46:15.5951032Z 310 │ │ break; 2026-10-23T20:46:15.5951110Z 311 │ │ } 2026-10-23T20:46:15.5951214Z 312 │ │ yield* Effect.yieldNow; 2026-10-23T20:46:15.5951345Z 313 │ ╰─▶ } 2026-10-23T20:46:15.5951400Z 314 │ 2026-10-23T20:46:15.5951451Z ╰──── 2026-10-23T20:46:15.5951454Z 2026-10-23T20:46:15.5951647Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-23T20:46:15.5951775Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-23T20:46:15.5951883Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-23T20:46:15.5951950Z 187 │ let next = initial; 2026-10-23T20:46:15.5952021Z ·  ──┬─ 2026-10-23T20:46:15.5952142Z · ╰── From this accumulator 2026-10-23T20:46:15.5952221Z 188 │ let receivedSnapshot = false; 2026-10-23T20:46:15.5952295Z 189 │ for (const item of items) { 2026-10-23T20:46:15.5952362Z ·  ─┬─ 2026-10-23T20:46:15.5952467Z · ╰── For this loop 2026-10-23T20:46:15.5952557Z 190 │ if (item.kind === "synchronized") { 2026-10-23T20:46:15.5952679Z 191 │ waiting = false; 2026-10-23T20:46:15.5952858Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-23T20:46:15.5952976Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-23T20:46:15.5953062Z ·  ───┬─── 2026-10-23T20:46:15.5953193Z · ╰── From this spread 2026-10-23T20:46:15.5953256Z 194 │ } 2026-10-23T20:46:15.5953308Z ╰──── 2026-10-23T20:46:15.5953465Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-23T20:46:15.5953623Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-23T20:46:15.5953625Z 2026-10-23T20:46:15.5953831Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T20:46:15.5954002Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-23T20:46:15.5954077Z 3 │ AuthProvidersManageScope, 2026-10-23T20:46:15.5954146Z 4 │ type AuthSessionState, 2026-10-23T20:46:15.5954229Z ·  ────────┬─────── 2026-10-23T20:46:15.5954383Z · ╰── 'AuthSessionState' is imported here 2026-10-23T20:46:15.5954477Z 5 │ type EnvironmentId, 2026-10-23T20:46:15.5954528Z ╰──── 2026-10-23T20:46:15.5954626Z  help: Consider removing this import. 2026-10-23T20:46:15.5954629Z 2026-10-23T20:46:15.5954889Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5955041Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-23T20:46:15.5955105Z 510 │ }, []); 2026-10-23T20:46:15.5955171Z 511 │ useEffect(() => { 2026-10-23T20:46:15.5955242Z ·  ────┬──── 2026-10-23T20:46:15.5955371Z · ╰── This is the containing effect 2026-10-23T20:46:15.5955456Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T20:46:15.5955544Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5955716Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5955816Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T20:46:15.5955866Z ╰──── 2026-10-23T20:46:15.5956476Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5956800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5956802Z 2026-10-23T20:46:15.5957060Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5957211Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-23T20:46:15.5957366Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-23T20:46:15.5957431Z 870 │ useEffect(() => { 2026-10-23T20:46:15.5957501Z ·  ────┬──── 2026-10-23T20:46:15.5957682Z · ╰── This is the containing effect 2026-10-23T20:46:15.5957868Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-23T20:46:15.5957981Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-23T20:46:15.5958077Z ·  ─────────────┬──────────── 2026-10-23T20:46:15.5958251Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5958307Z 873 │ } 2026-10-23T20:46:15.5958357Z ╰──── 2026-10-23T20:46:15.5958960Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5959290Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5959295Z 2026-10-23T20:46:15.5959552Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5959707Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-23T20:46:15.5959761Z 1117 │ 2026-10-23T20:46:15.5959827Z 1118 │ useEffect(() => { 2026-10-23T20:46:15.5959899Z ·  ────┬──── 2026-10-23T20:46:15.5960029Z · ╰── This is the containing effect 2026-10-23T20:46:15.5960105Z 1119 │ setAnchorMessageId(null); 2026-10-23T20:46:15.5960192Z ·  ─────────┬──────── 2026-10-23T20:46:15.5960369Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5960452Z 1120 │ setSubmittedMessageId(null); 2026-10-23T20:46:15.5960503Z ╰──── 2026-10-23T20:46:15.5961100Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5961419Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5961422Z 2026-10-23T20:46:15.5961625Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5961780Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-23T20:46:15.5961865Z 512 │ setKeyboardStateSuspect(false); 2026-10-23T20:46:15.5961964Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-23T20:46:15.5962104Z ·  ────────┬──────── ─────────┬──────── 2026-10-23T20:46:15.5962312Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-23T20:46:15.5962470Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-23T20:46:15.5962595Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-23T20:46:15.5962646Z ╰──── 2026-10-23T20:46:15.5962993Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5963342Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5963345Z 2026-10-23T20:46:15.5963544Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5963699Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-23T20:46:15.5963786Z 1066 │ userInputInsetProgress.set(1); 2026-10-23T20:46:15.5963947Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-23T20:46:15.5964043Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5964221Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-23T20:46:15.5964334Z 1068 │ const showContent = props.showContent ?? true; 2026-10-23T20:46:15.5964414Z ╰──── 2026-10-23T20:46:15.5964706Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5965015Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5965017Z 2026-10-23T20:46:15.5965218Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5965375Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-23T20:46:15.5965443Z 1124 │ freeze.set(false); 2026-10-23T20:46:15.5965524Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-23T20:46:15.5965625Z ·  ────────┬──────── 2026-10-23T20:46:15.5965792Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-23T20:46:15.5965844Z 1126 │ 2026-10-23T20:46:15.5965894Z ╰──── 2026-10-23T20:46:15.5966187Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5966502Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5966504Z 2026-10-23T20:46:15.5966663Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5966818Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-23T20:46:15.5966930Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-23T20:46:15.5967036Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-23T20:46:15.5967131Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5967292Z · ╰── `floatingControlCoverage` originates here 2026-10-23T20:46:15.5967416Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T20:46:15.5967472Z 953 │ ); 2026-10-23T20:46:15.5967537Z 954 │ useEffect(() => { 2026-10-23T20:46:15.5967640Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-23T20:46:15.5967730Z ·  ───────────┬─────────── 2026-10-23T20:46:15.5967891Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-23T20:46:15.5968071Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-23T20:46:15.5968152Z ╰──── 2026-10-23T20:46:15.5968416Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5968722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5968724Z 2026-10-23T20:46:15.5968881Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5969031Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-23T20:46:15.5969215Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-23T20:46:15.5969339Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-23T20:46:15.5969453Z ·  ────────────────┬──────────────── 2026-10-23T20:46:15.5969637Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-23T20:46:15.5969764Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-23T20:46:15.5969819Z 966 │ ); 2026-10-23T20:46:15.5969888Z 967 │ useAnimatedReaction( 2026-10-23T20:46:15.5969950Z 968 │ () => 2026-10-23T20:46:15.5970042Z 969 │ contentInsetEndAdjustment.value + 2026-10-23T20:46:15.5970130Z 970 │ floatingControlCoverage.value + 2026-10-23T20:46:15.5970324Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-23T20:46:15.5970387Z 972 │ (value) => { 2026-10-23T20:46:15.5970498Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-23T20:46:15.5970626Z ·  ────────────────┬──────────────── 2026-10-23T20:46:15.5970864Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-23T20:46:15.5970919Z 974 │ }, 2026-10-23T20:46:15.5970969Z ╰──── 2026-10-23T20:46:15.5971234Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5971539Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5971542Z 2026-10-23T20:46:15.5971800Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5972030Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-23T20:46:15.5972121Z 211 │ }; 2026-10-23T20:46:15.5972186Z 212 │ useEffect(() => { 2026-10-23T20:46:15.5972258Z ·  ────┬──── 2026-10-23T20:46:15.5972390Z · ╰── This is the containing effect 2026-10-23T20:46:15.5972562Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-23T20:46:15.5972627Z 214 │ if (inserted) { 2026-10-23T20:46:15.5972702Z 215 │ setSelection((current) => 2026-10-23T20:46:15.5972781Z ·  ──────┬───── 2026-10-23T20:46:15.5972947Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5973117Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-23T20:46:15.5973174Z ╰──── 2026-10-23T20:46:15.5973777Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5974097Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5974101Z 2026-10-23T20:46:15.5974384Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5974549Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-23T20:46:15.5974630Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-23T20:46:15.5974696Z 285 │ useEffect(() => { 2026-10-23T20:46:15.5974764Z ·  ────┬──── 2026-10-23T20:46:15.5974895Z · ╰── This is the containing effect 2026-10-23T20:46:15.5975041Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-23T20:46:15.5975189Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-23T20:46:15.5975258Z 288 │ const now = Date.now(); 2026-10-23T20:46:15.5975372Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-23T20:46:15.5975428Z 290 │ if ( 2026-10-23T20:46:15.5975507Z 291 │ lastRequest?.key === key && 2026-10-23T20:46:15.5975644Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-23T20:46:15.5975699Z 293 │ ) 2026-10-23T20:46:15.5975765Z 294 │ return; 2026-10-23T20:46:15.5975943Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-23T20:46:15.5976029Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-23T20:46:15.5976127Z ·  ────────────┬─────────── 2026-10-23T20:46:15.5976302Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5976363Z 297 │ return; 2026-10-23T20:46:15.5976413Z ╰──── 2026-10-23T20:46:15.5977011Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5977388Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5977417Z 2026-10-23T20:46:15.5977620Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-23T20:46:15.5977783Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-23T20:46:15.5977838Z 325 │ }, [ 2026-10-23T20:46:15.5977902Z 326 │ draftMessage, 2026-10-23T20:46:15.5977979Z ·  ──────┬───── 2026-10-23T20:46:15.5978125Z · ╰── Unnecessary dependency `draftMessage` 2026-10-23T20:46:15.5978189Z 327 │ environmentId, 2026-10-23T20:46:15.5978240Z ╰──── 2026-10-23T20:46:15.5978541Z  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.5978851Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.5978854Z 2026-10-23T20:46:15.5979138Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-23T20:46:15.5979294Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-23T20:46:15.5979350Z 162 │ keys, 2026-10-23T20:46:15.5979421Z 163 │ overridingProjects = [], 2026-10-23T20:46:15.5979502Z ·  ── 2026-10-23T20:46:15.5979570Z 164 │ onClearOverrides, 2026-10-23T20:46:15.5979621Z ╰──── 2026-10-23T20:46:15.5979945Z  help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it. 2026-10-23T20:46:15.5979949Z 2026-10-23T20:46:15.5980206Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.5980356Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-23T20:46:15.5980411Z 398 │ 2026-10-23T20:46:15.5980474Z 399 │ useEffect(() => { 2026-10-23T20:46:15.5980542Z ·  ────┬──── 2026-10-23T20:46:15.5980671Z · ╰── This is the containing effect 2026-10-23T20:46:15.5980763Z 400 │ setInspectorSelection((current) => { 2026-10-23T20:46:15.5980850Z ·  ──────────┬────────── 2026-10-23T20:46:15.5981024Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.5981130Z 401 │ if (props.renderInspector === undefined) { 2026-10-23T20:46:15.5981181Z ╰──── 2026-10-23T20:46:15.5981778Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.5982098Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.5982100Z 2026-10-23T20:46:15.5982363Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T20:46:15.5982543Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-23T20:46:15.5982702Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-23T20:46:15.5982870Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-23T20:46:15.5982969Z 529 │ │ 2026-10-23T20:46:15.5983586Z 534 │ ╰─▶ ); 2026-10-23T20:46:15.5983669Z 535 │ const FilesInspector = () => 2026-10-23T20:46:15.5983720Z ╰──── 2026-10-23T20:46:15.5983940Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T20:46:15.5983943Z 2026-10-23T20:46:15.5984155Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-23T20:46:15.5984311Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-23T20:46:15.5984379Z 534 │ ); 2026-10-23T20:46:15.5984577Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-23T20:46:15.5984726Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-23T20:46:15.5984839Z 537 │ │ 2026-10-23T20:46:15.5985799Z 545 │ ╰─▶ ) : null; 2026-10-23T20:46:15.5985956Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-23T20:46:15.5986009Z ╰──── 2026-10-23T20:46:15.5986224Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-23T20:46:15.5986228Z 2026-10-23T20:46:15.5986384Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5986538Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T20:46:15.5986591Z  86 │ 2026-10-23T20:46:15.5986683Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-23T20:46:15.5986763Z ·  ──────┬───── 2026-10-23T20:46:15.5986900Z · ╰── `cardCoverage` originates here 2026-10-23T20:46:15.5986981Z  88 │ const barHeightRef = useRef(0); 2026-10-23T20:46:15.5987110Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T20:46:15.5987233Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T20:46:15.5987325Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T20:46:15.5987393Z  92 │ if (!cardCoverage) { 2026-10-23T20:46:15.5987454Z  93 │ return; 2026-10-23T20:46:15.5987510Z  94 │ } 2026-10-23T20:46:15.5987660Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T20:46:15.5987747Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T20:46:15.5987806Z  97 │ return; 2026-10-23T20:46:15.5987859Z  98 │ } 2026-10-23T20:46:15.5987939Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T20:46:15.5988020Z 100 │ cardCoverage.value = coverage; 2026-10-23T20:46:15.5988098Z ·  ──────┬───── 2026-10-23T20:46:15.5988246Z · ╰── `cardCoverage` cannot be modified 2026-10-23T20:46:15.5988309Z 101 │ return; 2026-10-23T20:46:15.5988360Z ╰──── 2026-10-23T20:46:15.5988655Z  help: Do not mutate component props or hook arguments. If the value should change, update it where it is owned and pass an update callback, or use local state 2026-10-23T20:46:15.5988964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5988967Z 2026-10-23T20:46:15.5989123Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.5989278Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T20:46:15.5989359Z  89 │ const cardHeightRef = useRef(0); 2026-10-23T20:46:15.5989444Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T20:46:15.5989525Z ·  ─────┬──── 2026-10-23T20:46:15.5989660Z · ╰── `cardHeight` originates here 2026-10-23T20:46:15.5989753Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T20:46:15.5989819Z  92 │ if (!cardCoverage) { 2026-10-23T20:46:15.5989878Z  93 │ return; 2026-10-23T20:46:15.5989931Z  94 │ } 2026-10-23T20:46:15.5990080Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T20:46:15.5990165Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T20:46:15.5990223Z  97 │ return; 2026-10-23T20:46:15.5990277Z  98 │ } 2026-10-23T20:46:15.5990355Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T20:46:15.5990437Z 100 │ cardCoverage.value = coverage; 2026-10-23T20:46:15.5990495Z 101 │ return; 2026-10-23T20:46:15.5990553Z 102 │ } 2026-10-23T20:46:15.5990655Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T20:46:15.5990752Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T20:46:15.5990837Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T20:46:15.5990894Z 106 │ }); 2026-10-23T20:46:15.5990958Z 107 │ }, [cardCoverage]); 2026-10-23T20:46:15.5991043Z 108 │ const handleBarLayout = useCallback( 2026-10-23T20:46:15.5991124Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T20:46:15.5991248Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T20:46:15.5991316Z 111 │ notifyCoverage(); 2026-10-23T20:46:15.5991371Z 112 │ }, 2026-10-23T20:46:15.5991437Z 113 │ [notifyCoverage], 2026-10-23T20:46:15.5991490Z 114 │ ); 2026-10-23T20:46:15.5991574Z 115 │ const handleCardLayout = useCallback( 2026-10-23T20:46:15.5991705Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T20:46:15.5991858Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T20:46:15.5991970Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T20:46:15.5992050Z ·  ─────┬──── 2026-10-23T20:46:15.5992188Z · ╰── `cardHeight` cannot be modified 2026-10-23T20:46:15.5992255Z 119 │ notifyCoverage(); 2026-10-23T20:46:15.5992305Z ╰──── 2026-10-23T20:46:15.5992573Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.5992878Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5992881Z 2026-10-23T20:46:15.5993087Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T20:46:15.5993243Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T20:46:15.5993327Z  90 │ const cardHeight = useSharedValue(0); 2026-10-23T20:46:15.5993421Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-23T20:46:15.5993525Z ·  ───┬─── 2026-10-23T20:46:15.5993764Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T20:46:15.5993832Z  92 │ if (!cardCoverage) { 2026-10-23T20:46:15.5993891Z  93 │ return; 2026-10-23T20:46:15.5993944Z  94 │ } 2026-10-23T20:46:15.5994098Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-23T20:46:15.5994185Z  96 │ if (coverage === cardCoverage.value) { 2026-10-23T20:46:15.5994245Z  97 │ return; 2026-10-23T20:46:15.5994297Z  98 │ } 2026-10-23T20:46:15.5994412Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T20:46:15.5994493Z 100 │ cardCoverage.value = coverage; 2026-10-23T20:46:15.5994571Z ·  ──────┬───── 2026-10-23T20:46:15.5994707Z · ╰── This modifies `cardCoverage` 2026-10-23T20:46:15.5994767Z 101 │ return; 2026-10-23T20:46:15.5994817Z ╰──── 2026-10-23T20:46:15.5995162Z  help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead 2026-10-23T20:46:15.5995471Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5995476Z 2026-10-23T20:46:15.5995677Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T20:46:15.5995831Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-23T20:46:15.5995912Z  99 │ if (cardCoverage.value === 0) { 2026-10-23T20:46:15.5995995Z 100 │ cardCoverage.value = coverage; 2026-10-23T20:46:15.5996072Z ·  ──────┬───── 2026-10-23T20:46:15.5996203Z · ╰── This modifies `cardCoverage` 2026-10-23T20:46:15.5996263Z 101 │ return; 2026-10-23T20:46:15.5996317Z 102 │ } 2026-10-23T20:46:15.5996418Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-23T20:46:15.5996562Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-23T20:46:15.5996674Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-23T20:46:15.5996729Z 106 │ }); 2026-10-23T20:46:15.5996795Z 107 │ }, [cardCoverage]); 2026-10-23T20:46:15.5996878Z 108 │ const handleBarLayout = useCallback( 2026-10-23T20:46:15.5996957Z 109 │ (event: LayoutChangeEvent) => { 2026-10-23T20:46:15.5997064Z ·  ───────────────┬─────────────── 2026-10-23T20:46:15.5997288Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-23T20:46:15.5997410Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T20:46:15.5997462Z ╰──── 2026-10-23T20:46:15.5997804Z  help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead 2026-10-23T20:46:15.5998111Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.5998113Z 2026-10-23T20:46:15.5998313Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T20:46:15.5998466Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-23T20:46:15.5998551Z 115 │ const handleCardLayout = useCallback( 2026-10-23T20:46:15.5998631Z 116 │ (event: LayoutChangeEvent) => { 2026-10-23T20:46:15.5998735Z ·  ───────────────┬─────────────── 2026-10-23T20:46:15.5998952Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-23T20:46:15.5999081Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-23T20:46:15.5999197Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-23T20:46:15.5999273Z ·  ─────┬──── 2026-10-23T20:46:15.5999402Z · ╰── This modifies `cardHeight` 2026-10-23T20:46:15.5999469Z 119 │ notifyCoverage(); 2026-10-23T20:46:15.5999521Z ╰──── 2026-10-23T20:46:15.5999857Z  help: This argument is a function which may reassign or mutate `cardHeight` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead 2026-10-23T20:46:15.6000159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.6000161Z 2026-10-23T20:46:15.6000421Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-23T20:46:15.6000582Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-23T20:46:15.6000654Z 2 │ AuthFilesystemReadScope, 2026-10-23T20:46:15.6000721Z 3 │ type AuthSessionState, 2026-10-23T20:46:15.6000805Z ·  ────────┬─────── 2026-10-23T20:46:15.6000953Z · ╰── 'AuthSessionState' is imported here 2026-10-23T20:46:15.6001027Z 4 │ type FilesystemBrowseEntry, 2026-10-23T20:46:15.6001077Z ╰──── 2026-10-23T20:46:15.6001176Z  help: Consider removing this import. 2026-10-23T20:46:15.6001179Z 2026-10-23T20:46:15.6001437Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.6001604Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-23T20:46:15.6001717Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-23T20:46:15.6001784Z 38 │ useLayoutEffect(() => { 2026-10-23T20:46:15.6001860Z ·  ───────┬─────── 2026-10-23T20:46:15.6001991Z · ╰── This is the containing effect 2026-10-23T20:46:15.6002051Z 39 │ reset(); 2026-10-23T20:46:15.6002120Z 40 │ setInitialized(true); 2026-10-23T20:46:15.6002197Z ·  ───────┬────── 2026-10-23T20:46:15.6002366Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.6002426Z 41 │ }, [reset]); 2026-10-23T20:46:15.6002476Z ╰──── 2026-10-23T20:46:15.6003083Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.6003407Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.6003410Z 2026-10-23T20:46:15.6003667Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-23T20:46:15.6003826Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-23T20:46:15.6003879Z 88 │ 2026-10-23T20:46:15.6003945Z 89 │ useEffect(() => { 2026-10-23T20:46:15.6004014Z ·  ────┬──── 2026-10-23T20:46:15.6004145Z · ╰── This is the containing effect 2026-10-23T20:46:15.6004305Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-23T20:46:15.6004418Z 91 │ const branchName = initialProjectRef.branch; 2026-10-23T20:46:15.6004514Z 92 │ let active = true; 2026-10-23T20:46:15.6004608Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-23T20:46:15.6004693Z ·  ─────────┬───────── 2026-10-23T20:46:15.6004863Z · ╰── Avoid calling setState() directly within an effect 2026-10-23T20:46:15.6005016Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-23T20:46:15.6005071Z ╰──── 2026-10-23T20:46:15.6005716Z  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system. 2026-10-23T20:46:15.6006069Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect 2026-10-23T20:46:15.6006071Z 2026-10-23T20:46:15.6006229Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.6006394Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-23T20:46:15.6006447Z 107 │ ); 2026-10-23T20:46:15.6006603Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-23T20:46:15.6006691Z ·  ─────────┬──────── 2026-10-23T20:46:15.6006847Z · ╰── `separationProgress` originates here 2026-10-23T20:46:15.6006900Z 109 │ 2026-10-23T20:46:15.6006967Z 110 │ useEffect(() => { 2026-10-23T20:46:15.6007138Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-23T20:46:15.6007223Z ·  ─────────┬──────── 2026-10-23T20:46:15.6007372Z · ╰── `separationProgress` cannot be modified 2026-10-23T20:46:15.6007481Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-23T20:46:15.6007533Z ╰──── 2026-10-23T20:46:15.6007799Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.6008107Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.6008113Z 2026-10-23T20:46:15.6008266Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.6008430Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T20:46:15.6008540Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T20:46:15.6008656Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T20:46:15.6008735Z ·  ──────┬───── 2026-10-23T20:46:15.6008870Z · ╰── `capsuleWidth` originates here 2026-10-23T20:46:15.6008981Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T20:46:15.6009096Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T20:46:15.6009205Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T20:46:15.6009303Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T20:46:15.6009364Z 134 │ return; 2026-10-23T20:46:15.6009417Z 135 │ } 2026-10-23T20:46:15.6009524Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T20:46:15.6009610Z 137 │ measuredWidthRef.current = width; 2026-10-23T20:46:15.6009751Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T20:46:15.6009829Z ·  ──────┬───── 2026-10-23T20:46:15.6009967Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T20:46:15.6010021Z 139 │ }; 2026-10-23T20:46:15.6010075Z ╰──── 2026-10-23T20:46:15.6010390Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.6010771Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.6010774Z 2026-10-23T20:46:15.6010930Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.6011093Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T20:46:15.6011203Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-23T20:46:15.6011315Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-23T20:46:15.6011397Z ·  ──────┬───── 2026-10-23T20:46:15.6011533Z · ╰── `capsuleWidth` originates here 2026-10-23T20:46:15.6011645Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T20:46:15.6011759Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T20:46:15.6011864Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T20:46:15.6011959Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T20:46:15.6012018Z 134 │ return; 2026-10-23T20:46:15.6012071Z 135 │ } 2026-10-23T20:46:15.6012176Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T20:46:15.6012261Z 137 │ measuredWidthRef.current = width; 2026-10-23T20:46:15.6012402Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T20:46:15.6012453Z 139 │ }; 2026-10-23T20:46:15.6012544Z 140 │ const hasStatus = props.status !== null; 2026-10-23T20:46:15.6012678Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T20:46:15.6012751Z 142 │ useEffect(() => { 2026-10-23T20:46:15.6012817Z 143 │ if (!hasStatus) { 2026-10-23T20:46:15.6012903Z 144 │ measuredWidthRef.current = null; 2026-10-23T20:46:15.6012979Z 145 │ capsuleWidth.value = null; 2026-10-23T20:46:15.6013056Z ·  ──────┬───── 2026-10-23T20:46:15.6013195Z · ╰── `capsuleWidth` cannot be modified 2026-10-23T20:46:15.6013250Z 146 │ } 2026-10-23T20:46:15.6013301Z ╰──── 2026-10-23T20:46:15.6013566Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.6013869Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.6013872Z 2026-10-23T20:46:15.6014078Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T20:46:15.6014244Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-23T20:46:15.6014408Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-23T20:46:15.6014471Z 142 │ useEffect(() => { 2026-10-23T20:46:15.6014549Z ·  ───┬─── 2026-10-23T20:46:15.6014770Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T20:46:15.6014835Z 143 │ if (!hasStatus) { 2026-10-23T20:46:15.6014921Z 144 │ measuredWidthRef.current = null; 2026-10-23T20:46:15.6014997Z 145 │ capsuleWidth.value = null; 2026-10-23T20:46:15.6015075Z ·  ──────┬───── 2026-10-23T20:46:15.6015274Z · ╰── This modifies `capsuleWidth` 2026-10-23T20:46:15.6015365Z 146 │ } 2026-10-23T20:46:15.6015416Z ╰──── 2026-10-23T20:46:15.6015760Z  help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead 2026-10-23T20:46:15.6016066Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.6016068Z 2026-10-23T20:46:15.6016267Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-23T20:46:15.6016429Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-23T20:46:15.6016541Z 130 │ const measuredWidthRef = useRef(null); 2026-10-23T20:46:15.6016665Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-23T20:46:15.6016792Z ·  ───────────────┬─────────────── 2026-10-23T20:46:15.6017030Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-23T20:46:15.6017137Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-23T20:46:15.6017234Z 133 │ if (width === measuredWidthRef.current) { 2026-10-23T20:46:15.6017295Z 134 │ return; 2026-10-23T20:46:15.6017348Z 135 │ } 2026-10-23T20:46:15.6017453Z 136 │ const first = measuredWidthRef.current === null; 2026-10-23T20:46:15.6017539Z 137 │ measuredWidthRef.current = width; 2026-10-23T20:46:15.6017680Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-23T20:46:15.6017760Z ·  ──────┬───── 2026-10-23T20:46:15.6017898Z · ╰── This modifies `capsuleWidth` 2026-10-23T20:46:15.6017953Z 139 │ }; 2026-10-23T20:46:15.6018004Z ╰──── 2026-10-23T20:46:15.6018341Z  help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead 2026-10-23T20:46:15.6018645Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.6018647Z 2026-10-23T20:46:15.6018864Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-23T20:46:15.6019011Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:772:7] 2026-10-23T20:46:15.6019115Z 771 │ if (settingsSheetPresentation.isActive) { 2026-10-23T20:46:15.6019243Z 772 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-23T20:46:15.6019338Z ·  ────────────┬──────────── 2026-10-23T20:46:15.6019511Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-23T20:46:15.6019566Z 773 │ } 2026-10-23T20:46:15.6019768Z 774 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-23T20:46:15.6019878Z ·  ────────────────┬──────────────── 2026-10-23T20:46:15.6020158Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-23T20:46:15.6020214Z 775 │ 2026-10-23T20:46:15.6020315Z ╰──── 2026-10-23T20:46:15.6020773Z  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects 2026-10-23T20:46:15.6021086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.6021089Z 2026-10-23T20:46:15.6021246Z ⚠ react(immutability): This value cannot be modified 2026-10-23T20:46:15.6021389Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:390:5] 2026-10-23T20:46:15.6021545Z 386 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-23T20:46:15.6021686Z 387 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-23T20:46:15.6021779Z ·  ──────────┬───────── 2026-10-23T20:46:15.6021933Z · ╰── `animatedBorderRadius` originates here 2026-10-23T20:46:15.6022089Z 388 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-23T20:46:15.6022161Z 389 │ useLayoutEffect(() => { 2026-10-23T20:46:15.6022264Z 390 │ animatedBorderRadius.value = shouldAnimate 2026-10-23T20:46:15.6022351Z ·  ──────────┬───────── 2026-10-23T20:46:15.6022506Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-23T20:46:15.6022595Z 391 │ ? withTiming(targetBorderRadius, { 2026-10-23T20:46:15.6022646Z ╰──── 2026-10-23T20:46:15.6022917Z  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed 2026-10-23T20:46:15.6023225Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-23T20:46:15.6023228Z 2026-10-23T20:46:15.6023413Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-23T20:46:15.6023597Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-23T20:46:15.6023666Z 115 │ return [...commands]; 2026-10-23T20:46:15.6023796Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-23T20:46:15.6023911Z ·  ─────────┬───────── 2026-10-23T20:46:15.6024146Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-23T20:46:15.6024227Z 117 │ 2026-10-23T20:46:15.6024277Z ╰──── 2026-10-23T20:46:15.6024627Z  help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often 2026-10-23T20:46:15.6024941Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-23T20:46:15.6024944Z 2026-10-23T20:46:15.6025187Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T20:46:15.6025346Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-23T20:46:15.6025407Z 289 │ return ( 2026-10-23T20:46:15.6025543Z 290 │ 2026-10-23T20:46:15.6025667Z ·  ───────────── 2026-10-23T20:46:15.6025739Z 291 │ {props.children} 2026-10-23T20:46:15.6025788Z ╰──── 2026-10-23T20:46:15.6026014Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T20:46:15.6026154Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T20:46:15.6026157Z 2026-10-23T20:46:15.6026399Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T20:46:15.6026556Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-23T20:46:15.6026615Z 653 │ return ( 2026-10-23T20:46:15.6026741Z 654 │ 2026-10-23T20:46:15.6026858Z ·  ───────────── 2026-10-23T20:46:15.6026926Z 655 │ {props.children} 2026-10-23T20:46:15.6026976Z ╰──── 2026-10-23T20:46:15.6027197Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-23T20:46:15.6027333Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-23T20:46:15.6027335Z 2026-10-23T20:46:15.6027573Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-23T20:46:15.6027732Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-23T20:46:15.6027795Z 1461 │ return ( 2026-10-23T20:46:15.6027960Z 1462 │ 2026-10-23T20:46:15.6028095Z ·  ──────────────────── 2026-10-23T20:46:15.6028192Z 1463 │ (null); 2026-10-23T20:46:15.6032632Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-23T20:46:15.6032763Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-23T20:46:15.6032864Z 497 │ const handlePullToRefresh = async () => { 2026-10-23T20:46:15.6032943Z 498 │ setIsPullRefreshing(true); 2026-10-23T20:46:15.6033025Z 499 │ await refreshSelectedSection(); 2026-10-23T20:46:15.6033103Z 500 │ setIsPullRefreshing(false); 2026-10-23T20:46:15.6033158Z 501 │ }; 2026-10-23T20:46:15.6033301Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-23T20:46:15.6033444Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-23T20:46:15.6033550Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-23T20:46:15.6033635Z 505 │ threadKey: reviewCache.threadKey, 2026-10-23T20:46:15.6033726Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-23T20:46:15.6033793Z 507 │ files: reviewFiles, 2026-10-23T20:46:15.6033893Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-23T20:46:15.6034073Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-23T20:46:15.6034164Z 510 │ : undefined, 2026-10-23T20:46:15.6034259Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-23T20:46:15.6034408Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-23T20:46:15.6034471Z 513 │ : undefined, 2026-10-23T20:46:15.6034525Z 514 │ }); 2026-10-23T20:46:15.6034714Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-23T20:46:15.6034845Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-23T20:46:15.6034908Z 517 │ environmentId, 2026-10-23T20:46:15.6034968Z 518 │ threadId, 2026-10-23T20:46:15.6035034Z 519 │ selectedSection, 2026-10-23T20:46:15.6035106Z 520 │ nativeReviewDiffData, 2026-10-23T20:46:15.6035162Z 521 │ }); 2026-10-23T20:46:15.6035272Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-23T20:46:15.6035359Z 523 │ threadKey: reviewCache.threadKey, 2026-10-23T20:46:15.6035449Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-23T20:46:15.6035525Z 525 │ diff: selectedSection?.diff, 2026-10-23T20:46:15.6035600Z 526 │ data: nativeReviewDiffData, 2026-10-23T20:46:15.6035669Z 527 │ collapsedFileIds, 2026-10-23T20:46:15.6035734Z 528 │ viewedFileIds, 2026-10-23T20:46:15.6035845Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-23T20:46:15.6035942Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-23T20:46:15.6035995Z 531 │ }); 2026-10-23T20:46:15.6036068Z 532 │ const showcaseReviewKey = 2026-10-23T20:46:15.6036200Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-23T20:46:15.6036412Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-23T20:46:15.6036476Z 535 │ : null; 2026-10-23T20:46:15.6036642Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-23T20:46:15.6036721Z 537 │ nativeBridge.onDebug(event); 2026-10-23T20:46:15.6036777Z 538 │ if ( 2026-10-23T20:46:15.6036857Z 539 │ showcaseReviewKey === null || 2026-10-23T20:46:15.6036979Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-23T20:46:15.6037087Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-23T20:46:15.6037141Z 542 │ ) { 2026-10-23T20:46:15.6037201Z 543 │ return; 2026-10-23T20:46:15.6037255Z 544 │ } 2026-10-23T20:46:15.6037365Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-23T20:46:15.6037532Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-23T20:46:15.6037589Z 547 │ }; 2026-10-23T20:46:15.6037641Z 548 │ 2026-10-23T20:46:15.6037758Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-23T20:46:15.6037839Z 550 │ loadVisibleFile(fileId, true); 2026-10-23T20:46:15.6037928Z 551 │ commentSelection.clearSelection(); 2026-10-23T20:46:15.6038049Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-23T20:46:15.6038127Z 553 │ toggleExpandedFile(fileId); 2026-10-23T20:46:15.6038181Z 554 │ } 2026-10-23T20:46:15.6038293Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-23T20:46:15.6038369Z 556 │ if (!nativeView) return; 2026-10-23T20:46:15.6038462Z 557 │ const result = await settlePromise(() => 2026-10-23T20:46:15.6038685Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-23T20:46:15.6038767Z 559 │ ); 2026-10-23T20:46:15.6038857Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-23T20:46:15.6039035Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-23T20:46:15.6039088Z 562 │ } 2026-10-23T20:46:15.6039143Z 563 │ }; 2026-10-23T20:46:15.6039227Z 564 │ const handleVisibleFileChange = ( 2026-10-23T20:46:15.6039357Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-23T20:46:15.6039414Z 566 │ ) => { 2026-10-23T20:46:15.6039521Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T20:46:15.6039691Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-23T20:46:15.6039742Z 569 │ }; 2026-10-23T20:46:15.6039820Z 570 │ const renderInspector = () => ( 2026-10-23T20:46:15.6039893Z 571 │ void handleSelectFile(fileId)} 2026-10-23T20:46:15.6040401Z 577 │ /> 2026-10-23T20:46:15.6040454Z 578 │ ); 2026-10-23T20:46:15.6040506Z 579 │ 2026-10-23T20:46:15.6040687Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-23T20:46:15.6040775Z 581 │ const { fileId } = event.nativeEvent; 2026-10-23T20:46:15.6040837Z 582 │ if (fileId) { 2026-10-23T20:46:15.6040919Z 583 │ loadVisibleFile(fileId, true); 2026-10-23T20:46:15.6041001Z 584 │ toggleExpandedFile(fileId); 2026-10-23T20:46:15.6041057Z 585 │ } 2026-10-23T20:46:15.6041110Z 586 │ }; 2026-10-23T20:46:15.6041163Z 587 │ 2026-10-23T20:46:15.6041251Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-23T20:46:15.6041369Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-23T20:46:15.6041425Z 590 │ ) => { 2026-10-23T20:46:15.6041512Z 591 │ const { fileId } = event.nativeEvent; 2026-10-23T20:46:15.6041572Z 592 │ if (fileId) { 2026-10-23T20:46:15.6041647Z 593 │ toggleViewedFile(fileId); 2026-10-23T20:46:15.6041700Z 594 │ } 2026-10-23T20:46:15.6041752Z 595 │ }; 2026-10-23T20:46:15.6041804Z 596 │ 2026-10-23T20:46:15.6041874Z 597 │ const parsedDiffNotice = 2026-10-23T20:46:15.6042036Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-23T20:46:15.6042161Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-23T20:46:15.6042319Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-23T20:46:15.6042439Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-23T20:46:15.6042597Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-23T20:46:15.6042705Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-23T20:46:15.6042806Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-23T20:46:15.6042877Z 605 │ hasCachedSelectedDiff, 2026-10-23T20:46:15.6042943Z 606 │ hasAnyCachedDiff, 2026-10-23T20:46:15.6042995Z 607 │ }); 2026-10-23T20:46:15.6043084Z 608 │ const handleRetryEnvironment = () => { 2026-10-23T20:46:15.6043173Z 609 │ void retryEnvironment(environmentId); 2026-10-23T20:46:15.6043279Z 610 │ }; 2026-10-23T20:46:15.6043390Z 611 │ const handleReturnToThread = () => { 2026-10-23T20:46:15.6043467Z 612 │ if (navigation.canGoBack()) { 2026-10-23T20:46:15.6043536Z 613 │ navigation.goBack(); 2026-10-23T20:46:15.6043595Z 614 │ return; 2026-10-23T20:46:15.6043647Z 615 │ } 2026-10-23T20:46:15.6043731Z 616 │ navigation.navigate("Thread", { 2026-10-23T20:46:15.6043821Z 617 │ environmentId: String(environmentId), 2026-10-23T20:46:15.6043897Z 618 │ threadId: String(threadId), 2026-10-23T20:46:15.6043951Z 619 │ }); 2026-10-23T20:46:15.6044005Z 620 │ }; 2026-10-23T20:46:15.6044082Z 621 │ const androidHeaderSubtitle = [ 2026-10-23T20:46:15.6044151Z 622 │ selectedSection?.title, 2026-10-23T20:46:15.6044229Z 623 │ headerDiffSummary.additions, 2026-10-23T20:46:15.6044307Z 624 │ headerDiffSummary.deletions, 2026-10-23T20:46:15.6044396Z 625 │ ] 2026-10-23T20:46:15.6044503Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-23T20:46:15.6044566Z 627 │ .join(" · "); 2026-10-23T20:46:15.6044617Z 628 │ 2026-10-23T20:46:15.6044695Z 629 │ const showChangedFilesPane = 2026-10-23T20:46:15.6044765Z 630 │ !showConnectionNotice && 2026-10-23T20:46:15.6044840Z 631 │ selectedSection !== null && 2026-10-23T20:46:15.6044921Z 632 │ parsedDiff.kind === "files" && 2026-10-23T20:46:15.6044999Z 633 │ NativeReviewDiffView !== null; 2026-10-23T20:46:15.6045167Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-23T20:46:15.6045337Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-23T20:46:15.6045388Z 636 │ 2026-10-23T20:46:15.6045460Z 637 │ const listHeader = (() => { 2026-10-23T20:46:15.6045549Z 638 │ const children: ReactElement[] = []; 2026-10-23T20:46:15.6045604Z 639 │ 2026-10-23T20:46:15.6045666Z 640 │ if (error) { 2026-10-23T20:46:15.6045734Z 641 │ children.push( 2026-10-23T20:46:15.6045792Z 642 │ 2026-10-23T20:46:15.6046439Z 649 │ Review unavailable 2026-10-23T20:46:15.6046596Z 650 │ {error} 2026-10-23T20:46:15.6046662Z 651 │ , 2026-10-23T20:46:15.6046720Z 652 │ ); 2026-10-23T20:46:15.6046773Z 653 │ } 2026-10-23T20:46:15.6046824Z 654 │ 2026-10-23T20:46:15.6046897Z 655 │ if (parsedDiffNotice) { 2026-10-23T20:46:15.6048438Z 656 │ children.push(); 2026-10-23T20:46:15.6048498Z 657 │ } 2026-10-23T20:46:15.6048550Z 658 │ 2026-10-23T20:46:15.6048629Z 659 │ if (children.length === 0) { 2026-10-23T20:46:15.6048693Z 660 │ return null; 2026-10-23T20:46:15.6048745Z 661 │ } 2026-10-23T20:46:15.6048796Z 662 │ 2026-10-23T20:46:15.6048866Z 663 │ return <>{children}; 2026-10-23T20:46:15.6048920Z 664 │ })(); 2026-10-23T20:46:15.6048990Z 665 │ const headerSubtitle = [ 2026-10-23T20:46:15.6049069Z 666 │ headerDiffSummary.additions, 2026-10-23T20:46:15.6049212Z 667 │ headerDiffSummary.deletions, 2026-10-23T20:46:15.6049321Z 668 │ pendingReviewCommentCount > 0 2026-10-23T20:46:15.6049495Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-23T20:46:15.6049556Z 670 │ : null, 2026-10-23T20:46:15.6049608Z 671 │ ] 2026-10-23T20:46:15.6049672Z 672 │ .filter(Boolean) 2026-10-23T20:46:15.6049735Z 673 │ .join(" · "); 2026-10-23T20:46:15.6049870Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-23T20:46:15.6049923Z 675 │ 2026-10-23T20:46:15.6049981Z 676 │ return ( 2026-10-23T20:46:15.6050035Z 677 │ <> 2026-10-23T20:46:15.6050102Z 678 │ 2026-10-23T20:46:15.6051500Z 694 │ 2026-10-23T20:46:15.6051564Z 695 │ 2026-10-23T20:46:15.6051686Z 696 │ 2026-10-23T20:46:15.6051766Z 697 │ {showConnectionNotice ? ( 2026-10-23T20:46:15.6051904Z 698 │ 2026-10-23T20:46:15.6051993Z 699 │ 2026-10-23T20:46:15.6053105Z 711 │ 2026-10-23T20:46:15.6053262Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-23T20:46:15.6053322Z 713 │ 2026-10-23T20:46:15.6053764Z 719 │ 2026-10-23T20:46:15.6054118Z 723 │ {listHeader} 2026-10-23T20:46:15.6054237Z 724 │ 2026-10-23T20:46:15.6054319Z 725 │ ( 2026-10-23T20:46:15.6055903Z 223 │ 2026-10-23T20:46:15.6056010Z ·  ─────────────── 2026-10-23T20:46:15.6056110Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-23T20:46:15.6056163Z ╰──── 2026-10-23T20:46:15.6056310Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-23T20:46:15.6056313Z 2026-10-23T20:46:15.6056506Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-23T20:46:15.6056657Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-23T20:46:15.6056737Z 226 │