2026-10-25T01:04:13.7341128Z Current runner version: '2.338.1' 2026-10-25T01:04:13.7344383Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-rdhb4g5vsutffhiw' 2026-10-25T01:04:13.7345096Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-25T01:04:13.7345756Z Machine name: 'ip-172-31-73-130' 2026-10-25T01:04:13.7347321Z ##[group]GITHUB_TOKEN Permissions 2026-10-25T01:04:13.7348549Z Contents: read 2026-10-25T01:04:13.7348970Z Metadata: read 2026-10-25T01:04:13.7349377Z ##[endgroup] 2026-10-25T01:04:13.7350717Z Secret source: Actions 2026-10-25T01:04:13.7351312Z Cache mode: write 2026-10-25T01:04:13.7351851Z Prepare workflow directory 2026-10-25T01:04:13.7524445Z Prepare all required actions 2026-10-25T01:04:13.7549826Z Getting action download info 2026-10-25T01:04:13.8585146Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-25T01:04:13.8910283Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-25T01:04:14.0024510Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-25T01:04:14.0059963Z Complete job name: Lint 2026-10-25T01:04:14.0406983Z A job started hook has been configured by the self-hosted runner administrator 2026-10-25T01:04:14.0482605Z ##[group]Run '/setup.sh' 2026-10-25T01:04:14.0496355Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T01:04:14.0496754Z env: 2026-10-25T01:04:14.0496965Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:14.0497249Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:14.0497519Z BLACKSMITH_CHECK_RUN_ID: 121036834290 2026-10-25T01:04:14.0497794Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T01:04:14.0498055Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T01:04:14.0498531Z ##[endgroup] 2026-10-25T01:04:14.0732522Z Logging daemon started (blacksmithd for logs) 2026-10-25T01:04:14.0812440Z Results daemon started (blacksmithd for results) 2026-10-25T01:04:14.0949859Z Background adoption and SSH setup started (PID: 3161) 2026-10-25T01:04:14.0950243Z 2026-10-25T01:04:14.0950635Z ---------------------------------------- 2026-10-25T01:04:14.0951167Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40149164074/jobs/121036834290 2026-10-25T01:04:14.0951702Z SSH Access (using your GitHub SSH key): 2026-10-25T01:04:14.0952120Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-rdhb4g5vsutffhiw.vm.blacksmith.sh 2026-10-25T01:04:14.0952423Z 2026-10-25T01:04:14.0952542Z No GitHub SSH key? Add one at: 2026-10-25T01:04:14.0953014Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-25T01:04:14.0953408Z 2026-10-25T01:04:14.0953510Z ---------------------------------------- 2026-10-25T01:04:14.0953680Z 2026-10-25T01:04:14.0953815Z VM ID: blacksmith-8vcpu-ubuntu-2404-rdhb4g5vsutffhiw 2026-10-25T01:04:14.0954128Z Host: production-152.236.39.44-x8664 2026-10-25T01:04:14.0954384Z Host Agent PID: 3488459 2026-10-25T01:04:14.0954627Z Host Agent Git SHA: 1637818df 2026-10-25T01:04:14.0954883Z Host CPU Manufacturer: AuthenticAMD 2026-10-25T01:04:14.0955151Z Blacksmith Host Generation: gen 2 2026-10-25T01:04:14.0955426Z Petname: production-clear-caribou-747815e7 2026-10-25T01:04:14.0955698Z Region: us-east 2026-10-25T01:04:14.0955923Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-25T01:04:14.0961161Z OS Version: Ubuntu 24.04.4 LTS 2026-10-25T01:04:14.0961612Z 2026-10-25T01:04:14.0961721Z Enabling Blacksmith transparent cache 2026-10-25T01:04:14.1152992Z ##[group]Run actions/checkout@v6 2026-10-25T01:04:14.1153268Z with: 2026-10-25T01:04:14.1153583Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-25T01:04:14.1153971Z sparse-checkout-cone-mode: false 2026-10-25T01:04:14.1154244Z repository: pingdotgg/t3code 2026-10-25T01:04:14.1156126Z token: *** 2026-10-25T01:04:14.1156332Z ssh-strict: true 2026-10-25T01:04:14.1156588Z ssh-user: git 2026-10-25T01:04:14.1156908Z persist-credentials: true 2026-10-25T01:04:14.1157450Z clean: true 2026-10-25T01:04:14.1157753Z fetch-depth: 1 2026-10-25T01:04:14.1158066Z fetch-tags: false 2026-10-25T01:04:14.1158405Z show-progress: true 2026-10-25T01:04:14.1158701Z lfs: false 2026-10-25T01:04:14.1158903Z submodules: false 2026-10-25T01:04:14.1159123Z set-safe-directory: true 2026-10-25T01:04:14.1159369Z allow-unsafe-pr-checkout: false 2026-10-25T01:04:14.1159619Z env: 2026-10-25T01:04:14.1159851Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:14.1160175Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:14.1160448Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:14.1160702Z ##[endgroup] 2026-10-25T01:04:14.2235287Z Syncing repository: pingdotgg/t3code 2026-10-25T01:04:14.2236142Z ##[group]Getting Git version info 2026-10-25T01:04:14.2236466Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-25T01:04:14.2236929Z [command]/usr/local/bin/git version 2026-10-25T01:04:14.2315509Z git version 2.55.0 2026-10-25T01:04:14.2326464Z ##[endgroup] 2026-10-25T01:04:14.2333402Z Temporarily overriding HOME='/home/runner/_work/_temp/1971a4b8-7083-4d4c-9b87-891c583d4bb6' before making global git config changes 2026-10-25T01:04:14.2334055Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T01:04:14.2336431Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T01:04:14.2366995Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-25T01:04:14.2368497Z ##[group]Determining repository object format 2026-10-25T01:04:14.2369650Z ##[endgroup] 2026-10-25T01:04:14.2370072Z ##[group]Initializing the repository 2026-10-25T01:04:14.2372024Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-25T01:04:14.2403139Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-25T01:04:14.2403612Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-25T01:04:14.2404061Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-25T01:04:14.2404412Z hint: call: 2026-10-25T01:04:14.2404607Z hint: 2026-10-25T01:04:14.2404864Z hint: git config --global init.defaultBranch 2026-10-25T01:04:14.2405156Z hint: 2026-10-25T01:04:14.2405473Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-25T01:04:14.2405918Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-25T01:04:14.2406274Z hint: 2026-10-25T01:04:14.2406475Z hint: git branch -m 2026-10-25T01:04:14.2406706Z hint: 2026-10-25T01:04:14.2407008Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-25T01:04:14.2407546Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-25T01:04:14.2408408Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-25T01:04:14.2429519Z ##[endgroup] 2026-10-25T01:04:14.2429904Z ##[group]Disabling automatic garbage collection 2026-10-25T01:04:14.2431920Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-25T01:04:14.2452243Z ##[endgroup] 2026-10-25T01:04:14.2452597Z ##[group]Setting up auth 2026-10-25T01:04:14.2452857Z Removing SSH command configuration 2026-10-25T01:04:14.2456037Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T01:04:14.2480086Z [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-25T01:04:14.2608724Z Removing HTTP extra header 2026-10-25T01:04:14.2611890Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-25T01:04:14.2635736Z [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-25T01:04:14.2733900Z Removing includeIf entries pointing to credentials config files 2026-10-25T01:04:14.2736872Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-25T01:04:14.2756600Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-25T01:04:14.2853349Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-ae97cd9e-1201-4611-a1fa-aca74a738503.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-25T01:04:14.2900048Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-ae97cd9e-1201-4611-a1fa-aca74a738503.config 2026-10-25T01:04:14.2921658Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-ae97cd9e-1201-4611-a1fa-aca74a738503.config 2026-10-25T01:04:14.2939441Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-ae97cd9e-1201-4611-a1fa-aca74a738503.config 2026-10-25T01:04:14.2957762Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-ae97cd9e-1201-4611-a1fa-aca74a738503.config 2026-10-25T01:04:14.2977178Z ##[endgroup] 2026-10-25T01:04:14.2977539Z ##[group]Fetching the repository 2026-10-25T01:04:14.2978324Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +453bf01d2068758fac79f9aa74099b2e85bbc719:refs/remotes/origin/main 2026-10-25T01:04:14.5570877Z From https://github.com/pingdotgg/t3code 2026-10-25T01:04:14.5571722Z * [new ref] 453bf01d2068758fac79f9aa74099b2e85bbc719 -> origin/main 2026-10-25T01:04:14.5598053Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-25T01:04:14.5617573Z origin/main 2026-10-25T01:04:14.5621571Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-25T01:04:14.5637421Z 453bf01d2068758fac79f9aa74099b2e85bbc719 2026-10-25T01:04:14.5639374Z ##[endgroup] 2026-10-25T01:04:14.5640250Z ##[group]Determining the checkout info 2026-10-25T01:04:14.5641070Z ##[endgroup] 2026-10-25T01:04:14.5641917Z ##[group]Setting up sparse checkout 2026-10-25T01:04:14.5642824Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-25T01:04:14.5663099Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-25T01:04:14.5680938Z .git/info/sparse-checkout 2026-10-25T01:04:14.5684878Z ##[endgroup] 2026-10-25T01:04:14.5685797Z ##[group]Checking out the ref 2026-10-25T01:04:14.5686965Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-25T01:04:21.5018727Z Updating files: 0% (1/6433) 2026-10-25T01:04:21.5046765Z Updating files: 1% (65/6433) 2026-10-25T01:04:21.5064663Z Updating files: 2% (129/6433) 2026-10-25T01:04:21.5085290Z Updating files: 3% (193/6433) 2026-10-25T01:04:21.5106824Z Updating files: 4% (258/6433) 2026-10-25T01:04:21.5136459Z Updating files: 5% (322/6433) 2026-10-25T01:04:21.5158367Z Updating files: 6% (386/6433) 2026-10-25T01:04:21.5210450Z Updating files: 7% (451/6433) 2026-10-25T01:04:21.5242432Z Updating files: 8% (515/6433) 2026-10-25T01:04:21.5311486Z Updating files: 9% (579/6433) 2026-10-25T01:04:21.5524357Z Updating files: 10% (644/6433) 2026-10-25T01:04:21.5606841Z Updating files: 11% (708/6433) 2026-10-25T01:04:21.5619499Z Updating files: 12% (772/6433) 2026-10-25T01:04:21.5631710Z Updating files: 13% (837/6433) 2026-10-25T01:04:21.5648322Z Updating files: 14% (901/6433) 2026-10-25T01:04:21.5665537Z Updating files: 15% (965/6433) 2026-10-25T01:04:21.5682856Z Updating files: 16% (1030/6433) 2026-10-25T01:04:21.5698565Z Updating files: 17% (1094/6433) 2026-10-25T01:04:21.5717522Z Updating files: 18% (1158/6433) 2026-10-25T01:04:21.5732217Z Updating files: 19% (1223/6433) 2026-10-25T01:04:21.5748869Z Updating files: 20% (1287/6433) 2026-10-25T01:04:21.5772037Z Updating files: 21% (1351/6433) 2026-10-25T01:04:21.5789764Z Updating files: 22% (1416/6433) 2026-10-25T01:04:21.5804147Z Updating files: 23% (1480/6433) 2026-10-25T01:04:21.5819474Z Updating files: 24% (1544/6433) 2026-10-25T01:04:21.5832523Z Updating files: 25% (1609/6433) 2026-10-25T01:04:21.5848344Z Updating files: 26% (1673/6433) 2026-10-25T01:04:21.5861475Z Updating files: 27% (1737/6433) 2026-10-25T01:04:21.5880649Z Updating files: 28% (1802/6433) 2026-10-25T01:04:21.5893462Z Updating files: 29% (1866/6433) 2026-10-25T01:04:21.5908663Z Updating files: 29% (1894/6433) 2026-10-25T01:04:21.5929372Z Updating files: 30% (1930/6433) 2026-10-25T01:04:21.5953967Z Updating files: 31% (1995/6433) 2026-10-25T01:04:21.5981060Z Updating files: 32% (2059/6433) 2026-10-25T01:04:21.6010178Z Updating files: 33% (2123/6433) 2026-10-25T01:04:21.6075811Z Updating files: 34% (2188/6433) 2026-10-25T01:04:21.6128798Z Updating files: 35% (2252/6433) 2026-10-25T01:04:21.6162970Z Updating files: 36% (2316/6433) 2026-10-25T01:04:21.6199520Z Updating files: 37% (2381/6433) 2026-10-25T01:04:21.6241124Z Updating files: 38% (2445/6433) 2026-10-25T01:04:21.6268356Z Updating files: 39% (2509/6433) 2026-10-25T01:04:21.6298618Z Updating files: 40% (2574/6433) 2026-10-25T01:04:21.6325353Z Updating files: 41% (2638/6433) 2026-10-25T01:04:21.6341968Z Updating files: 42% (2702/6433) 2026-10-25T01:04:21.6352039Z Updating files: 43% (2767/6433) 2026-10-25T01:04:21.6367495Z Updating files: 44% (2831/6433) 2026-10-25T01:04:21.6399874Z Updating files: 45% (2895/6433) 2026-10-25T01:04:21.6423100Z Updating files: 46% (2960/6433) 2026-10-25T01:04:21.6451452Z Updating files: 47% (3024/6433) 2026-10-25T01:04:21.6478018Z Updating files: 48% (3088/6433) 2026-10-25T01:04:21.6506653Z Updating files: 49% (3153/6433) 2026-10-25T01:04:21.6542420Z Updating files: 50% (3217/6433) 2026-10-25T01:04:21.6557499Z Updating files: 51% (3281/6433) 2026-10-25T01:04:21.6592274Z Updating files: 52% (3346/6433) 2026-10-25T01:04:21.6615609Z Updating files: 53% (3410/6433) 2026-10-25T01:04:21.6636517Z Updating files: 54% (3474/6433) 2026-10-25T01:04:21.6659721Z Updating files: 55% (3539/6433) 2026-10-25T01:04:21.6676549Z Updating files: 56% (3603/6433) 2026-10-25T01:04:21.6693890Z Updating files: 57% (3667/6433) 2026-10-25T01:04:21.6711853Z Updating files: 58% (3732/6433) 2026-10-25T01:04:21.7054469Z Updating files: 59% (3796/6433) 2026-10-25T01:04:21.7071525Z Updating files: 60% (3860/6433) 2026-10-25T01:04:21.7091378Z Updating files: 61% (3925/6433) 2026-10-25T01:04:21.7114147Z Updating files: 62% (3989/6433) 2026-10-25T01:04:21.7138823Z Updating files: 63% (4053/6433) 2026-10-25T01:04:21.7166454Z Updating files: 64% (4118/6433) 2026-10-25T01:04:21.7186528Z Updating files: 65% (4182/6433) 2026-10-25T01:04:21.7204200Z Updating files: 66% (4246/6433) 2026-10-25T01:04:21.7229164Z Updating files: 67% (4311/6433) 2026-10-25T01:04:21.7241857Z Updating files: 68% (4375/6433) 2026-10-25T01:04:21.7260411Z Updating files: 69% (4439/6433) 2026-10-25T01:04:21.7271607Z Updating files: 70% (4504/6433) 2026-10-25T01:04:21.7291419Z Updating files: 71% (4568/6433) 2026-10-25T01:04:21.7305030Z Updating files: 72% (4632/6433) 2026-10-25T01:04:21.7349106Z Updating files: 73% (4697/6433) 2026-10-25T01:04:21.7732556Z Updating files: 74% (4761/6433) 2026-10-25T01:04:21.7758493Z Updating files: 75% (4825/6433) 2026-10-25T01:04:21.7778604Z Updating files: 76% (4890/6433) 2026-10-25T01:04:21.7800044Z Updating files: 77% (4954/6433) 2026-10-25T01:04:21.7822704Z Updating files: 78% (5018/6433) 2026-10-25T01:04:21.7839298Z Updating files: 79% (5083/6433) 2026-10-25T01:04:21.7860297Z Updating files: 80% (5147/6433) 2026-10-25T01:04:21.7876152Z Updating files: 81% (5211/6433) 2026-10-25T01:04:21.7893551Z Updating files: 82% (5276/6433) 2026-10-25T01:04:21.7914228Z Updating files: 83% (5340/6433) 2026-10-25T01:04:21.7936252Z Updating files: 84% (5404/6433) 2026-10-25T01:04:21.7953362Z Updating files: 85% (5469/6433) 2026-10-25T01:04:21.7977018Z Updating files: 86% (5533/6433) 2026-10-25T01:04:21.8055808Z Updating files: 87% (5597/6433) 2026-10-25T01:04:21.8084734Z Updating files: 88% (5662/6433) 2026-10-25T01:04:21.8104285Z Updating files: 89% (5726/6433) 2026-10-25T01:04:21.8131997Z Updating files: 90% (5790/6433) 2026-10-25T01:04:21.8159460Z Updating files: 91% (5855/6433) 2026-10-25T01:04:21.8173685Z Updating files: 92% (5919/6433) 2026-10-25T01:04:21.8194984Z Updating files: 93% (5983/6433) 2026-10-25T01:04:21.8215616Z Updating files: 94% (6048/6433) 2026-10-25T01:04:21.8238498Z Updating files: 95% (6112/6433) 2026-10-25T01:04:21.8294655Z Updating files: 96% (6176/6433) 2026-10-25T01:04:21.8316822Z Updating files: 97% (6241/6433) 2026-10-25T01:04:21.8360470Z Updating files: 98% (6305/6433) 2026-10-25T01:04:21.8379373Z Updating files: 99% (6369/6433) 2026-10-25T01:04:21.8379607Z Updating files: 100% (6433/6433) 2026-10-25T01:04:21.8380110Z Updating files: 100% (6433/6433), done. 2026-10-25T01:04:21.8528244Z Switched to a new branch 'main' 2026-10-25T01:04:21.8529128Z branch 'main' set up to track 'origin/main'. 2026-10-25T01:04:21.8540460Z ##[endgroup] 2026-10-25T01:04:21.8572042Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-25T01:04:21.8589369Z 453bf01d2068758fac79f9aa74099b2e85bbc719 2026-10-25T01:04:21.8662879Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-25T01:04:21.8663110Z files="$(git ls-files .github/pr-assets)" 2026-10-25T01:04:21.8663293Z if test -n "$files"; then 2026-10-25T01:04:21.8663514Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-25T01:04:21.8663725Z  exit 1 2026-10-25T01:04:21.8663832Z fi 2026-10-25T01:04:21.8681623Z shell: /usr/bin/bash -e {0} 2026-10-25T01:04:21.8681753Z env: 2026-10-25T01:04:21.8681882Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:21.8682029Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:21.8682170Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:21.8682300Z ##[endgroup] 2026-10-25T01:04:21.8834256Z Prepare all required actions 2026-10-25T01:04:21.8834571Z Getting action download info 2026-10-25T01:04:21.9633284Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-25T01:04:22.0664143Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-25T01:04:22.0664302Z env: 2026-10-25T01:04:22.0664418Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:22.0664565Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:22.0664710Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:22.0664886Z ##[endgroup] 2026-10-25T01:04:22.0742812Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-25T01:04:22.0754923Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T01:04:22.0755271Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-25T01:04:22.0755559Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T01:04:22.0755790Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-25T01:04:22.0776748Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T01:04:22.0777051Z env: 2026-10-25T01:04:22.0777238Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:22.0777465Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:22.0777640Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:22.0777773Z ##[endgroup] 2026-10-25T01:04:22.0854831Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=11] 2026-10-25T01:04:22.0856207Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-25T01:04:22.0896463Z ##[group]Run actions/cache@v6 2026-10-25T01:04:22.0896739Z with: 2026-10-25T01:04:22.0896843Z path: ~/.vite-plus 2026-10-25T01:04:22.0897050Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T01:04:22.0897246Z enableCrossOsArchive: false 2026-10-25T01:04:22.0897376Z fail-on-cache-miss: false 2026-10-25T01:04:22.0897501Z lookup-only: false 2026-10-25T01:04:22.0897610Z save-always: false 2026-10-25T01:04:22.0897717Z env: 2026-10-25T01:04:22.0897824Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:22.0897968Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:22.0898115Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:22.0898329Z ##[endgroup] 2026-10-25T01:04:22.5913982Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T01:04:22.9413032Z Received 170349591 of 170349591 (100.0%), 495.3 MBs/sec 2026-10-25T01:04:22.9413642Z Cache Size: ~162 MB (170349591 B) 2026-10-25T01:04:22.9448092Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/c22911de-e8a8-48f0-9877-8fae60e81fc5/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T01:04:23.5857432Z Cache restored successfully 2026-10-25T01:04:23.6017708Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-25T01:04:23.6112563Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1525] 2026-10-25T01:04:23.6114882Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-25T01:04:23.6135791Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T01:04:23.6136091Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-25T01:04:23.6136336Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-25T01:04:23.6160657Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T01:04:23.6160955Z env: 2026-10-25T01:04:23.6161075Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:23.6161222Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:23.6161367Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:23.6161513Z ##[endgroup] 2026-10-25T01:04:23.6219214Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-25T01:04:23.6228893Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=11] 2026-10-25T01:04:23.6230892Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-25T01:04:23.6236012Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-25T01:04:23.6237690Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-25T01:04:23.6248221Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-25T01:04:23.6248402Z store_path="$(vp pm cache dir)" 2026-10-25T01:04:23.6248565Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-25T01:04:23.6271727Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T01:04:23.6271910Z env: 2026-10-25T01:04:23.6272029Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:23.6272226Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:23.6272376Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:23.6272509Z ##[endgroup] 2026-10-25T01:04:23.6435475Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=19] 2026-10-25T01:04:23.6438121Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-25T01:04:23.6817605Z ##[group]Run actions/cache@v6 2026-10-25T01:04:23.6817780Z with: 2026-10-25T01:04:23.6817908Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-25T01:04:23.6818363Z key: pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c 2026-10-25T01:04:23.6818690Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-25T01:04:23.6818957Z enableCrossOsArchive: false 2026-10-25T01:04:23.6819136Z fail-on-cache-miss: false 2026-10-25T01:04:23.6819306Z lookup-only: false 2026-10-25T01:04:23.6819495Z save-always: false 2026-10-25T01:04:23.6819644Z env: 2026-10-25T01:04:23.6820229Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:23.6820542Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:23.6820850Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:23.6821108Z ##[endgroup] 2026-10-25T01:04:23.8826403Z Cache hit for: pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c 2026-10-25T01:04:24.9366608Z Received 671088640 of 996034848 (67.4%), 631.2 MBs/sec 2026-10-25T01:04:25.3880731Z Received 996034848 of 996034848 (100.0%), 648.4 MBs/sec 2026-10-25T01:04:25.3881197Z Cache Size: ~950 MB (996034848 B) 2026-10-25T01:04:25.3922109Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/af9e5d2b-4417-4988-b3d4-2ea8bbf186c9/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T01:04:30.3288425Z Cache restored successfully 2026-10-25T01:04:30.3732832Z Cache restored from key: pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c 2026-10-25T01:04:30.3795476Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=6735] 2026-10-25T01:04:30.3797470Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-25T01:04:30.3806844Z ##[group]Run vp install 2026-10-25T01:04:30.3806995Z vp install 2026-10-25T01:04:30.3826603Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T01:04:30.3826795Z env: 2026-10-25T01:04:30.3826915Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:30.3827064Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:30.3827208Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:30.3827341Z ##[endgroup] 2026-10-25T01:04:30.4141906Z Scope: all 34 workspace projects 2026-10-25T01:04:30.5091225Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-25T01:04:30.7530312Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-25T01:04:30.7530881Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-25T01:04:30.7531247Z Virtual store is at: node_modules/.pnpm 2026-10-25T01:04:32.9806745Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.5s) 2026-10-25T01:04:32.9807001Z Lockfile is up to date, resolution step is skipped 2026-10-25T01:04:32.9958997Z Packages: +1721 2026-10-25T01:04:32.9959164Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-25T01:04:33.0233407Z Progress: resolved 1721, reused 1717, downloaded 0, added 1721, done 2026-10-25T01:04:33.9084760Z . prepare$ vp config --no-agent 2026-10-25T01:04:33.9980103Z . prepare: Done 2026-10-25T01:04:33.9992744Z 2026-10-25T01:04:33.9993366Z devDependencies: 2026-10-25T01:04:33.9993535Z + @coderabbitai/config 1.1.0 2026-10-25T01:04:33.9993676Z + @shadcn/lint 0.1.5 2026-10-25T01:04:33.9993825Z + @types/node 24.12.4 2026-10-25T01:04:33.9993945Z + knip 6.34.0 2026-10-25T01:04:33.9994077Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-25T01:04:33.9994221Z + vite-plus 1.3.0 2026-10-25T01:04:33.9994288Z 2026-10-25T01:04:34.0006981Z Done in 3.6s using pnpm v12.14.0 2026-10-25T01:04:34.0146420Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3634] 2026-10-25T01:04:34.0628123Z ##[group]Run actions/cache@v6 2026-10-25T01:04:34.0628382Z with: 2026-10-25T01:04:34.0628542Z path: ~/.cache/electron 2026-10-25T01:04:34.0628883Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T01:04:34.0629254Z enableCrossOsArchive: false 2026-10-25T01:04:34.0629448Z fail-on-cache-miss: false 2026-10-25T01:04:34.0629569Z lookup-only: false 2026-10-25T01:04:34.0629682Z save-always: false 2026-10-25T01:04:34.0629789Z env: 2026-10-25T01:04:34.0629900Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:34.0630042Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:34.0630194Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:34.0630324Z ##[endgroup] 2026-10-25T01:04:34.2527280Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T01:04:34.4216000Z Received 122906203 of 122906203 (100.0%), 761.1 MBs/sec 2026-10-25T01:04:34.4217012Z Cache Size: ~117 MB (122906203 B) 2026-10-25T01:04:34.4267373Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/d39a7235-ce81-425f-ab0b-47804bbb83a2/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-25T01:04:34.4854099Z Cache restored successfully 2026-10-25T01:04:34.4982695Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-25T01:04:34.5082651Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-25T01:04:34.5082961Z vp run --filter @t3tools/desktop ensure:electron 2026-10-25T01:04:34.5103334Z shell: /usr/bin/bash -e {0} 2026-10-25T01:04:34.5103475Z env: 2026-10-25T01:04:34.5103759Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:34.5103910Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:34.5104056Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:34.5104197Z ##[endgroup] 2026-10-25T01:04:34.6604756Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-25T01:04:35.2093313Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-25T01:04:35.2109715Z 2026-10-25T01:04:35.2188048Z ##[group]Run vp run knip:check 2026-10-25T01:04:35.2188267Z vp run knip:check 2026-10-25T01:04:35.2206439Z shell: /usr/bin/bash -e {0} 2026-10-25T01:04:35.2206581Z env: 2026-10-25T01:04:35.2206694Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:35.2206852Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:35.2206994Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:35.2207128Z ##[endgroup] 2026-10-25T01:04:35.3611255Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-25T01:04:38.8730177Z 2026-10-25T01:04:38.8733042Z $ 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-definitions --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-25T01:04:46.7685595Z 2026-10-25T01:04:46.7686732Z --- 2026-10-25T01:04:46.7687060Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-25T01:04:46.7754900Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-25T01:04:46.7755189Z vp run --filter @t3tools/source-control-github generate --check 2026-10-25T01:04:46.7772458Z shell: /usr/bin/bash -e {0} 2026-10-25T01:04:46.7772588Z env: 2026-10-25T01:04:46.7772701Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:46.7772854Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:46.7772998Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:46.7773132Z ##[endgroup] 2026-10-25T01:04:46.9276077Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-25T01:04:47.1077370Z 2026-10-25T01:04:47.1158885Z ##[group]Run vp run --filter t3 generate --check 2026-10-25T01:04:47.1159132Z vp run --filter t3 generate --check 2026-10-25T01:04:47.1176827Z shell: /usr/bin/bash -e {0} 2026-10-25T01:04:47.1176958Z env: 2026-10-25T01:04:47.1177078Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:47.1177221Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:47.1177363Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:47.1177494Z ##[endgroup] 2026-10-25T01:04:47.2576420Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-25T01:04:47.4089333Z 2026-10-25T01:04:47.4187726Z ##[group]Run vp check 2026-10-25T01:04:47.4187949Z vp check 2026-10-25T01:04:47.4206917Z shell: /usr/bin/bash -e {0} 2026-10-25T01:04:47.4207050Z env: 2026-10-25T01:04:47.4207160Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:47.4207313Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:47.4207453Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-25T01:04:47.4207590Z ##[endgroup] 2026-10-25T01:04:47.9902452Z pass: All 5760 files are correctly formatted (431ms, 8 threads) 2026-10-25T01:04:53.7360876Z warn: Lint warnings found 2026-10-25T01:04:53.7362217Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T01:04:53.7362603Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-25T01:04:53.7362903Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-25T01:04:53.7363120Z 259 │ for (const edit of edits.reverse()) 2026-10-25T01:04:53.7363350Z ·  ─────── 2026-10-25T01:04:53.7363635Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T01:04:53.7363877Z ╰──── 2026-10-25T01:04:53.7364228Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T01:04:53.7364490Z 2026-10-25T01:04:53.7364731Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T01:04:53.7365071Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-25T01:04:53.7365315Z 289 │ visit(parser.parse(markdown)); 2026-10-25T01:04:53.7365510Z 290 │ for (const edit of edits.reverse()) 2026-10-25T01:04:53.7365723Z ·  ─────── 2026-10-25T01:04:53.7366030Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-25T01:04:53.7366265Z ╰──── 2026-10-25T01:04:53.7366591Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T01:04:53.7366852Z 2026-10-25T01:04:53.7367072Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T01:04:53.7367426Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-25T01:04:53.7367663Z 343 │ visit(parser.parse(markdown)); 2026-10-25T01:04:53.7367877Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-25T01:04:53.7368123Z ·  ─────── 2026-10-25T01:04:53.7368421Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-25T01:04:53.7368651Z ╰──── 2026-10-25T01:04:53.7368984Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T01:04:53.7369243Z 2026-10-25T01:04:53.7369517Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7369951Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-25T01:04:53.7370182Z 55 │ 2026-10-25T01:04:53.7370319Z 56 │ useEffect(() => { 2026-10-25T01:04:53.7370528Z ·  ────┬──── 2026-10-25T01:04:53.7370764Z · ╰── This is the containing effect 2026-10-25T01:04:53.7370980Z 57 │ setDecodedSize(null); 2026-10-25T01:04:53.7371461Z ·  ───────┬────── 2026-10-25T01:04:53.7371750Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7372003Z 58 │ }, [props.sourceKey]); 2026-10-25T01:04:53.7372152Z ╰──── 2026-10-25T01:04:53.7372971Z  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-25T01:04:53.7373958Z  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-25T01:04:53.7374279Z 2026-10-25T01:04:53.7374553Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7374976Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-25T01:04:53.7375194Z 59 │ 2026-10-25T01:04:53.7375327Z 60 │ useEffect(() => { 2026-10-25T01:04:53.7375487Z ·  ────┬──── 2026-10-25T01:04:53.7375709Z · ╰── This is the containing effect 2026-10-25T01:04:53.7375919Z 61 │ setFailedUri(null); 2026-10-25T01:04:53.7376098Z ·  ──────┬───── 2026-10-25T01:04:53.7376367Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7376608Z 62 │ }, [props.uri]); 2026-10-25T01:04:53.7376752Z ╰──── 2026-10-25T01:04:53.7377423Z  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-25T01:04:53.7378596Z  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-25T01:04:53.7378922Z 2026-10-25T01:04:53.7379156Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T01:04:53.7379551Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-25T01:04:53.7379852Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-25T01:04:53.7380176Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-25T01:04:53.7380489Z ·  ────────┬──────── 2026-10-25T01:04:53.7380764Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T01:04:53.7380971Z 8 │ 2026-10-25T01:04:53.7381086Z ╰──── 2026-10-25T01:04:53.7381254Z  help: Consider removing this import. 2026-10-25T01:04:53.7381378Z 2026-10-25T01:04:53.7381595Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7381957Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-25T01:04:53.7382196Z 57 │ setDecodedSize(null); 2026-10-25T01:04:53.7382360Z 58 │ }, [props.sourceKey]); 2026-10-25T01:04:53.7382541Z ·  ───────┬─────── 2026-10-25T01:04:53.7382797Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-25T01:04:53.7383008Z 59 │ 2026-10-25T01:04:53.7383142Z ╰──── 2026-10-25T01:04:53.7383499Z  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-25T01:04:53.7384098Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7384524Z 2026-10-25T01:04:53.7384775Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7385126Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-25T01:04:53.7385358Z 61 │ setFailedUri(null); 2026-10-25T01:04:53.7385518Z 62 │ }, [props.uri]); 2026-10-25T01:04:53.7385678Z ·  ────┬──── 2026-10-25T01:04:53.7385920Z · ╰── Unnecessary dependency `props.uri` 2026-10-25T01:04:53.7386118Z 63 │ 2026-10-25T01:04:53.7386237Z ╰──── 2026-10-25T01:04:53.7386588Z  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-25T01:04:53.7387195Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7387493Z 2026-10-25T01:04:53.7387865Z ⚠ 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-25T01:04:53.7388335Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-25T01:04:53.7388616Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-25T01:04:53.7388905Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-25T01:04:53.7389160Z ·  ──────────────────────── 2026-10-25T01:04:53.7389423Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-25T01:04:53.7389630Z ╰──── 2026-10-25T01:04:53.7389689Z 2026-10-25T01:04:53.7390065Z ⚠ 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-25T01:04:53.7390565Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-25T01:04:53.7390808Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-25T01:04:53.7391087Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-25T01:04:53.7391374Z ·  ──────────────────────── 2026-10-25T01:04:53.7391564Z 257 │ return [ 2026-10-25T01:04:53.7391698Z ╰──── 2026-10-25T01:04:53.7391755Z 2026-10-25T01:04:53.7392001Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T01:04:53.7392399Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-25T01:04:53.7392637Z 261 │ ): boolean { 2026-10-25T01:04:53.7392873Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-25T01:04:53.7393204Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-25T01:04:53.7393514Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-25T01:04:53.7393726Z ╰──── 2026-10-25T01:04:53.7393864Z  help: Switch to `Set` 2026-10-25T01:04:53.7393965Z 2026-10-25T01:04:53.7394176Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T01:04:53.7394556Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-25T01:04:53.7394811Z 14 │ } from "@t3tools/contracts"; 2026-10-25T01:04:53.7395080Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-25T01:04:53.7395314Z ·  ── 2026-10-25T01:04:53.7395463Z 16 │ 2026-10-25T01:04:53.7395579Z ╰──── 2026-10-25T01:04:53.7395720Z  help: Remove empty braces 2026-10-25T01:04:53.7395828Z 2026-10-25T01:04:53.7396027Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.7396394Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-25T01:04:53.7396641Z 87 │
  • { 2026-10-25T01:04:53.7413932Z 57 │ if (pulse) { 2026-10-25T01:04:53.7414109Z 58 │ pulseProgress.value = withRepeat( 2026-10-25T01:04:53.7414301Z ·  ──────┬────── 2026-10-25T01:04:53.7414546Z · ╰── `pulseProgress` cannot be modified 2026-10-25T01:04:53.7414765Z 59 │ withTiming(1, { 2026-10-25T01:04:53.7414906Z ╰──── 2026-10-25T01:04:53.7415239Z  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-25T01:04:53.7415823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7416131Z 2026-10-25T01:04:53.7416346Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-25T01:04:53.7416656Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-25T01:04:53.7416927Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-25T01:04:53.7417203Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-25T01:04:53.7417433Z ·  ──────┬────── 2026-10-25T01:04:53.7417681Z · ╰── 'HookForwarder' is imported here 2026-10-25T01:04:53.7417939Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-25T01:04:53.7418118Z ╰──── 2026-10-25T01:04:53.7418341Z  help: Consider removing this import. 2026-10-25T01:04:53.7418458Z 2026-10-25T01:04:53.7418727Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7419165Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:82:5] 2026-10-25T01:04:53.7419398Z 79 │ 2026-10-25T01:04:53.7419529Z 80 │ useEffect(() => { 2026-10-25T01:04:53.7419685Z ·  ────┬──── 2026-10-25T01:04:53.7419906Z · ╰── This is the containing effect 2026-10-25T01:04:53.7420180Z 81 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-25T01:04:53.7420423Z 82 │ setHostInput(host); 2026-10-25T01:04:53.7420594Z ·  ──────┬───── 2026-10-25T01:04:53.7420866Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7421110Z 83 │ setCodeInput(code); 2026-10-25T01:04:53.7421252Z ╰──── 2026-10-25T01:04:53.7421924Z  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-25T01:04:53.7422802Z  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-25T01:04:53.7423115Z 2026-10-25T01:04:53.7423485Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7423974Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:92:5] 2026-10-25T01:04:53.7424206Z 85 │ 2026-10-25T01:04:53.7424332Z 86 │ useEffect(() => { 2026-10-25T01:04:53.7424502Z ·  ────┬──── 2026-10-25T01:04:53.7424723Z · ╰── This is the containing effect 2026-10-25T01:04:53.7424956Z 87 │ if (routePairingUrl.length === 0) { 2026-10-25T01:04:53.7425129Z 88 │ return; 2026-10-25T01:04:53.7425269Z 89 │ } 2026-10-25T01:04:53.7425387Z 90 │ 2026-10-25T01:04:53.7425570Z 91 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-25T01:04:53.7425776Z 92 │ setHostInput(host); 2026-10-25T01:04:53.7425942Z ·  ──────┬───── 2026-10-25T01:04:53.7426215Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7426454Z 93 │ setCodeInput(code); 2026-10-25T01:04:53.7426597Z ╰──── 2026-10-25T01:04:53.7427265Z  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-25T01:04:53.7428142Z  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-25T01:04:53.7428452Z 2026-10-25T01:04:53.7428715Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7429148Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:98:7] 2026-10-25T01:04:53.7429382Z 95 │ 2026-10-25T01:04:53.7429512Z 96 │ useEffect(() => { 2026-10-25T01:04:53.7429667Z ·  ────┬──── 2026-10-25T01:04:53.7429889Z · ╰── This is the containing effect 2026-10-25T01:04:53.7430112Z 97 │ if (pairingConnectionError) { 2026-10-25T01:04:53.7430295Z 98 │ setIsSubmitting(false); 2026-10-25T01:04:53.7430514Z ·  ───────┬─────── 2026-10-25T01:04:53.7430793Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7431022Z 99 │ } 2026-10-25T01:04:53.7431141Z ╰──── 2026-10-25T01:04:53.7431814Z  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-25T01:04:53.7432690Z  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-25T01:04:53.7432999Z 2026-10-25T01:04:53.7433215Z ⚠ eslint(no-unused-vars): Identifier 'openSettings' is imported but never used. 2026-10-25T01:04:53.7433602Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10] 2026-10-25T01:04:53.7433920Z 34 │ import { splitEnvironmentSections } from "./environmentSections"; 2026-10-25T01:04:53.7434203Z 35 │ import { openSettings } from "../settings/settings-navigation"; 2026-10-25T01:04:53.7434515Z ·  ──────┬───── 2026-10-25T01:04:53.7434797Z · ╰── 'openSettings' is imported here 2026-10-25T01:04:53.7435079Z 36 │ import { leaveSettingsPage } from "../settings/settings-navigation"; 2026-10-25T01:04:53.7435280Z ╰──── 2026-10-25T01:04:53.7435441Z  help: Consider removing this import. 2026-10-25T01:04:53.7435563Z 2026-10-25T01:04:53.7435799Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T01:04:53.7436177Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-25T01:04:53.7436398Z 237 │ ): string { 2026-10-25T01:04:53.7436644Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-25T01:04:53.7436936Z ·  ────── 2026-10-25T01:04:53.7437209Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-25T01:04:53.7437410Z ╰──── 2026-10-25T01:04:53.7437647Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T01:04:53.7437826Z 2026-10-25T01:04:53.7438018Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T01:04:53.7438395Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:121:34] 2026-10-25T01:04:53.7438658Z 120 │ return [...commands]; 2026-10-25T01:04:53.7438889Z 121 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-25T01:04:53.7439158Z ·  ─────────┬───────── 2026-10-25T01:04:53.7439481Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-25T01:04:53.7439720Z 122 │ 2026-10-25T01:04:53.7439838Z ╰──── 2026-10-25T01:04:53.7440221Z  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-25T01:04:53.7440882Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7441188Z 2026-10-25T01:04:53.7441364Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T01:04:53.7441661Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-25T01:04:53.7441850Z 265 │ 2026-10-25T01:04:53.7442022Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-25T01:04:53.7442232Z ·  ── 2026-10-25T01:04:53.7442385Z 267 │ } 2026-10-25T01:04:53.7442505Z ╰──── 2026-10-25T01:04:53.7442799Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T01:04:53.7443032Z 2026-10-25T01:04:53.7443312Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7443716Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:935:7] 2026-10-25T01:04:53.7443926Z 934 │ 2026-10-25T01:04:53.7444193Z 935 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-25T01:04:53.7444477Z ·  ─────┬───── 2026-10-25T01:04:53.7444791Z · ╰── 'layerDaemon' is declared here 2026-10-25T01:04:53.7445093Z 936 │ runDaemon.pipe(Effect.forkScoped), 2026-10-25T01:04:53.7445264Z ╰──── 2026-10-25T01:04:53.7445433Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7445557Z 2026-10-25T01:04:53.7445903Z ⚠ 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-25T01:04:53.7446371Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-25T01:04:53.7446700Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-25T01:04:53.7447051Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T01:04:53.7447319Z ·  ───────── 2026-10-25T01:04:53.7447616Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T01:04:53.7447864Z ╰──── 2026-10-25T01:04:53.7447924Z 2026-10-25T01:04:53.7448262Z ⚠ 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-25T01:04:53.7448723Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-25T01:04:53.7449051Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-25T01:04:53.7449417Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-25T01:04:53.7449693Z ·  ───────── 2026-10-25T01:04:53.7449856Z 52 │ } 2026-10-25T01:04:53.7449974Z ╰──── 2026-10-25T01:04:53.7450033Z 2026-10-25T01:04:53.7450393Z ⚠ 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-25T01:04:53.7450886Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-25T01:04:53.7451115Z 54 │ assert.equal( 2026-10-25T01:04:53.7451376Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T01:04:53.7451636Z ·  ───────── 2026-10-25T01:04:53.7451785Z 56 │ true, 2026-10-25T01:04:53.7451911Z ╰──── 2026-10-25T01:04:53.7451966Z 2026-10-25T01:04:53.7452303Z ⚠ 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-25T01:04:53.7452769Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-25T01:04:53.7452993Z 58 │ assert.equal( 2026-10-25T01:04:53.7453267Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-25T01:04:53.7453534Z ·  ───────── 2026-10-25T01:04:53.7453683Z 60 │ true, 2026-10-25T01:04:53.7453811Z ╰──── 2026-10-25T01:04:53.7453870Z 2026-10-25T01:04:53.7454206Z ⚠ 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-25T01:04:53.7454672Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-25T01:04:53.7454888Z 102 │ 2026-10-25T01:04:53.7455129Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-25T01:04:53.7455399Z ·  ───────── 2026-10-25T01:04:53.7455633Z 104 │ }); 2026-10-25T01:04:53.7455817Z ╰──── 2026-10-25T01:04:53.7455879Z 2026-10-25T01:04:53.7456094Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-25T01:04:53.7456456Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-25T01:04:53.7456672Z 236 │ 2026-10-25T01:04:53.7456856Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-25T01:04:53.7457079Z ·  ───────┬────── 2026-10-25T01:04:53.7457329Z · ╰── 'nonEmptyString' is declared here 2026-10-25T01:04:53.7457627Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-25T01:04:53.7457838Z ╰──── 2026-10-25T01:04:53.7458005Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7458136Z 2026-10-25T01:04:53.7458443Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-25T01:04:53.7458791Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-25T01:04:53.7458982Z 11 │ 2026-10-25T01:04:53.7459145Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-25T01:04:53.7459373Z ·  ────────────┬──────────── 2026-10-25T01:04:53.7459675Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-25T01:04:53.7459924Z 13 │ readonly thread: { 2026-10-25T01:04:53.7460067Z ╰──── 2026-10-25T01:04:53.7460233Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7460384Z 2026-10-25T01:04:53.7460598Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-25T01:04:53.7460900Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-25T01:04:53.7461108Z  9 │ import * as Effect from "effect/Effect"; 2026-10-25T01:04:53.7461307Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-25T01:04:53.7461495Z ·  ──┬── 2026-10-25T01:04:53.7461728Z · ╰── 'Fiber' is imported here 2026-10-25T01:04:53.7461977Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-25T01:04:53.7462151Z ╰──── 2026-10-25T01:04:53.7462311Z  help: Consider removing this import. 2026-10-25T01:04:53.7462429Z 2026-10-25T01:04:53.7462639Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-25T01:04:53.7462944Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-25T01:04:53.7463237Z 16 │ import * as Ref from "effect/Ref"; 2026-10-25T01:04:53.7463487Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-25T01:04:53.7463689Z ·  ────┬─── 2026-10-25T01:04:53.7463933Z · ╰── 'Schedule' is imported here 2026-10-25T01:04:53.7464171Z 18 │ import * as Schema from "effect/Schema"; 2026-10-25T01:04:53.7464334Z ╰──── 2026-10-25T01:04:53.7464495Z  help: Consider removing this import. 2026-10-25T01:04:53.7464613Z 2026-10-25T01:04:53.7464926Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7465322Z ╭─[apps/server/src/ws.ts:1292:13] 2026-10-25T01:04:53.7465605Z 1291 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-25T01:04:53.7465994Z 1292 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-25T01:04:53.7466328Z ·  ────────────┬─────────── 2026-10-25T01:04:53.7466636Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-25T01:04:53.7466990Z 1293 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-25T01:04:53.7467233Z ╰──── 2026-10-25T01:04:53.7467400Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7467524Z 2026-10-25T01:04:53.7467796Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7468186Z ╭─[packages/provider-grok/src/server/adapter.ts:427:7] 2026-10-25T01:04:53.7468394Z 426 │ 2026-10-25T01:04:53.7468538Z 427 │ const layer: Layer.Layer< 2026-10-25T01:04:53.7468718Z ·  ──┬── 2026-10-25T01:04:53.7468942Z · ╰── 'layer' is declared here 2026-10-25T01:04:53.7469184Z 428 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T01:04:53.7469356Z ╰──── 2026-10-25T01:04:53.7469524Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7469652Z 2026-10-25T01:04:53.7469922Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-25T01:04:53.7470333Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-25T01:04:53.7470606Z 1619 │ 2026-10-25T01:04:53.7470891Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-25T01:04:53.7471248Z ·  ──────────────────┬────────────────── 2026-10-25T01:04:53.7471591Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-25T01:04:53.7471875Z 1621 │ const meta = response._meta; 2026-10-25T01:04:53.7472034Z ╰──── 2026-10-25T01:04:53.7472204Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7491694Z 2026-10-25T01:04:53.7492171Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T01:04:53.7492592Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-25T01:04:53.7492887Z 52 │ 2026-10-25T01:04:53.7493020Z 53 │ for (const {} of [ 2026-10-25T01:04:53.7493191Z ·  ── 2026-10-25T01:04:53.7493351Z 54 │ { healthy: true }, 2026-10-25T01:04:53.7493714Z ╰──── 2026-10-25T01:04:53.7494077Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T01:04:53.7494298Z 2026-10-25T01:04:53.7494512Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-25T01:04:53.7494880Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-25T01:04:53.7495135Z 24 │ import * as Schema from "effect/Schema"; 2026-10-25T01:04:53.7495359Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-25T01:04:53.7495575Z ·  ─────┬───── 2026-10-25T01:04:53.7495818Z · ╰── 'HostProcess' is imported here 2026-10-25T01:04:53.7496014Z 26 │ 2026-10-25T01:04:53.7496119Z ╰──── 2026-10-25T01:04:53.7496280Z  help: Consider removing this import. 2026-10-25T01:04:53.7496398Z 2026-10-25T01:04:53.7496675Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7497099Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-25T01:04:53.7497346Z 123 │ const path = yield* Path.Path; 2026-10-25T01:04:53.7497565Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T01:04:53.7497774Z ·  ──────┬───── 2026-10-25T01:04:53.7498010Z · ╰── 'serverConfig' is declared here 2026-10-25T01:04:53.7498411Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T01:04:53.7498625Z ╰──── 2026-10-25T01:04:53.7498792Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7498912Z 2026-10-25T01:04:53.7499185Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7499596Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-25T01:04:53.7499875Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-25T01:04:53.7500144Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-25T01:04:53.7500408Z ·  ───────┬────── 2026-10-25T01:04:53.7500649Z · ╰── 'serverSettings' is declared here 2026-10-25T01:04:53.7500926Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-25T01:04:53.7501130Z ╰──── 2026-10-25T01:04:53.7501294Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7501415Z 2026-10-25T01:04:53.7501620Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T01:04:53.7501957Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-25T01:04:53.7502265Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T01:04:53.7502530Z 228 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7502732Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7503297Z · ╰── 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-25T01:04:53.7503891Z 229 │ mostRecentEventCount, 2026-10-25T01:04:53.7504085Z 230 │ ); 2026-10-25T01:04:53.7504275Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T01:04:53.7504553Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T01:04:53.7504895Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.7505169Z 232 │ const assumedValue = props.value; 2026-10-25T01:04:53.7505328Z ╰──── 2026-10-25T01:04:53.7505550Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T01:04:53.7506045Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7506336Z 2026-10-25T01:04:53.7506554Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T01:04:53.7506898Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-25T01:04:53.7507184Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T01:04:53.7507430Z 239 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7507628Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7508184Z · ╰── 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-25T01:04:53.7508657Z 240 │ controlledEventCount, 2026-10-25T01:04:53.7508821Z 241 │ assumedValue, 2026-10-25T01:04:53.7508966Z 242 │ ); 2026-10-25T01:04:53.7509189Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T01:04:53.7509493Z ·  ───────────┬────────── 2026-10-25T01:04:53.7509834Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T01:04:53.7510114Z 244 │ const acceptNativeEvent = useCallback( 2026-10-25T01:04:53.7510272Z ╰──── 2026-10-25T01:04:53.7510780Z  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-25T01:04:53.7511458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7511752Z 2026-10-25T01:04:53.7511900Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7512188Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-25T01:04:53.7512453Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T01:04:53.7512699Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T01:04:53.7512953Z ·  ─────────────┬──────────── 2026-10-25T01:04:53.7513247Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.7513465Z 165 │ }); 2026-10-25T01:04:53.7513583Z ╰──── 2026-10-25T01:04:53.7514159Z  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-25T01:04:53.7514894Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7515165Z 2026-10-25T01:04:53.7515310Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7515595Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-25T01:04:53.7515863Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T01:04:53.7516106Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T01:04:53.7516352Z ·  ─────────────┬──────────── 2026-10-25T01:04:53.7516686Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7516938Z 165 │ }); 2026-10-25T01:04:53.7517056Z ╰──── 2026-10-25T01:04:53.7517569Z  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-25T01:04:53.7518261Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7518532Z 2026-10-25T01:04:53.7518680Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7518966Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-25T01:04:53.7519169Z 165 │ }); 2026-10-25T01:04:53.7519328Z 166 │ confirmedTokensRef.current = tokens; 2026-10-25T01:04:53.7519565Z ·  ─────────┬────────────┬─── 2026-10-25T01:04:53.7519882Z · │ ╰── Cannot update ref value during render 2026-10-25T01:04:53.7520179Z · ╰── This value is a ref 2026-10-25T01:04:53.7520404Z 167 │ return JSON.stringify( 2026-10-25T01:04:53.7520548Z ╰──── 2026-10-25T01:04:53.7521052Z  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-25T01:04:53.7521800Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7522110Z 2026-10-25T01:04:53.7522252Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7522538Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-25T01:04:53.7522752Z 207 │ mostRecentEventCount, 2026-10-25T01:04:53.7522933Z 208 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7523146Z ·  ───────────────┬─────────────── 2026-10-25T01:04:53.7523452Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7523689Z 209 │ ); 2026-10-25T01:04:53.7523806Z ╰──── 2026-10-25T01:04:53.7524322Z  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-25T01:04:53.7525022Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7525294Z 2026-10-25T01:04:53.7525441Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7525724Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-25T01:04:53.7525936Z 213 │ mostRecentEventCount, 2026-10-25T01:04:53.7526117Z 214 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7526333Z ·  ───────────────┬─────────────── 2026-10-25T01:04:53.7526632Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7526872Z 215 │ ); 2026-10-25T01:04:53.7526986Z ╰──── 2026-10-25T01:04:53.7527496Z  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-25T01:04:53.7528191Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7528464Z 2026-10-25T01:04:53.7528653Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T01:04:53.7528971Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-25T01:04:53.7529239Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T01:04:53.7529487Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T01:04:53.7529728Z ·  ─────────┬──────── 2026-10-25T01:04:53.7530304Z · ╰── 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-25T01:04:53.7530802Z 165 │ }); 2026-10-25T01:04:53.7530959Z 166 │ confirmedTokensRef.current = tokens; 2026-10-25T01:04:53.7531137Z 167 │ return JSON.stringify( 2026-10-25T01:04:53.7531390Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T01:04:53.7531690Z 169 │ const record = 2026-10-25T01:04:53.7531886Z 170 │ token.type === "context" 2026-10-25T01:04:53.7532150Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T01:04:53.7532379Z 172 │ : undefined; 2026-10-25T01:04:53.7532572Z 173 │ const presentation = contextChipPresentation( 2026-10-25T01:04:53.7532802Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-25T01:04:53.7532994Z 175 │ record, 2026-10-25T01:04:53.7533132Z 176 │ ); 2026-10-25T01:04:53.7533290Z 177 │ const icon = contextChipIcon( 2026-10-25T01:04:53.7533459Z 178 │ presentation, 2026-10-25T01:04:53.7533686Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T01:04:53.7533895Z 180 │ ); 2026-10-25T01:04:53.7534023Z 181 │ return { 2026-10-25T01:04:53.7534177Z 182 │ type: token.type, 2026-10-25T01:04:53.7534340Z 183 │ source: token.source, 2026-10-25T01:04:53.7534510Z 184 │ start: token.start, 2026-10-25T01:04:53.7534666Z 185 │ end: token.end, 2026-10-25T01:04:53.7534909Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T01:04:53.7535124Z 187 │ label: 2026-10-25T01:04:53.7535277Z 188 │ token.type === "skill" 2026-10-25T01:04:53.7535487Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T01:04:53.7535692Z 190 │ : token.type === "context" 2026-10-25T01:04:53.7536029Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T01:04:53.7536338Z 192 │ : basename(token.value), 2026-10-25T01:04:53.7536591Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T01:04:53.7536838Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-25T01:04:53.7537044Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-25T01:04:53.7537205Z 196 │ }; 2026-10-25T01:04:53.7537332Z 197 │ }), 2026-10-25T01:04:53.7537454Z 198 │ ); 2026-10-25T01:04:53.7537655Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T01:04:53.7537961Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T01:04:53.7538727Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.7539058Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T01:04:53.7539258Z ╰──── 2026-10-25T01:04:53.7539525Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T01:04:53.7540035Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7540327Z 2026-10-25T01:04:53.7540544Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T01:04:53.7540862Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-25T01:04:53.7541138Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T01:04:53.7541379Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T01:04:53.7541591Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7542225Z · ╰── 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-25T01:04:53.7542761Z 255 │ eventCount: acknowledgedEventCount, 2026-10-25T01:04:53.7542932Z 256 │ value, 2026-10-25T01:04:53.7543089Z 257 │ selection: nextSelection, 2026-10-25T01:04:53.7543245Z 258 │ }); 2026-10-25T01:04:53.7543397Z 259 │ return acknowledgedEventCount; 2026-10-25T01:04:53.7543554Z 260 │ }, 2026-10-25T01:04:53.7543675Z 261 │ [], 2026-10-25T01:04:53.7543807Z ·  ─┬ 2026-10-25T01:04:53.7544070Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.7544304Z 262 │ ); 2026-10-25T01:04:53.7544423Z ╰──── 2026-10-25T01:04:53.7544691Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T01:04:53.7545198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7545489Z 2026-10-25T01:04:53.7545678Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7546033Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-25T01:04:53.7546289Z 554 │ assert.deepStrictEqual( 2026-10-25T01:04:53.7546558Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T01:04:53.7546854Z ·  ┬ 2026-10-25T01:04:53.7547151Z · ╰── '_' is declared here 2026-10-25T01:04:53.7547372Z 556 │ [ 2026-10-25T01:04:53.7547497Z ╰──── 2026-10-25T01:04:53.7547659Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7547774Z 2026-10-25T01:04:53.7547962Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7548322Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-25T01:04:53.7548573Z 1154 │ assert.deepStrictEqual( 2026-10-25T01:04:53.7548840Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-25T01:04:53.7549128Z ·  ┬ 2026-10-25T01:04:53.7549425Z · ╰── '_' is declared here 2026-10-25T01:04:53.7549640Z 1156 │ [ 2026-10-25T01:04:53.7549769Z ╰──── 2026-10-25T01:04:53.7549924Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7550040Z 2026-10-25T01:04:53.7550239Z ⚠ eslint(no-unused-vars): Identifier 'FormSheet' is imported but never used. 2026-10-25T01:04:53.7550618Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:26:10] 2026-10-25T01:04:53.7550876Z 25 │ import { StyleSheet, View } from "react-native"; 2026-10-25T01:04:53.7551112Z 26 │ import { FormSheet, Stack } from "react-native-screens"; 2026-10-25T01:04:53.7551317Z ·  ────┬──── 2026-10-25T01:04:53.7551612Z · ╰── 'FormSheet' is imported here 2026-10-25T01:04:53.7551933Z 27 │ import { NativeScrollEdgeEffectsContext } from "./NativeScrollViewMarker"; 2026-10-25T01:04:53.7552151Z ╰──── 2026-10-25T01:04:53.7552302Z  help: Consider removing this import. 2026-10-25T01:04:53.7552416Z 2026-10-25T01:04:53.7552648Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopAction' is imported but never used. 2026-10-25T01:04:53.7553012Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:33:3] 2026-10-25T01:04:53.7553237Z 32 │ nativeStackPopAction, 2026-10-25T01:04:53.7553400Z 33 │ nativeWorkspacePopAction, 2026-10-25T01:04:53.7553591Z ·  ────────────┬─────────── 2026-10-25T01:04:53.7553857Z · ╰── 'nativeWorkspacePopAction' is imported here 2026-10-25T01:04:53.7554097Z 34 │ nativeWorkspacePopCount, 2026-10-25T01:04:53.7554244Z ╰──── 2026-10-25T01:04:53.7554396Z  help: Consider removing this import. 2026-10-25T01:04:53.7554509Z 2026-10-25T01:04:53.7554735Z ⚠ eslint(no-unused-vars): Identifier 'nativeWorkspacePopCount' is imported but never used. 2026-10-25T01:04:53.7555093Z ╭─[apps/mobile/src/native/createV5StackNavigator.ios.tsx:34:3] 2026-10-25T01:04:53.7555321Z 33 │ nativeWorkspacePopAction, 2026-10-25T01:04:53.7555481Z 34 │ nativeWorkspacePopCount, 2026-10-25T01:04:53.7555662Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7555918Z · ╰── 'nativeWorkspacePopCount' is imported here 2026-10-25T01:04:53.7556156Z 35 │ partitionStackPresentations, 2026-10-25T01:04:53.7556305Z ╰──── 2026-10-25T01:04:53.7556463Z  help: Consider removing this import. 2026-10-25T01:04:53.7556575Z 2026-10-25T01:04:53.7556747Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.7557049Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-25T01:04:53.7557305Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-25T01:04:53.7557534Z 2037 │ createdAt: new Date().toISOString(), 2026-10-25T01:04:53.7557737Z ·  ─────┬──── 2026-10-25T01:04:53.7557983Z · ╰── Cannot call impure function 2026-10-25T01:04:53.7558232Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-25T01:04:53.7558404Z ╰──── 2026-10-25T01:04:53.7558749Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T01:04:53.7559304Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.7559583Z 2026-10-25T01:04:53.7559751Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.7560070Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-25T01:04:53.7560449Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-25T01:04:53.7560761Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-25T01:04:53.7561032Z ·  ─────┬──── 2026-10-25T01:04:53.7561386Z · ╰── Cannot call impure function 2026-10-25T01:04:53.7561645Z 153 │ } 2026-10-25T01:04:53.7561764Z ╰──── 2026-10-25T01:04:53.7562101Z  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-25T01:04:53.7562653Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.7562930Z 2026-10-25T01:04:53.7563134Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-25T01:04:53.7563492Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1850:8] 2026-10-25T01:04:53.7563730Z 1849 │ assert.equal( 2026-10-25T01:04:53.7563964Z 1850 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-25T01:04:53.7564225Z ·  ────────────────────────── 2026-10-25T01:04:53.7564418Z 1851 │ stored.attachments[0]?.id, 2026-10-25T01:04:53.7564572Z ╰──── 2026-10-25T01:04:53.7564798Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-25T01:04:53.7564971Z 2026-10-25T01:04:53.7565118Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7565388Z ╭─[apps/mobile/src/native/StackHeader.tsx:210:9] 2026-10-25T01:04:53.7565582Z 209 │ "options", 2026-10-25T01:04:53.7565760Z 210 │ latestOptionFunctionsRef.current, 2026-10-25T01:04:53.7565980Z ·  ────────────────┬─────────────── 2026-10-25T01:04:53.7566298Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7566581Z 211 │ optionFunctionWrappersRef.current, 2026-10-25T01:04:53.7566750Z ╰──── 2026-10-25T01:04:53.7567270Z  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-25T01:04:53.7567977Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7568253Z 2026-10-25T01:04:53.7568401Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7568666Z ╭─[apps/mobile/src/native/StackHeader.tsx:211:9] 2026-10-25T01:04:53.7568942Z 210 │ latestOptionFunctionsRef.current, 2026-10-25T01:04:53.7569179Z 211 │ optionFunctionWrappersRef.current, 2026-10-25T01:04:53.7569398Z ·  ────────────────┬──────────────── 2026-10-25T01:04:53.7569709Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7569982Z 212 │ ) as NativeStackNavigationOptions) 2026-10-25T01:04:53.7570146Z ╰──── 2026-10-25T01:04:53.7570690Z  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-25T01:04:53.7571396Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7571678Z 2026-10-25T01:04:53.7572146Z ⚠ 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-25T01:04:53.7572704Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-25T01:04:53.7572909Z 93 │ ) { 2026-10-25T01:04:53.7573184Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T01:04:53.7573549Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-25T01:04:53.7573847Z 96 │ │ if (predicate(project)) return project; 2026-10-25T01:04:53.7574079Z 97 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.7574325Z 98 │ ╰─▶ } 2026-10-25T01:04:53.7574608Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-25T01:04:53.7574821Z ╰──── 2026-10-25T01:04:53.7574879Z 2026-10-25T01:04:53.7575141Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7575527Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-25T01:04:53.7575731Z 3754 │ 2026-10-25T01:04:53.7575993Z 3755 │ const layer: Layer.Layer = 2026-10-25T01:04:53.7576266Z ·  ──┬── 2026-10-25T01:04:53.7576491Z · ╰── 'layer' is declared here 2026-10-25T01:04:53.7576697Z 3756 │ Layer.effect( 2026-10-25T01:04:53.7576835Z ╰──── 2026-10-25T01:04:53.7576999Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7577118Z 2026-10-25T01:04:53.7577285Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-25T01:04:53.7577608Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-25T01:04:53.7577820Z 1436 │ 2026-10-25T01:04:53.7577949Z 1437 │ for (const [] of [ 2026-10-25T01:04:53.7578103Z ·  ── 2026-10-25T01:04:53.7578322Z 1438 │ ["github", "github.com"], 2026-10-25T01:04:53.7578463Z ╰──── 2026-10-25T01:04:53.7578800Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-25T01:04:53.7579061Z 2026-10-25T01:04:53.7579427Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7579912Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-25T01:04:53.7580132Z 345 │ 2026-10-25T01:04:53.7580300Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-25T01:04:53.7580536Z ·  ────────────┬─────────── 2026-10-25T01:04:53.7580811Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-25T01:04:53.7581050Z 347 │ ProviderAdapterRegistryV2, 2026-10-25T01:04:53.7581197Z ╰──── 2026-10-25T01:04:53.7581356Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7581475Z 2026-10-25T01:04:53.7581944Z ⚠ 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-25T01:04:53.7582516Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-25T01:04:53.7582735Z 27 │ ) { 2026-10-25T01:04:53.7583000Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T01:04:53.7583334Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-25T01:04:53.7583612Z 30 │ │ if (predicate(available)) return available; 2026-10-25T01:04:53.7583849Z 31 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.7584088Z 32 │ ╰─▶ } 2026-10-25T01:04:53.7584400Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-25T01:04:53.7584640Z ╰──── 2026-10-25T01:04:53.7584696Z 2026-10-25T01:04:53.7584955Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7585360Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-25T01:04:53.7585580Z 409 │ 2026-10-25T01:04:53.7585771Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-25T01:04:53.7585980Z ·  ──┬── 2026-10-25T01:04:53.7586194Z · ╰── 'layer' is declared here 2026-10-25T01:04:53.7586381Z ╰──── 2026-10-25T01:04:53.7586546Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7586662Z 2026-10-25T01:04:53.7586901Z ⚠ unicorn(no-useless-spread): Using a spread operator here creates a new array unnecessarily. 2026-10-25T01:04:53.7587262Z ╭─[apps/mobile/src/native/native-layout-metrics.tsx:43:27] 2026-10-25T01:04:53.7587476Z 42 │ latestMetrics = next; 2026-10-25T01:04:53.7587678Z 43 │ for (const settle of [...metricsWaiters]) settle(next); 2026-10-25T01:04:53.7587892Z ·  ─── 2026-10-25T01:04:53.7588059Z 44 │ setMetrics(next); 2026-10-25T01:04:53.7588199Z ╰──── 2026-10-25T01:04:53.7588442Z  help: `for…of` can iterate over iterable, it's unnecessary to convert to an array. 2026-10-25T01:04:53.7588618Z 2026-10-25T01:04:53.7588818Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-25T01:04:53.7589216Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-25T01:04:53.7589541Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-25T01:04:53.7589803Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-25T01:04:53.7590007Z ·  ──┬── 2026-10-25T01:04:53.7590222Z · ╰── 'Image' is imported here 2026-10-25T01:04:53.7590439Z 18 │ 2026-10-25T01:04:53.7590550Z ╰──── 2026-10-25T01:04:53.7590707Z  help: Consider removing this import. 2026-10-25T01:04:53.7590817Z 2026-10-25T01:04:53.7591026Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T01:04:53.7591367Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-25T01:04:53.7591683Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-25T01:04:53.7591950Z 226 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7592152Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7592715Z · ╰── 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-25T01:04:53.7593195Z 227 │ mostRecentEventCount, 2026-10-25T01:04:53.7593343Z 228 │ ); 2026-10-25T01:04:53.7593535Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-25T01:04:53.7593815Z ·  ──────────────────────────┬────────────────────────── 2026-10-25T01:04:53.7594160Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.7594433Z 230 │ const assumedValue = props.value; 2026-10-25T01:04:53.7594594Z ╰──── 2026-10-25T01:04:53.7594818Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T01:04:53.7595306Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7595597Z 2026-10-25T01:04:53.7595809Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T01:04:53.7596161Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-25T01:04:53.7596452Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-25T01:04:53.7596700Z 237 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7596902Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7597467Z · ╰── 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-25T01:04:53.7597942Z 238 │ controlledEventCount, 2026-10-25T01:04:53.7598104Z 239 │ assumedValue, 2026-10-25T01:04:53.7598243Z 240 │ ); 2026-10-25T01:04:53.7598471Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-25T01:04:53.7598778Z ·  ───────────┬────────── 2026-10-25T01:04:53.7599187Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-25T01:04:53.7599503Z 242 │ const acceptNativeEvent = useCallback( 2026-10-25T01:04:53.7599669Z ╰──── 2026-10-25T01:04:53.7600142Z  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-25T01:04:53.7600861Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7601150Z 2026-10-25T01:04:53.7601300Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7601599Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-25T01:04:53.7601877Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T01:04:53.7602132Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T01:04:53.7602382Z ·  ─────────────┬──────────── 2026-10-25T01:04:53.7602675Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.7602894Z 163 │ }); 2026-10-25T01:04:53.7603011Z ╰──── 2026-10-25T01:04:53.7603532Z  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-25T01:04:53.7604238Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7604509Z 2026-10-25T01:04:53.7604662Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7604964Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-25T01:04:53.7605239Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T01:04:53.7605490Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T01:04:53.7605739Z ·  ─────────────┬──────────── 2026-10-25T01:04:53.7606071Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7606323Z 163 │ }); 2026-10-25T01:04:53.7606441Z ╰──── 2026-10-25T01:04:53.7607014Z  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-25T01:04:53.7607781Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7608054Z 2026-10-25T01:04:53.7608200Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7608494Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-25T01:04:53.7608700Z 163 │ }); 2026-10-25T01:04:53.7608854Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T01:04:53.7609091Z ·  ─────────┬────────────┬─── 2026-10-25T01:04:53.7609414Z · │ ╰── Cannot update ref value during render 2026-10-25T01:04:53.7609721Z · ╰── This value is a ref 2026-10-25T01:04:53.7609923Z 165 │ return JSON.stringify( 2026-10-25T01:04:53.7610071Z ╰──── 2026-10-25T01:04:53.7610618Z  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-25T01:04:53.7611323Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7611598Z 2026-10-25T01:04:53.7611742Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7612042Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-25T01:04:53.7612264Z 205 │ mostRecentEventCount, 2026-10-25T01:04:53.7612447Z 206 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7612663Z ·  ───────────────┬─────────────── 2026-10-25T01:04:53.7612965Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7613197Z 207 │ ); 2026-10-25T01:04:53.7613314Z ╰──── 2026-10-25T01:04:53.7613824Z  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-25T01:04:53.7614529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7614803Z 2026-10-25T01:04:53.7614947Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7615241Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-25T01:04:53.7615456Z 211 │ mostRecentEventCount, 2026-10-25T01:04:53.7615635Z 212 │ nativeEventSnapshotsRef.current, 2026-10-25T01:04:53.7615846Z ·  ───────────────┬─────────────── 2026-10-25T01:04:53.7616152Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7616383Z 213 │ ); 2026-10-25T01:04:53.7616498Z ╰──── 2026-10-25T01:04:53.7617062Z  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-25T01:04:53.7617799Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7618068Z 2026-10-25T01:04:53.7618316Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T01:04:53.7618643Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-25T01:04:53.7618918Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-25T01:04:53.7619171Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-25T01:04:53.7619413Z ·  ─────────┬──────── 2026-10-25T01:04:53.7620005Z · ╰── 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-25T01:04:53.7620649Z 163 │ }); 2026-10-25T01:04:53.7620998Z 164 │ confirmedTokensRef.current = tokens; 2026-10-25T01:04:53.7621201Z 165 │ return JSON.stringify( 2026-10-25T01:04:53.7621471Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-25T01:04:53.7621718Z 167 │ const record = 2026-10-25T01:04:53.7621898Z 168 │ token.type === "context" 2026-10-25T01:04:53.7622170Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-25T01:04:53.7622410Z 170 │ : undefined; 2026-10-25T01:04:53.7622611Z 171 │ const presentation = contextChipPresentation( 2026-10-25T01:04:53.7622867Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-25T01:04:53.7623064Z 173 │ record, 2026-10-25T01:04:53.7623203Z 174 │ ); 2026-10-25T01:04:53.7623363Z 175 │ const icon = contextChipIcon( 2026-10-25T01:04:53.7623536Z 176 │ presentation, 2026-10-25T01:04:53.7623771Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-25T01:04:53.7623980Z 178 │ ); 2026-10-25T01:04:53.7624110Z 179 │ return { 2026-10-25T01:04:53.7624262Z 180 │ type: token.type, 2026-10-25T01:04:53.7624425Z 181 │ source: token.source, 2026-10-25T01:04:53.7624594Z 182 │ start: token.start, 2026-10-25T01:04:53.7624750Z 183 │ end: token.end, 2026-10-25T01:04:53.7624990Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-25T01:04:53.7625221Z 185 │ label: 2026-10-25T01:04:53.7625381Z 186 │ token.type === "skill" 2026-10-25T01:04:53.7625588Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-25T01:04:53.7625794Z 188 │ : token.type === "context" 2026-10-25T01:04:53.7626144Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-25T01:04:53.7626454Z 190 │ : basename(token.value), 2026-10-25T01:04:53.7626701Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-25T01:04:53.7626949Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-25T01:04:53.7627154Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-25T01:04:53.7627319Z 194 │ }; 2026-10-25T01:04:53.7627446Z 195 │ }), 2026-10-25T01:04:53.7627570Z 196 │ ); 2026-10-25T01:04:53.7627947Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-25T01:04:53.7628368Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-25T01:04:53.7628755Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.7629099Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-25T01:04:53.7629307Z ╰──── 2026-10-25T01:04:53.7629571Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T01:04:53.7630098Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7630567Z 2026-10-25T01:04:53.7630929Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T01:04:53.7631312Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-25T01:04:53.7631605Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-25T01:04:53.7631860Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-25T01:04:53.7632083Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7632666Z · ╰── 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-25T01:04:53.7633175Z 253 │ eventCount: acknowledgedEventCount, 2026-10-25T01:04:53.7633352Z 254 │ value, 2026-10-25T01:04:53.7633517Z 255 │ selection: nextSelection, 2026-10-25T01:04:53.7633674Z 256 │ }); 2026-10-25T01:04:53.7633831Z 257 │ return acknowledgedEventCount; 2026-10-25T01:04:53.7633989Z 258 │ }, 2026-10-25T01:04:53.7634110Z 259 │ [], 2026-10-25T01:04:53.7634244Z ·  ─┬ 2026-10-25T01:04:53.7634512Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.7634745Z 260 │ ); 2026-10-25T01:04:53.7634860Z ╰──── 2026-10-25T01:04:53.7635124Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T01:04:53.7635644Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7635941Z 2026-10-25T01:04:53.7636217Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-25T01:04:53.7636613Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-25T01:04:53.7636923Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-25T01:04:53.7637168Z 12 │ this.onmessage = listener; 2026-10-25T01:04:53.7637353Z ·  ───────── 2026-10-25T01:04:53.7637504Z 13 │ } 2026-10-25T01:04:53.7637621Z ╰──── 2026-10-25T01:04:53.7637988Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-25T01:04:53.7638276Z 2026-10-25T01:04:53.7638624Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T01:04:53.7638996Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-25T01:04:53.7639207Z 15 │ constructor() { 2026-10-25T01:04:53.7639356Z 16 │ source = this; 2026-10-25T01:04:53.7639512Z ·  ────── 2026-10-25T01:04:53.7639649Z 17 │ } 2026-10-25T01:04:53.7639765Z ╰──── 2026-10-25T01:04:53.7640087Z  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-25T01:04:53.7640339Z 2026-10-25T01:04:53.7640552Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-25T01:04:53.7640890Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-25T01:04:53.7641097Z  80 │ 2026-10-25T01:04:53.7641511Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-25T01:04:53.7641879Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-25T01:04:53.7642127Z  83 │ │ ): Effect.fn.Return { 2026-10-25T01:04:53.7642421Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-25T01:04:53.7642726Z  85 │ │ const connections = new Map(); 2026-10-25T01:04:53.7642935Z  86 │ │ 2026-10-25T01:04:53.7643232Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-25T01:04:53.7643537Z  88 │ │ Effect.suspend(() => { 2026-10-25T01:04:53.7643792Z  89 │ │ const connection = connections.get(connectionId); 2026-10-25T01:04:53.7644044Z  90 │ │ return connection === undefined 2026-10-25T01:04:53.7644373Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-25T01:04:53.7644684Z  92 │ │ : Effect.succeed(connection); 2026-10-25T01:04:53.7644885Z  93 │ │ }); 2026-10-25T01:04:53.7645042Z  94 │ │ 2026-10-25T01:04:53.7645215Z  95 │ │ const send = ( 2026-10-25T01:04:53.7645412Z  96 │ │ connection: Connection, 2026-10-25T01:04:53.7645613Z  97 │ │ message: unknown, 2026-10-25T01:04:53.7645877Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-25T01:04:53.7646157Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-25T01:04:53.7646387Z 100 │ │ Effect.gen(function* () { 2026-10-25T01:04:53.7646625Z 101 │ │ const body = JSON.stringify(message); 2026-10-25T01:04:53.7646894Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-25T01:04:53.7647247Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-25T01:04:53.7647525Z 104 │ │ } 2026-10-25T01:04:53.7647750Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T01:04:53.7647989Z 106 │ │ try: (signal) => 2026-10-25T01:04:53.7648290Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-25T01:04:53.7648566Z 108 │ │ method: "POST", 2026-10-25T01:04:53.7648770Z 109 │ │ signal, 2026-10-25T01:04:53.7648973Z 110 │ │ headers: { 2026-10-25T01:04:53.7649202Z 111 │ │ "content-type": "application/json", 2026-10-25T01:04:53.7649479Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-25T01:04:53.7649752Z 113 │ │ authorization: options.authorization, 2026-10-25T01:04:53.7650012Z 114 │ │ ...(connection.sessionId === null 2026-10-25T01:04:53.7650238Z 115 │ │ ? {} 2026-10-25T01:04:53.7650540Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-25T01:04:53.7650817Z 117 │ │ ...(connection.protocolVersion === null 2026-10-25T01:04:53.7651048Z 118 │ │ ? {} 2026-10-25T01:04:53.7651318Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T01:04:53.7651565Z 120 │ │ }, 2026-10-25T01:04:53.7651755Z 121 │ │ body, 2026-10-25T01:04:53.7651940Z 122 │ │ }), 2026-10-25T01:04:53.7652142Z 123 │ │ catch: bridgeError, 2026-10-25T01:04:53.7652333Z 124 │ │ }); 2026-10-25T01:04:53.7652641Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-25T01:04:53.7652946Z 126 │ │ if (!response.ok) { 2026-10-25T01:04:53.7653170Z 127 │ │ yield* Effect.promise( 2026-10-25T01:04:53.7653467Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T01:04:53.7653724Z 129 │ │ ); 2026-10-25T01:04:53.7653932Z 130 │ │ return yield* Effect.fail( 2026-10-25T01:04:53.7654264Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-25T01:04:53.7654545Z 132 │ │ ); 2026-10-25T01:04:53.7654725Z 133 │ │ } 2026-10-25T01:04:53.7655036Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-25T01:04:53.7655373Z 135 │ │ for (const payload of payloads) { 2026-10-25T01:04:53.7655716Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-25T01:04:53.7656003Z 137 │ │ } 2026-10-25T01:04:53.7656195Z 138 │ │ return payloads; 2026-10-25T01:04:53.7656431Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-25T01:04:53.7656637Z 140 │ │ ); 2026-10-25T01:04:53.7656799Z 141 │ │ 2026-10-25T01:04:53.7657059Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-25T01:04:53.7657362Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-25T01:04:53.7657754Z 144 │ │ ): Effect.fn.Return { 2026-10-25T01:04:53.7658128Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T01:04:53.7658510Z 146 │ │ connections.delete(request.connectionId); 2026-10-25T01:04:53.7658768Z 147 │ │ const sessionId = connection.sessionId; 2026-10-25T01:04:53.7659002Z 148 │ │ if (sessionId !== null) { 2026-10-25T01:04:53.7659246Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-25T01:04:53.7659490Z 150 │ │ try: (signal) => 2026-10-25T01:04:53.7666021Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-25T01:04:53.7666268Z 152 │ │ method: "DELETE", 2026-10-25T01:04:53.7666476Z 153 │ │ signal, 2026-10-25T01:04:53.7666676Z 154 │ │ headers: { 2026-10-25T01:04:53.7666913Z 155 │ │ authorization: options.authorization, 2026-10-25T01:04:53.7667166Z 156 │ │ "mcp-session-id": sessionId, 2026-10-25T01:04:53.7667429Z 157 │ │ ...(connection.protocolVersion === null 2026-10-25T01:04:53.7667654Z 158 │ │ ? {} 2026-10-25T01:04:53.7667918Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-25T01:04:53.7668159Z 160 │ │ }, 2026-10-25T01:04:53.7668335Z 161 │ │ }), 2026-10-25T01:04:53.7668529Z 162 │ │ catch: bridgeError, 2026-10-25T01:04:53.7668722Z 163 │ │ }); 2026-10-25T01:04:53.7668950Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-25T01:04:53.7669196Z 165 │ │ return yield* Effect.fail( 2026-10-25T01:04:53.7669421Z 166 │ │ new AcpMcpOverAcpError( 2026-10-25T01:04:53.7669725Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-25T01:04:53.7669982Z 168 │ │ ), 2026-10-25T01:04:53.7670155Z 169 │ │ ); 2026-10-25T01:04:53.7670320Z 170 │ │ } 2026-10-25T01:04:53.7670557Z 171 │ │ yield* Effect.promise( 2026-10-25T01:04:53.7670966Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-25T01:04:53.7671265Z 173 │ │ ); 2026-10-25T01:04:53.7671433Z 174 │ │ } 2026-10-25T01:04:53.7671606Z 175 │ │ return {}; 2026-10-25T01:04:53.7671777Z 176 │ │ }); 2026-10-25T01:04:53.7671932Z 177 │ │ 2026-10-25T01:04:53.7672095Z 178 │ │ return { 2026-10-25T01:04:53.7672359Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-25T01:04:53.7672650Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-25T01:04:53.7672886Z 181 │ │ return yield* Effect.fail( 2026-10-25T01:04:53.7673190Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-25T01:04:53.7673451Z 183 │ │ ); 2026-10-25T01:04:53.7673619Z 184 │ │ } 2026-10-25T01:04:53.7673839Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-25T01:04:53.7674178Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-25T01:04:53.7674452Z 187 │ │ } 2026-10-25T01:04:53.7674694Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-25T01:04:53.7674963Z 189 │ │ connections.set(connectionId, { 2026-10-25T01:04:53.7675203Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-25T01:04:53.7675432Z 191 │ │ sessionId: null, 2026-10-25T01:04:53.7675652Z 192 │ │ protocolVersion: null, 2026-10-25T01:04:53.7675870Z 193 │ │ nextRequestId: 0, 2026-10-25T01:04:53.7676055Z 194 │ │ }); 2026-10-25T01:04:53.7676252Z 195 │ │ return { connectionId }; 2026-10-25T01:04:53.7676441Z 196 │ │ }), 2026-10-25T01:04:53.7676701Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-25T01:04:53.7677032Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T01:04:53.7677316Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-25T01:04:53.7677573Z 200 │ │ const payloads = yield* send(connection, { 2026-10-25T01:04:53.7677800Z 201 │ │ jsonrpc: "2.0", 2026-10-25T01:04:53.7677992Z 202 │ │ id, 2026-10-25T01:04:53.7678190Z 203 │ │ method: request.method, 2026-10-25T01:04:53.7678463Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T01:04:53.7678695Z 205 │ │ }); 2026-10-25T01:04:53.7678975Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-25T01:04:53.7679278Z 207 │ │ const envelope = asEnvelope(response); 2026-10-25T01:04:53.7679508Z 208 │ │ if (envelope === null) { 2026-10-25T01:04:53.7679616Z 209 │ │ return yield* Effect.fail( 2026-10-25T01:04:53.7679796Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-25T01:04:53.7679936Z 211 │ │ ); 2026-10-25T01:04:53.7680044Z 212 │ │ } 2026-10-25T01:04:53.7680160Z 213 │ │ if (envelope.error !== undefined) { 2026-10-25T01:04:53.7680374Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-25T01:04:53.7680448Z 215 │ │ } 2026-10-25T01:04:53.7680615Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-25T01:04:53.7680690Z 217 │ │ }), 2026-10-25T01:04:53.7680877Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-25T01:04:53.7681034Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-25T01:04:53.7681142Z 220 │ │ yield* send(connection, { 2026-10-25T01:04:53.7681241Z 221 │ │ jsonrpc: "2.0", 2026-10-25T01:04:53.7681339Z 222 │ │ method: request.method, 2026-10-25T01:04:53.7681497Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-25T01:04:53.7681573Z 224 │ │ }); 2026-10-25T01:04:53.7681646Z 225 │ │ }), 2026-10-25T01:04:53.7681729Z 226 │ │ disconnect, 2026-10-25T01:04:53.7681836Z 227 │ │ dispose: Effect.suspend(() => 2026-10-25T01:04:53.7681934Z 228 │ │ Effect.forEach( 2026-10-25T01:04:53.7682038Z 229 │ │ [...connections.keys()], 2026-10-25T01:04:53.7682208Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-25T01:04:53.7682310Z 231 │ │ { discard: true }, 2026-10-25T01:04:53.7682386Z 232 │ │ ), 2026-10-25T01:04:53.7682461Z 233 │ │ ), 2026-10-25T01:04:53.7682533Z 234 │ │ }; 2026-10-25T01:04:53.7682660Z 235 │ ╰─▶ }); 2026-10-25T01:04:53.7682718Z ╰──── 2026-10-25T01:04:53.7682968Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-25T01:04:53.7682972Z 2026-10-25T01:04:53.7683207Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-25T01:04:53.7683340Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-25T01:04:53.7683441Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-25T01:04:53.7683575Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-25T01:04:53.7683661Z ·  ─────────────── 2026-10-25T01:04:53.7683722Z 518 │ ) 2026-10-25T01:04:53.7683777Z ╰──── 2026-10-25T01:04:53.7683931Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-25T01:04:53.7683934Z 2026-10-25T01:04:53.7684400Z ⚠ 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-25T01:04:53.7684618Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-25T01:04:53.7684751Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-25T01:04:53.7684945Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-25T01:04:53.7685044Z 567 │ │ const nextEvent = { 2026-10-25T01:04:53.7685199Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-25T01:04:53.7685330Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-25T01:04:53.7685420Z 570 │ │ threadId, 2026-10-25T01:04:53.7685522Z 571 │ │ providerInstanceId, 2026-10-25T01:04:53.7685618Z 572 │ │ occurredAt: now, 2026-10-25T01:04:53.7685772Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-25T01:04:53.7685899Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-25T01:04:53.7686012Z 575 │ │ const reader = yield* eventSink 2026-10-25T01:04:53.7686129Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-25T01:04:53.7686259Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-25T01:04:53.7686363Z 578 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.7686522Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-25T01:04:53.7686647Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-25T01:04:53.7686761Z 581 │ │ if (Option.isNone(received)) { 2026-10-25T01:04:53.7686964Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-25T01:04:53.7687046Z 583 │ │ } 2026-10-25T01:04:53.7687207Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-25T01:04:53.7687349Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-25T01:04:53.7687476Z 586 │ │ afterSequence = received.value.sequence; 2026-10-25T01:04:53.7687606Z 587 │ ╰─▶ } 2026-10-25T01:04:53.7687669Z 588 │ }), 2026-10-25T01:04:53.7687720Z ╰──── 2026-10-25T01:04:53.7687722Z 2026-10-25T01:04:53.7688186Z ⚠ 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-25T01:04:53.7688360Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-25T01:04:53.7688439Z 2326 │ let settled = false; 2026-10-25T01:04:53.7688595Z 2327 │ ╭─▶ while (!settled) { 2026-10-25T01:04:53.7688754Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-25T01:04:53.7688886Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-25T01:04:53.7688967Z 2330 │ │ ); 2026-10-25T01:04:53.7689088Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-25T01:04:53.7689344Z 2332 │ ╰─▶ } 2026-10-25T01:04:53.7689507Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-25T01:04:53.7689560Z ╰──── 2026-10-25T01:04:53.7689563Z 2026-10-25T01:04:53.7689772Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-25T01:04:53.7689908Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-25T01:04:53.7689963Z 21 │ 2026-10-25T01:04:53.7690120Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-25T01:04:53.7690209Z ·  ────────┬─────── 2026-10-25T01:04:53.7690369Z · ╰── 'summarizePayload' is declared here 2026-10-25T01:04:53.7690499Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-25T01:04:53.7690560Z ╰──── 2026-10-25T01:04:53.7690668Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7690671Z 2026-10-25T01:04:53.7691023Z ⚠ 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-25T01:04:53.7691160Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-25T01:04:53.7691294Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-25T01:04:53.7691441Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-25T01:04:53.7691557Z ·  ─────────────────── 2026-10-25T01:04:53.7691622Z 1787 │ cwd, 2026-10-25T01:04:53.7691676Z ╰──── 2026-10-25T01:04:53.7691678Z 2026-10-25T01:04:53.7691964Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7692111Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12468:7] 2026-10-25T01:04:53.7692165Z 12467 │ 2026-10-25T01:04:53.7692306Z 12468 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-25T01:04:53.7692394Z ·  ────────┬─────── 2026-10-25T01:04:53.7692540Z · ╰── 'layerUnavailable' is declared here 2026-10-25T01:04:53.7692611Z 12469 │ OrchestratorV2, 2026-10-25T01:04:53.7692665Z ╰──── 2026-10-25T01:04:53.7692769Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7692771Z 2026-10-25T01:04:53.7693001Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-25T01:04:53.7693128Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-25T01:04:53.7693186Z 730 │ ); 2026-10-25T01:04:53.7693356Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-25T01:04:53.7693456Z ·  ────── 2026-10-25T01:04:53.7693569Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-25T01:04:53.7693623Z ╰──── 2026-10-25T01:04:53.7693792Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T01:04:53.7693795Z 2026-10-25T01:04:53.7694073Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T01:04:53.7694251Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-25T01:04:53.7694343Z 284 │ }, 2026-10-25T01:04:53.7694426Z 285 │ (effect, flow, stopSessions) => 2026-10-25T01:04:53.7694519Z ·  ──────┬───── 2026-10-25T01:04:53.7694665Z · ╰── 'stopSessions' is declared here 2026-10-25T01:04:53.7694731Z 286 │ effect.pipe( 2026-10-25T01:04:53.7694783Z ╰──── 2026-10-25T01:04:53.7694884Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7694887Z 2026-10-25T01:04:53.7695142Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7695275Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-25T01:04:53.7695470Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-25T01:04:53.7695543Z 168 │ useLayoutEffect(() => { 2026-10-25T01:04:53.7695618Z ·  ───────┬─────── 2026-10-25T01:04:53.7695754Z · ╰── This is the containing effect 2026-10-25T01:04:53.7695841Z 169 │ if (faviconRequest === null) return; 2026-10-25T01:04:53.7695896Z 170 │ 2026-10-25T01:04:53.7696026Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-25T01:04:53.7696122Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-25T01:04:53.7696212Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7696386Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7696453Z 173 │ return endRequest; 2026-10-25T01:04:53.7696504Z ╰──── 2026-10-25T01:04:53.7697101Z  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-25T01:04:53.7697426Z  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-25T01:04:53.7697429Z 2026-10-25T01:04:53.7697621Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.7697767Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-25T01:04:53.7697877Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-25T01:04:53.7698018Z 223 │ 2026-10-25T01:04:53.7698158Z ·  ─────────────── 2026-10-25T01:04:53.7698259Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-25T01:04:53.7698382Z ╰──── 2026-10-25T01:04:53.7698528Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T01:04:53.7698530Z 2026-10-25T01:04:53.7698719Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.7698865Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-25T01:04:53.7698941Z 226 │ >; 2026-10-25T01:04:53.7700020Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-25T01:04:53.7700127Z 55 │ │ onTouchStart: (event) => { 2026-10-25T01:04:53.7700283Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-25T01:04:53.7700467Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-25T01:04:53.7700597Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-25T01:04:53.7700763Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-25T01:04:53.7700874Z 60 │ │ pendingPress.current = null; 2026-10-25T01:04:53.7700993Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-25T01:04:53.7701072Z 62 │ │ }, 2026-10-25T01:04:53.7701171Z 63 │ │ onPress: (event) => { 2026-10-25T01:04:53.7701341Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-25T01:04:53.7701480Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-25T01:04:53.7701650Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-25T01:04:53.7701837Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-25T01:04:53.7701923Z 68 │ │ return; 2026-10-25T01:04:53.7701998Z 69 │ │ } 2026-10-25T01:04:53.7702138Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-25T01:04:53.7702307Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-25T01:04:53.7702471Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-25T01:04:53.7702572Z 73 │ │ event.persist(); 2026-10-25T01:04:53.7702795Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-25T01:04:53.7702918Z 75 │ │ return; 2026-10-25T01:04:53.7702993Z 76 │ │ } 2026-10-25T01:04:53.7703107Z 77 │ │ child.props.onPress?.(event); 2026-10-25T01:04:53.7703182Z 78 │ │ }, 2026-10-25T01:04:53.7703313Z 79 │ ├─▶ }); 2026-10-25T01:04:53.7703548Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.7703651Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-25T01:04:53.7703705Z ╰──── 2026-10-25T01:04:53.7704173Z  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-25T01:04:53.7704467Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7704469Z 2026-10-25T01:04:53.7704727Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7704913Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-25T01:04:53.7704967Z 104 │ 2026-10-25T01:04:53.7705033Z 105 │ useEffect(() => { 2026-10-25T01:04:53.7705105Z ·  ────┬──── 2026-10-25T01:04:53.7705243Z · ╰── This is the containing effect 2026-10-25T01:04:53.7705325Z 106 │ clearReviewCommentTarget(); 2026-10-25T01:04:53.7705420Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T01:04:53.7705528Z ·  ────────────────┬─────────────── 2026-10-25T01:04:53.7705705Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7705779Z 108 │ }, [selectedSection?.id]); 2026-10-25T01:04:53.7705829Z ╰──── 2026-10-25T01:04:53.7706414Z  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-25T01:04:53.7706740Z  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-25T01:04:53.7706746Z 2026-10-25T01:04:53.7707001Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7707185Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-25T01:04:53.7707238Z 109 │ 2026-10-25T01:04:53.7707301Z 110 │ useEffect(() => { 2026-10-25T01:04:53.7707372Z ·  ────┬──── 2026-10-25T01:04:53.7707502Z · ╰── This is the containing effect 2026-10-25T01:04:53.7707587Z 111 │ if (activeCommentTarget === null) { 2026-10-25T01:04:53.7707688Z 112 │ setPendingNativeCommentSelection(null); 2026-10-25T01:04:53.7707845Z ·  ────────────────┬─────────────── 2026-10-25T01:04:53.7708055Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7708110Z 113 │ } 2026-10-25T01:04:53.7708162Z ╰──── 2026-10-25T01:04:53.7708745Z  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-25T01:04:53.7709058Z  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-25T01:04:53.7709061Z 2026-10-25T01:04:53.7709265Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7709448Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-25T01:04:53.7709545Z 107 │ setPendingNativeCommentSelection(null); 2026-10-25T01:04:53.7709617Z 108 │ }, [selectedSection?.id]); 2026-10-25T01:04:53.7709703Z ·  ─────────┬───────── 2026-10-25T01:04:53.7709866Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-25T01:04:53.7709918Z 109 │ 2026-10-25T01:04:53.7709970Z ╰──── 2026-10-25T01:04:53.7710257Z  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-25T01:04:53.7710602Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7710607Z 2026-10-25T01:04:53.7710807Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-25T01:04:53.7710912Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-25T01:04:53.7710979Z 296 │ } from "./device.ts"; 2026-10-25T01:04:53.7711070Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-25T01:04:53.7711137Z ·  ── 2026-10-25T01:04:53.7711196Z 298 │ import { 2026-10-25T01:04:53.7711246Z ╰──── 2026-10-25T01:04:53.7711328Z  help: Remove empty braces 2026-10-25T01:04:53.7711330Z 2026-10-25T01:04:53.7711789Z ⚠ 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-25T01:04:53.7711921Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-25T01:04:53.7711987Z 38 │ JSON.stringify( 2026-10-25T01:04:53.7712112Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-25T01:04:53.7712207Z ·  ──────────────────────── 2026-10-25T01:04:53.7712273Z 40 │ { name: "a" }, 2026-10-25T01:04:53.7712323Z ╰──── 2026-10-25T01:04:53.7712325Z 2026-10-25T01:04:53.7712509Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7712644Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-25T01:04:53.7712808Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-25T01:04:53.7712960Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-25T01:04:53.7713074Z ·  ┬ 2026-10-25T01:04:53.7713203Z · ╰── '_' is declared here 2026-10-25T01:04:53.7713303Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-25T01:04:53.7713354Z ╰──── 2026-10-25T01:04:53.7713456Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7713458Z 2026-10-25T01:04:53.7713636Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7713770Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-25T01:04:53.7713826Z 133 │ ); 2026-10-25T01:04:53.7713932Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-25T01:04:53.7714028Z ·  ┬ 2026-10-25T01:04:53.7714172Z · ╰── '_' is declared here 2026-10-25T01:04:53.7714240Z 135 │ Effect.succeed( 2026-10-25T01:04:53.7714291Z ╰──── 2026-10-25T01:04:53.7714390Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7714394Z 2026-10-25T01:04:53.7714569Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7714702Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-25T01:04:53.7714757Z 177 │ }); 2026-10-25T01:04:53.7714853Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-25T01:04:53.7714941Z ·  ┬ 2026-10-25T01:04:53.7715074Z · ╰── '_' is declared here 2026-10-25T01:04:53.7715179Z 179 │ switch (options.continuation ?? "queued") { 2026-10-25T01:04:53.7715230Z ╰──── 2026-10-25T01:04:53.7715329Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7715331Z 2026-10-25T01:04:53.7715511Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7715643Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-25T01:04:53.7715697Z 202 │ ); 2026-10-25T01:04:53.7715793Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-25T01:04:53.7715883Z ·  ┬ 2026-10-25T01:04:53.7716016Z · ╰── '_' is declared here 2026-10-25T01:04:53.7716096Z 204 │ options.removeWorktreeFails 2026-10-25T01:04:53.7716145Z ╰──── 2026-10-25T01:04:53.7716248Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7716253Z 2026-10-25T01:04:53.7716431Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7716562Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-25T01:04:53.7716614Z 207 │ ); 2026-10-25T01:04:53.7716715Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-25T01:04:53.7716806Z ·  ┬ 2026-10-25T01:04:53.7716942Z · ╰── '_' is declared here 2026-10-25T01:04:53.7717025Z 209 │ options.deleteLocalBranchFails 2026-10-25T01:04:53.7717076Z ╰──── 2026-10-25T01:04:53.7717173Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7717176Z 2026-10-25T01:04:53.7717403Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7717562Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-25T01:04:53.7717617Z 212 │ ); 2026-10-25T01:04:53.7717730Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-25T01:04:53.7717827Z ·  ┬ 2026-10-25T01:04:53.7717967Z · ╰── '_' is declared here 2026-10-25T01:04:53.7718051Z 214 │ options.fetchWorktreeBaseFails 2026-10-25T01:04:53.7718103Z ╰──── 2026-10-25T01:04:53.7718200Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7718203Z 2026-10-25T01:04:53.7718380Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7718517Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-25T01:04:53.7718573Z 253 │ ); 2026-10-25T01:04:53.7718663Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-25T01:04:53.7718749Z ·  ┬ 2026-10-25T01:04:53.7718885Z · ╰── '_' is declared here 2026-10-25T01:04:53.7718957Z 255 │ Effect.succeed({ 2026-10-25T01:04:53.7719008Z ╰──── 2026-10-25T01:04:53.7719106Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7719109Z 2026-10-25T01:04:53.7719287Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7719419Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-25T01:04:53.7719473Z 263 │ ); 2026-10-25T01:04:53.7719625Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-25T01:04:53.7719717Z ·  ┬ 2026-10-25T01:04:53.7719851Z · ╰── '_' is declared here 2026-10-25T01:04:53.7719997Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-25T01:04:53.7720046Z ╰──── 2026-10-25T01:04:53.7720145Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7720148Z 2026-10-25T01:04:53.7720427Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7720602Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:38:5] 2026-10-25T01:04:53.7720654Z 33 │ 2026-10-25T01:04:53.7720721Z 34 │ useEffect(() => { 2026-10-25T01:04:53.7720798Z ·  ────┬──── 2026-10-25T01:04:53.7720930Z · ╰── This is the containing effect 2026-10-25T01:04:53.7720995Z 35 │ scheduler.reset(); 2026-10-25T01:04:53.7721095Z 36 │ highlightedRowIdsRef.current = new Set(); 2026-10-25T01:04:53.7721180Z 37 │ visibleChunkIndexRef.current = 0; 2026-10-25T01:04:53.7721296Z 38 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-25T01:04:53.7721373Z ·  ───────┬─────── 2026-10-25T01:04:53.7721544Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7721655Z 39 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-25T01:04:53.7721706Z ╰──── 2026-10-25T01:04:53.7722342Z  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-25T01:04:53.7722707Z  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-25T01:04:53.7722709Z 2026-10-25T01:04:53.7722908Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7723079Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:41:7] 2026-10-25T01:04:53.7723160Z 40 │ return () => scheduler.cancel(); 2026-10-25T01:04:53.7723257Z 41 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-25T01:04:53.7723388Z ·  ───┬─── ─────┬───── 2026-10-25T01:04:53.7723580Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-25T01:04:53.7723717Z · ╰── Unnecessary dependency `enabled` 2026-10-25T01:04:53.7723769Z 42 │ 2026-10-25T01:04:53.7723821Z ╰──── 2026-10-25T01:04:53.7724111Z  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-25T01:04:53.7724414Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7724417Z 2026-10-25T01:04:53.7724638Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T01:04:53.7724745Z ╭─[apps/mobile/src/Stack.tsx:1049:21] 2026-10-25T01:04:53.7724810Z 1048 │ } 2026-10-25T01:04:53.7725083Z ·  ───────────────────────────────────────────── 2026-10-25T01:04:53.7725163Z 1050 │ screenOptions={({ route }) => 2026-10-25T01:04:53.7725217Z ╰──── 2026-10-25T01:04:53.7725575Z  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-25T01:04:53.7725578Z 2026-10-25T01:04:53.7725805Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-25T01:04:53.7725975Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-25T01:04:53.7726182Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-25T01:04:53.7726277Z 35 │ instanceId === configured ? true : false, 2026-10-25T01:04:53.7726392Z ·  ──────────────────────────────────────── 2026-10-25T01:04:53.7726445Z 36 │ ); 2026-10-25T01:04:53.7726497Z ╰──── 2026-10-25T01:04:53.7726591Z  help: Remove this ternary operator 2026-10-25T01:04:53.7726593Z 2026-10-25T01:04:53.7726790Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7726923Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-25T01:04:53.7727005Z 453 │ showAuxiliaryPane("inspector"); 2026-10-25T01:04:53.7727117Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-25T01:04:53.7727263Z ·  ──────┬────── ────┬─── 2026-10-25T01:04:53.7727460Z · │ ╰── Unnecessary dependency `threadId` 2026-10-25T01:04:53.7727605Z · ╰── Unnecessary dependency `environmentId` 2026-10-25T01:04:53.7727665Z 455 │ const { 2026-10-25T01:04:53.7727717Z ╰──── 2026-10-25T01:04:53.7728005Z  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-25T01:04:53.7728307Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7728310Z 2026-10-25T01:04:53.7728498Z ⚠ react(static-components): Cannot create components during render 2026-10-25T01:04:53.7728632Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-25T01:04:53.7728696Z 492 │ // same check. 2026-10-25T01:04:53.7728822Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-25T01:04:53.7728941Z ·  ─────────────┬───────────── 2026-10-25T01:04:53.7729119Z · ╰── The component is created during render here 2026-10-25T01:04:53.7729271Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-25T01:04:53.7729390Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-25T01:04:53.7729524Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-25T01:04:53.7729619Z 497 │ const handlePullToRefresh = async () => { 2026-10-25T01:04:53.7729696Z 498 │ setIsPullRefreshing(true); 2026-10-25T01:04:53.7729778Z 499 │ await refreshSelectedSection(); 2026-10-25T01:04:53.7729851Z 500 │ setIsPullRefreshing(false); 2026-10-25T01:04:53.7729904Z 501 │ }; 2026-10-25T01:04:53.7730044Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-25T01:04:53.7730184Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-25T01:04:53.7730290Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-25T01:04:53.7730386Z 505 │ threadKey: reviewCache.threadKey, 2026-10-25T01:04:53.7730507Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-25T01:04:53.7730572Z 507 │ files: reviewFiles, 2026-10-25T01:04:53.7730725Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-25T01:04:53.7730883Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-25T01:04:53.7730946Z 510 │ : undefined, 2026-10-25T01:04:53.7731038Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-25T01:04:53.7731161Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-25T01:04:53.7731223Z 513 │ : undefined, 2026-10-25T01:04:53.7731280Z 514 │ }); 2026-10-25T01:04:53.7731466Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-25T01:04:53.7731598Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-25T01:04:53.7731660Z 517 │ environmentId, 2026-10-25T01:04:53.7731723Z 518 │ threadId, 2026-10-25T01:04:53.7731787Z 519 │ selectedSection, 2026-10-25T01:04:53.7731862Z 520 │ nativeReviewDiffData, 2026-10-25T01:04:53.7731919Z 521 │ }); 2026-10-25T01:04:53.7732023Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-25T01:04:53.7732106Z 523 │ threadKey: reviewCache.threadKey, 2026-10-25T01:04:53.7732196Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-25T01:04:53.7732272Z 525 │ diff: selectedSection?.diff, 2026-10-25T01:04:53.7732348Z 526 │ data: nativeReviewDiffData, 2026-10-25T01:04:53.7732414Z 527 │ collapsedFileIds, 2026-10-25T01:04:53.7732479Z 528 │ viewedFileIds, 2026-10-25T01:04:53.7732588Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-25T01:04:53.7732684Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-25T01:04:53.7732737Z 531 │ }); 2026-10-25T01:04:53.7732808Z 532 │ const showcaseReviewKey = 2026-10-25T01:04:53.7732945Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-25T01:04:53.7733152Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-25T01:04:53.7733212Z 535 │ : null; 2026-10-25T01:04:53.7733377Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-25T01:04:53.7733455Z 537 │ nativeBridge.onDebug(event); 2026-10-25T01:04:53.7733512Z 538 │ if ( 2026-10-25T01:04:53.7733589Z 539 │ showcaseReviewKey === null || 2026-10-25T01:04:53.7733709Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-25T01:04:53.7733816Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-25T01:04:53.7733870Z 542 │ ) { 2026-10-25T01:04:53.7733930Z 543 │ return; 2026-10-25T01:04:53.7733984Z 544 │ } 2026-10-25T01:04:53.7734094Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-25T01:04:53.7734260Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-25T01:04:53.7734317Z 547 │ }; 2026-10-25T01:04:53.7734369Z 548 │ 2026-10-25T01:04:53.7734484Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-25T01:04:53.7734562Z 550 │ loadVisibleFile(fileId, true); 2026-10-25T01:04:53.7734654Z 551 │ commentSelection.clearSelection(); 2026-10-25T01:04:53.7734776Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-25T01:04:53.7734855Z 553 │ toggleExpandedFile(fileId); 2026-10-25T01:04:53.7734906Z 554 │ } 2026-10-25T01:04:53.7735016Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-25T01:04:53.7735087Z 556 │ if (!nativeView) return; 2026-10-25T01:04:53.7735181Z 557 │ const result = await settlePromise(() => 2026-10-25T01:04:53.7735403Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-25T01:04:53.7735489Z 559 │ ); 2026-10-25T01:04:53.7735575Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-25T01:04:53.7735754Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-25T01:04:53.7735806Z 562 │ } 2026-10-25T01:04:53.7735860Z 563 │ }; 2026-10-25T01:04:53.7735942Z 564 │ const handleVisibleFileChange = ( 2026-10-25T01:04:53.7736073Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-25T01:04:53.7736128Z 566 │ ) => { 2026-10-25T01:04:53.7736236Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T01:04:53.7736403Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-25T01:04:53.7736457Z 569 │ }; 2026-10-25T01:04:53.7736539Z 570 │ const renderInspector = () => ( 2026-10-25T01:04:53.7736611Z 571 │ void handleSelectFile(fileId)} 2026-10-25T01:04:53.7737117Z 577 │ /> 2026-10-25T01:04:53.7737171Z 578 │ ); 2026-10-25T01:04:53.7737223Z 579 │ 2026-10-25T01:04:53.7737405Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-25T01:04:53.7737490Z 581 │ const { fileId } = event.nativeEvent; 2026-10-25T01:04:53.7737555Z 582 │ if (fileId) { 2026-10-25T01:04:53.7737641Z 583 │ loadVisibleFile(fileId, true); 2026-10-25T01:04:53.7737723Z 584 │ toggleExpandedFile(fileId); 2026-10-25T01:04:53.7737776Z 585 │ } 2026-10-25T01:04:53.7737830Z 586 │ }; 2026-10-25T01:04:53.7737884Z 587 │ 2026-10-25T01:04:53.7737972Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-25T01:04:53.7738088Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-25T01:04:53.7738145Z 590 │ ) => { 2026-10-25T01:04:53.7738283Z 591 │ const { fileId } = event.nativeEvent; 2026-10-25T01:04:53.7738346Z 592 │ if (fileId) { 2026-10-25T01:04:53.7738420Z 593 │ toggleViewedFile(fileId); 2026-10-25T01:04:53.7738476Z 594 │ } 2026-10-25T01:04:53.7738530Z 595 │ }; 2026-10-25T01:04:53.7738581Z 596 │ 2026-10-25T01:04:53.7738652Z 597 │ const parsedDiffNotice = 2026-10-25T01:04:53.7738820Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-25T01:04:53.7738945Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-25T01:04:53.7739100Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-25T01:04:53.7739221Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-25T01:04:53.7739380Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-25T01:04:53.7739491Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-25T01:04:53.7739589Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-25T01:04:53.7739661Z 605 │ hasCachedSelectedDiff, 2026-10-25T01:04:53.7739728Z 606 │ hasAnyCachedDiff, 2026-10-25T01:04:53.7739783Z 607 │ }); 2026-10-25T01:04:53.7739868Z 608 │ const handleRetryEnvironment = () => { 2026-10-25T01:04:53.7740021Z 609 │ void retryEnvironment(environmentId); 2026-10-25T01:04:53.7740114Z 610 │ }; 2026-10-25T01:04:53.7740200Z 611 │ const handleReturnToThread = () => { 2026-10-25T01:04:53.7740277Z 612 │ if (navigation.canGoBack()) { 2026-10-25T01:04:53.7740347Z 613 │ navigation.goBack(); 2026-10-25T01:04:53.7740435Z 614 │ return; 2026-10-25T01:04:53.7740491Z 615 │ } 2026-10-25T01:04:53.7740571Z 616 │ navigation.navigate("Thread", { 2026-10-25T01:04:53.7740661Z 617 │ environmentId: String(environmentId), 2026-10-25T01:04:53.7740739Z 618 │ threadId: String(threadId), 2026-10-25T01:04:53.7740795Z 619 │ }); 2026-10-25T01:04:53.7740847Z 620 │ }; 2026-10-25T01:04:53.7740925Z 621 │ const androidHeaderSubtitle = [ 2026-10-25T01:04:53.7741002Z 622 │ selectedSection?.title, 2026-10-25T01:04:53.7741081Z 623 │ headerDiffSummary.additions, 2026-10-25T01:04:53.7741166Z 624 │ headerDiffSummary.deletions, 2026-10-25T01:04:53.7741223Z 625 │ ] 2026-10-25T01:04:53.7741329Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-25T01:04:53.7741391Z 627 │ .join(" · "); 2026-10-25T01:04:53.7741446Z 628 │ 2026-10-25T01:04:53.7741523Z 629 │ const showChangedFilesPane = 2026-10-25T01:04:53.7741596Z 630 │ !showConnectionNotice && 2026-10-25T01:04:53.7741669Z 631 │ selectedSection !== null && 2026-10-25T01:04:53.7741749Z 632 │ parsedDiff.kind === "files" && 2026-10-25T01:04:53.7741829Z 633 │ NativeReviewDiffView !== null; 2026-10-25T01:04:53.7742000Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-25T01:04:53.7742170Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-25T01:04:53.7742226Z 636 │ 2026-10-25T01:04:53.7742306Z 637 │ const listHeader = (() => { 2026-10-25T01:04:53.7742396Z 638 │ const children: ReactElement[] = []; 2026-10-25T01:04:53.7742446Z 639 │ 2026-10-25T01:04:53.7742510Z 640 │ if (error) { 2026-10-25T01:04:53.7742578Z 641 │ children.push( 2026-10-25T01:04:53.7742639Z 642 │ 2026-10-25T01:04:53.7743297Z 649 │ Review unavailable 2026-10-25T01:04:53.7743458Z 650 │ {error} 2026-10-25T01:04:53.7743522Z 651 │ , 2026-10-25T01:04:53.7743579Z 652 │ ); 2026-10-25T01:04:53.7743635Z 653 │ } 2026-10-25T01:04:53.7743685Z 654 │ 2026-10-25T01:04:53.7743760Z 655 │ if (parsedDiffNotice) { 2026-10-25T01:04:53.7743921Z 656 │ children.push(); 2026-10-25T01:04:53.7743977Z 657 │ } 2026-10-25T01:04:53.7744027Z 658 │ 2026-10-25T01:04:53.7744104Z 659 │ if (children.length === 0) { 2026-10-25T01:04:53.7744169Z 660 │ return null; 2026-10-25T01:04:53.7744225Z 661 │ } 2026-10-25T01:04:53.7744276Z 662 │ 2026-10-25T01:04:53.7744347Z 663 │ return <>{children}; 2026-10-25T01:04:53.7744406Z 664 │ })(); 2026-10-25T01:04:53.7744473Z 665 │ const headerSubtitle = [ 2026-10-25T01:04:53.7744609Z 666 │ headerDiffSummary.additions, 2026-10-25T01:04:53.7744725Z 667 │ headerDiffSummary.deletions, 2026-10-25T01:04:53.7744806Z 668 │ pendingReviewCommentCount > 0 2026-10-25T01:04:53.7744975Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-25T01:04:53.7745037Z 670 │ : null, 2026-10-25T01:04:53.7745091Z 671 │ ] 2026-10-25T01:04:53.7745157Z 672 │ .filter(Boolean) 2026-10-25T01:04:53.7745219Z 673 │ .join(" · "); 2026-10-25T01:04:53.7745355Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-25T01:04:53.7745410Z 675 │ 2026-10-25T01:04:53.7745471Z 676 │ return ( 2026-10-25T01:04:53.7745525Z 677 │ <> 2026-10-25T01:04:53.7745591Z 678 │ 2026-10-25T01:04:53.7746926Z 694 │ 2026-10-25T01:04:53.7746992Z 695 │ 2026-10-25T01:04:53.7747112Z 696 │ 2026-10-25T01:04:53.7747194Z 697 │ {showConnectionNotice ? ( 2026-10-25T01:04:53.7747335Z 698 │ 2026-10-25T01:04:53.7747426Z 699 │ 2026-10-25T01:04:53.7748442Z 711 │ 2026-10-25T01:04:53.7748597Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-25T01:04:53.7748658Z 713 │ 2026-10-25T01:04:53.7749179Z 719 │ 2026-10-25T01:04:53.7749533Z 723 │ {listHeader} 2026-10-25T01:04:53.7749654Z 724 │ 2026-10-25T01:04:53.7749737Z 725 │ => 2026-10-25T01:04:53.7752418Z ·  ──────────┬────────── 2026-10-25T01:04:53.7752623Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-25T01:04:53.7752845Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-25T01:04:53.7752898Z ╰──── 2026-10-25T01:04:53.7753001Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7753004Z 2026-10-25T01:04:53.7753310Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7753433Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-25T01:04:53.7753487Z 220 │ 2026-10-25T01:04:53.7753618Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-25T01:04:53.7753721Z ·  ──────────────┬────────────── 2026-10-25T01:04:53.7753905Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-25T01:04:53.7754068Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-25T01:04:53.7754119Z ╰──── 2026-10-25T01:04:53.7754222Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7754224Z 2026-10-25T01:04:53.7754425Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7754587Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:167:7] 2026-10-25T01:04:53.7754643Z 166 │ } 2026-10-25T01:04:53.7754711Z 167 │ }, [wrappedRender]); 2026-10-25T01:04:53.7754790Z ·  ──────┬────── 2026-10-25T01:04:53.7754940Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-25T01:04:53.7754994Z 168 │ 2026-10-25T01:04:53.7755043Z ╰──── 2026-10-25T01:04:53.7755340Z  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-25T01:04:53.7755652Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7755655Z 2026-10-25T01:04:53.7755897Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T01:04:53.7756057Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:843:42] 2026-10-25T01:04:53.7756117Z 842 │ > 2026-10-25T01:04:53.7756247Z 843 │ 2026-10-25T01:04:53.7756370Z ·  ──────────────────── 2026-10-25T01:04:53.7756472Z 844 │ 2026-10-25T01:04:53.7756528Z ╰──── 2026-10-25T01:04:53.7756751Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T01:04:53.7756891Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T01:04:53.7757071Z 2026-10-25T01:04:53.7757285Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T01:04:53.7757634Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-25T01:04:53.7757906Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-25T01:04:53.7758156Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-25T01:04:53.7758440Z ·  ─────── 2026-10-25T01:04:53.7758697Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-25T01:04:53.7758873Z ╰──── 2026-10-25T01:04:53.7759192Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T01:04:53.7759438Z 2026-10-25T01:04:53.7759585Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.7759889Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-25T01:04:53.7760224Z 151 │ 2026-10-25T01:04:53.7760533Z 152 │ {props.children(open)} 2026-10-25T01:04:53.7760723Z ·  ──┬─ 2026-10-25T01:04:53.7760992Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.7761210Z 153 │ 2026-10-25T01:04:53.7761337Z ╰──── 2026-10-25T01:04:53.7761862Z  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-25T01:04:53.7762585Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.7762861Z 2026-10-25T01:04:53.7763056Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-25T01:04:53.7763401Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-25T01:04:53.7763641Z 139 │ if (action.id !== undefined) { 2026-10-25T01:04:53.7763826Z 140 │ props.onPressAction?.({ 2026-10-25T01:04:53.7763995Z ·  ──┬── 2026-10-25T01:04:53.7764212Z · ╰── Missing dependency `props` 2026-10-25T01:04:53.7764439Z 141 │ nativeEvent: { event: action.id }, 2026-10-25T01:04:53.7764692Z 142 │ } as Parameters>[0]); 2026-10-25T01:04:53.7764902Z 143 │ } 2026-10-25T01:04:53.7765020Z 144 │ }, 2026-10-25T01:04:53.7765166Z 145 │ [close, props.onPressAction], 2026-10-25T01:04:53.7765358Z ·  ─────────┬───────── 2026-10-25T01:04:53.7765673Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-25T01:04:53.7765929Z 146 │ ); 2026-10-25T01:04:53.7766042Z ╰──── 2026-10-25T01:04:53.7766571Z  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-25T01:04:53.7767303Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7767597Z 2026-10-25T01:04:53.7767876Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T01:04:53.7768292Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-25T01:04:53.7768507Z 162 │ keys, 2026-10-25T01:04:53.7768697Z 163 │ overridingProjects = [], 2026-10-25T01:04:53.7768905Z ·  ── 2026-10-25T01:04:53.7769069Z 164 │ onClearOverrides, 2026-10-25T01:04:53.7769202Z ╰──── 2026-10-25T01:04:53.7769571Z  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-25T01:04:53.7769864Z 2026-10-25T01:04:53.7770081Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T01:04:53.7770435Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-25T01:04:53.7770673Z 1021 │ instanceId, 2026-10-25T01:04:53.7770901Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-25T01:04:53.7771194Z ·  ────────────────────────────────────────────────── 2026-10-25T01:04:53.7771393Z 1023 │ ]), 2026-10-25T01:04:53.7771520Z ╰──── 2026-10-25T01:04:53.7771843Z  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-25T01:04:53.7772186Z 2026-10-25T01:04:53.7772609Z ⚠ 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-25T01:04:53.7773134Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-25T01:04:53.7773369Z 262 │ ...(update._meta !== undefined 2026-10-25T01:04:53.7773635Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-25T01:04:53.7773896Z ·  ───────── 2026-10-25T01:04:53.7774062Z 264 │ : {}), 2026-10-25T01:04:53.7774187Z ╰──── 2026-10-25T01:04:53.7774245Z 2026-10-25T01:04:53.7774402Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.7774716Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-25T01:04:53.7774936Z 35 │ 2026-10-25T01:04:53.7775131Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-25T01:04:53.7775364Z ·  ────────┬──────── 2026-10-25T01:04:53.7775612Z · ╰── `inspectorProgress` originates here 2026-10-25T01:04:53.7775852Z 37 │ const { renderedInspectorWidth } = props; 2026-10-25T01:04:53.7776102Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T01:04:53.7776298Z 39 │ 2026-10-25T01:04:53.7776436Z 40 │ const onClosed = props.onClosed; 2026-10-25T01:04:53.7776599Z 41 │ useEffect(() => { 2026-10-25T01:04:53.7776774Z 42 │ inspectorProgress.value = withTiming( 2026-10-25T01:04:53.7776962Z ·  ────────┬──────── 2026-10-25T01:04:53.7777207Z · ╰── `inspectorProgress` cannot be modified 2026-10-25T01:04:53.7777431Z 43 │ inspectorVisible ? 1 : 0, 2026-10-25T01:04:53.7777578Z ╰──── 2026-10-25T01:04:53.7777897Z  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-25T01:04:53.7778570Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7778900Z 2026-10-25T01:04:53.7779059Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.7779374Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-25T01:04:53.7779629Z 37 │ const { renderedInspectorWidth } = props; 2026-10-25T01:04:53.7779867Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-25T01:04:53.7780102Z ·  ──────────┬───────── 2026-10-25T01:04:53.7780385Z · ╰── `renderedContentWidth` originates here 2026-10-25T01:04:53.7780604Z 39 │ 2026-10-25T01:04:53.7780739Z 40 │ const onClosed = props.onClosed; 2026-10-25T01:04:53.7780905Z 41 │ useEffect(() => { 2026-10-25T01:04:53.7781074Z 42 │ inspectorProgress.value = withTiming( 2026-10-25T01:04:53.7781260Z 43 │ inspectorVisible ? 1 : 0, 2026-10-25T01:04:53.7781426Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-25T01:04:53.7781581Z 45 │ (finished) => { 2026-10-25T01:04:53.7781800Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-25T01:04:53.7782017Z 47 │ runOnJS(onClosed)(); 2026-10-25T01:04:53.7782168Z 48 │ } 2026-10-25T01:04:53.7782289Z 49 │ }, 2026-10-25T01:04:53.7782412Z 50 │ ); 2026-10-25T01:04:53.7782605Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-25T01:04:53.7782826Z 52 │ renderedInspectorWidth.set( 2026-10-25T01:04:53.7783067Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-25T01:04:53.7783274Z 54 │ ); 2026-10-25T01:04:53.7783390Z 55 │ }, [ 2026-10-25T01:04:53.7783519Z 56 │ inspectorProgress, 2026-10-25T01:04:53.7783681Z 57 │ inspectorVisible, 2026-10-25T01:04:53.7783830Z 58 │ inspectorWidth, 2026-10-25T01:04:53.7783972Z 59 │ onClosed, 2026-10-25T01:04:53.7784118Z 60 │ renderedInspectorWidth, 2026-10-25T01:04:53.7784267Z 61 │ resizing, 2026-10-25T01:04:53.7784397Z 62 │ ]); 2026-10-25T01:04:53.7784510Z 63 │ 2026-10-25T01:04:53.7784632Z 64 │ useEffect(() => { 2026-10-25T01:04:53.7784805Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-25T01:04:53.7785001Z 66 │ if (!inspectorVisible || resizing) { 2026-10-25T01:04:53.7785201Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-25T01:04:53.7785407Z ·  ──────────┬───────── 2026-10-25T01:04:53.7785663Z · ╰── `renderedContentWidth` cannot be modified 2026-10-25T01:04:53.7785878Z 68 │ return; 2026-10-25T01:04:53.7786007Z ╰──── 2026-10-25T01:04:53.7786328Z  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-25T01:04:53.7786876Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7787163Z 2026-10-25T01:04:53.7787424Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7787840Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:124:7] 2026-10-25T01:04:53.7788066Z 119 │ 2026-10-25T01:04:53.7788191Z 120 │ useEffect(() => { 2026-10-25T01:04:53.7788345Z ·  ────┬──── 2026-10-25T01:04:53.7788620Z · ╰── This is the containing effect 2026-10-25T01:04:53.7788866Z 121 │ if (orientationSettled) return; 2026-10-25T01:04:53.7789083Z 122 │ const orientation = getNativeShowcaseOrientation(); 2026-10-25T01:04:53.7789285Z 123 │ if (orientation === null) { 2026-10-25T01:04:53.7789464Z 124 │ setOrientationSettled(true); 2026-10-25T01:04:53.7789658Z ·  ──────────┬────────── 2026-10-25T01:04:53.7789931Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7790157Z 125 │ return; 2026-10-25T01:04:53.7790285Z ╰──── 2026-10-25T01:04:53.7790972Z  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-25T01:04:53.7791824Z  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-25T01:04:53.7792124Z 2026-10-25T01:04:53.7792378Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7792792Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:300:7] 2026-10-25T01:04:53.7793014Z 288 │ 2026-10-25T01:04:53.7793146Z 289 │ useEffect(() => { 2026-10-25T01:04:53.7793302Z ·  ────┬──── 2026-10-25T01:04:53.7793516Z · ╰── This is the containing effect 2026-10-25T01:04:53.7793705Z 290 │ if ( 2026-10-25T01:04:53.7793848Z 291 │ scene === null || 2026-10-25T01:04:53.7794011Z 292 │ requestedScene === null || 2026-10-25T01:04:53.7794185Z 293 │ scene !== requestedScene || 2026-10-25T01:04:53.7794348Z 294 │ !hasFixture || 2026-10-25T01:04:53.7794502Z 295 │ !orientationSettled || 2026-10-25T01:04:53.7794663Z 296 │ !themeApplied || 2026-10-25T01:04:53.7794864Z 297 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-25T01:04:53.7795134Z 298 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-25T01:04:53.7795335Z 299 │ ) { 2026-10-25T01:04:53.7795471Z 300 │ setReadyScene(null); 2026-10-25T01:04:53.7795640Z ·  ──────┬────── 2026-10-25T01:04:53.7795900Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7796181Z 301 │ return; 2026-10-25T01:04:53.7796336Z ╰──── 2026-10-25T01:04:53.7796982Z  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-25T01:04:53.7797829Z  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-25T01:04:53.7798126Z 2026-10-25T01:04:53.7798397Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7798822Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:129:9] 2026-10-25T01:04:53.7799063Z 128 │ let cancelled = false; 2026-10-25T01:04:53.7799247Z 129 │ let lastOutcome: string | null = null; 2026-10-25T01:04:53.7799432Z ·  ─────┬───── 2026-10-25T01:04:53.7799658Z · ╰── 'lastOutcome' is declared here 2026-10-25T01:04:53.7799974Z 130 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-25T01:04:53.7800205Z ╰──── 2026-10-25T01:04:53.7800386Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7800534Z 2026-10-25T01:04:53.7800901Z ⚠ 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-25T01:04:53.7801359Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-25T01:04:53.7801553Z 145 │ name, 2026-10-25T01:04:53.7801767Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-25T01:04:53.7802019Z ·  ────────────────────────── 2026-10-25T01:04:53.7802254Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-25T01:04:53.7802437Z ╰──── 2026-10-25T01:04:53.7802495Z 2026-10-25T01:04:53.7802679Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-25T01:04:53.7802992Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-25T01:04:53.7803224Z 14 │ import * as Layer from "effect/Layer"; 2026-10-25T01:04:53.7803417Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-25T01:04:53.7803606Z ·  ──┬── 2026-10-25T01:04:53.7803839Z · ╰── 'Scope' is imported here 2026-10-25T01:04:53.7804063Z 16 │ import * as Stream from "effect/Stream"; 2026-10-25T01:04:53.7804216Z ╰──── 2026-10-25T01:04:53.7804368Z  help: Consider removing this import. 2026-10-25T01:04:53.7804482Z 2026-10-25T01:04:53.7804682Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7805039Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-25T01:04:53.7805307Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-25T01:04:53.7840058Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-25T01:04:53.7840303Z ·  ──────┬───── 2026-10-25T01:04:53.7840759Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-25T01:04:53.7841076Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-25T01:04:53.7841249Z ╰──── 2026-10-25T01:04:53.7841598Z  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-25T01:04:53.7842184Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7842477Z 2026-10-25T01:04:53.7842676Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7843009Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-25T01:04:53.7843231Z 1320 │ queuedMessagesByThreadKey, 2026-10-25T01:04:53.7843395Z 1321 │ retryTick, 2026-10-25T01:04:53.7843548Z ·  ────┬──── 2026-10-25T01:04:53.7843778Z · ╰── Unnecessary dependency `retryTick` 2026-10-25T01:04:53.7843986Z 1322 │ restoreQueuedMessage, 2026-10-25T01:04:53.7844122Z ╰──── 2026-10-25T01:04:53.7844461Z  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-25T01:04:53.7845028Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7845312Z 2026-10-25T01:04:53.7845477Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-25T01:04:53.7845786Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-25T01:04:53.7845992Z 465 │ 2026-10-25T01:04:53.7846155Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-25T01:04:53.7846343Z ·  ── 2026-10-25T01:04:53.7846485Z 467 │ } 2026-10-25T01:04:53.7846592Z ╰──── 2026-10-25T01:04:53.7846866Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-25T01:04:53.7847083Z 2026-10-25T01:04:53.7847346Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7847749Z ╭─[apps/mobile/src/features/workspace/WorkspaceSidebarTabs.ios.tsx:32:9] 2026-10-25T01:04:53.7848056Z 31 │ const tabs = [...visibleNavigationTabs(order, hidden), "settings" as const]; 2026-10-25T01:04:53.7848285Z 32 │ const navigation = useNavigation(); 2026-10-25T01:04:53.7848464Z ·  ─────┬──── 2026-10-25T01:04:53.7848688Z · ╰── 'navigation' is declared here 2026-10-25T01:04:53.7848914Z 33 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T01:04:53.7849069Z ╰──── 2026-10-25T01:04:53.7849221Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7849334Z 2026-10-25T01:04:53.7849592Z ⚠ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7849992Z ╭─[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9] 2026-10-25T01:04:53.7850245Z 22 │ const selectTab = useSelectWorkspaceTab(); 2026-10-25T01:04:53.7850445Z 23 │ const navigation = useNavigation(); 2026-10-25T01:04:53.7850708Z ·  ─────┬──── 2026-10-25T01:04:53.7850949Z · ╰── 'navigation' is declared here 2026-10-25T01:04:53.7851171Z 24 │ const selected = selectedNavigationTab( 2026-10-25T01:04:53.7851322Z ╰──── 2026-10-25T01:04:53.7851470Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7851585Z 2026-10-25T01:04:53.7851781Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7852085Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-25T01:04:53.7852275Z 28 │ getPendingThreadOrder(); 2026-10-25T01:04:53.7852442Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-25T01:04:53.7852658Z ·  ────┬──── ───────┬────── 2026-10-25T01:04:53.7852971Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T01:04:53.7853281Z · ╰── Unnecessary dependency `nowMinute` 2026-10-25T01:04:53.7853479Z 30 │ return pending; 2026-10-25T01:04:53.7853603Z ╰──── 2026-10-25T01:04:53.7853936Z  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-25T01:04:53.7854506Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7854793Z 2026-10-25T01:04:53.7855015Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-25T01:04:53.7855389Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-25T01:04:53.7855604Z 1397 │ 2026-10-25T01:04:53.7855746Z 1398 │ function assertUserMessagesExclude( 2026-10-25T01:04:53.7855947Z ·  ────────────┬──────────── 2026-10-25T01:04:53.7856219Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-25T01:04:53.7856481Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-25T01:04:53.7856649Z ╰──── 2026-10-25T01:04:53.7856799Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7856912Z 2026-10-25T01:04:53.7857108Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7857425Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-25T01:04:53.7857614Z 81 │ }, 2026-10-25T01:04:53.7857736Z 82 │ [draftKey], 2026-10-25T01:04:53.7857886Z ·  ────┬─── 2026-10-25T01:04:53.7858106Z · ╰── Unnecessary dependency `draftKey` 2026-10-25T01:04:53.7858359Z 83 │ ); 2026-10-25T01:04:53.7858465Z ╰──── 2026-10-25T01:04:53.7858798Z  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-25T01:04:53.7859371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7859658Z 2026-10-25T01:04:53.7859911Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7860542Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-25T01:04:53.7860798Z 61 │ }, []); 2026-10-25T01:04:53.7860927Z 62 │ useEffect(() => { 2026-10-25T01:04:53.7861075Z ·  ────┬──── 2026-10-25T01:04:53.7861285Z · ╰── This is the containing effect 2026-10-25T01:04:53.7861559Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-25T01:04:53.7861828Z ·  ───────┬────── 2026-10-25T01:04:53.7862150Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7862412Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-25T01:04:53.7862555Z ╰──── 2026-10-25T01:04:53.7863200Z  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-25T01:04:53.7864041Z  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-25T01:04:53.7864336Z 2026-10-25T01:04:53.7864590Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7864959Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-25T01:04:53.7865152Z 57 │ 2026-10-25T01:04:53.7865268Z 58 │ useEffect(() => { 2026-10-25T01:04:53.7865417Z ·  ────┬──── 2026-10-25T01:04:53.7865627Z · ╰── This is the containing effect 2026-10-25T01:04:53.7865854Z 59 │ const controller = new AbortController(); 2026-10-25T01:04:53.7866031Z 60 │ setLoadState("pending"); 2026-10-25T01:04:53.7866192Z ·  ──────┬───── 2026-10-25T01:04:53.7866440Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7866758Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-25T01:04:53.7866962Z ╰──── 2026-10-25T01:04:53.7867597Z  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-25T01:04:53.7868433Z  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-25T01:04:53.7868731Z 2026-10-25T01:04:53.7868927Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7869247Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-25T01:04:53.7869467Z 70 │ return () => controller.abort(); 2026-10-25T01:04:53.7869659Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-25T01:04:53.7869944Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-25T01:04:53.7870317Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-25T01:04:53.7870795Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-25T01:04:53.7871145Z · ╰── Unnecessary dependency `player_0` 2026-10-25T01:04:53.7871332Z 72 │ 2026-10-25T01:04:53.7871434Z ╰──── 2026-10-25T01:04:53.7871772Z  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-25T01:04:53.7872342Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7872628Z 2026-10-25T01:04:53.7872881Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7873257Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-25T01:04:53.7873502Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-25T01:04:53.7873679Z 67 │ useEffect(() => { 2026-10-25T01:04:53.7873826Z ·  ────┬──── 2026-10-25T01:04:53.7874031Z · ╰── This is the containing effect 2026-10-25T01:04:53.7874219Z 68 │ setUri(null); 2026-10-25T01:04:53.7874364Z ·  ───┬── 2026-10-25T01:04:53.7874606Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7874828Z 69 │ setError(null); 2026-10-25T01:04:53.7874954Z ╰──── 2026-10-25T01:04:53.7875591Z  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-25T01:04:53.7876430Z  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-25T01:04:53.7876726Z 2026-10-25T01:04:53.7876922Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7877247Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-25T01:04:53.7877441Z 90 │ }; 2026-10-25T01:04:53.7877575Z 91 │ }, [attachmentId, fileUri]); 2026-10-25T01:04:53.7877782Z ·  ──────┬───── ───┬─── 2026-10-25T01:04:53.7878135Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-25T01:04:53.7878492Z · ╰── Unnecessary dependency `attachmentId` 2026-10-25T01:04:53.7878766Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-25T01:04:53.7878956Z ╰──── 2026-10-25T01:04:53.7879292Z  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-25T01:04:53.7879866Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7880157Z 2026-10-25T01:04:53.7880378Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T01:04:53.7880753Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-25T01:04:53.7880963Z 212 │ useEffect(() => { 2026-10-25T01:04:53.7881155Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-25T01:04:53.7881374Z ·  ──┬── 2026-10-25T01:04:53.7881629Z · ╰── Missing dependency `props` 2026-10-25T01:04:53.7881876Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-25T01:04:53.7882104Z ·  ──────────┬───────── 2026-10-25T01:04:53.7882441Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-25T01:04:53.7882723Z 215 │ const { source } = props; 2026-10-25T01:04:53.7882863Z ╰──── 2026-10-25T01:04:53.7883333Z  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-25T01:04:53.7884016Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7884305Z 2026-10-25T01:04:53.7884498Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.7884831Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-25T01:04:53.7885090Z 271 │ {record.elements?.map((element, index) => ( 2026-10-25T01:04:53.7885375Z 272 │ 2026-10-25T01:04:53.7885696Z ·  ─────────────────────────────────────────────────────── 2026-10-25T01:04:53.7885914Z 273 │ { 2026-10-25T01:04:53.7888044Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-25T01:04:53.7888361Z ·  ──────────────────────── 2026-10-25T01:04:53.7888533Z 182 │ version: 1, 2026-10-25T01:04:53.7888658Z ╰──── 2026-10-25T01:04:53.7888712Z 2026-10-25T01:04:53.7888879Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.7889184Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-25T01:04:53.7889443Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-25T01:04:53.7889722Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-25T01:04:53.7890012Z ·  ─────┬──── 2026-10-25T01:04:53.7890307Z · ╰── Cannot call impure function 2026-10-25T01:04:53.7890547Z 179 │ } 2026-10-25T01:04:53.7890657Z ╰──── 2026-10-25T01:04:53.7890983Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T01:04:53.7891531Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.7891806Z 2026-10-25T01:04:53.7891998Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.7892349Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-25T01:04:53.7892580Z 817 │
    Date.now()); 2026-10-25T01:04:53.7894931Z 84 │ useEffect(() => { 2026-10-25T01:04:53.7895081Z ·  ────┬──── 2026-10-25T01:04:53.7895297Z · ╰── This is the containing effect 2026-10-25T01:04:53.7895514Z 85 │ if (!actionState.isRunning) return; 2026-10-25T01:04:53.7895683Z 86 │ setNowMs(Date.now()); 2026-10-25T01:04:53.7895838Z ·  ────┬─── 2026-10-25T01:04:53.7896087Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7896370Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-25T01:04:53.7896551Z ╰──── 2026-10-25T01:04:53.7897185Z  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-25T01:04:53.7898082Z  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-25T01:04:53.7898467Z 2026-10-25T01:04:53.7898684Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T01:04:53.7899012Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-25T01:04:53.7899239Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-25T01:04:53.7899483Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-25T01:04:53.7899768Z ·  ────────────────────────────────────────────────────────────── 2026-10-25T01:04:53.7899966Z 347 │ }; 2026-10-25T01:04:53.7900086Z ╰──── 2026-10-25T01:04:53.7900434Z  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-25T01:04:53.7900689Z 2026-10-25T01:04:53.7900903Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-25T01:04:53.7901227Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-25T01:04:53.7901415Z 447 │ const favorites = 2026-10-25T01:04:53.7901600Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-25T01:04:53.7901805Z ·  ───┬── 2026-10-25T01:04:53.7902027Z · ╰── For this reduce 2026-10-25T01:04:53.7902230Z 449 │ const exists = current.some( 2026-10-25T01:04:53.7902501Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-25T01:04:53.7902732Z 451 │ ); 2026-10-25T01:04:53.7902871Z 452 │ return change.favorite 2026-10-25T01:04:53.7903021Z 453 │ ? exists 2026-10-25T01:04:53.7903155Z 454 │ ? current 2026-10-25T01:04:53.7903364Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-25T01:04:53.7903585Z ·  ─────┬──── 2026-10-25T01:04:53.7903796Z · ╰── From this spread 2026-10-25T01:04:53.7903985Z 456 │ : current.filter( 2026-10-25T01:04:53.7904121Z ╰──── 2026-10-25T01:04:53.7904374Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-25T01:04:53.7904727Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T01:04:53.7904887Z 2026-10-25T01:04:53.7905080Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T01:04:53.7905378Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-25T01:04:53.7905560Z 464 │ null; 2026-10-25T01:04:53.7905739Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-25T01:04:53.7905952Z ·  ──────────┬───────── 2026-10-25T01:04:53.7906172Z · ╰── From this accumulator 2026-10-25T01:04:53.7906399Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-25T01:04:53.7906579Z ·  ─┬─ 2026-10-25T01:04:53.7906761Z · ╰── For this loop 2026-10-25T01:04:53.7907005Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-25T01:04:53.7907214Z 468 │ hiddenModels: [], 2026-10-25T01:04:53.7907430Z 469 │ modelOrder: [], 2026-10-25T01:04:53.7907604Z 470 │ }; 2026-10-25T01:04:53.7907842Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-25T01:04:53.7908128Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-25T01:04:53.7908324Z 473 │ nextModelPreferences = { 2026-10-25T01:04:53.7908490Z 474 │ ...nextModelPreferences, 2026-10-25T01:04:53.7908679Z ·  ───────────┬─────────── 2026-10-25T01:04:53.7908899Z · ╰── From this spread 2026-10-25T01:04:53.7909132Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-25T01:04:53.7909303Z ╰──── 2026-10-25T01:04:53.7909510Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T01:04:53.7909827Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T01:04:53.7909992Z 2026-10-25T01:04:53.7910211Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T01:04:53.7910588Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-25T01:04:53.7910795Z 20 │ [instanceId]: { 2026-10-25T01:04:53.7910952Z 21 │ ...(state[instanceId] ?? {}), 2026-10-25T01:04:53.7911149Z ·  ──────────────────────────── 2026-10-25T01:04:53.7911321Z 22 │ [model]: options, 2026-10-25T01:04:53.7911453Z ╰──── 2026-10-25T01:04:53.7911766Z  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-25T01:04:53.7912015Z 2026-10-25T01:04:53.7912282Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7912641Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-25T01:04:53.7912811Z 35 │ 2026-10-25T01:04:53.7913000Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-25T01:04:53.7913213Z ·  ─────┬──── 2026-10-25T01:04:53.7913433Z · ╰── 'claudeCaps' is declared here 2026-10-25T01:04:53.7913636Z 37 │ optionDescriptors: [ 2026-10-25T01:04:53.7913773Z ╰──── 2026-10-25T01:04:53.7913927Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7914042Z 2026-10-25T01:04:53.7914548Z ⚠ 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-25T01:04:53.7915104Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-25T01:04:53.7915311Z 138 │ Effect.gen(function* () { 2026-10-25T01:04:53.7915597Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-25T01:04:53.7915903Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-25T01:04:53.7916352Z 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-25T01:04:53.7916827Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-25T01:04:53.7917145Z 143 │ ╰─▶ } 2026-10-25T01:04:53.7917366Z 144 │ return yield* Fiber.join(fiber); 2026-10-25T01:04:53.7917520Z ╰──── 2026-10-25T01:04:53.7917577Z 2026-10-25T01:04:53.7917859Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T01:04:53.7918282Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-25T01:04:53.7918510Z 472 │ onFilters, 2026-10-25T01:04:53.7918645Z 473 │ authorOptions = [], 2026-10-25T01:04:53.7918802Z ·  ── 2026-10-25T01:04:53.7918956Z 474 │ labelOptions = [], 2026-10-25T01:04:53.7919087Z ╰──── 2026-10-25T01:04:53.7919467Z  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-25T01:04:53.7919762Z 2026-10-25T01:04:53.7920035Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-25T01:04:53.7920493Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-25T01:04:53.7920723Z 473 │ authorOptions = [], 2026-10-25T01:04:53.7920869Z 474 │ labelOptions = [], 2026-10-25T01:04:53.7921024Z ·  ── 2026-10-25T01:04:53.7921178Z 475 │ optionScope, 2026-10-25T01:04:53.7921301Z ╰──── 2026-10-25T01:04:53.7921663Z  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-25T01:04:53.7921954Z 2026-10-25T01:04:53.7922143Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-25T01:04:53.7922428Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-25T01:04:53.7922604Z 457 │ ): Array { 2026-10-25T01:04:53.7922788Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-25T01:04:53.7923007Z ·  ┬ 2026-10-25T01:04:53.7923261Z · ╰── '_' is declared here 2026-10-25T01:04:53.7923466Z 459 │ for (const b of data) { 2026-10-25T01:04:53.7923603Z ╰──── 2026-10-25T01:04:53.7923759Z  help: Consider removing this parameter. 2026-10-25T01:04:53.7923875Z 2026-10-25T01:04:53.7924106Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-25T01:04:53.7924510Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-25T01:04:53.7924802Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-25T01:04:53.7925172Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-25T01:04:53.7925508Z 986 │ │ (approval) => approval.requestId, 2026-10-25T01:04:53.7925768Z 987 │ ╰─▶ ); 2026-10-25T01:04:53.7926040Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-25T01:04:53.7926239Z ╰──── 2026-10-25T01:04:53.7926367Z  help: Switch to `Set` 2026-10-25T01:04:53.7926461Z 2026-10-25T01:04:53.7926833Z ⚠ 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-25T01:04:53.7927291Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-25T01:04:53.7927568Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-25T01:04:53.7927877Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-25T01:04:53.7928159Z ·  ────────────────────────── 2026-10-25T01:04:53.7928397Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-25T01:04:53.7928576Z ╰──── 2026-10-25T01:04:53.7928630Z 2026-10-25T01:04:53.7929075Z ⚠ 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-25T01:04:53.7929598Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-25T01:04:53.7929869Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-25T01:04:53.7930055Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-25T01:04:53.7930169Z ·  ─────────────────── 2026-10-25T01:04:53.7930261Z 1013 │ expect(encoded).not.toContain(url); 2026-10-25T01:04:53.7930312Z ╰──── 2026-10-25T01:04:53.7930314Z 2026-10-25T01:04:53.7930810Z ⚠ 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-25T01:04:53.7930970Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-25T01:04:53.7931085Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-25T01:04:53.7931292Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-25T01:04:53.7931425Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-25T01:04:53.7931529Z 137 │ │ if (predicate(lastState)) { 2026-10-25T01:04:53.7931625Z 138 │ │ return lastState; 2026-10-25T01:04:53.7931698Z 139 │ │ } 2026-10-25T01:04:53.7931799Z 140 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.7931928Z 141 │ ╰─▶ } 2026-10-25T01:04:53.7932050Z 142 │ return yield* Effect.die( 2026-10-25T01:04:53.7932127Z ╰──── 2026-10-25T01:04:53.7932129Z 2026-10-25T01:04:53.7932315Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T01:04:53.7932429Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-25T01:04:53.7932487Z 7 │ () => 2026-10-25T01:04:53.7932551Z 8 │ Gesture.Hover() 2026-10-25T01:04:53.7932628Z ·  ──┬── 2026-10-25T01:04:53.7932762Z · ╰── `Hover` may be a component 2026-10-25T01:04:53.7932835Z 9 │ .manualActivation(true) 2026-10-25T01:04:53.7932884Z ╰──── 2026-10-25T01:04:53.7933162Z  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-25T01:04:53.7933607Z  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-25T01:04:53.7933612Z 2026-10-25T01:04:53.7933868Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7934016Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-25T01:04:53.7934172Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-25T01:04:53.7934237Z 29 │ useEffect(() => { 2026-10-25T01:04:53.7934307Z ·  ────┬──── 2026-10-25T01:04:53.7934434Z · ╰── This is the containing effect 2026-10-25T01:04:53.7934559Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-25T01:04:53.7934665Z ·  ───┬─── 2026-10-25T01:04:53.7934855Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7934927Z 31 │ }, [key, live, snapshot]); 2026-10-25T01:04:53.7934977Z ╰──── 2026-10-25T01:04:53.7935563Z  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-25T01:04:53.7935885Z  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-25T01:04:53.7935891Z 2026-10-25T01:04:53.7936126Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T01:04:53.7936280Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-25T01:04:53.7936338Z 289 │ return ( 2026-10-25T01:04:53.7936471Z 290 │ 2026-10-25T01:04:53.7936591Z ·  ───────────── 2026-10-25T01:04:53.7936658Z 291 │ {props.children} 2026-10-25T01:04:53.7936707Z ╰──── 2026-10-25T01:04:53.7936928Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T01:04:53.7937121Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T01:04:53.7937152Z 2026-10-25T01:04:53.7937385Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T01:04:53.7937536Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-25T01:04:53.7937593Z 653 │ return ( 2026-10-25T01:04:53.7937710Z 654 │ 2026-10-25T01:04:53.7937822Z ·  ───────────── 2026-10-25T01:04:53.7937888Z 655 │ {props.children} 2026-10-25T01:04:53.7937937Z ╰──── 2026-10-25T01:04:53.7938155Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T01:04:53.7938359Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T01:04:53.7938364Z 2026-10-25T01:04:53.7938596Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T01:04:53.7938751Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-25T01:04:53.7938811Z 1461 │ return ( 2026-10-25T01:04:53.7938971Z 1462 │ 2026-10-25T01:04:53.7939102Z ·  ──────────────────── 2026-10-25T01:04:53.7939198Z 1463 │ { 2026-10-25T01:04:53.7940412Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-25T01:04:53.7940541Z ·  ──────────────────────── 2026-10-25T01:04:53.7940605Z 18 │ "review:write", 2026-10-25T01:04:53.7940656Z ╰──── 2026-10-25T01:04:53.7940658Z 2026-10-25T01:04:53.7941017Z ⚠ 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-25T01:04:53.7941129Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-25T01:04:53.7941183Z 19 │ ]); 2026-10-25T01:04:53.7941342Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-25T01:04:53.7941448Z ·  ──────────────────────── 2026-10-25T01:04:53.7941577Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-25T01:04:53.7941627Z ╰──── 2026-10-25T01:04:53.7941629Z 2026-10-25T01:04:53.7941980Z ⚠ 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-25T01:04:53.7942153Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-25T01:04:53.7942356Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-25T01:04:53.7942478Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-25T01:04:53.7942582Z ·  ──────────────────────── 2026-10-25T01:04:53.7942652Z 59 │ authenticated: true, 2026-10-25T01:04:53.7942702Z ╰──── 2026-10-25T01:04:53.7942704Z 2026-10-25T01:04:53.7942958Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7943106Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:404:5] 2026-10-25T01:04:53.7943161Z 402 │ 2026-10-25T01:04:53.7943229Z 403 │ useEffect(() => { 2026-10-25T01:04:53.7943306Z ·  ────┬──── 2026-10-25T01:04:53.7943436Z · ╰── This is the containing effect 2026-10-25T01:04:53.7943527Z 404 │ setInspectorSelection((current) => { 2026-10-25T01:04:53.7943612Z ·  ──────────┬────────── 2026-10-25T01:04:53.7943781Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7943881Z 405 │ if (props.renderInspector === undefined) { 2026-10-25T01:04:53.7943931Z ╰──── 2026-10-25T01:04:53.7944522Z  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-25T01:04:53.7944843Z  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-25T01:04:53.7944848Z 2026-10-25T01:04:53.7945061Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T01:04:53.7945210Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:532:24] 2026-10-25T01:04:53.7945368Z 531 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-25T01:04:53.7945532Z 532 │ ╭─▶ const GitInspector = () => ( 2026-10-25T01:04:53.7945628Z 533 │ │ 2026-10-25T01:04:53.7946303Z 538 │ ╰─▶ ); 2026-10-25T01:04:53.7946384Z 539 │ const FilesInspector = () => 2026-10-25T01:04:53.7946434Z ╰──── 2026-10-25T01:04:53.7946648Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T01:04:53.7946651Z 2026-10-25T01:04:53.7946859Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-25T01:04:53.7947009Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:539:26] 2026-10-25T01:04:53.7947071Z 538 │ ); 2026-10-25T01:04:53.7947236Z 539 │ ╭─▶ const FilesInspector = () => 2026-10-25T01:04:53.7947382Z 540 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-25T01:04:53.7947487Z 541 │ │ 2026-10-25T01:04:53.7948435Z 549 │ ╰─▶ ) : null; 2026-10-25T01:04:53.7948583Z 550 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-25T01:04:53.7948634Z ╰──── 2026-10-25T01:04:53.7948845Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-25T01:04:53.7948847Z 2026-10-25T01:04:53.7949022Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-25T01:04:53.7949147Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-25T01:04:53.7949267Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-25T01:04:53.7949361Z 194 │ const codes = new Array(count); 2026-10-25T01:04:53.7949468Z ·  ──────────────────────── 2026-10-25T01:04:53.7949571Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-25T01:04:53.7949621Z ╰──── 2026-10-25T01:04:53.7950033Z  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-25T01:04:53.7950036Z 2026-10-25T01:04:53.7950221Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T01:04:53.7950400Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-25T01:04:53.7950612Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-25T01:04:53.7950722Z 602 │ const gesture = Gesture.Pan() 2026-10-25T01:04:53.7950808Z ·  ─┬─ 2026-10-25T01:04:53.7950948Z · ╰── `Pan` may be a component 2026-10-25T01:04:53.7951021Z 603 │ .enabled(!props.disabled) 2026-10-25T01:04:53.7951071Z ╰──── 2026-10-25T01:04:53.7951343Z  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-25T01:04:53.7951773Z  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-25T01:04:53.7951775Z 2026-10-25T01:04:53.7952036Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7952196Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-25T01:04:53.7952306Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-25T01:04:53.7952372Z 38 │ useLayoutEffect(() => { 2026-10-25T01:04:53.7952448Z ·  ───────┬─────── 2026-10-25T01:04:53.7952580Z · ╰── This is the containing effect 2026-10-25T01:04:53.7952640Z 39 │ reset(); 2026-10-25T01:04:53.7952705Z 40 │ setInitialized(true); 2026-10-25T01:04:53.7952783Z ·  ───────┬────── 2026-10-25T01:04:53.7952951Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7953012Z 41 │ }, [reset]); 2026-10-25T01:04:53.7953068Z ╰──── 2026-10-25T01:04:53.7953664Z  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-25T01:04:53.7953981Z  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-25T01:04:53.7953984Z 2026-10-25T01:04:53.7954236Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7954393Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-25T01:04:53.7954446Z 88 │ 2026-10-25T01:04:53.7954513Z 89 │ useEffect(() => { 2026-10-25T01:04:53.7954581Z ·  ────┬──── 2026-10-25T01:04:53.7954707Z · ╰── This is the containing effect 2026-10-25T01:04:53.7954859Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-25T01:04:53.7954960Z 91 │ const branchName = initialProjectRef.branch; 2026-10-25T01:04:53.7955024Z 92 │ let active = true; 2026-10-25T01:04:53.7955118Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-25T01:04:53.7955199Z ·  ─────────┬───────── 2026-10-25T01:04:53.7955368Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7955519Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-25T01:04:53.7955619Z ╰──── 2026-10-25T01:04:53.7956228Z  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-25T01:04:53.7956542Z  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-25T01:04:53.7956544Z 2026-10-25T01:04:53.7956807Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7956938Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-25T01:04:53.7956991Z 339 │ 2026-10-25T01:04:53.7957094Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-25T01:04:53.7957170Z ·  ────┬──── 2026-10-25T01:04:53.7957303Z · ╰── 'layerTest' is declared here 2026-10-25T01:04:53.7957353Z ╰──── 2026-10-25T01:04:53.7957455Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7957457Z 2026-10-25T01:04:53.7957609Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.7957758Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T01:04:53.7957810Z 83 │ 2026-10-25T01:04:53.7957900Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-25T01:04:53.7957980Z ·  ──────┬───── 2026-10-25T01:04:53.7958112Z · ╰── `cardCoverage` originates here 2026-10-25T01:04:53.7958197Z 85 │ const barHeightRef = useRef(0); 2026-10-25T01:04:53.7958277Z 86 │ const cardHeightRef = useRef(0); 2026-10-25T01:04:53.7958361Z 87 │ const cardHeight = useSharedValue(0); 2026-10-25T01:04:53.7958450Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-25T01:04:53.7958516Z 89 │ if (!cardCoverage) { 2026-10-25T01:04:53.7958573Z 90 │ return; 2026-10-25T01:04:53.7958627Z 91 │ } 2026-10-25T01:04:53.7958788Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T01:04:53.7958889Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T01:04:53.7959041Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T01:04:53.7959114Z ·  ──────┬───── 2026-10-25T01:04:53.7959256Z · ╰── `cardCoverage` cannot be modified 2026-10-25T01:04:53.7959324Z 95 │ }, [cardCoverage]); 2026-10-25T01:04:53.7959373Z ╰──── 2026-10-25T01:04:53.7959664Z  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-25T01:04:53.7959964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7959967Z 2026-10-25T01:04:53.7960119Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.7960272Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-25T01:04:53.7960361Z  86 │ const cardHeightRef = useRef(0); 2026-10-25T01:04:53.7960447Z  87 │ const cardHeight = useSharedValue(0); 2026-10-25T01:04:53.7960596Z ·  ─────┬──── 2026-10-25T01:04:53.7960754Z · ╰── `cardHeight` originates here 2026-10-25T01:04:53.7960846Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-25T01:04:53.7960912Z  89 │ if (!cardCoverage) { 2026-10-25T01:04:53.7960971Z  90 │ return; 2026-10-25T01:04:53.7961023Z  91 │ } 2026-10-25T01:04:53.7961187Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T01:04:53.7961285Z  93 │ // feed inset and floating controls trailing it. 2026-10-25T01:04:53.7961444Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T01:04:53.7961509Z  95 │ }, [cardCoverage]); 2026-10-25T01:04:53.7961592Z  96 │ const handleBarLayout = useCallback( 2026-10-25T01:04:53.7961677Z  97 │ (event: LayoutChangeEvent) => { 2026-10-25T01:04:53.7961801Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T01:04:53.7961865Z  99 │ notifyCoverage(); 2026-10-25T01:04:53.7961921Z 100 │ }, 2026-10-25T01:04:53.7961985Z 101 │ [notifyCoverage], 2026-10-25T01:04:53.7962037Z 102 │ ); 2026-10-25T01:04:53.7962122Z 103 │ const handleCardLayout = useCallback( 2026-10-25T01:04:53.7962204Z 104 │ (event: LayoutChangeEvent) => { 2026-10-25T01:04:53.7962329Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T01:04:53.7962441Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T01:04:53.7962515Z ·  ─────┬──── 2026-10-25T01:04:53.7962650Z · ╰── `cardHeight` cannot be modified 2026-10-25T01:04:53.7962716Z 107 │ notifyCoverage(); 2026-10-25T01:04:53.7962775Z ╰──── 2026-10-25T01:04:53.7963039Z  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-25T01:04:53.7963340Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7963342Z 2026-10-25T01:04:53.7963540Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T01:04:53.7963691Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T01:04:53.7963773Z 87 │ const cardHeight = useSharedValue(0); 2026-10-25T01:04:53.7963865Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-25T01:04:53.7963966Z ·  ───┬─── 2026-10-25T01:04:53.7964206Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T01:04:53.7964273Z 89 │ if (!cardCoverage) { 2026-10-25T01:04:53.7964330Z 90 │ return; 2026-10-25T01:04:53.7964386Z 91 │ } 2026-10-25T01:04:53.7964549Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-25T01:04:53.7964652Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T01:04:53.7964805Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T01:04:53.7964881Z ·  ──────┬───── 2026-10-25T01:04:53.7965013Z · ╰── This modifies `cardCoverage` 2026-10-25T01:04:53.7965082Z 95 │ }, [cardCoverage]); 2026-10-25T01:04:53.7965179Z ╰──── 2026-10-25T01:04:53.7965549Z  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-25T01:04:53.7965852Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7965855Z 2026-10-25T01:04:53.7966054Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T01:04:53.7966204Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-25T01:04:53.7966308Z 93 │ // feed inset and floating controls trailing it. 2026-10-25T01:04:53.7966465Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-25T01:04:53.7966545Z ·  ──────┬───── 2026-10-25T01:04:53.7966676Z · ╰── This modifies `cardCoverage` 2026-10-25T01:04:53.7966743Z 95 │ }, [cardCoverage]); 2026-10-25T01:04:53.7966830Z 96 │ const handleBarLayout = useCallback( 2026-10-25T01:04:53.7966913Z 97 │ (event: LayoutChangeEvent) => { 2026-10-25T01:04:53.7967018Z ·  ───────────────┬─────────────── 2026-10-25T01:04:53.7967241Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-25T01:04:53.7967365Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T01:04:53.7967421Z ╰──── 2026-10-25T01:04:53.7967760Z  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-25T01:04:53.7968065Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7968067Z 2026-10-25T01:04:53.7968268Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T01:04:53.7968425Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-25T01:04:53.7968514Z 103 │ const handleCardLayout = useCallback( 2026-10-25T01:04:53.7968595Z 104 │ (event: LayoutChangeEvent) => { 2026-10-25T01:04:53.7968704Z ·  ───────────────┬─────────────── 2026-10-25T01:04:53.7968923Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-25T01:04:53.7969094Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-25T01:04:53.7969240Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-25T01:04:53.7969319Z ·  ─────┬──── 2026-10-25T01:04:53.7969449Z · ╰── This modifies `cardHeight` 2026-10-25T01:04:53.7969518Z 107 │ notifyCoverage(); 2026-10-25T01:04:53.7969569Z ╰──── 2026-10-25T01:04:53.7969902Z  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-25T01:04:53.7970202Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7970204Z 2026-10-25T01:04:53.7970421Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-25T01:04:53.7970564Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-25T01:04:53.7970649Z 27 │ import * as Schema from "effect/Schema"; 2026-10-25T01:04:53.7970744Z 28 │ import { identity } from "effect/Function"; 2026-10-25T01:04:53.7970822Z ·  ────┬─── 2026-10-25T01:04:53.7970981Z · ╰── 'identity' is imported here 2026-10-25T01:04:53.7971114Z 29 │ import * as Layer from "effect/Layer"; 2026-10-25T01:04:53.7971197Z ╰──── 2026-10-25T01:04:53.7971329Z  help: Consider removing this import. 2026-10-25T01:04:53.7971332Z 2026-10-25T01:04:53.7971815Z ⚠ 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-25T01:04:53.7971974Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-25T01:04:53.7972122Z 2614 │ let orphanedAt: number | undefined; 2026-10-25T01:04:53.7972381Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-25T01:04:53.7972537Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-25T01:04:53.7972699Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-25T01:04:53.7972860Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-25T01:04:53.7972995Z 2619 │ │ flush: () => { 2026-10-25T01:04:53.7973155Z 2620 │ │ let task: (() => void) | undefined; 2026-10-25T01:04:53.7973316Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-25T01:04:53.7973420Z 2622 │ │ }, 2026-10-25T01:04:53.7973548Z 2623 │ │ }; 2026-10-25T01:04:53.7973654Z 2624 │ │ 2026-10-25T01:04:53.7973865Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-25T01:04:53.7974001Z 2626 │ │ let requestChecks = 0; 2026-10-25T01:04:53.7974161Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-25T01:04:53.7974314Z 2628 │ │ executionMode: "async", 2026-10-25T01:04:53.7974463Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-25T01:04:53.7974639Z 2630 │ │ shouldYield: (fiber) => { 2026-10-25T01:04:53.7974824Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-25T01:04:53.7974984Z 2632 │ │ requestChecks += 1; 2026-10-25T01:04:53.7975154Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-25T01:04:53.7975282Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-25T01:04:53.7975410Z 2635 │ │ return true; 2026-10-25T01:04:53.7975530Z 2636 │ │ }, 2026-10-25T01:04:53.7975649Z 2637 │ │ }; 2026-10-25T01:04:53.7975735Z 2638 │ │ 2026-10-25T01:04:53.7975889Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-25T01:04:53.7976013Z 2640 │ │ ...WINDOW, 2026-10-25T01:04:53.7976235Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-25T01:04:53.7976442Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-25T01:04:53.7976553Z 2643 │ │ }; 2026-10-25T01:04:53.7976698Z 2644 │ │ const first = yield* service 2026-10-25T01:04:53.7976834Z 2645 │ │ .readSummary(input) 2026-10-25T01:04:53.7976947Z 2646 │ │ .pipe( 2026-10-25T01:04:53.7977072Z 2647 │ │ Effect.exit, 2026-10-25T01:04:53.7977259Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T01:04:53.7977395Z 2649 │ │ Effect.forkChild, 2026-10-25T01:04:53.7977504Z 2650 │ │ ); 2026-10-25T01:04:53.7977647Z 2651 │ │ requestFiber = first; 2026-10-25T01:04:53.7977781Z 2652 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.7977916Z 2653 │ │ dispatcher.flush(); 2026-10-25T01:04:53.7978019Z 2654 │ │ 2026-10-25T01:04:53.7978255Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-25T01:04:53.7978383Z 2656 │ │ Effect.match({ 2026-10-25T01:04:53.7978537Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-25T01:04:53.7978681Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-25T01:04:53.7978795Z 2659 │ │ }), 2026-10-25T01:04:53.7979028Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-25T01:04:53.7979162Z 2661 │ │ Effect.forkChild, 2026-10-25T01:04:53.7979270Z 2662 │ │ ); 2026-10-25T01:04:53.7979379Z 2663 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.7979525Z 2664 │ │ dispatcher.flush(); 2026-10-25T01:04:53.7979679Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-25T01:04:53.7979828Z 2666 │ │ if (secondExit === undefined) { 2026-10-25T01:04:53.7979952Z 2667 │ │ second.interruptUnsafe(); 2026-10-25T01:04:53.7980092Z 2668 │ │ orphanedAt = interruptAt; 2026-10-25T01:04:53.7980296Z 2669 │ │ break; 2026-10-25T01:04:53.7980472Z 2670 │ │ } 2026-10-25T01:04:53.7980606Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-25T01:04:53.7980783Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-25T01:04:53.7980913Z 2673 │ │ } 2026-10-25T01:04:53.7981089Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-25T01:04:53.7981236Z 2675 │ ╰─▶ } 2026-10-25T01:04:53.7981355Z 2676 │ 2026-10-25T01:04:53.7981443Z ╰──── 2026-10-25T01:04:53.7981446Z 2026-10-25T01:04:53.7981749Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7981949Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:217:7] 2026-10-25T01:04:53.7982021Z 213 │ }; 2026-10-25T01:04:53.7982109Z 214 │ useEffect(() => { 2026-10-25T01:04:53.7982234Z ·  ────┬──── 2026-10-25T01:04:53.7982391Z · ╰── This is the containing effect 2026-10-25T01:04:53.7982576Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-25T01:04:53.7982671Z 216 │ if (inserted) { 2026-10-25T01:04:53.7982784Z 217 │ setSelection((current) => 2026-10-25T01:04:53.7982899Z ·  ──────┬───── 2026-10-25T01:04:53.7983081Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7983287Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-25T01:04:53.7983368Z ╰──── 2026-10-25T01:04:53.7984011Z  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-25T01:04:53.7984359Z  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-25T01:04:53.7984362Z 2026-10-25T01:04:53.7984628Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.7984869Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-25T01:04:53.7984984Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-25T01:04:53.7985085Z 287 │ useEffect(() => { 2026-10-25T01:04:53.7985170Z ·  ────┬──── 2026-10-25T01:04:53.7985328Z · ╰── This is the containing effect 2026-10-25T01:04:53.7985499Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-25T01:04:53.7985697Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-25T01:04:53.7985780Z 290 │ const now = Date.now(); 2026-10-25T01:04:53.7985924Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-25T01:04:53.7986013Z 292 │ if ( 2026-10-25T01:04:53.7986135Z 293 │ lastRequest?.key === key && 2026-10-25T01:04:53.7986291Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-25T01:04:53.7986432Z 295 │ ) 2026-10-25T01:04:53.7986558Z 296 │ return; 2026-10-25T01:04:53.7986755Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-25T01:04:53.7986865Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-25T01:04:53.7987002Z ·  ────────────┬─────────── 2026-10-25T01:04:53.7987261Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.7987351Z 299 │ return; 2026-10-25T01:04:53.7987408Z ╰──── 2026-10-25T01:04:53.7988047Z  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-25T01:04:53.7988400Z  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-25T01:04:53.7988403Z 2026-10-25T01:04:53.7988634Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.7988815Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-25T01:04:53.7988919Z 327 │ }, [ 2026-10-25T01:04:53.7988996Z 328 │ draftMessage, 2026-10-25T01:04:53.7989103Z ·  ──────┬───── 2026-10-25T01:04:53.7989278Z · ╰── Unnecessary dependency `draftMessage` 2026-10-25T01:04:53.7989376Z 329 │ environmentId, 2026-10-25T01:04:53.7989451Z ╰──── 2026-10-25T01:04:53.7989776Z  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-25T01:04:53.7990112Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7990115Z 2026-10-25T01:04:53.7990338Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T01:04:53.7990534Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-25T01:04:53.7990650Z 2 │ AuthDiagnosticsReadScope, 2026-10-25T01:04:53.7990786Z 3 │ type AuthSessionState, 2026-10-25T01:04:53.7990897Z ·  ────────┬─────── 2026-10-25T01:04:53.7991047Z · ╰── 'AuthSessionState' is imported here 2026-10-25T01:04:53.7991172Z 4 │ sessionGrantsScope, 2026-10-25T01:04:53.7991253Z ╰──── 2026-10-25T01:04:53.7991381Z  help: Consider removing this import. 2026-10-25T01:04:53.7991384Z 2026-10-25T01:04:53.7991655Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.7991813Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-25T01:04:53.7991903Z 168 │ 2026-10-25T01:04:53.7992008Z 169 │ const layerTest = Layer.succeed( 2026-10-25T01:04:53.7992111Z ·  ────┬──── 2026-10-25T01:04:53.7992252Z · ╰── 'layerTest' is declared here 2026-10-25T01:04:53.7992358Z 170 │ UsageService, 2026-10-25T01:04:53.7992437Z ╰──── 2026-10-25T01:04:53.7992628Z  help: Consider removing this declaration. 2026-10-25T01:04:53.7992664Z 2026-10-25T01:04:53.7992889Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T01:04:53.7993089Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-25T01:04:53.7993240Z 248 │ mountedRef.current = false; 2026-10-25T01:04:53.7993350Z 249 │ flow.setBranchQuery(""); 2026-10-25T01:04:53.7993433Z ·  ──┬─ 2026-10-25T01:04:53.7993579Z · ╰── Missing dependency `flow` 2026-10-25T01:04:53.7993676Z 250 │ }; 2026-10-25T01:04:53.7993781Z 251 │ }, [flow.setBranchQuery]); 2026-10-25T01:04:53.7993880Z ·  ─────────┬───────── 2026-10-25T01:04:53.7994116Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-25T01:04:53.7994203Z 252 │ 2026-10-25T01:04:53.7994287Z ╰──── 2026-10-25T01:04:53.7994717Z  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-25T01:04:53.7995052Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.7995055Z 2026-10-25T01:04:53.7995535Z ⚠ 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-25T01:04:53.7995733Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-25T01:04:53.7995900Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-25T01:04:53.7996056Z 133 │ ╭─▶ for ( 2026-10-25T01:04:53.7996190Z 134 │ │ let attempt = 0; 2026-10-25T01:04:53.7996431Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-25T01:04:53.7996571Z 136 │ │ attempt += 1 2026-10-25T01:04:53.7996681Z 137 │ │ ) { 2026-10-25T01:04:53.7996805Z 138 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.7996962Z 139 │ ╰─▶ } 2026-10-25T01:04:53.7997148Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-25T01:04:53.7997230Z ╰──── 2026-10-25T01:04:53.7997233Z 2026-10-25T01:04:53.7997403Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.7997594Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-25T01:04:53.7997683Z 107 │ ); 2026-10-25T01:04:53.7997873Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-25T01:04:53.7997974Z ·  ─────────┬──────── 2026-10-25T01:04:53.7998156Z · ╰── `separationProgress` originates here 2026-10-25T01:04:53.7998230Z 109 │ 2026-10-25T01:04:53.7998346Z 110 │ useEffect(() => { 2026-10-25T01:04:53.7998538Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-25T01:04:53.7998708Z ·  ─────────┬──────── 2026-10-25T01:04:53.7998981Z · ╰── `separationProgress` cannot be modified 2026-10-25T01:04:53.7999119Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-25T01:04:53.7999190Z ╰──── 2026-10-25T01:04:53.7999481Z  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-25T01:04:53.7999816Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.7999819Z 2026-10-25T01:04:53.7999996Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8000208Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-25T01:04:53.8000335Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-25T01:04:53.8000507Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-25T01:04:53.8000622Z ·  ──────┬───── 2026-10-25T01:04:53.8000792Z · ╰── `capsuleWidth` originates here 2026-10-25T01:04:53.8000921Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T01:04:53.8001065Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T01:04:53.8001203Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T01:04:53.8001320Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T01:04:53.8001403Z 134 │ return; 2026-10-25T01:04:53.8001493Z 135 │ } 2026-10-25T01:04:53.8001632Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T01:04:53.8001819Z 137 │ measuredWidthRef.current = width; 2026-10-25T01:04:53.8001971Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T01:04:53.8002098Z ·  ──────┬───── 2026-10-25T01:04:53.8002268Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T01:04:53.8002354Z 139 │ }; 2026-10-25T01:04:53.8002419Z ╰──── 2026-10-25T01:04:53.8002709Z  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-25T01:04:53.8003042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8003045Z 2026-10-25T01:04:53.8003284Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8003505Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-25T01:04:53.8003619Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-25T01:04:53.8003785Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-25T01:04:53.8003895Z ·  ──────┬───── 2026-10-25T01:04:53.8004060Z · ╰── `capsuleWidth` originates here 2026-10-25T01:04:53.8004181Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T01:04:53.8004331Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T01:04:53.8004517Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T01:04:53.8004640Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T01:04:53.8004718Z 134 │ return; 2026-10-25T01:04:53.8004797Z 135 │ } 2026-10-25T01:04:53.8004954Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T01:04:53.8005068Z 137 │ measuredWidthRef.current = width; 2026-10-25T01:04:53.8005221Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T01:04:53.8005303Z 139 │ }; 2026-10-25T01:04:53.8005430Z 140 │ const hasStatus = props.status !== null; 2026-10-25T01:04:53.8005597Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T01:04:53.8005676Z 142 │ useEffect(() => { 2026-10-25T01:04:53.8005772Z 143 │ if (!hasStatus) { 2026-10-25T01:04:53.8005886Z 144 │ measuredWidthRef.current = null; 2026-10-25T01:04:53.8006014Z 145 │ capsuleWidth.value = null; 2026-10-25T01:04:53.8006107Z ·  ──────┬───── 2026-10-25T01:04:53.8006282Z · ╰── `capsuleWidth` cannot be modified 2026-10-25T01:04:53.8006372Z 146 │ } 2026-10-25T01:04:53.8006458Z ╰──── 2026-10-25T01:04:53.8006737Z  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-25T01:04:53.8007128Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8007131Z 2026-10-25T01:04:53.8007366Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T01:04:53.8007549Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-25T01:04:53.8007731Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-25T01:04:53.8007815Z 142 │ useEffect(() => { 2026-10-25T01:04:53.8007926Z ·  ───┬─── 2026-10-25T01:04:53.8008179Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T01:04:53.8008281Z 143 │ if (!hasStatus) { 2026-10-25T01:04:53.8008387Z 144 │ measuredWidthRef.current = null; 2026-10-25T01:04:53.8008492Z 145 │ capsuleWidth.value = null; 2026-10-25T01:04:53.8008603Z ·  ──────┬───── 2026-10-25T01:04:53.8008760Z · ╰── This modifies `capsuleWidth` 2026-10-25T01:04:53.8008839Z 146 │ } 2026-10-25T01:04:53.8008927Z ╰──── 2026-10-25T01:04:53.8009344Z  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-25T01:04:53.8009704Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8009707Z 2026-10-25T01:04:53.8013698Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T01:04:53.8013881Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-25T01:04:53.8013994Z 130 │ const measuredWidthRef = useRef(null); 2026-10-25T01:04:53.8014106Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-25T01:04:53.8014230Z ·  ───────────────┬─────────────── 2026-10-25T01:04:53.8014480Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-25T01:04:53.8014589Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-25T01:04:53.8014684Z 133 │ if (width === measuredWidthRef.current) { 2026-10-25T01:04:53.8014747Z 134 │ return; 2026-10-25T01:04:53.8014804Z 135 │ } 2026-10-25T01:04:53.8014911Z 136 │ const first = measuredWidthRef.current === null; 2026-10-25T01:04:53.8014994Z 137 │ measuredWidthRef.current = width; 2026-10-25T01:04:53.8015136Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-25T01:04:53.8015213Z ·  ──────┬───── 2026-10-25T01:04:53.8015346Z · ╰── This modifies `capsuleWidth` 2026-10-25T01:04:53.8015399Z 139 │ }; 2026-10-25T01:04:53.8015452Z ╰──── 2026-10-25T01:04:53.8015794Z  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-25T01:04:53.8016100Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8016103Z 2026-10-25T01:04:53.8016362Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.8016490Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-25T01:04:53.8016546Z 727 │ 2026-10-25T01:04:53.8016627Z 728 │ const layer = layerWithOptions(); 2026-10-25T01:04:53.8016698Z ·  ──┬── 2026-10-25T01:04:53.8016823Z · ╰── 'layer' is declared here 2026-10-25T01:04:53.8016880Z ╰──── 2026-10-25T01:04:53.8016989Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8016991Z 2026-10-25T01:04:53.8017181Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.8017327Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-25T01:04:53.8017417Z 35 │ = count) { 2026-10-25T01:04:53.8021074Z 133 │ │ return; 2026-10-25T01:04:53.8021156Z 134 │ │ } 2026-10-25T01:04:53.8021263Z 135 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8021398Z 136 │ ╰─▶ } 2026-10-25T01:04:53.8021564Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-25T01:04:53.8021618Z ╰──── 2026-10-25T01:04:53.8021620Z 2026-10-25T01:04:53.8022080Z ⚠ 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-25T01:04:53.8022216Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-25T01:04:53.8022379Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-25T01:04:53.8022627Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-25T01:04:53.8022734Z 253 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8022862Z 254 │ ╰─▶ } 2026-10-25T01:04:53.8022990Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-25T01:04:53.8023112Z ╰──── 2026-10-25T01:04:53.8023145Z 2026-10-25T01:04:53.8023600Z ⚠ 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-25T01:04:53.8023730Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-25T01:04:53.8023788Z 257 │ 2026-10-25T01:04:53.8024036Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T01:04:53.8024142Z 259 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8024274Z 260 │ ╰─▶ } 2026-10-25T01:04:53.8024381Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T01:04:53.8024438Z ╰──── 2026-10-25T01:04:53.8024440Z 2026-10-25T01:04:53.8024892Z ⚠ 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-25T01:04:53.8025022Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-25T01:04:53.8025081Z 321 │ ); 2026-10-25T01:04:53.8025335Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-25T01:04:53.8025441Z 323 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8025574Z 324 │ ╰─▶ } 2026-10-25T01:04:53.8025632Z 325 │ 2026-10-25T01:04:53.8025689Z ╰──── 2026-10-25T01:04:53.8025692Z 2026-10-25T01:04:53.8026140Z ⚠ 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-25T01:04:53.8026270Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-25T01:04:53.8026433Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-25T01:04:53.8026678Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-25T01:04:53.8026786Z 331 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8026919Z 332 │ ╰─▶ } 2026-10-25T01:04:53.8027025Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-25T01:04:53.8027076Z ╰──── 2026-10-25T01:04:53.8027078Z 2026-10-25T01:04:53.8027327Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-25T01:04:53.8027445Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-25T01:04:53.8027503Z 55 │ 2026-10-25T01:04:53.8027602Z 56 │ function normalizeTerminalContextSelection( 2026-10-25T01:04:53.8027719Z ·  ────────────────┬──────────────── 2026-10-25T01:04:53.8027911Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-25T01:04:53.8028001Z 57 │ selection: TerminalContextSelection, 2026-10-25T01:04:53.8028053Z ╰──── 2026-10-25T01:04:53.8028206Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8028238Z 2026-10-25T01:04:53.8028687Z ⚠ 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-25T01:04:53.8028822Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-25T01:04:53.8028886Z 225 │ ) { 2026-10-25T01:04:53.8029086Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T01:04:53.8029201Z 227 │ │ const socket = sockets[index]; 2026-10-25T01:04:53.8029291Z 228 │ │ if (socket) { 2026-10-25T01:04:53.8029393Z 229 │ │ return socket; 2026-10-25T01:04:53.8029468Z 230 │ │ } 2026-10-25T01:04:53.8029572Z 231 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8029702Z 232 │ ╰─▶ } 2026-10-25T01:04:53.8029878Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-25T01:04:53.8029927Z ╰──── 2026-10-25T01:04:53.8029930Z 2026-10-25T01:04:53.8030430Z ⚠ 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-25T01:04:53.8030563Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-25T01:04:53.8030621Z 239 │ ) { 2026-10-25T01:04:53.8030824Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T01:04:53.8031042Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-25T01:04:53.8031135Z 242 │ │ if (request) { 2026-10-25T01:04:53.8031232Z 243 │ │ return request; 2026-10-25T01:04:53.8031312Z 244 │ │ } 2026-10-25T01:04:53.8031412Z 245 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8031537Z 246 │ ╰─▶ } 2026-10-25T01:04:53.8031705Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-25T01:04:53.8031761Z ╰──── 2026-10-25T01:04:53.8031764Z 2026-10-25T01:04:53.8032020Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T01:04:53.8032188Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-25T01:04:53.8032267Z 89 │ let cursor = prompt.length; 2026-10-25T01:04:53.8032372Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-25T01:04:53.8032478Z ·  ─────── 2026-10-25T01:04:53.8032562Z 91 │ let { start, end } = occurrence; 2026-10-25T01:04:53.8032616Z ╰──── 2026-10-25T01:04:53.8032876Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T01:04:53.8032878Z 2026-10-25T01:04:53.8033083Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T01:04:53.8033217Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-25T01:04:53.8033292Z 2 │ AuthFilesystemReadScope, 2026-10-25T01:04:53.8033363Z 3 │ type AuthSessionState, 2026-10-25T01:04:53.8033447Z ·  ────────┬─────── 2026-10-25T01:04:53.8033594Z · ╰── 'AuthSessionState' is imported here 2026-10-25T01:04:53.8033671Z 4 │ type FilesystemBrowseEntry, 2026-10-25T01:04:53.8033723Z ╰──── 2026-10-25T01:04:53.8033820Z  help: Consider removing this import. 2026-10-25T01:04:53.8033823Z 2026-10-25T01:04:53.8034011Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-25T01:04:53.8034138Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-25T01:04:53.8034255Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-25T01:04:53.8034325Z 187 │ let next = initial; 2026-10-25T01:04:53.8034400Z ·  ──┬─ 2026-10-25T01:04:53.8034527Z · ╰── From this accumulator 2026-10-25T01:04:53.8034611Z 188 │ let receivedSnapshot = false; 2026-10-25T01:04:53.8034685Z 189 │ for (const item of items) { 2026-10-25T01:04:53.8034757Z ·  ─┬─ 2026-10-25T01:04:53.8034865Z · ╰── For this loop 2026-10-25T01:04:53.8034958Z 190 │ if (item.kind === "synchronized") { 2026-10-25T01:04:53.8035027Z 191 │ waiting = false; 2026-10-25T01:04:53.8035121Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-25T01:04:53.8035240Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-25T01:04:53.8035338Z ·  ───┬─── 2026-10-25T01:04:53.8035469Z · ╰── From this spread 2026-10-25T01:04:53.8035532Z 194 │ } 2026-10-25T01:04:53.8035587Z ╰──── 2026-10-25T01:04:53.8035744Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-25T01:04:53.8035899Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-25T01:04:53.8035902Z 2026-10-25T01:04:53.8036115Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-25T01:04:53.8036241Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-25T01:04:53.8036299Z 40 │ 2026-10-25T01:04:53.8036407Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-25T01:04:53.8036573Z ·  ─────── 2026-10-25T01:04:53.8036706Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-25T01:04:53.8036760Z ╰──── 2026-10-25T01:04:53.8037015Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-25T01:04:53.8037017Z 2026-10-25T01:04:53.8037460Z ⚠ 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-25T01:04:53.8037588Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-25T01:04:53.8037761Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-25T01:04:53.8037951Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T01:04:53.8038065Z ·  ─────────────────── 2026-10-25T01:04:53.8038178Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T01:04:53.8038234Z ╰──── 2026-10-25T01:04:53.8038237Z 2026-10-25T01:04:53.8038676Z ⚠ 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-25T01:04:53.8038795Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-25T01:04:53.8038980Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-25T01:04:53.8039089Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-25T01:04:53.8039213Z ·  ─────────────────── 2026-10-25T01:04:53.8039332Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-25T01:04:53.8039386Z ╰──── 2026-10-25T01:04:53.8039388Z 2026-10-25T01:04:53.8039557Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8039718Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-25T01:04:53.8039899Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-25T01:04:53.8040064Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-25T01:04:53.8040204Z ·  ─────┬──── 2026-10-25T01:04:53.8040422Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8040561Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-25T01:04:53.8040612Z ╰──── 2026-10-25T01:04:53.8040903Z  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-25T01:04:53.8041201Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8041203Z 2026-10-25T01:04:53.8041373Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8041533Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-25T01:04:53.8041656Z 718 │ const snoozePresets = useMemo( 2026-10-25T01:04:53.8041868Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T01:04:53.8042003Z ·  ─────┬──── 2026-10-25T01:04:53.8042185Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8042302Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T01:04:53.8042356Z ╰──── 2026-10-25T01:04:53.8042631Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T01:04:53.8042927Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8042932Z 2026-10-25T01:04:53.8043114Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T01:04:53.8043267Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-25T01:04:53.8043443Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-25T01:04:53.8043558Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-25T01:04:53.8043654Z ·  ────────────┬─────────── 2026-10-25T01:04:53.8043827Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-25T01:04:53.8043886Z 721 │ ); 2026-10-25T01:04:53.8043939Z ╰──── 2026-10-25T01:04:53.8044260Z  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-25T01:04:53.8044651Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8044655Z 2026-10-25T01:04:53.8044838Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T01:04:53.8044995Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-25T01:04:53.8045067Z 765 │ thread.pinnedAt, 2026-10-25T01:04:53.8045129Z 766 │ variant, 2026-10-25T01:04:53.8045207Z ·  ───┬─── 2026-10-25T01:04:53.8045346Z · ╰── Unnecessary dependency `variant` 2026-10-25T01:04:53.8045407Z 767 │ ], 2026-10-25T01:04:53.8045458Z ╰──── 2026-10-25T01:04:53.8045779Z  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-25T01:04:53.8046091Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8046093Z 2026-10-25T01:04:53.8046290Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.8046449Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-25T01:04:53.8046772Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-25T01:04:53.8046910Z 1216 │ 2026-10-25T01:04:53.8047092Z ·  ────────────────────────── 2026-10-25T01:04:53.8047240Z 1217 │ 2026-10-25T01:04:53.8047293Z ╰──── 2026-10-25T01:04:53.8047448Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T01:04:53.8047451Z 2026-10-25T01:04:53.8047654Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-25T01:04:53.8047748Z ╭─[apps/web/src/types.ts:22:3] 2026-10-25T01:04:53.8047819Z 21 │ EnvironmentThreadShell, 2026-10-25T01:04:53.8047888Z 22 │ ThreadRunSummary, 2026-10-25T01:04:53.8047972Z ·  ────────┬─────── 2026-10-25T01:04:53.8048117Z · ╰── 'ThreadRunSummary' is imported here 2026-10-25T01:04:53.8048185Z 23 │ ThreadRuntimeSummary, 2026-10-25T01:04:53.8048246Z ╰──── 2026-10-25T01:04:53.8048350Z  help: Consider removing this import. 2026-10-25T01:04:53.8048353Z 2026-10-25T01:04:53.8048567Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T01:04:53.8048711Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-25T01:04:53.8048816Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-25T01:04:53.8048946Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-25T01:04:53.8049043Z ·  ────────────┬──────────── 2026-10-25T01:04:53.8049213Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-25T01:04:53.8049271Z 774 │ } 2026-10-25T01:04:53.8049482Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-25T01:04:53.8049596Z ·  ────────────────┬──────────────── 2026-10-25T01:04:53.8049878Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-25T01:04:53.8049931Z 776 │ 2026-10-25T01:04:53.8049986Z ╰──── 2026-10-25T01:04:53.8050439Z  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-25T01:04:53.8050749Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8050752Z 2026-10-25T01:04:53.8050911Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8051057Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-25T01:04:53.8051220Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-25T01:04:53.8051356Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-25T01:04:53.8051448Z ·  ──────────┬───────── 2026-10-25T01:04:53.8051603Z · ╰── `animatedBorderRadius` originates here 2026-10-25T01:04:53.8051761Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-25T01:04:53.8051833Z 390 │ useLayoutEffect(() => { 2026-10-25T01:04:53.8051935Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-25T01:04:53.8052074Z ·  ──────────┬───────── 2026-10-25T01:04:53.8052266Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-25T01:04:53.8052357Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-25T01:04:53.8052410Z ╰──── 2026-10-25T01:04:53.8052671Z  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-25T01:04:53.8052976Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8052978Z 2026-10-25T01:04:53.8053146Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8053268Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-25T01:04:53.8053374Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-25T01:04:53.8053535Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-25T01:04:53.8053661Z ·  ─────┬──── 2026-10-25T01:04:53.8053830Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8053909Z 822 │ return AsyncResult.failure( 2026-10-25T01:04:53.8053964Z ╰──── 2026-10-25T01:04:53.8054237Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T01:04:53.8054527Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8054532Z 2026-10-25T01:04:53.8054705Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8054828Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-25T01:04:53.8054901Z 708 │ const wokeAt = resolved 2026-10-25T01:04:53.8055037Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-25T01:04:53.8055150Z ·  ─────┬──── 2026-10-25T01:04:53.8055306Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8055369Z 710 │ : null; 2026-10-25T01:04:53.8055421Z ╰──── 2026-10-25T01:04:53.8055690Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T01:04:53.8056021Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8056061Z 2026-10-25T01:04:53.8056224Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-25T01:04:53.8056415Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-25T01:04:53.8056552Z 219 │ 2026-10-25T01:04:53.8056689Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-25T01:04:53.8056794Z ·  ──┬─ 2026-10-25T01:04:53.8056959Z · ╰── 'U+001B' is a control character. 2026-10-25T01:04:53.8057029Z 221 │ 2026-10-25T01:04:53.8057084Z ╰──── 2026-10-25T01:04:53.8057310Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-25T01:04:53.8057312Z 2026-10-25T01:04:53.8057568Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.8057699Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-25T01:04:53.8057753Z 3404 │ 2026-10-25T01:04:53.8057939Z 3405 │ const layer: Layer.Layer = 2026-10-25T01:04:53.8058012Z ·  ──┬── 2026-10-25T01:04:53.8058136Z · ╰── 'layer' is declared here 2026-10-25T01:04:53.8058259Z 3406 │ Layer.effect( 2026-10-25T01:04:53.8058315Z ╰──── 2026-10-25T01:04:53.8058422Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8058425Z 2026-10-25T01:04:53.8058683Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8058869Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-25T01:04:53.8058920Z 117 │ 2026-10-25T01:04:53.8058986Z 118 │ useEffect(() => { 2026-10-25T01:04:53.8059058Z ·  ────┬──── 2026-10-25T01:04:53.8059187Z · ╰── This is the containing effect 2026-10-25T01:04:53.8059266Z 119 │ void refreshNotifications(); 2026-10-25T01:04:53.8059359Z ·  ──────────┬───────── 2026-10-25T01:04:53.8059540Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8059686Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-25T01:04:53.8059736Z ╰──── 2026-10-25T01:04:53.8060334Z  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-25T01:04:53.8060688Z  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-25T01:04:53.8060691Z 2026-10-25T01:04:53.8061006Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8061226Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-25T01:04:53.8061277Z 125 │ 2026-10-25T01:04:53.8061342Z 126 │ useEffect(() => { 2026-10-25T01:04:53.8061413Z ·  ────┬──── 2026-10-25T01:04:53.8061541Z · ╰── This is the containing effect 2026-10-25T01:04:53.8061605Z 127 │ if (!isLoaded) { 2026-10-25T01:04:53.8061696Z 128 │ setLiveActivityStatus("checking"); 2026-10-25T01:04:53.8061786Z ·  ──────────┬────────── 2026-10-25T01:04:53.8061955Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8062016Z 129 │ return; 2026-10-25T01:04:53.8062069Z ╰──── 2026-10-25T01:04:53.8062659Z  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-25T01:04:53.8062980Z  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-25T01:04:53.8062982Z 2026-10-25T01:04:53.8063443Z ⚠ 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-25T01:04:53.8063566Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-25T01:04:53.8063622Z 499 │ 2026-10-25T01:04:53.8063741Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-25T01:04:53.8063859Z ·  ────────────────────────── 2026-10-25T01:04:53.8063966Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-25T01:04:53.8064019Z ╰──── 2026-10-25T01:04:53.8064022Z 2026-10-25T01:04:53.8064226Z ⚠ eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used. 2026-10-25T01:04:53.8064382Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8] 2026-10-25T01:04:53.8064463Z  9 │ hasScheduledTaskDraftChanges, 2026-10-25T01:04:53.8064533Z 10 │ type ScheduledTaskDraft, 2026-10-25T01:04:53.8064621Z ·  ─────────┬──────── 2026-10-25T01:04:53.8064780Z · ╰── 'ScheduledTaskDraft' is imported here 2026-10-25T01:04:53.8064859Z 11 │ } from "./scheduledTaskDraft"; 2026-10-25T01:04:53.8064909Z ╰──── 2026-10-25T01:04:53.8065006Z  help: Consider removing this import. 2026-10-25T01:04:53.8065008Z 2026-10-25T01:04:53.8065188Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T01:04:53.8065344Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85] 2026-10-25T01:04:53.8065445Z 80 │ const startEditor = startScheduledTaskEditor; 2026-10-25T01:04:53.8065624Z 81 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-25T01:04:53.8065768Z ·  ─────┬───── 2026-10-25T01:04:53.8066024Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T01:04:53.8066132Z 82 │ const readEditor = useCallback( 2026-10-25T01:04:53.8066184Z ╰──── 2026-10-25T01:04:53.8066496Z  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-25T01:04:53.8066804Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8066807Z 2026-10-25T01:04:53.8066984Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T01:04:53.8067140Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7] 2026-10-25T01:04:53.8067209Z 101 │ setEditor, 2026-10-25T01:04:53.8067276Z 102 │ startEditor, 2026-10-25T01:04:53.8067354Z ·  ─────┬───── 2026-10-25T01:04:53.8067496Z · ╰── Unnecessary dependency `startEditor` 2026-10-25T01:04:53.8067560Z 103 │ hasChanges, 2026-10-25T01:04:53.8067610Z ╰──── 2026-10-25T01:04:53.8067914Z  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-25T01:04:53.8068217Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8068220Z 2026-10-25T01:04:53.8068419Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-25T01:04:53.8068547Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-25T01:04:53.8068620Z 37 │ get isConnected() { 2026-10-25T01:04:53.8068711Z 38 │ let current: FakeElement | null = this; 2026-10-25T01:04:53.8068784Z ·  ─────── 2026-10-25T01:04:53.8068856Z 39 │ while (current?.parent) { 2026-10-25T01:04:53.8068907Z ╰──── 2026-10-25T01:04:53.8069174Z  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-25T01:04:53.8069177Z 2026-10-25T01:04:53.8069546Z ⚠ 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-25T01:04:53.8069661Z ╭─[packages/effect-acp/src/client.ts:1270:11] 2026-10-25T01:04:53.8069817Z 1269 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-25T01:04:53.8069992Z 1270 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-25T01:04:53.8070097Z ·  ────────────────────────── 2026-10-25T01:04:53.8070244Z 1271 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-25T01:04:53.8070298Z ╰──── 2026-10-25T01:04:53.8070301Z 2026-10-25T01:04:53.8070666Z ⚠ 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-25T01:04:53.8070781Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-25T01:04:53.8070941Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-25T01:04:53.8071111Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-25T01:04:53.8071220Z ·  ───────── 2026-10-25T01:04:53.8071278Z 19 │ expect( 2026-10-25T01:04:53.8071331Z ╰──── 2026-10-25T01:04:53.8071334Z 2026-10-25T01:04:53.8071658Z ⚠ 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-25T01:04:53.8071773Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-25T01:04:53.8071832Z 19 │ expect( 2026-10-25T01:04:53.8072000Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-25T01:04:53.8072073Z ·  ───────── 2026-10-25T01:04:53.8072135Z 21 │ ).toBe(true); 2026-10-25T01:04:53.8072184Z ╰──── 2026-10-25T01:04:53.8072193Z 2026-10-25T01:04:53.8072649Z ⚠ 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-25T01:04:53.8072770Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-25T01:04:53.8072864Z 128 │ const secret = "acp-summary-secret"; 2026-10-25T01:04:53.8072972Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-25T01:04:53.8073086Z ·  ────────────────────────── 2026-10-25T01:04:53.8073157Z 130 │ Schema.Struct({ 2026-10-25T01:04:53.8073207Z ╰──── 2026-10-25T01:04:53.8073210Z 2026-10-25T01:04:53.8073427Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T01:04:53.8073558Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-25T01:04:53.8073631Z 113 │ const declared = { 2026-10-25T01:04:53.8073723Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-25T01:04:53.8073834Z ·  ──────────────────────────────── 2026-10-25T01:04:53.8073935Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T01:04:53.8073987Z ╰──── 2026-10-25T01:04:53.8074249Z  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-25T01:04:53.8074252Z 2026-10-25T01:04:53.8074470Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T01:04:53.8074593Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-25T01:04:53.8074690Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-25T01:04:53.8074796Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T01:04:53.8074917Z ·  ──────────────────────────────────────── 2026-10-25T01:04:53.8075014Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T01:04:53.8075065Z ╰──── 2026-10-25T01:04:53.8075324Z  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-25T01:04:53.8075327Z 2026-10-25T01:04:53.8075542Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-25T01:04:53.8075665Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-25T01:04:53.8075764Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-25T01:04:53.8075918Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-25T01:04:53.8076059Z ·  ──────────────────────────────────── 2026-10-25T01:04:53.8076123Z 117 │ }; 2026-10-25T01:04:53.8076172Z ╰──── 2026-10-25T01:04:53.8076431Z  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-25T01:04:53.8076434Z 2026-10-25T01:04:53.8076626Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-25T01:04:53.8076763Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-25T01:04:53.8076824Z 1 │ import type { 2026-10-25T01:04:53.8076887Z 2 │ EnvironmentId, 2026-10-25T01:04:53.8076964Z ·  ──────┬────── 2026-10-25T01:04:53.8077108Z · ╰── 'EnvironmentId' is imported here 2026-10-25T01:04:53.8077194Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-25T01:04:53.8077246Z ╰──── 2026-10-25T01:04:53.8077346Z  help: Consider removing this import. 2026-10-25T01:04:53.8077348Z 2026-10-25T01:04:53.8077513Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8077646Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-25T01:04:53.8077780Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-25T01:04:53.8077928Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-25T01:04:53.8078051Z ·  ─────┬──── 2026-10-25T01:04:53.8078224Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8078325Z 141 │ onSelect={(selected) => { 2026-10-25T01:04:53.8078377Z ╰──── 2026-10-25T01:04:53.8078653Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-25T01:04:53.8078941Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8078946Z 2026-10-25T01:04:53.8079220Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-25T01:04:53.8079349Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-25T01:04:53.8079458Z 248 │ }, 2026-10-25T01:04:53.8079572Z 249 │ (effect, flow, stopSessions) => 2026-10-25T01:04:53.8079662Z ·  ──────┬───── 2026-10-25T01:04:53.8079807Z · ╰── 'stopSessions' is declared here 2026-10-25T01:04:53.8079872Z 250 │ effect.pipe( 2026-10-25T01:04:53.8079925Z ╰──── 2026-10-25T01:04:53.8080026Z  help: Consider removing this parameter. 2026-10-25T01:04:53.8080029Z 2026-10-25T01:04:53.8080515Z ⚠ 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-25T01:04:53.8080692Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-25T01:04:53.8080768Z 222 │ let idlePasses = 0; 2026-10-25T01:04:53.8080912Z 223 │ ╭─▶ for (;;) { 2026-10-25T01:04:53.8081055Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-25T01:04:53.8081197Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-25T01:04:53.8081291Z 226 │ │ if (!pending) { 2026-10-25T01:04:53.8081382Z 227 │ │ idlePasses++; 2026-10-25T01:04:53.8081487Z 228 │ │ if (idlePasses >= 3) { 2026-10-25T01:04:53.8081573Z 229 │ │ return; 2026-10-25T01:04:53.8081650Z 230 │ │ } 2026-10-25T01:04:53.8081734Z 231 │ │ continue; 2026-10-25T01:04:53.8081817Z 232 │ │ } 2026-10-25T01:04:53.8081914Z 233 │ │ idlePasses = 0; 2026-10-25T01:04:53.8082028Z 234 │ │ const exit = yield* Effect.exit( 2026-10-25T01:04:53.8082236Z 235 │ │ pending.operation as Effect.Effect, 2026-10-25T01:04:53.8082314Z 236 │ │ ); 2026-10-25T01:04:53.8082421Z 237 │ │ yield* Effect.sync(() => { 2026-10-25T01:04:53.8082527Z 238 │ │ pending.resolve(exit); 2026-10-25T01:04:53.8082602Z 239 │ │ }); 2026-10-25T01:04:53.8082731Z 240 │ ╰─▶ } 2026-10-25T01:04:53.8082789Z 241 │ }, 2026-10-25T01:04:53.8082840Z ╰──── 2026-10-25T01:04:53.8082843Z 2026-10-25T01:04:53.8083128Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.8083284Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-25T01:04:53.8083339Z 14 │ 2026-10-25T01:04:53.8083412Z 15 │ const legacyCredentials = { 2026-10-25T01:04:53.8083496Z ·  ────────┬──────── 2026-10-25T01:04:53.8083641Z · ╰── 'legacyCredentials' is declared here 2026-10-25T01:04:53.8083711Z 16 │ version: 1 as const, 2026-10-25T01:04:53.8083763Z ╰──── 2026-10-25T01:04:53.8083864Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8083868Z 2026-10-25T01:04:53.8084064Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-25T01:04:53.8084249Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-25T01:04:53.8084376Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-25T01:04:53.8084465Z 24 │ import * as Duration from "effect/Duration"; 2026-10-25T01:04:53.8084541Z ·  ────┬─── 2026-10-25T01:04:53.8084672Z · ╰── 'Duration' is imported here 2026-10-25T01:04:53.8084759Z 25 │ import * as Effect from "effect/Effect"; 2026-10-25T01:04:53.8084812Z ╰──── 2026-10-25T01:04:53.8084906Z  help: Consider removing this import. 2026-10-25T01:04:53.8084908Z 2026-10-25T01:04:53.8085073Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8085197Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-25T01:04:53.8085300Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-25T01:04:53.8085368Z 1136 │ Date.now(), 2026-10-25T01:04:53.8085449Z ·  ─────┬──── 2026-10-25T01:04:53.8085583Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8085720Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-25T01:04:53.8085771Z ╰──── 2026-10-25T01:04:53.8086051Z  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-25T01:04:53.8086341Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8086343Z 2026-10-25T01:04:53.8086491Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8086650Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-25T01:04:53.8086709Z 276 │ 2026-10-25T01:04:53.8086890Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-25T01:04:53.8086984Z 278 │ │ ...nativeProps, 2026-10-25T01:04:53.8087124Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-25T01:04:53.8087216Z 280 │ │ ref: nativeRef, 2026-10-25T01:04:53.8087343Z 281 │ ├─▶ }); 2026-10-25T01:04:53.8087579Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.8087640Z 282 │ } 2026-10-25T01:04:53.8087693Z ╰──── 2026-10-25T01:04:53.8088155Z  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-25T01:04:53.8088439Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8088441Z 2026-10-25T01:04:53.8088648Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-25T01:04:53.8088771Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-25T01:04:53.8088825Z 78 │ 2026-10-25T01:04:53.8089007Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-25T01:04:53.8089201Z ·  ────────┬─────── 2026-10-25T01:04:53.8089347Z · ╰── 'describeSchedule' is declared here 2026-10-25T01:04:53.8089454Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-25T01:04:53.8089504Z ╰──── 2026-10-25T01:04:53.8089606Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8089608Z 2026-10-25T01:04:53.8090068Z ⚠ 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-25T01:04:53.8090246Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-25T01:04:53.8090318Z 520 │ })).delivery; 2026-10-25T01:04:53.8090550Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-25T01:04:53.8090667Z 522 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8090813Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-25T01:04:53.8090913Z 524 │ │ id: task.id, 2026-10-25T01:04:53.8091027Z 525 │ │ deliveryId: deliveryId!, 2026-10-25T01:04:53.8091125Z 526 │ │ })).delivery; 2026-10-25T01:04:53.8091260Z 527 │ ╰─▶ } 2026-10-25T01:04:53.8091376Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-25T01:04:53.8091429Z ╰──── 2026-10-25T01:04:53.8091431Z 2026-10-25T01:04:53.8091580Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8091738Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-25T01:04:53.8091894Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T01:04:53.8092016Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T01:04:53.8092137Z ·  ───────────┬────────── 2026-10-25T01:04:53.8092310Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8092427Z 123 │ const sessionRef = useRef(null); 2026-10-25T01:04:53.8092478Z ╰──── 2026-10-25T01:04:53.8092941Z  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-25T01:04:53.8093230Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8093232Z 2026-10-25T01:04:53.8093373Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8093529Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-25T01:04:53.8093581Z 125 │ 2026-10-25T01:04:53.8093690Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T01:04:53.8093776Z ·  ─────────┬──────── 2026-10-25T01:04:53.8093978Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8094112Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T01:04:53.8094162Z ╰──── 2026-10-25T01:04:53.8094615Z  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-25T01:04:53.8094897Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8094899Z 2026-10-25T01:04:53.8095076Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8095237Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-25T01:04:53.8095290Z 125 │ 2026-10-25T01:04:53.8095398Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T01:04:53.8095488Z ·  ─────────┬───────── 2026-10-25T01:04:53.8095646Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8095747Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T01:04:53.8095795Z ╰──── 2026-10-25T01:04:53.8096249Z  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-25T01:04:53.8096534Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8096536Z 2026-10-25T01:04:53.8096682Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8096840Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-25T01:04:53.8096890Z 125 │ 2026-10-25T01:04:53.8096998Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T01:04:53.8097110Z ·  ─────────┬───────── 2026-10-25T01:04:53.8097276Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8097373Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T01:04:53.8097425Z ╰──── 2026-10-25T01:04:53.8097932Z  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-25T01:04:53.8098312Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8098315Z 2026-10-25T01:04:53.8098457Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8098610Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-25T01:04:53.8098662Z 125 │ 2026-10-25T01:04:53.8098767Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T01:04:53.8098879Z ·  ──────────┬───────── 2026-10-25T01:04:53.8099040Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8099144Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T01:04:53.8099199Z ╰──── 2026-10-25T01:04:53.8099653Z  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-25T01:04:53.8099933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8099938Z 2026-10-25T01:04:53.8100075Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8100230Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-25T01:04:53.8100340Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T01:04:53.8100573Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-25T01:04:53.8100744Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T01:04:53.8100868Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-25T01:04:53.8101020Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T01:04:53.8101137Z 131 │ │ isFinished: status.isFinished, 2026-10-25T01:04:53.8101309Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T01:04:53.8101412Z 133 │ │ error: status.error, 2026-10-25T01:04:53.8101510Z 134 │ │ url: status.url, 2026-10-25T01:04:53.8101597Z 135 │ │ }); 2026-10-25T01:04:53.8101676Z 136 │ │ }, 2026-10-25T01:04:53.8101873Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T01:04:53.8101982Z 138 │ │ selectInput: (inputs) => { 2026-10-25T01:04:53.8102134Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T01:04:53.8102277Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T01:04:53.8102441Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T01:04:53.8102578Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-25T01:04:53.8102680Z 143 │ │ if (order !== known) { 2026-10-25T01:04:53.8102878Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T01:04:53.8103026Z 145 │ │ transform: (current) => ({ 2026-10-25T01:04:53.8103228Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T01:04:53.8103314Z 147 │ │ }), 2026-10-25T01:04:53.8103396Z 148 │ │ }); 2026-10-25T01:04:53.8103472Z 149 │ │ } 2026-10-25T01:04:53.8103613Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-25T01:04:53.8103689Z 151 │ │ }, 2026-10-25T01:04:53.8103819Z 152 │ ├─▶ }); 2026-10-25T01:04:53.8104056Z · ╰──── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.8104143Z 153 │ recorderRef.current = recorder; 2026-10-25T01:04:53.8104195Z ╰──── 2026-10-25T01:04:53.8104651Z  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-25T01:04:53.8104933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8104938Z 2026-10-25T01:04:53.8105077Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8105238Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-25T01:04:53.8105298Z 152 │ }); 2026-10-25T01:04:53.8105380Z 153 │ recorderRef.current = recorder; 2026-10-25T01:04:53.8105490Z ·  ─────┬─────────┬─── 2026-10-25T01:04:53.8105736Z · │ ╰── Cannot update ref value during render 2026-10-25T01:04:53.8105887Z · ╰── This value is a ref 2026-10-25T01:04:53.8105992Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T01:04:53.8106041Z ╰──── 2026-10-25T01:04:53.8106501Z  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-25T01:04:53.8106791Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8106797Z 2026-10-25T01:04:53.8106941Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8107094Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-25T01:04:53.8107178Z 153 │ recorderRef.current = recorder; 2026-10-25T01:04:53.8107366Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-25T01:04:53.8107451Z 155 │ │ recorder, 2026-10-25T01:04:53.8107580Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T01:04:53.8107695Z 157 │ │ requestPermission: async () => { 2026-10-25T01:04:53.8107912Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T01:04:53.8108135Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T01:04:53.8108213Z 160 │ │ }, 2026-10-25T01:04:53.8108352Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T01:04:53.8108487Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T01:04:53.8108620Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T01:04:53.8108732Z 164 │ │ onStateChange: (nextState) => 2026-10-25T01:04:53.8108820Z 165 │ │ setState({ 2026-10-25T01:04:53.8108927Z 166 │ │ state: nextState, 2026-10-25T01:04:53.8109068Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T01:04:53.8109197Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-25T01:04:53.8109276Z 169 │ │ }), 2026-10-25T01:04:53.8109404Z 170 │ ├─▶ }); 2026-10-25T01:04:53.8109603Z · ╰──── Cannot access ref value during render 2026-10-25T01:04:53.8109660Z 171 │ } 2026-10-25T01:04:53.8109710Z ╰──── 2026-10-25T01:04:53.8110175Z  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-25T01:04:53.8110511Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8110514Z 2026-10-25T01:04:53.8110657Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8110813Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-25T01:04:53.8110893Z 153 │ recorderRef.current = recorder; 2026-10-25T01:04:53.8110995Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T01:04:53.8111106Z ·  ─────┬────────┬─── 2026-10-25T01:04:53.8111285Z · │ ╰── Cannot update ref value during render 2026-10-25T01:04:53.8111405Z · ╰── This value is a ref 2026-10-25T01:04:53.8111473Z 155 │ recorder, 2026-10-25T01:04:53.8111526Z ╰──── 2026-10-25T01:04:53.8111977Z  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-25T01:04:53.8112256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8112260Z 2026-10-25T01:04:53.8112400Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8112555Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-25T01:04:53.8112642Z 184 │ return () => subscription.remove(); 2026-10-25T01:04:53.8112756Z 185 │ }, [controller]); 2026-10-25T01:04:53.8112862Z ·  ─────┬──── 2026-10-25T01:04:53.8113006Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8113058Z 186 │ 2026-10-25T01:04:53.8113108Z ╰──── 2026-10-25T01:04:53.8113559Z  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-25T01:04:53.8113843Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8113845Z 2026-10-25T01:04:53.8113989Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8114146Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-25T01:04:53.8114230Z 184 │ return () => subscription.remove(); 2026-10-25T01:04:53.8114293Z 185 │ }, [controller]); 2026-10-25T01:04:53.8114370Z ·  ──────┬───── 2026-10-25T01:04:53.8114510Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8114561Z 186 │ 2026-10-25T01:04:53.8114612Z ╰──── 2026-10-25T01:04:53.8115063Z  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-25T01:04:53.8115350Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8115355Z 2026-10-25T01:04:53.8115494Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8115644Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-25T01:04:53.8115701Z 191 │ }, 2026-10-25T01:04:53.8115772Z 192 │ [controller, recorder], 2026-10-25T01:04:53.8115848Z ·  ─────┬──── 2026-10-25T01:04:53.8115986Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8116041Z 193 │ ); 2026-10-25T01:04:53.8116092Z ╰──── 2026-10-25T01:04:53.8116552Z  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-25T01:04:53.8116835Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8116841Z 2026-10-25T01:04:53.8116980Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8117135Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-25T01:04:53.8117226Z 174 │ const controller = session.controller; 2026-10-25T01:04:53.8117314Z 175 │ const recorder = recorderRef.current; 2026-10-25T01:04:53.8117415Z ·  ─────────┬───────── 2026-10-25T01:04:53.8117569Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8117622Z 176 │ 2026-10-25T01:04:53.8117717Z ╰──── 2026-10-25T01:04:53.8118197Z  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-25T01:04:53.8118479Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8118481Z 2026-10-25T01:04:53.8118621Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8118777Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-25T01:04:53.8118847Z 191 │ }, 2026-10-25T01:04:53.8118918Z 192 │ [controller, recorder], 2026-10-25T01:04:53.8119009Z ·  ───────────┬────────── 2026-10-25T01:04:53.8119157Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8119210Z 193 │ ); 2026-10-25T01:04:53.8119260Z ╰──── 2026-10-25T01:04:53.8119712Z  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-25T01:04:53.8119994Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8119997Z 2026-10-25T01:04:53.8120137Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8120292Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-25T01:04:53.8120395Z 245 │ return () => clearInterval(intervalId); 2026-10-25T01:04:53.8120532Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T01:04:53.8120620Z ·  ─────┬──── 2026-10-25T01:04:53.8120770Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8120824Z 247 │ 2026-10-25T01:04:53.8120875Z ╰──── 2026-10-25T01:04:53.8121327Z  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-25T01:04:53.8121613Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8121621Z 2026-10-25T01:04:53.8121758Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8121913Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-25T01:04:53.8122002Z 245 │ return () => clearInterval(intervalId); 2026-10-25T01:04:53.8122116Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-25T01:04:53.8122244Z ·  ────────────────────────┬─────────────────────── 2026-10-25T01:04:53.8122400Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8122454Z 247 │ 2026-10-25T01:04:53.8122504Z ╰──── 2026-10-25T01:04:53.8123003Z  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-25T01:04:53.8123318Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8123320Z 2026-10-25T01:04:53.8123462Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8123615Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-25T01:04:53.8123683Z 260 │ setOwnerFocused, 2026-10-25T01:04:53.8123743Z 261 │ session, 2026-10-25T01:04:53.8123817Z ·  ───┬─── 2026-10-25T01:04:53.8123954Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8124011Z 262 │ stop, 2026-10-25T01:04:53.8124068Z ╰──── 2026-10-25T01:04:53.8124522Z  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-25T01:04:53.8124807Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8124810Z 2026-10-25T01:04:53.8124952Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8125105Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-25T01:04:53.8125159Z 250 │ 2026-10-25T01:04:53.8125297Z 251 │ ╭─▶ return { 2026-10-25T01:04:53.8125511Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-25T01:04:53.8125591Z 253 │ │ state, 2026-10-25T01:04:53.8125681Z 254 │ │ audioLevels, 2026-10-25T01:04:53.8125774Z 255 │ │ elapsedSeconds, 2026-10-25T01:04:53.8125902Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-25T01:04:53.8125980Z 257 │ │ ownerKey, 2026-10-25T01:04:53.8126061Z 258 │ │ label, 2026-10-25T01:04:53.8126152Z 259 │ │ focusedOwners, 2026-10-25T01:04:53.8126246Z 260 │ │ setOwnerFocused, 2026-10-25T01:04:53.8126325Z 261 │ │ session, 2026-10-25T01:04:53.8126450Z 262 │ │ stop, 2026-10-25T01:04:53.8126564Z 263 │ │ cancel, 2026-10-25T01:04:53.8126693Z 264 │ ├─▶ }; 2026-10-25T01:04:53.8126887Z · ╰──── Cannot access ref value during render 2026-10-25T01:04:53.8126942Z 265 │ } 2026-10-25T01:04:53.8126992Z ╰──── 2026-10-25T01:04:53.8127446Z  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-25T01:04:53.8127725Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8127729Z 2026-10-25T01:04:53.8127886Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8128046Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-25T01:04:53.8128201Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-25T01:04:53.8128323Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-25T01:04:53.8128400Z ·  ─────┬───── 2026-10-25T01:04:53.8128535Z · ╰── `audioLevels` originates here 2026-10-25T01:04:53.8128654Z 123 │ const sessionRef = useRef(null); 2026-10-25T01:04:53.8128801Z 124 │ const recorderRef = useRef | null>(null); 2026-10-25T01:04:53.8128853Z 125 │ 2026-10-25T01:04:53.8128968Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-25T01:04:53.8129070Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-25T01:04:53.8129208Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-25T01:04:53.8129301Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-25T01:04:53.8129422Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-25T01:04:53.8129508Z 131 │ isFinished: status.isFinished, 2026-10-25T01:04:53.8129648Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-25T01:04:53.8129721Z 133 │ error: status.error, 2026-10-25T01:04:53.8129791Z 134 │ url: status.url, 2026-10-25T01:04:53.8129851Z 135 │ }); 2026-10-25T01:04:53.8129909Z 136 │ }, 2026-10-25T01:04:53.8130077Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-25T01:04:53.8130160Z 138 │ selectInput: (inputs) => { 2026-10-25T01:04:53.8130284Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-25T01:04:53.8130407Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-25T01:04:53.8130565Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-25T01:04:53.8130673Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-25T01:04:53.8130745Z 143 │ if (order !== known) { 2026-10-25T01:04:53.8130850Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-25T01:04:53.8130931Z 145 │ transform: (current) => ({ 2026-10-25T01:04:53.8131102Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-25T01:04:53.8131163Z 147 │ }), 2026-10-25T01:04:53.8131271Z 148 │ }); 2026-10-25T01:04:53.8131355Z 149 │ } 2026-10-25T01:04:53.8131463Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-25T01:04:53.8131521Z 151 │ }, 2026-10-25T01:04:53.8131573Z 152 │ }); 2026-10-25T01:04:53.8131656Z 153 │ recorderRef.current = recorder; 2026-10-25T01:04:53.8131755Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-25T01:04:53.8131817Z 155 │ recorder, 2026-10-25T01:04:53.8131914Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-25T01:04:53.8132000Z 157 │ requestPermission: async () => { 2026-10-25T01:04:53.8132127Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-25T01:04:53.8132282Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-25T01:04:53.8132336Z 160 │ }, 2026-10-25T01:04:53.8132452Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-25T01:04:53.8132559Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-25T01:04:53.8132664Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-25T01:04:53.8132741Z 164 │ onStateChange: (nextState) => 2026-10-25T01:04:53.8132806Z 165 │ setState({ 2026-10-25T01:04:53.8132876Z 166 │ state: nextState, 2026-10-25T01:04:53.8132982Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-25T01:04:53.8133078Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-25T01:04:53.8133138Z 169 │ }), 2026-10-25T01:04:53.8133191Z 170 │ }); 2026-10-25T01:04:53.8133246Z 171 │ } 2026-10-25T01:04:53.8133296Z 172 │ 2026-10-25T01:04:53.8133381Z 173 │ const session = sessionRef.current; 2026-10-25T01:04:53.8133476Z 174 │ const controller = session.controller; 2026-10-25T01:04:53.8133563Z 175 │ const recorder = recorderRef.current; 2026-10-25T01:04:53.8133612Z 176 │ 2026-10-25T01:04:53.8133677Z 177 │ useEffect(() => { 2026-10-25T01:04:53.8133826Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-25T01:04:53.8133965Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-25T01:04:53.8134099Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-25T01:04:53.8134204Z 181 │ // calls and route interruptions during capture. 2026-10-25T01:04:53.8134338Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-25T01:04:53.8134394Z 183 │ }); 2026-10-25T01:04:53.8134478Z 184 │ return () => subscription.remove(); 2026-10-25T01:04:53.8134542Z 185 │ }, [controller]); 2026-10-25T01:04:53.8134601Z 186 │ 2026-10-25T01:04:53.8134662Z 187 │ useEffect( 2026-10-25T01:04:53.8134723Z 188 │ () => () => { 2026-10-25T01:04:53.8134794Z 189 │ controller.dispose(); 2026-10-25T01:04:53.8134864Z 190 │ recorder.release(); 2026-10-25T01:04:53.8134917Z 191 │ }, 2026-10-25T01:04:53.8134987Z 192 │ [controller, recorder], 2026-10-25T01:04:53.8135042Z 193 │ ); 2026-10-25T01:04:53.8135093Z 194 │ 2026-10-25T01:04:53.8135154Z 195 │ useEffect(() => { 2026-10-25T01:04:53.8135248Z 196 │ if (state.phase !== "recording") return; 2026-10-25T01:04:53.8135299Z 197 │ 2026-10-25T01:04:53.8135446Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-25T01:04:53.8135548Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-25T01:04:53.8135632Z 200 │ void activation.catch(() => {}); 2026-10-25T01:04:53.8135760Z 201 │ return () => { 2026-10-25T01:04:53.8135941Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-25T01:04:53.8136076Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-25T01:04:53.8136132Z 204 │ }; 2026-10-25T01:04:53.8136212Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-25T01:04:53.8136262Z 206 │ 2026-10-25T01:04:53.8136325Z 207 │ useEffect(() => { 2026-10-25T01:04:53.8136515Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T01:04:53.8136566Z 209 │ 2026-10-25T01:04:53.8136689Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T01:04:53.8136848Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T01:04:53.8136952Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T01:04:53.8137035Z ·  ─────┬───── 2026-10-25T01:04:53.8137174Z · ╰── `audioLevels` cannot be modified 2026-10-25T01:04:53.8137229Z 213 │ } 2026-10-25T01:04:53.8137281Z ╰──── 2026-10-25T01:04:53.8137547Z  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-25T01:04:53.8137849Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8137853Z 2026-10-25T01:04:53.8138049Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-25T01:04:53.8138250Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-25T01:04:53.8138307Z 206 │ 2026-10-25T01:04:53.8138376Z 207 │ useEffect(() => { 2026-10-25T01:04:53.8138451Z ·  ───┬─── 2026-10-25T01:04:53.8138668Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-25T01:04:53.8138801Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-25T01:04:53.8138853Z 209 │ 2026-10-25T01:04:53.8138971Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-25T01:04:53.8139121Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-25T01:04:53.8139223Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-25T01:04:53.8139299Z ·  ─────┬───── 2026-10-25T01:04:53.8139430Z · ╰── This modifies `audioLevels` 2026-10-25T01:04:53.8139491Z 213 │ } 2026-10-25T01:04:53.8139546Z ╰──── 2026-10-25T01:04:53.8139880Z  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-25T01:04:53.8140180Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8140183Z 2026-10-25T01:04:53.8140340Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8140546Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-25T01:04:53.8140600Z 90 │ }) { 2026-10-25T01:04:53.8140710Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-25T01:04:53.8140853Z ·  ────┬─── 2026-10-25T01:04:53.8141021Z · ╰── `rotation` originates here 2026-10-25T01:04:53.8141091Z 92 │ useLayoutEffect(() => { 2026-10-25T01:04:53.8141230Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-25T01:04:53.8141300Z ·  ────┬─── 2026-10-25T01:04:53.8141432Z · ╰── `rotation` cannot be modified 2026-10-25T01:04:53.8141509Z 94 │ }, [props.hidden, rotation]); 2026-10-25T01:04:53.8141557Z ╰──── 2026-10-25T01:04:53.8141819Z  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-25T01:04:53.8142124Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8142129Z 2026-10-25T01:04:53.8142283Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8142453Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-25T01:04:53.8142544Z 266 │ const variant = props.variant ?? "plain"; 2026-10-25T01:04:53.8142682Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-25T01:04:53.8142768Z ·  ────────┬──────── 2026-10-25T01:04:53.8142913Z · ╰── `loadingVisibility` originates here 2026-10-25T01:04:53.8142980Z 268 │ useLayoutEffect(() => { 2026-10-25T01:04:53.8143138Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-25T01:04:53.8143219Z ·  ────────┬──────── 2026-10-25T01:04:53.8143372Z · ╰── `loadingVisibility` cannot be modified 2026-10-25T01:04:53.8143464Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-25T01:04:53.8143516Z ╰──── 2026-10-25T01:04:53.8143775Z  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-25T01:04:53.8144076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8144079Z 2026-10-25T01:04:53.8144228Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8144395Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-25T01:04:53.8144451Z 325 │ }) { 2026-10-25T01:04:53.8144612Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-25T01:04:53.8144703Z ·  ─────────┬───────── 2026-10-25T01:04:53.8144851Z · ╰── `recordingVisibility` originates here 2026-10-25T01:04:53.8144923Z 327 │ useLayoutEffect(() => { 2026-10-25T01:04:53.8145107Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-25T01:04:53.8145192Z ·  ─────────┬───────── 2026-10-25T01:04:53.8145343Z · ╰── `recordingVisibility` cannot be modified 2026-10-25T01:04:53.8145434Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-25T01:04:53.8145485Z ╰──── 2026-10-25T01:04:53.8145800Z  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-25T01:04:53.8146125Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8146127Z 2026-10-25T01:04:53.8146278Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8146444Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-25T01:04:53.8146547Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-25T01:04:53.8146629Z 66 │ const progress = useSharedValue(0); 2026-10-25T01:04:53.8146703Z ·  ────┬─── 2026-10-25T01:04:53.8146835Z · ╰── `progress` originates here 2026-10-25T01:04:53.8146901Z 67 │ useEffect(() => { 2026-10-25T01:04:53.8147026Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-25T01:04:53.8147101Z ·  ────┬─── 2026-10-25T01:04:53.8147232Z · ╰── `progress` cannot be modified 2026-10-25T01:04:53.8147306Z 69 │ }, [expanded, progress]); 2026-10-25T01:04:53.8147356Z ╰──── 2026-10-25T01:04:53.8147617Z  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-25T01:04:53.8147913Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8147916Z 2026-10-25T01:04:53.8148173Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8148348Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-25T01:04:53.8148404Z 328 │ }; 2026-10-25T01:04:53.8148471Z 329 │ useEffect(() => { 2026-10-25T01:04:53.8148541Z ·  ────┬──── 2026-10-25T01:04:53.8148669Z · ╰── This is the containing effect 2026-10-25T01:04:53.8148772Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-25T01:04:53.8148867Z 331 │ requestedSection.current = "overview"; 2026-10-25T01:04:53.8149030Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T01:04:53.8149102Z 333 │ setSection("overview"); 2026-10-25T01:04:53.8149177Z ·  ─────┬──── 2026-10-25T01:04:53.8149350Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8149408Z 334 │ } 2026-10-25T01:04:53.8149457Z ╰──── 2026-10-25T01:04:53.8150047Z  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-25T01:04:53.8150376Z  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-25T01:04:53.8150378Z 2026-10-25T01:04:53.8150614Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T01:04:53.8150781Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-25T01:04:53.8150928Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-25T01:04:53.8151050Z 331 │ requestedSection.current = "overview"; 2026-10-25T01:04:53.8151132Z ·  ────────┬─────── 2026-10-25T01:04:53.8151574Z · ╰── 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-25T01:04:53.8151735Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-25T01:04:53.8151880Z ·  ─────────┬───────── ──────┬────── 2026-10-25T01:04:53.8152379Z · │ ╰── 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-25T01:04:53.8152822Z · ╰── 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-25T01:04:53.8152897Z 333 │ setSection("overview"); 2026-10-25T01:04:53.8152951Z 334 │ } 2026-10-25T01:04:53.8153041Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-25T01:04:53.8153153Z ·  ──────────────────┬───────────────── 2026-10-25T01:04:53.8153341Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.8153434Z 336 │ const tabContent = activityContent; 2026-10-25T01:04:53.8153486Z ╰──── 2026-10-25T01:04:53.8153651Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T01:04:53.8153958Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8153961Z 2026-10-25T01:04:53.8154161Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-25T01:04:53.8154326Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-25T01:04:53.8154384Z 860 │ if ( 2026-10-25T01:04:53.8154501Z 861 │ lastSelection.current.path === route.params.path && 2026-10-25T01:04:53.8154580Z ·  ──────┬────── 2026-10-25T01:04:53.8155052Z · ╰── 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-25T01:04:53.8155209Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-25T01:04:53.8155264Z 863 │ ) 2026-10-25T01:04:53.8155325Z 864 │ return; 2026-10-25T01:04:53.8155500Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-25T01:04:53.8155632Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-25T01:04:53.8155718Z 867 │ setJumpPath(route.params.path); 2026-10-25T01:04:53.8155791Z 868 │ setSelectedRowId(null); 2026-10-25T01:04:53.8155869Z 869 │ jumpStarted.current = false; 2026-10-25T01:04:53.8156016Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-25T01:04:53.8156112Z 871 │ if (!file || !nativeView.current) return; 2026-10-25T01:04:53.8156200Z ·  ─────┬──── 2026-10-25T01:04:53.8156627Z · ╰── 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-25T01:04:53.8156752Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-25T01:04:53.8156832Z 873 │ jumpStarted.current = true; 2026-10-25T01:04:53.8156973Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-25T01:04:53.8157053Z 875 │ jumpStarted.current = false; 2026-10-25T01:04:53.8157107Z 876 │ }); 2026-10-25T01:04:53.8157306Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-25T01:04:53.8157505Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-25T01:04:53.8157722Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.8157829Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-25T01:04:53.8157882Z ╰──── 2026-10-25T01:04:53.8158048Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-25T01:04:53.8158356Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8158358Z 2026-10-25T01:04:53.8158508Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8158674Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-25T01:04:53.8158756Z 26 │ const latestInput = useRef(input); 2026-10-25T01:04:53.8158834Z 27 │ latestInput.current = input; 2026-10-25T01:04:53.8158946Z ·  ─────┬─────────┬─── 2026-10-25T01:04:53.8159123Z · │ ╰── Cannot update ref value during render 2026-10-25T01:04:53.8159238Z · ╰── This value is a ref 2026-10-25T01:04:53.8159313Z 28 │ const mounted = useRef(true); 2026-10-25T01:04:53.8159365Z ╰──── 2026-10-25T01:04:53.8159872Z  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-25T01:04:53.8160187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8160190Z 2026-10-25T01:04:53.8160332Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8160513Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-25T01:04:53.8160574Z 493 │ > 2026-10-25T01:04:53.8160650Z 494 │ {props.children(close)} 2026-10-25T01:04:53.8160739Z ·  ──┬── 2026-10-25T01:04:53.8160895Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8160977Z 495 │ 2026-10-25T01:04:53.8161031Z ╰──── 2026-10-25T01:04:53.8161487Z  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-25T01:04:53.8161771Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8161774Z 2026-10-25T01:04:53.8161957Z ⚠ react(static-components): Cannot create components during render 2026-10-25T01:04:53.8162114Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-25T01:04:53.8162201Z 196 │ const { onInput, onResize } = props; 2026-10-25T01:04:53.8162352Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-25T01:04:53.8162483Z ·  ────────────────┬─────────────── 2026-10-25T01:04:53.8162669Z · ╰── The component is created during render here 2026-10-25T01:04:53.8162794Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-25T01:04:53.8162847Z 199 │ 2026-10-25T01:04:53.8162913Z 200 │ useEffect(() => { 2026-10-25T01:04:53.8162999Z 201 │ terminalDebugLog("native:surface", { 2026-10-25T01:04:53.8163084Z 202 │ terminalKey: props.terminalKey, 2026-10-25T01:04:53.8163162Z 203 │ native: hasNativeSurface, 2026-10-25T01:04:53.8163297Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-25T01:04:53.8163378Z 205 │ bufferLen: props.buffer.length, 2026-10-25T01:04:53.8163463Z 206 │ isRunning: props.isRunning, 2026-10-25T01:04:53.8163524Z 207 │ }); 2026-10-25T01:04:53.8163681Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-25T01:04:53.8163767Z 209 │ const handleNativeInput = useCallback( 2026-10-25T01:04:53.8163883Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-25T01:04:53.8163982Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-25T01:04:53.8164043Z 212 │ return; 2026-10-25T01:04:53.8164096Z 213 │ } 2026-10-25T01:04:53.8164186Z 214 │ terminalDebugLog("native:onInput", { 2026-10-25T01:04:53.8164341Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-25T01:04:53.8164398Z 216 │ }); 2026-10-25T01:04:53.8164482Z 217 │ onInput(event.nativeEvent.data); 2026-10-25T01:04:53.8164594Z 218 │ }, 2026-10-25T01:04:53.8164811Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-25T01:04:53.8164864Z 220 │ ); 2026-10-25T01:04:53.8164950Z 221 │ const handleNativeResize = useCallback( 2026-10-25T01:04:53.8165066Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-25T01:04:53.8165127Z 223 │ onResize({ 2026-10-25T01:04:53.8165210Z 224 │ cols: event.nativeEvent.cols, 2026-10-25T01:04:53.8165290Z 225 │ rows: event.nativeEvent.rows, 2026-10-25T01:04:53.8165347Z 226 │ }); 2026-10-25T01:04:53.8165404Z 227 │ }, 2026-10-25T01:04:53.8165461Z 228 │ [onResize], 2026-10-25T01:04:53.8165514Z 229 │ ); 2026-10-25T01:04:53.8165566Z 230 │ 2026-10-25T01:04:53.8165649Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-25T01:04:53.8165705Z 232 │ return ( 2026-10-25T01:04:53.8165792Z 233 │ 2026-10-25T01:04:53.8165874Z 234 │ item.type === "assistant_message").at(-1)?.text, 2026-10-25T01:04:53.8167542Z ·  ────── 2026-10-25T01:04:53.8167621Z 2145 │ "authoritative answer", 2026-10-25T01:04:53.8167676Z ╰──── 2026-10-25T01:04:53.8167846Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-25T01:04:53.8167849Z 2026-10-25T01:04:53.8168312Z ⚠ 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-25T01:04:53.8168483Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4246:7] 2026-10-25T01:04:53.8168661Z 4245 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-25T01:04:53.8168867Z 4246 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-25T01:04:53.8168973Z 4247 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8169107Z 4248 │ ╰─▶ } 2026-10-25T01:04:53.8169226Z 4249 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-25T01:04:53.8169277Z ╰──── 2026-10-25T01:04:53.8169280Z 2026-10-25T01:04:53.8169785Z ⚠ 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-25T01:04:53.8169982Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6357:9] 2026-10-25T01:04:53.8170069Z 6356 │ .pipe(Effect.forkScoped); 2026-10-25T01:04:53.8170251Z 6357 │ ╭─▶ while (promptGates.length < 1) { 2026-10-25T01:04:53.8170385Z 6358 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8170517Z 6359 │ ╰─▶ } 2026-10-25T01:04:53.8170686Z 6360 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-25T01:04:53.8170737Z ╰──── 2026-10-25T01:04:53.8170740Z 2026-10-25T01:04:53.8171196Z ⚠ 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-25T01:04:53.8171363Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6492:9] 2026-10-25T01:04:53.8171447Z 6491 │ .pipe(Effect.forkScoped); 2026-10-25T01:04:53.8171626Z 6492 │ ╭─▶ while (promptGates.length < 2) { 2026-10-25T01:04:53.8171734Z 6493 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8171867Z 6494 │ ╰─▶ } 2026-10-25T01:04:53.8172027Z 6495 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-25T01:04:53.8172083Z ╰──── 2026-10-25T01:04:53.8172088Z 2026-10-25T01:04:53.8172314Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T01:04:53.8172441Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-25T01:04:53.8172509Z 14 │ threadSearchMatchKey, 2026-10-25T01:04:53.8172600Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-25T01:04:53.8172705Z ·  ──────────────┬───────────── 2026-10-25T01:04:53.8172879Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T01:04:53.8172986Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T01:04:53.8173038Z ╰──── 2026-10-25T01:04:53.8173136Z  help: Consider removing this import. 2026-10-25T01:04:53.8173138Z 2026-10-25T01:04:53.8173342Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8173473Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-25T01:04:53.8173604Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-25T01:04:53.8173694Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T01:04:53.8173796Z ·  ───────┬────── 2026-10-25T01:04:53.8173959Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T01:04:53.8174095Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-25T01:04:53.8174146Z ╰──── 2026-10-25T01:04:53.8174485Z  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-25T01:04:53.8174818Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8174821Z 2026-10-25T01:04:53.8174984Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8175112Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-25T01:04:53.8175198Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-25T01:04:53.8175358Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-25T01:04:53.8175477Z ·  ─────┬──── 2026-10-25T01:04:53.8175646Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8175728Z 519 │ const id = setTimeout(() => { 2026-10-25T01:04:53.8175779Z ╰──── 2026-10-25T01:04:53.8176056Z  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-25T01:04:53.8176346Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8176348Z 2026-10-25T01:04:53.8176604Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8176760Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-25T01:04:53.8178577Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-25T01:04:53.8178656Z 113 │ useEffect(() => { 2026-10-25T01:04:53.8178734Z ·  ────┬──── 2026-10-25T01:04:53.8178866Z · ╰── This is the containing effect 2026-10-25T01:04:53.8179031Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-25T01:04:53.8179092Z 115 │ return; 2026-10-25T01:04:53.8179147Z 116 │ } 2026-10-25T01:04:53.8179263Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-25T01:04:53.8179336Z ·  ────┬─── 2026-10-25T01:04:53.8179499Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8179620Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-25T01:04:53.8179673Z ╰──── 2026-10-25T01:04:53.8180384Z  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-25T01:04:53.8180758Z  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-25T01:04:53.8180761Z 2026-10-25T01:04:53.8181015Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.8181184Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10691:7] 2026-10-25T01:04:53.8181240Z 10690 │ 2026-10-25T01:04:53.8181314Z 10691 │ const layer: Layer.Layer< 2026-10-25T01:04:53.8181387Z ·  ──┬── 2026-10-25T01:04:53.8181516Z · ╰── 'layer' is declared here 2026-10-25T01:04:53.8181611Z 10692 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T01:04:53.8181664Z ╰──── 2026-10-25T01:04:53.8181766Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8181768Z 2026-10-25T01:04:53.8182023Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8182190Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-25T01:04:53.8182242Z 638 │ 2026-10-25T01:04:53.8182306Z 639 │ useEffect(() => { 2026-10-25T01:04:53.8182375Z ·  ────┬──── 2026-10-25T01:04:53.8182507Z · ╰── This is the containing effect 2026-10-25T01:04:53.8182617Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-25T01:04:53.8182676Z 641 │ return; 2026-10-25T01:04:53.8182731Z 642 │ } 2026-10-25T01:04:53.8182804Z 643 │ setPendingLaunchEntry({ 2026-10-25T01:04:53.8182892Z ·  ──────────┬────────── 2026-10-25T01:04:53.8183061Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8183131Z 644 │ key: launchTargetKey, 2026-10-25T01:04:53.8183183Z ╰──── 2026-10-25T01:04:53.8183780Z  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-25T01:04:53.8184098Z  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-25T01:04:53.8184101Z 2026-10-25T01:04:53.8184352Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8184519Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-25T01:04:53.8184571Z 648 │ 2026-10-25T01:04:53.8184637Z 649 │ useEffect(() => { 2026-10-25T01:04:53.8184705Z ·  ────┬──── 2026-10-25T01:04:53.8184831Z · ╰── This is the containing effect 2026-10-25T01:04:53.8184944Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-25T01:04:53.8185052Z 651 │ return; 2026-10-25T01:04:53.8185138Z 652 │ } 2026-10-25T01:04:53.8185220Z 653 │ setInitialAttachGridEntry({ 2026-10-25T01:04:53.8185314Z ·  ────────────┬──────────── 2026-10-25T01:04:53.8185485Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8185552Z 654 │ key: launchTargetKey, 2026-10-25T01:04:53.8185603Z ╰──── 2026-10-25T01:04:53.8186183Z  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-25T01:04:53.8186501Z  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-25T01:04:53.8186507Z 2026-10-25T01:04:53.8186757Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8186920Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-25T01:04:53.8186973Z 743 │ 2026-10-25T01:04:53.8187036Z 744 │ useEffect(() => { 2026-10-25T01:04:53.8187104Z ·  ────┬──── 2026-10-25T01:04:53.8187230Z · ╰── This is the containing effect 2026-10-25T01:04:53.8187329Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-25T01:04:53.8187397Z 746 │ setLastGridSize({ 2026-10-25T01:04:53.8187477Z ·  ───────┬─────── 2026-10-25T01:04:53.8187648Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8187733Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-25T01:04:53.8187783Z ╰──── 2026-10-25T01:04:53.8188362Z  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-25T01:04:53.8188673Z  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-25T01:04:53.8188676Z 2026-10-25T01:04:53.8188873Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8189043Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-25T01:04:53.8189100Z 537 │ }); 2026-10-25T01:04:53.8189221Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-25T01:04:53.8189330Z ·  ───────────┬────────── 2026-10-25T01:04:53.8189572Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-25T01:04:53.8189733Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-25T01:04:53.8189785Z ╰──── 2026-10-25T01:04:53.8190071Z  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-25T01:04:53.8190455Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8190489Z 2026-10-25T01:04:53.8190692Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8190857Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-25T01:04:53.8190951Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-25T01:04:53.8191017Z 709 │ }, [terminalKey]); 2026-10-25T01:04:53.8191093Z ·  ─────┬───── 2026-10-25T01:04:53.8191233Z · ╰── Unnecessary dependency `terminalKey` 2026-10-25T01:04:53.8191283Z 710 │ 2026-10-25T01:04:53.8191334Z ╰──── 2026-10-25T01:04:53.8191625Z  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-25T01:04:53.8191933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8191936Z 2026-10-25T01:04:53.8192130Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8192292Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-25T01:04:53.8192349Z 799 │ }; 2026-10-25T01:04:53.8192524Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-25T01:04:53.8192702Z ·  ────────────┬──────────── ─────┬───── 2026-10-25T01:04:53.8192935Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-25T01:04:53.8193147Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-25T01:04:53.8193199Z 801 │ 2026-10-25T01:04:53.8193249Z ╰──── 2026-10-25T01:04:53.8193534Z  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-25T01:04:53.8193839Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8193842Z 2026-10-25T01:04:53.8193988Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8194158Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-25T01:04:53.8194213Z 792 │ } 2026-10-25T01:04:53.8194317Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-25T01:04:53.8194429Z ·  ───────────┬─────────── 2026-10-25T01:04:53.8194590Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8194642Z 794 │ 2026-10-25T01:04:53.8194690Z ╰──── 2026-10-25T01:04:53.8195151Z  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-25T01:04:53.8195488Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8195525Z 2026-10-25T01:04:53.8195719Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.8195874Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-25T01:04:53.8195938Z 71 │ { 2026-10-25T01:04:53.8196960Z ·  ────┬──── 2026-10-25T01:04:53.8197088Z · ╰── This is the containing effect 2026-10-25T01:04:53.8197168Z 152 │ if (!controlledSelectedPath) { 2026-10-25T01:04:53.8197229Z 153 │ return; 2026-10-25T01:04:53.8197283Z 154 │ } 2026-10-25T01:04:53.8197362Z 155 │ setExpandedPaths((current) => { 2026-10-25T01:04:53.8197444Z ·  ────────┬─────── 2026-10-25T01:04:53.8197617Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8197741Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-25T01:04:53.8197791Z ╰──── 2026-10-25T01:04:53.8198376Z  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-25T01:04:53.8198693Z  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-25T01:04:53.8198695Z 2026-10-25T01:04:53.8199023Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.8199190Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-25T01:04:53.8199245Z 1443 │ 2026-10-25T01:04:53.8199359Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-25T01:04:53.8199476Z ·  ───────────────────┬─────────────────── 2026-10-25T01:04:53.8199677Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-25T01:04:53.8199796Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-25T01:04:53.8199846Z ╰──── 2026-10-25T01:04:53.8199950Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8199953Z 2026-10-25T01:04:53.8200206Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.8200440Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-25T01:04:53.8200539Z 1679 │ 2026-10-25T01:04:53.8200612Z 1680 │ const layer: Layer.Layer< 2026-10-25T01:04:53.8200680Z ·  ──┬── 2026-10-25T01:04:53.8200804Z · ╰── 'layer' is declared here 2026-10-25T01:04:53.8200896Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-25T01:04:53.8200949Z ╰──── 2026-10-25T01:04:53.8201052Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8201054Z 2026-10-25T01:04:53.8201250Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8201393Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-25T01:04:53.8201490Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-25T01:04:53.8201576Z 257 │ }, [props.path, targetIndex]); 2026-10-25T01:04:53.8201654Z ·  ─────┬──── 2026-10-25T01:04:53.8201794Z · ╰── Unnecessary dependency `props.path` 2026-10-25T01:04:53.8201852Z 258 │ 2026-10-25T01:04:53.8201902Z ╰──── 2026-10-25T01:04:53.8202190Z  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-25T01:04:53.8202493Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8202498Z 2026-10-25T01:04:53.8202687Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.8202836Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-25T01:04:53.8202913Z 292 │ 2026-10-25T01:04:53.8204047Z ·  ─────────── 2026-10-25T01:04:53.8204114Z 310 │ {body} 2026-10-25T01:04:53.8204165Z ╰──── 2026-10-25T01:04:53.8204308Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-25T01:04:53.8204310Z 2026-10-25T01:04:53.8204558Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-25T01:04:53.8204735Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-25T01:04:53.8204787Z 959 │ 2026-10-25T01:04:53.8204895Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-25T01:04:53.8205006Z ·  ──────────────────┬───────────────── 2026-10-25T01:04:53.8205206Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-25T01:04:53.8205310Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-25T01:04:53.8205361Z ╰──── 2026-10-25T01:04:53.8205460Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8205462Z 2026-10-25T01:04:53.8205716Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8205877Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-25T01:04:53.8205995Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-25T01:04:53.8206059Z 278 │ useEffect(() => { 2026-10-25T01:04:53.8206129Z ·  ────┬──── 2026-10-25T01:04:53.8206257Z · ╰── This is the containing effect 2026-10-25T01:04:53.8206346Z 279 │ setNow(new Date().toISOString()); 2026-10-25T01:04:53.8206415Z ·  ───┬── 2026-10-25T01:04:53.8206578Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8206715Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-25T01:04:53.8206766Z ╰──── 2026-10-25T01:04:53.8207349Z  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-25T01:04:53.8207669Z  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-25T01:04:53.8207674Z 2026-10-25T01:04:53.8207898Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-25T01:04:53.8208055Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-25T01:04:53.8208125Z 12 │ threadSearchMatchKey, 2026-10-25T01:04:53.8208207Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-25T01:04:53.8208309Z ·  ──────────────┬───────────── 2026-10-25T01:04:53.8208481Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-25T01:04:53.8208588Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-25T01:04:53.8208638Z ╰──── 2026-10-25T01:04:53.8208735Z  help: Consider removing this import. 2026-10-25T01:04:53.8208738Z 2026-10-25T01:04:53.8208986Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8209176Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-25T01:04:53.8209305Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-25T01:04:53.8209393Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-25T01:04:53.8209492Z ·  ───────┬────── 2026-10-25T01:04:53.8209654Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-25T01:04:53.8209766Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-25T01:04:53.8209815Z ╰──── 2026-10-25T01:04:53.8210108Z  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-25T01:04:53.8210427Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8210430Z 2026-10-25T01:04:53.8210624Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8210784Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-25T01:04:53.8210870Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-25T01:04:53.8211023Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-25T01:04:53.8211142Z ·  ─────┬──── 2026-10-25T01:04:53.8211308Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8211389Z 351 │ const id = setTimeout(() => { 2026-10-25T01:04:53.8211439Z ╰──── 2026-10-25T01:04:53.8211718Z  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-25T01:04:53.8212005Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8212007Z 2026-10-25T01:04:53.8212275Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-25T01:04:53.8212417Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-25T01:04:53.8212471Z 60 │ ) { 2026-10-25T01:04:53.8212642Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-25T01:04:53.8212723Z ·  ──────┬────── 2026-10-25T01:04:53.8212859Z · ╰── 'useDragRegion' is declared here 2026-10-25T01:04:53.8212950Z 62 │ const isInline = props.mode === "inline"; 2026-10-25T01:04:53.8213000Z ╰──── 2026-10-25T01:04:53.8213101Z  help: Consider removing this declaration. 2026-10-25T01:04:53.8213104Z 2026-10-25T01:04:53.8213563Z ⚠ 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-25T01:04:53.8213710Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-25T01:04:53.8213821Z 168 │ }); 2026-10-25T01:04:53.8214047Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T01:04:53.8214236Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-25T01:04:53.8214342Z 171 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8214472Z 172 │ ╰─▶ } 2026-10-25T01:04:53.8214527Z 173 │ 2026-10-25T01:04:53.8214577Z ╰──── 2026-10-25T01:04:53.8214579Z 2026-10-25T01:04:53.8215031Z ⚠ 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-25T01:04:53.8215182Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-25T01:04:53.8215299Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-25T01:04:53.8215487Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T01:04:53.8215619Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-25T01:04:53.8215722Z 180 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8215853Z 181 │ ╰─▶ } 2026-10-25T01:04:53.8215907Z 182 │ 2026-10-25T01:04:53.8215957Z ╰──── 2026-10-25T01:04:53.8215959Z 2026-10-25T01:04:53.8216414Z ⚠ 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-25T01:04:53.8216560Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-25T01:04:53.8216685Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-25T01:04:53.8216872Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-25T01:04:53.8216994Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-25T01:04:53.8217185Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-25T01:04:53.8217270Z 310 │ │ break; 2026-10-25T01:04:53.8217347Z 311 │ │ } 2026-10-25T01:04:53.8217457Z 312 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8217589Z 313 │ ╰─▶ } 2026-10-25T01:04:53.8217644Z 314 │ 2026-10-25T01:04:53.8217693Z ╰──── 2026-10-25T01:04:53.8217695Z 2026-10-25T01:04:53.8217897Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-25T01:04:53.8218061Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-25T01:04:53.8218136Z 3 │ AuthProvidersManageScope, 2026-10-25T01:04:53.8218349Z 4 │ type AuthSessionState, 2026-10-25T01:04:53.8218435Z ·  ────────┬─────── 2026-10-25T01:04:53.8218581Z · ╰── 'AuthSessionState' is imported here 2026-10-25T01:04:53.8218649Z 5 │ type EnvironmentId, 2026-10-25T01:04:53.8218768Z ╰──── 2026-10-25T01:04:53.8218910Z  help: Consider removing this import. 2026-10-25T01:04:53.8218912Z 2026-10-25T01:04:53.8219362Z ⚠ 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-25T01:04:53.8219515Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1742:7] 2026-10-25T01:04:53.8219607Z 1741 │ yield* harness.replaceSession; 2026-10-25T01:04:53.8219810Z 1742 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T01:04:53.8219962Z 1743 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-25T01:04:53.8220054Z 1744 │ │ break; 2026-10-25T01:04:53.8220135Z 1745 │ │ } 2026-10-25T01:04:53.8220238Z 1746 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8220398Z 1747 │ ╰─▶ } 2026-10-25T01:04:53.8220472Z 1748 │ yield* Queue.offer( 2026-10-25T01:04:53.8220524Z ╰──── 2026-10-25T01:04:53.8220526Z 2026-10-25T01:04:53.8220974Z ⚠ 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-25T01:04:53.8221128Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1851:7] 2026-10-25T01:04:53.8221216Z 1850 │ yield* harness.replaceSession; 2026-10-25T01:04:53.8221421Z 1851 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-25T01:04:53.8221581Z 1852 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-25T01:04:53.8221683Z 1853 │ │ yield* Effect.yieldNow; 2026-10-25T01:04:53.8221814Z 1854 │ ╰─▶ } 2026-10-25T01:04:53.8221941Z 1855 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-25T01:04:53.8221994Z ╰──── 2026-10-25T01:04:53.8221996Z 2026-10-25T01:04:53.8222250Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8222409Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-25T01:04:53.8222475Z 434 │ : null; 2026-10-25T01:04:53.8222542Z 435 │ useEffect(() => { 2026-10-25T01:04:53.8222614Z ·  ────┬──── 2026-10-25T01:04:53.8222742Z · ╰── This is the containing effect 2026-10-25T01:04:53.8222800Z 436 │ if ( 2026-10-25T01:04:53.8222876Z 437 │ props.active === false || 2026-10-25T01:04:53.8222951Z 438 │ activeDraftKey !== null || 2026-10-25T01:04:53.8223032Z 439 │ editingPendingTask !== null || 2026-10-25T01:04:53.8223107Z 440 │ selectedProject === null 2026-10-25T01:04:53.8223163Z 441 │ ) { 2026-10-25T01:04:53.8223221Z 442 │ return; 2026-10-25T01:04:53.8223275Z 443 │ } 2026-10-25T01:04:53.8223343Z 444 │ setActiveDraftKey( 2026-10-25T01:04:53.8223423Z ·  ────────┬──────── 2026-10-25T01:04:53.8223644Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8223752Z 445 │ createNewTaskDraft({ 2026-10-25T01:04:53.8223802Z ╰──── 2026-10-25T01:04:53.8224389Z  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-25T01:04:53.8224706Z  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-25T01:04:53.8224709Z 2026-10-25T01:04:53.8224947Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-25T01:04:53.8225114Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-25T01:04:53.8225222Z 1243 │ 2026-10-25T01:04:53.8225412Z 1244 │ {props.children} 2026-10-25T01:04:53.8225521Z ·  ───────────── 2026-10-25T01:04:53.8225595Z 1245 │ 2026-10-25T01:04:53.8225646Z ╰──── 2026-10-25T01:04:53.8225867Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-25T01:04:53.8226004Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-25T01:04:53.8226007Z 2026-10-25T01:04:53.8226166Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8226312Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-25T01:04:53.8226455Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-25T01:04:53.8226588Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-25T01:04:53.8226664Z ·  ────┬─── 2026-10-25T01:04:53.8226796Z · ╰── `rotation` originates here 2026-10-25T01:04:53.8226847Z 172 │ 2026-10-25T01:04:53.8226913Z 173 │ useLayoutEffect(() => { 2026-10-25T01:04:53.8227047Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-25T01:04:53.8227118Z ·  ────┬─── 2026-10-25T01:04:53.8227249Z · ╰── `rotation` cannot be modified 2026-10-25T01:04:53.8227393Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-25T01:04:53.8227476Z ╰──── 2026-10-25T01:04:53.8227738Z  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-25T01:04:53.8228039Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8228041Z 2026-10-25T01:04:53.8228231Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-25T01:04:53.8228380Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-25T01:04:53.8228447Z 1245 │ { 2026-10-25T01:04:53.8229549Z ·  ────┬──── 2026-10-25T01:04:53.8229673Z · ╰── This is the containing effect 2026-10-25T01:04:53.8229740Z 261 │ stop(); 2026-10-25T01:04:53.8229813Z ·  ──┬─ 2026-10-25T01:04:53.8229975Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8230042Z 262 │ }, [orderVersion]); 2026-10-25T01:04:53.8230092Z ╰──── 2026-10-25T01:04:53.8230705Z  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-25T01:04:53.8231021Z  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-25T01:04:53.8231023Z 2026-10-25T01:04:53.8231236Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T01:04:53.8231398Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-25T01:04:53.8231463Z 260 │ useEffect(() => { 2026-10-25T01:04:53.8231522Z 261 │ stop(); 2026-10-25T01:04:53.8231587Z ·  ──┬─ 2026-10-25T01:04:53.8231710Z · ╰── Missing dependency `stop` 2026-10-25T01:04:53.8231775Z 262 │ }, [orderVersion]); 2026-10-25T01:04:53.8231855Z ·  ──────┬───── 2026-10-25T01:04:53.8232000Z · ╰── Unnecessary dependency `orderVersion` 2026-10-25T01:04:53.8232061Z 263 │ useEffect( 2026-10-25T01:04:53.8232112Z ╰──── 2026-10-25T01:04:53.8232577Z  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-25T01:04:53.8232916Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8232918Z 2026-10-25T01:04:53.8233059Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8233214Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-25T01:04:53.8233292Z 95 │ const latest = useRef(props); 2026-10-25T01:04:53.8233361Z 96 │ latest.current = props; 2026-10-25T01:04:53.8233462Z ·  ───┬──────┬─── 2026-10-25T01:04:53.8233644Z · │ ╰── Cannot update ref value during render 2026-10-25T01:04:53.8233762Z · ╰── This value is a ref 2026-10-25T01:04:53.8233830Z 97 │ const gesture = useMemo( 2026-10-25T01:04:53.8233879Z ╰──── 2026-10-25T01:04:53.8234337Z  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-25T01:04:53.8234627Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8234629Z 2026-10-25T01:04:53.8234770Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8234931Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-25T01:04:53.8234997Z 103 │ .runOnJS(true) 2026-10-25T01:04:53.8235096Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T01:04:53.8235210Z ·  ───────────────┬────────────── 2026-10-25T01:04:53.8235408Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.8235538Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8235591Z ╰──── 2026-10-25T01:04:53.8236048Z  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-25T01:04:53.8236338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8236343Z 2026-10-25T01:04:53.8236485Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8236640Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-25T01:04:53.8236737Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T01:04:53.8236870Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8237012Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T01:04:53.8237216Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.8237387Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8237469Z ╰──── 2026-10-25T01:04:53.8237923Z  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-25T01:04:53.8238204Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8238208Z 2026-10-25T01:04:53.8238345Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8238501Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-25T01:04:53.8238629Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8238755Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8238894Z ·  ──────────────────────────┬───────────────────────── 2026-10-25T01:04:53.8239094Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.8239219Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T01:04:53.8239269Z ╰──── 2026-10-25T01:04:53.8239721Z  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-25T01:04:53.8240008Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8240012Z 2026-10-25T01:04:53.8240152Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8240308Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-25T01:04:53.8240454Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8240573Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T01:04:53.8240709Z ·  ───────────────────────┬────────────────────── 2026-10-25T01:04:53.8240912Z · ╰── Passing a ref to a function may read its value during render 2026-10-25T01:04:53.8240979Z 108 │ [props.disabled], 2026-10-25T01:04:53.8241028Z ╰──── 2026-10-25T01:04:53.8241491Z  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-25T01:04:53.8241775Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8241778Z 2026-10-25T01:04:53.8241918Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8242073Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-25T01:04:53.8242183Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T01:04:53.8242288Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-25T01:04:53.8242517Z ·  ───┬──────┬─── 2026-10-25T01:04:53.8242723Z · │ ╰── Cannot update ref value during render 2026-10-25T01:04:53.8242836Z · ╰── This value is a ref 2026-10-25T01:04:53.8242889Z 250 │ 2026-10-25T01:04:53.8242940Z ╰──── 2026-10-25T01:04:53.8243395Z  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-25T01:04:53.8243675Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8243680Z 2026-10-25T01:04:53.8243823Z ⚠ react(refs): Cannot access refs during render 2026-10-25T01:04:53.8243980Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-25T01:04:53.8244097Z 246 │ const [preview, setPreview] = useState(null); 2026-10-25T01:04:53.8244209Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-25T01:04:53.8244332Z ·  ──────────────────┬────────────────── 2026-10-25T01:04:53.8244500Z · ╰── Cannot access ref value during render 2026-10-25T01:04:53.8244608Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-25T01:04:53.8244660Z ╰──── 2026-10-25T01:04:53.8245118Z  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-25T01:04:53.8245404Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-25T01:04:53.8245407Z 2026-10-25T01:04:53.8245572Z ⚠ react(purity): Cannot call impure function during render 2026-10-25T01:04:53.8245729Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-25T01:04:53.8245793Z 323 │ update(0); 2026-10-25T01:04:53.8245871Z 324 │ let last = performance.now(); 2026-10-25T01:04:53.8245968Z ·  ────────┬──────── 2026-10-25T01:04:53.8246105Z · ╰── Cannot call impure function 2026-10-25T01:04:53.8246174Z 325 │ const tick = () => { 2026-10-25T01:04:53.8246270Z ╰──── 2026-10-25T01:04:53.8246595Z  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-25T01:04:53.8246883Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-25T01:04:53.8246885Z 2026-10-25T01:04:53.8247073Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-25T01:04:53.8247227Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-25T01:04:53.8247287Z  98 │ () => 2026-10-25T01:04:53.8247353Z  99 │ Gesture.Pan() 2026-10-25T01:04:53.8247427Z ·  ─┬─ 2026-10-25T01:04:53.8247561Z · ╰── `Pan` may be a component 2026-10-25T01:04:53.8247642Z 100 │ .enabled(!props.disabled) 2026-10-25T01:04:53.8247693Z ╰──── 2026-10-25T01:04:53.8247963Z  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-25T01:04:53.8248397Z  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-25T01:04:53.8248401Z 2026-10-25T01:04:53.8248584Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-25T01:04:53.8248739Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-25T01:04:53.8248810Z 103 │ .runOnJS(true) 2026-10-25T01:04:53.8248912Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-25T01:04:53.8248996Z ·  ───┬── 2026-10-25T01:04:53.8249423Z · ╰── 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-25T01:04:53.8249554Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8249676Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-25T01:04:53.8249795Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-25T01:04:53.8249863Z 108 │ [props.disabled], 2026-10-25T01:04:53.8249944Z ·  ────────┬─────── 2026-10-25T01:04:53.8250134Z · ╰── This dependency list is missing values used by the callback 2026-10-25T01:04:53.8250190Z 109 │ ); 2026-10-25T01:04:53.8250242Z ╰──── 2026-10-25T01:04:53.8250483Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-25T01:04:53.8250791Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8250793Z 2026-10-25T01:04:53.8250994Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-25T01:04:53.8251115Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-25T01:04:53.8251216Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-25T01:04:53.8251427Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-25T01:04:53.8251588Z 159 │ │ constructor(data: Record) { 2026-10-25T01:04:53.8251704Z 160 │ │ clipboardItemConstructor(data); 2026-10-25T01:04:53.8251778Z 161 │ │ } 2026-10-25T01:04:53.8251902Z 162 │ ╰─▶ }, 2026-10-25T01:04:53.8251967Z 163 │ clipboard: { 2026-10-25T01:04:53.8252016Z ╰──── 2026-10-25T01:04:53.8252182Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-25T01:04:53.8252185Z 2026-10-25T01:04:53.8252440Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8252619Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-25T01:04:53.8252673Z 58 │ 2026-10-25T01:04:53.8252737Z 59 │ useEffect(() => { 2026-10-25T01:04:53.8252808Z ·  ────┬──── 2026-10-25T01:04:53.8252935Z · ╰── This is the containing effect 2026-10-25T01:04:53.8253015Z 60 │ setMountedModes((current) => { 2026-10-25T01:04:53.8253095Z ·  ───────┬─────── 2026-10-25T01:04:53.8253262Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8253342Z 61 │ if (current.has(props.mode)) { 2026-10-25T01:04:53.8253392Z ╰──── 2026-10-25T01:04:53.8253986Z  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-25T01:04:53.8254304Z  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-25T01:04:53.8254306Z 2026-10-25T01:04:53.8254559Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8254709Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-25T01:04:53.8254767Z 568 │ }, []); 2026-10-25T01:04:53.8254832Z 569 │ useEffect(() => { 2026-10-25T01:04:53.8254904Z ·  ────┬──── 2026-10-25T01:04:53.8255037Z · ╰── This is the containing effect 2026-10-25T01:04:53.8255122Z 570 │ setKeyboardStateSuspect(false); 2026-10-25T01:04:53.8255213Z ·  ───────────┬─────────── 2026-10-25T01:04:53.8255383Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8255484Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T01:04:53.8255532Z ╰──── 2026-10-25T01:04:53.8256124Z  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-25T01:04:53.8256492Z  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-25T01:04:53.8256526Z 2026-10-25T01:04:53.8256778Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8256927Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-25T01:04:53.8257079Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-25T01:04:53.8257144Z 964 │ useEffect(() => { 2026-10-25T01:04:53.8257215Z ·  ────┬──── 2026-10-25T01:04:53.8257341Z · ╰── This is the containing effect 2026-10-25T01:04:53.8257496Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-25T01:04:53.8257607Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-25T01:04:53.8257709Z ·  ─────────────┬──────────── 2026-10-25T01:04:53.8257884Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8257938Z 967 │ } 2026-10-25T01:04:53.8257988Z ╰──── 2026-10-25T01:04:53.8258627Z  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-25T01:04:53.8258940Z  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-25T01:04:53.8258942Z 2026-10-25T01:04:53.8259198Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8259351Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-25T01:04:53.8259405Z 1220 │ 2026-10-25T01:04:53.8259470Z 1221 │ useEffect(() => { 2026-10-25T01:04:53.8259543Z ·  ────┬──── 2026-10-25T01:04:53.8259670Z · ╰── This is the containing effect 2026-10-25T01:04:53.8259747Z 1222 │ setAnchorMessageId(null); 2026-10-25T01:04:53.8259830Z ·  ─────────┬──────── 2026-10-25T01:04:53.8260000Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8260079Z 1223 │ setSubmittedMessageId(null); 2026-10-25T01:04:53.8260133Z ╰──── 2026-10-25T01:04:53.8260763Z  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-25T01:04:53.8261082Z  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-25T01:04:53.8261084Z 2026-10-25T01:04:53.8261280Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8261426Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-25T01:04:53.8261511Z 570 │ setKeyboardStateSuspect(false); 2026-10-25T01:04:53.8261609Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-25T01:04:53.8261806Z ·  ────────┬──────── ─────────┬──────── 2026-10-25T01:04:53.8262044Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-25T01:04:53.8262200Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-25T01:04:53.8262326Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-25T01:04:53.8262378Z ╰──── 2026-10-25T01:04:53.8262671Z  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-25T01:04:53.8262974Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8262982Z 2026-10-25T01:04:53.8263181Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8263332Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-25T01:04:53.8263417Z 1169 │ userInputInsetProgress.set(1); 2026-10-25T01:04:53.8263576Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-25T01:04:53.8263670Z ·  ────────────┬─────────── 2026-10-25T01:04:53.8263847Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-25T01:04:53.8263954Z 1171 │ const showContent = props.showContent ?? true; 2026-10-25T01:04:53.8264003Z ╰──── 2026-10-25T01:04:53.8264294Z  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-25T01:04:53.8264600Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8264602Z 2026-10-25T01:04:53.8264800Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8264954Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-25T01:04:53.8265021Z 1227 │ freeze.set(false); 2026-10-25T01:04:53.8265102Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-25T01:04:53.8265196Z ·  ────────┬──────── 2026-10-25T01:04:53.8265357Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-25T01:04:53.8265408Z 1229 │ 2026-10-25T01:04:53.8265464Z ╰──── 2026-10-25T01:04:53.8265756Z  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-25T01:04:53.8266062Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8266064Z 2026-10-25T01:04:53.8266215Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8266365Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-25T01:04:53.8266474Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-25T01:04:53.8266581Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-25T01:04:53.8266721Z ·  ───────────┬─────────── 2026-10-25T01:04:53.8266910Z · ╰── `floatingControlCoverage` originates here 2026-10-25T01:04:53.8267038Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T01:04:53.8267093Z 1056 │ ); 2026-10-25T01:04:53.8267157Z 1057 │ useEffect(() => { 2026-10-25T01:04:53.8267262Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-25T01:04:53.8267352Z ·  ───────────┬─────────── 2026-10-25T01:04:53.8267514Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-25T01:04:53.8267638Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-25T01:04:53.8267691Z ╰──── 2026-10-25T01:04:53.8267960Z  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-25T01:04:53.8268262Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8268264Z 2026-10-25T01:04:53.8268418Z ⚠ react(immutability): This value cannot be modified 2026-10-25T01:04:53.8268565Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-25T01:04:53.8268750Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-25T01:04:53.8268874Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-25T01:04:53.8268984Z ·  ────────────────┬──────────────── 2026-10-25T01:04:53.8269172Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-25T01:04:53.8269304Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-25T01:04:53.8269358Z 1069 │ ); 2026-10-25T01:04:53.8269428Z 1070 │ useAnimatedReaction( 2026-10-25T01:04:53.8269486Z 1071 │ () => 2026-10-25T01:04:53.8269578Z 1072 │ contentInsetEndAdjustment.value + 2026-10-25T01:04:53.8269667Z 1073 │ floatingControlCoverage.value + 2026-10-25T01:04:53.8269859Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-25T01:04:53.8269921Z 1075 │ (value) => { 2026-10-25T01:04:53.8270034Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-25T01:04:53.8270142Z ·  ────────────────┬──────────────── 2026-10-25T01:04:53.8270399Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-25T01:04:53.8270502Z 1077 │ }, 2026-10-25T01:04:53.8270558Z ╰──── 2026-10-25T01:04:53.8270818Z  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-25T01:04:53.8271119Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-25T01:04:53.8271122Z 2026-10-25T01:04:53.8271375Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8271510Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2189:5] 2026-10-25T01:04:53.8271565Z 2187 │ ); 2026-10-25T01:04:53.8271632Z 2188 │ useEffect(() => { 2026-10-25T01:04:53.8271708Z ·  ────┬──── 2026-10-25T01:04:53.8271838Z · ╰── This is the containing effect 2026-10-25T01:04:53.8271912Z 2189 │ setExpandedVideo(null); 2026-10-25T01:04:53.8271993Z ·  ────────┬─────── 2026-10-25T01:04:53.8272161Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8272233Z 2190 │ setExpandedFile(null); 2026-10-25T01:04:53.8272284Z ╰──── 2026-10-25T01:04:53.8272868Z  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-25T01:04:53.8273187Z  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-25T01:04:53.8273192Z 2026-10-25T01:04:53.8273442Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8273576Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2694:9] 2026-10-25T01:04:53.8273712Z 2685 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-25T01:04:53.8273777Z 2686 │ useEffect(() => { 2026-10-25T01:04:53.8273847Z ·  ────┬──── 2026-10-25T01:04:53.8273976Z · ╰── This is the containing effect 2026-10-25T01:04:53.8274103Z 2687 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-25T01:04:53.8274204Z 2688 │ const index = presentedFeed.findIndex( 2026-10-25T01:04:53.8274338Z 2689 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-25T01:04:53.8274393Z 2690 │ ); 2026-10-25T01:04:53.8274463Z 2691 │ if (index === -1) { 2026-10-25T01:04:53.8274590Z 2692 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-25T01:04:53.8274689Z 2693 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-25T01:04:53.8274782Z 2694 │ setInteractionState((current) => ({ 2026-10-25T01:04:53.8274871Z ·  ─────────┬───────── 2026-10-25T01:04:53.8275046Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8275110Z 2695 │ ...current, 2026-10-25T01:04:53.8275161Z ╰──── 2026-10-25T01:04:53.8275798Z  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-25T01:04:53.8276144Z  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-25T01:04:53.8276147Z 2026-10-25T01:04:53.8276371Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-25T01:04:53.8276501Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-25T01:04:53.8276637Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-25T01:04:53.8276778Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-25T01:04:53.8276877Z ·  ───────────┬─────────── 2026-10-25T01:04:53.8277040Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-25T01:04:53.8277194Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-25T01:04:53.8277245Z ╰──── 2026-10-25T01:04:53.8277342Z  help: Consider removing this import. 2026-10-25T01:04:53.8277345Z 2026-10-25T01:04:53.8277549Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-25T01:04:53.8277677Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-25T01:04:53.8277734Z 95 │ import { 2026-10-25T01:04:53.8277799Z 96 │ createContext, 2026-10-25T01:04:53.8277874Z ·  ──────┬────── 2026-10-25T01:04:53.8278011Z · ╰── 'createContext' is imported here 2026-10-25T01:04:53.8278072Z 97 │ memo, 2026-10-25T01:04:53.8278122Z ╰──── 2026-10-25T01:04:53.8278217Z  help: Consider removing this import. 2026-10-25T01:04:53.8278221Z 2026-10-25T01:04:53.8278426Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-25T01:04:53.8278558Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-25T01:04:53.8278615Z 111 │ import { 2026-10-25T01:04:53.8278684Z 112 │ ActivityIndicator, 2026-10-25T01:04:53.8278765Z ·  ────────┬──────── 2026-10-25T01:04:53.8278906Z · ╰── 'ActivityIndicator' is imported here 2026-10-25T01:04:53.8278963Z 113 │ Image, 2026-10-25T01:04:53.8279014Z ╰──── 2026-10-25T01:04:53.8279115Z  help: Consider removing this import. 2026-10-25T01:04:53.8279119Z 2026-10-25T01:04:53.8279315Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-25T01:04:53.8279446Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-25T01:04:53.8279508Z 118 │ Pressable, 2026-10-25T01:04:53.8279568Z 119 │ ScrollView, 2026-10-25T01:04:53.8279640Z ·  ─────┬──── 2026-10-25T01:04:53.8279770Z · ╰── 'ScrollView' is imported here 2026-10-25T01:04:53.8279831Z 120 │ StyleSheet, 2026-10-25T01:04:53.8279880Z ╰──── 2026-10-25T01:04:53.8279975Z  help: Consider removing this import. 2026-10-25T01:04:53.8279977Z 2026-10-25T01:04:53.8280225Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-25T01:04:53.8280397Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-25T01:04:53.8280477Z 120 │ StyleSheet, 2026-10-25T01:04:53.8280544Z 121 │ Text as NativeText, 2026-10-25T01:04:53.8280624Z ·  ─────┬──── 2026-10-25T01:04:53.8280761Z · ╰── 'NativeText' is imported here 2026-10-25T01:04:53.8280824Z 122 │ type ColorValue, 2026-10-25T01:04:53.8280874Z ╰──── 2026-10-25T01:04:53.8280968Z  help: Consider removing this import. 2026-10-25T01:04:53.8280970Z 2026-10-25T01:04:53.8281181Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-25T01:04:53.8281310Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-25T01:04:53.8281449Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-25T01:04:53.8281577Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-25T01:04:53.8281665Z ·  ─────────┬──────── 2026-10-25T01:04:53.8281814Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-25T01:04:53.8281958Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-25T01:04:53.8282008Z ╰──── 2026-10-25T01:04:53.8282103Z  help: Consider removing this import. 2026-10-25T01:04:53.8282105Z 2026-10-25T01:04:53.8282316Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-25T01:04:53.8282447Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-25T01:04:53.8282583Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-25T01:04:53.8282709Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-25T01:04:53.8282797Z ·  ─────────┬───────── 2026-10-25T01:04:53.8282947Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-25T01:04:53.8283004Z 148 │ import { 2026-10-25T01:04:53.8283055Z ╰──── 2026-10-25T01:04:53.8283146Z  help: Consider removing this import. 2026-10-25T01:04:53.8283149Z 2026-10-25T01:04:53.8283358Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-25T01:04:53.8283488Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-25T01:04:53.8283631Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-25T01:04:53.8283768Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-25T01:04:53.8283858Z ·  ────────┬─────── 2026-10-25T01:04:53.8284005Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-25T01:04:53.8284142Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-25T01:04:53.8284190Z ╰──── 2026-10-25T01:04:53.8284284Z  help: Consider removing this import. 2026-10-25T01:04:53.8284286Z 2026-10-25T01:04:53.8284503Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-25T01:04:53.8284631Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-25T01:04:53.8284714Z 164 │ attachmentVideoPreviewSource, 2026-10-25T01:04:53.8284836Z 165 │ mediaVideoPreviewUri, 2026-10-25T01:04:53.8284950Z ·  ──────────┬───────── 2026-10-25T01:04:53.8285099Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-25T01:04:53.8285172Z 166 │ mediaVideoThumbnailKey, 2026-10-25T01:04:53.8285220Z ╰──── 2026-10-25T01:04:53.8285313Z  help: Consider removing this import. 2026-10-25T01:04:53.8285315Z 2026-10-25T01:04:53.8285533Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-25T01:04:53.8285664Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-25T01:04:53.8285731Z 165 │ mediaVideoPreviewUri, 2026-10-25T01:04:53.8285802Z 166 │ mediaVideoThumbnailKey, 2026-10-25T01:04:53.8285888Z ·  ───────────┬────────── 2026-10-25T01:04:53.8286048Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-25T01:04:53.8286130Z 167 │ type MediaVideoPreviewSource, 2026-10-25T01:04:53.8286181Z ╰──── 2026-10-25T01:04:53.8286273Z  help: Consider removing this import. 2026-10-25T01:04:53.8286276Z 2026-10-25T01:04:53.8286483Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-25T01:04:53.8286610Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-25T01:04:53.8286680Z 166 │ mediaVideoThumbnailKey, 2026-10-25T01:04:53.8286758Z 167 │ type MediaVideoPreviewSource, 2026-10-25T01:04:53.8286852Z ·  ───────────┬─────────── 2026-10-25T01:04:53.8287009Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-25T01:04:53.8287101Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-25T01:04:53.8287153Z ╰──── 2026-10-25T01:04:53.8287248Z  help: Consider removing this import. 2026-10-25T01:04:53.8287250Z 2026-10-25T01:04:53.8287471Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-25T01:04:53.8287600Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3] 2026-10-25T01:04:53.8287659Z 188 │ import { 2026-10-25T01:04:53.8287733Z 189 │ resolveMarkdownFontSizes, 2026-10-25T01:04:53.8287820Z ·  ────────────┬─────────── 2026-10-25T01:04:53.8287977Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-25T01:04:53.8288064Z 190 │ resolveNativeMarkdownTypography, 2026-10-25T01:04:53.8288115Z ╰──── 2026-10-25T01:04:53.8288257Z  help: Consider removing this import. 2026-10-25T01:04:53.8288289Z 2026-10-25T01:04:53.8288542Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-25T01:04:53.8288671Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:196:3] 2026-10-25T01:04:53.8288748Z 195 │ normalizeNativeMarkdownUrl, 2026-10-25T01:04:53.8288841Z 196 │ resolveMarkdownInlineCodePresentation, 2026-10-25T01:04:53.8288953Z ·  ──────────────────┬────────────────── 2026-10-25T01:04:53.8289146Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-25T01:04:53.8289230Z 197 │ resolveMarkdownLinkPresentation, 2026-10-25T01:04:53.8289279Z ╰──── 2026-10-25T01:04:53.8289373Z  help: Consider removing this import. 2026-10-25T01:04:53.8289375Z 2026-10-25T01:04:53.8289588Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-25T01:04:53.8289721Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:244:3] 2026-10-25T01:04:53.8289783Z 243 │ useAssetUrl, 2026-10-25T01:04:53.8289849Z 244 │ useAssetUrlState, 2026-10-25T01:04:53.8289928Z ·  ────────┬─────── 2026-10-25T01:04:53.8290069Z · ╰── 'useAssetUrlState' is imported here 2026-10-25T01:04:53.8290134Z 245 │ useRefreshAssetUrl, 2026-10-25T01:04:53.8290186Z ╰──── 2026-10-25T01:04:53.8290280Z  help: Consider removing this import. 2026-10-25T01:04:53.8290282Z 2026-10-25T01:04:53.8290511Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8290647Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2191:7] 2026-10-25T01:04:53.8290725Z 2190 │ setExpandedFile(null); 2026-10-25T01:04:53.8290880Z 2191 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-25T01:04:53.8291099Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-25T01:04:53.8291384Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-25T01:04:53.8291578Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-25T01:04:53.8291742Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T01:04:53.8291890Z 2192 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-25T01:04:53.8291945Z ╰──── 2026-10-25T01:04:53.8292236Z  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-25T01:04:53.8292544Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8292546Z 2026-10-25T01:04:53.8292742Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8292877Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2663:7] 2026-10-25T01:04:53.8292973Z 2662 │ reportHeaderMaterialVisibility(false); 2026-10-25T01:04:53.8293135Z 2663 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-25T01:04:53.8293245Z ·  ──────┬────── 2026-10-25T01:04:53.8293393Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-25T01:04:53.8293446Z 2664 │ 2026-10-25T01:04:53.8293494Z ╰──── 2026-10-25T01:04:53.8293782Z  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-25T01:04:53.8294084Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8294087Z 2026-10-25T01:04:53.8294282Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8294418Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2679:7] 2026-10-25T01:04:53.8294477Z 2678 │ } 2026-10-25T01:04:53.8294608Z 2679 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-25T01:04:53.8294687Z ·  ──────┬───── 2026-10-25T01:04:53.8294830Z · ╰── Unnecessary dependency `listMountKey` 2026-10-25T01:04:53.8294972Z 2680 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-25T01:04:53.8295023Z ╰──── 2026-10-25T01:04:53.8295308Z  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-25T01:04:53.8295610Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8295618Z 2026-10-25T01:04:53.8295816Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8295951Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2875:7] 2026-10-25T01:04:53.8296006Z 2874 │ } 2026-10-25T01:04:53.8296185Z 2875 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-25T01:04:53.8296380Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-25T01:04:53.8296628Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-25T01:04:53.8296835Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-25T01:04:53.8296988Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-25T01:04:53.8297042Z 2876 │ 2026-10-25T01:04:53.8297092Z ╰──── 2026-10-25T01:04:53.8297375Z  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-25T01:04:53.8297678Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8297681Z 2026-10-25T01:04:53.8297860Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-25T01:04:53.8297991Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:626:9] 2026-10-25T01:04:53.8298048Z 625 │ }; 2026-10-25T01:04:53.8298274Z 626 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-25T01:04:53.8298503Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-25T01:04:53.8298739Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-25T01:04:53.8298932Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-25T01:04:53.8299095Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-25T01:04:53.8299149Z 627 │ ); 2026-10-25T01:04:53.8299202Z ╰──── 2026-10-25T01:04:53.8299514Z  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-25T01:04:53.8299822Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8299824Z 2026-10-25T01:04:53.8300081Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8300233Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-25T01:04:53.8300396Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-25T01:04:53.8300463Z 356 │ useEffect(() => { 2026-10-25T01:04:53.8300534Z ·  ────┬──── 2026-10-25T01:04:53.8300662Z · ╰── This is the containing effect 2026-10-25T01:04:53.8300755Z 357 │ if (!isReturningToProjectPicker) { 2026-10-25T01:04:53.8300820Z 358 │ return; 2026-10-25T01:04:53.8300874Z 359 │ } 2026-10-25T01:04:53.8300969Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-25T01:04:53.8301059Z 361 │ setIsReturningToProjectPicker(false); 2026-10-25T01:04:53.8301163Z ·  ──────────────┬────────────── 2026-10-25T01:04:53.8301339Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8301400Z 362 │ return; 2026-10-25T01:04:53.8301450Z ╰──── 2026-10-25T01:04:53.8302088Z  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-25T01:04:53.8302436Z  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-25T01:04:53.8302439Z 2026-10-25T01:04:53.8302693Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8302844Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-25T01:04:53.8302894Z 447 │ 2026-10-25T01:04:53.8302960Z 448 │ useEffect(() => { 2026-10-25T01:04:53.8303031Z ·  ────┬──── 2026-10-25T01:04:53.8303157Z · ╰── This is the containing effect 2026-10-25T01:04:53.8303257Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-25T01:04:53.8303321Z 450 │ return; 2026-10-25T01:04:53.8303383Z 451 │ } 2026-10-25T01:04:53.8303523Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-25T01:04:53.8303652Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-25T01:04:53.8303759Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-25T01:04:53.8303813Z 455 │ } 2026-10-25T01:04:53.8303952Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T01:04:53.8304075Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T01:04:53.8304178Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-25T01:04:53.8304249Z 459 │ const directProject = 2026-10-25T01:04:53.8304317Z 460 │ projects.find( 2026-10-25T01:04:53.8304380Z 461 │ (project) => 2026-10-25T01:04:53.8304559Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-25T01:04:53.8304625Z 463 │ ) ?? null; 2026-10-25T01:04:53.8304677Z 464 │ 2026-10-25T01:04:53.8304745Z 465 │ if (directProject) { 2026-10-25T01:04:53.8304882Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-25T01:04:53.8305020Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-25T01:04:53.8305182Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-25T01:04:53.8305314Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-25T01:04:53.8305378Z 470 │ return; 2026-10-25T01:04:53.8305437Z 471 │ } 2026-10-25T01:04:53.8305536Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-25T01:04:53.8305602Z 473 │ if ( 2026-10-25T01:04:53.8305749Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-25T01:04:53.8305850Z 475 │ selectedProject.id !== directProject.id 2026-10-25T01:04:53.8305912Z 476 │ ) { 2026-10-25T01:04:53.8305995Z 477 │ setProject(directProject); 2026-10-25T01:04:53.8306060Z 478 │ return; 2026-10-25T01:04:53.8306120Z 479 │ } 2026-10-25T01:04:53.8306201Z 480 │ if (!flow.draftKey) return; 2026-10-25T01:04:53.8306341Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-25T01:04:53.8306487Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-25T01:04:53.8306597Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-25T01:04:53.8306674Z 484 │ workspaceSelection: { 2026-10-25T01:04:53.8306794Z 485 │ mode: "local", 2026-10-25T01:04:53.8306929Z 486 │ branch: props.initialProjectRef.branch, 2026-10-25T01:04:53.8307065Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-25T01:04:53.8307146Z 488 │ startFromOrigin: false, 2026-10-25T01:04:53.8307208Z 489 │ }, 2026-10-25T01:04:53.8307268Z 490 │ }); 2026-10-25T01:04:53.8307326Z 491 │ } 2026-10-25T01:04:53.8307452Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-25T01:04:53.8307512Z 493 │ if ( 2026-10-25T01:04:53.8307653Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-25T01:04:53.8307752Z 495 │ selectedProject.id === directProject.id 2026-10-25T01:04:53.8307809Z 496 │ ) { 2026-10-25T01:04:53.8307878Z 497 │ return; 2026-10-25T01:04:53.8307938Z 498 │ } 2026-10-25T01:04:53.8308017Z 499 │ setProject(directProject); 2026-10-25T01:04:53.8308078Z 500 │ return; 2026-10-25T01:04:53.8308134Z 501 │ } 2026-10-25T01:04:53.8308188Z 502 │ 2026-10-25T01:04:53.8308265Z 503 │ if (projects.length > 0) { 2026-10-25T01:04:53.8308364Z 504 │ setIsReturningToProjectPicker(true); 2026-10-25T01:04:53.8308474Z ·  ──────────────┬────────────── 2026-10-25T01:04:53.8308656Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8308709Z 505 │ } 2026-10-25T01:04:53.8308762Z ╰──── 2026-10-25T01:04:53.8309360Z  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-25T01:04:53.8309682Z  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-25T01:04:53.8309685Z 2026-10-25T01:04:53.8309944Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-25T01:04:53.8310099Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-25T01:04:53.8310154Z 545 │ 2026-10-25T01:04:53.8310221Z 546 │ useEffect(() => { 2026-10-25T01:04:53.8310295Z ·  ────┬──── 2026-10-25T01:04:53.8310437Z · ╰── This is the containing effect 2026-10-25T01:04:53.8310564Z 547 │ const shareId = props.incomingShareId; 2026-10-25T01:04:53.8310649Z 548 │ const draftKey = flow.draftKey; 2026-10-25T01:04:53.8310750Z 549 │ const destinationProject = selectedProject; 2026-10-25T01:04:53.8310888Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-25T01:04:53.8311018Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-25T01:04:53.8311108Z 552 │ const selectedProjectMatchesRoute = 2026-10-25T01:04:53.8311184Z 553 │ !initialEnvironmentId || 2026-10-25T01:04:53.8311252Z 554 │ !initialProjectId || 2026-10-25T01:04:53.8311383Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-25T01:04:53.8311487Z 556 │ destinationProject.id === initialProjectId); 2026-10-25T01:04:53.8311544Z 557 │ if ( 2026-10-25T01:04:53.8311663Z 558 │ !shareId || 2026-10-25T01:04:53.8311846Z 559 │ !draftKey || 2026-10-25T01:04:53.8311919Z 560 │ !destinationProject || 2026-10-25T01:04:53.8312007Z 561 │ !selectedProjectMatchesRoute || 2026-10-25T01:04:53.8312095Z 562 │ cancelledIncomingShareId === shareId 2026-10-25T01:04:53.8312153Z 563 │ ) { 2026-10-25T01:04:53.8312214Z 564 │ return; 2026-10-25T01:04:53.8312270Z 565 │ } 2026-10-25T01:04:53.8312363Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-25T01:04:53.8312421Z 567 │ if ( 2026-10-25T01:04:53.8312534Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-25T01:04:53.8312646Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-25T01:04:53.8312700Z 570 │ ) { 2026-10-25T01:04:53.8312761Z 571 │ return; 2026-10-25T01:04:53.8312817Z 572 │ } 2026-10-25T01:04:53.8312874Z 573 │ 2026-10-25T01:04:53.8312947Z 574 │ if (!incomingShare) { 2026-10-25T01:04:53.8313143Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-25T01:04:53.8313272Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-25T01:04:53.8313337Z 577 │ Dialog.alert( 2026-10-25T01:04:53.8313423Z 578 │ "Shared content unavailable", 2026-10-25T01:04:53.8313600Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-25T01:04:53.8313659Z 580 │ ); 2026-10-25T01:04:53.8313712Z 581 │ } 2026-10-25T01:04:53.8313772Z 582 │ return; 2026-10-25T01:04:53.8313829Z 583 │ } 2026-10-25T01:04:53.8313883Z 584 │ 2026-10-25T01:04:53.8313939Z 585 │ if ( 2026-10-25T01:04:53.8314106Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-25T01:04:53.8314208Z 587 │ selectedEnvironmentServerConfig === null 2026-10-25T01:04:53.8314263Z 588 │ ) { 2026-10-25T01:04:53.8314320Z 589 │ return; 2026-10-25T01:04:53.8314374Z 590 │ } 2026-10-25T01:04:53.8314426Z 591 │ 2026-10-25T01:04:53.8314560Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-25T01:04:53.8314680Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-25T01:04:53.8314736Z 594 │ } 2026-10-25T01:04:53.8314842Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-25T01:04:53.8314909Z 596 │ const draftBackup = 2026-10-25T01:04:53.8315094Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-25T01:04:53.8315232Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-25T01:04:53.8315328Z 599 │ const importToken = Symbol(importKey); 2026-10-25T01:04:53.8315408Z 600 │ let didReserveShare = false; 2026-10-25T01:04:53.8315485Z 601 │ let didConsumeShare = false; 2026-10-25T01:04:53.8315566Z 602 │ let needsDraftRestore = false; 2026-10-25T01:04:53.8315676Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-25T01:04:53.8315760Z 604 │ setImportingShareKey(importKey); 2026-10-25T01:04:53.8315850Z ·  ──────────┬───────── 2026-10-25T01:04:53.8316024Z · ╰── Avoid calling setState() directly within an effect 2026-10-25T01:04:53.8316094Z 605 │ void (async () => { 2026-10-25T01:04:53.8316144Z ╰──── 2026-10-25T01:04:53.8316787Z  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-25T01:04:53.8317141Z  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-25T01:04:53.8317143Z 2026-10-25T01:04:53.8317344Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8317498Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-25T01:04:53.8317573Z 523 │ props.initialProjectRef, 2026-10-25T01:04:53.8317648Z 524 │ props.incomingShareId, 2026-10-25T01:04:53.8317737Z ·  ──────────┬────────── 2026-10-25T01:04:53.8317908Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-25T01:04:53.8317980Z 525 │ props.pendingTaskId, 2026-10-25T01:04:53.8318034Z ╰──── 2026-10-25T01:04:53.8318323Z  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-25T01:04:53.8318630Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8318633Z 2026-10-25T01:04:53.8318845Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-25T01:04:53.8318994Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-25T01:04:53.8319110Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-25T01:04:53.8319184Z 543 │ flow.loadBranches(); 2026-10-25T01:04:53.8319259Z ·  ──┬─ 2026-10-25T01:04:53.8319381Z · ╰── Missing dependency `flow` 2026-10-25T01:04:53.8319477Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-25T01:04:53.8319565Z ·  ────────┬──────── 2026-10-25T01:04:53.8319763Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-25T01:04:53.8319814Z 545 │ 2026-10-25T01:04:53.8319867Z ╰──── 2026-10-25T01:04:53.8320286Z  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-25T01:04:53.8320635Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8320641Z 2026-10-25T01:04:53.8320836Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-25T01:04:53.8320991Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-25T01:04:53.8321057Z 765 │ flow.draftKey, 2026-10-25T01:04:53.8321135Z 766 │ hasImportedIncomingShare, 2026-10-25T01:04:53.8321226Z ·  ────────────┬─────────── 2026-10-25T01:04:53.8321404Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-25T01:04:53.8321470Z 767 │ incomingShare, 2026-10-25T01:04:53.8321549Z 768 │ isIncomingShareInboxLoading, 2026-10-25T01:04:53.8321695Z ·  ─────────────┬───────────── 2026-10-25T01:04:53.8321911Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-25T01:04:53.8321992Z 769 │ isIncomingShareUnavailable, 2026-10-25T01:04:53.8322066Z 770 │ props.incomingShareId, 2026-10-25T01:04:53.8322160Z 771 │ props.initialProjectRef?.environmentId, 2026-10-25T01:04:53.8322251Z 772 │ props.initialProjectRef?.projectId, 2026-10-25T01:04:53.8322326Z 773 │ releaseShareReservation, 2026-10-25T01:04:53.8322391Z 774 │ reserveShare, 2026-10-25T01:04:53.8322475Z 775 │ selectedEnvironmentServerConfig, 2026-10-25T01:04:53.8322545Z 776 │ selectedProject, 2026-10-25T01:04:53.8322616Z 777 │ shareImportAttempt, 2026-10-25T01:04:53.8322703Z ·  ─────────┬──────── 2026-10-25T01:04:53.8322870Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-25T01:04:53.8322930Z 778 │ ]); 2026-10-25T01:04:53.8322982Z ╰──── 2026-10-25T01:04:53.8323273Z  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-25T01:04:53.8323575Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-25T01:04:53.8323581Z 2026-10-25T01:04:53.8323664Z Found 0 errors and 372 warnings in 5486 files (5.7s, 8 threads) 2026-10-25T01:04:53.8746403Z Post job cleanup. 2026-10-25T01:04:53.9346434Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-25T01:04:53.9411168Z Post job cleanup. 2026-10-25T01:04:54.0313537Z ##[start-action display=Cache full pnpm store;id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.__actions_cache] 2026-10-25T01:04:54.0603218Z Post job cleanup. 2026-10-25T01:04:54.1203520Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c, not saving cache. 2026-10-25T01:04:54.1231462Z ##[end-action id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.__actions_cache;outcome=success;conclusion=success;duration_ms=91] 2026-10-25T01:04:54.1233523Z ##[start-action display=Cache Vite+;id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.vp_cache] 2026-10-25T01:04:54.1256531Z Post job cleanup. 2026-10-25T01:04:54.1848886Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-25T01:04:54.1875975Z ##[end-action id=__566ef0e8-ae7a-4db2-86d3-df2296ab3022.vp_cache;outcome=success;conclusion=success;duration_ms=64] 2026-10-25T01:04:54.1910344Z Post job cleanup. 2026-10-25T01:04:54.2284659Z [command]/usr/local/bin/git version 2026-10-25T01:04:54.2331681Z git version 2.55.0 2026-10-25T01:04:54.2347393Z Temporarily overriding HOME='/home/runner/_work/_temp/81f55779-7a15-4994-8023-edd851863df7' before making global git config changes 2026-10-25T01:04:54.2347743Z Adding repository directory to the temporary git global config as a safe directory 2026-10-25T01:04:54.2349994Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-25T01:04:54.2369209Z Removing SSH command configuration 2026-10-25T01:04:54.2371946Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-25T01:04:54.2393832Z [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-25T01:04:54.2501891Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-25T01:04:54.2522016Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-25T01:04:54.2556330Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-25T01:04:54.2577939Z ##[group]Run '/job_completed.sh' 2026-10-25T01:04:54.2589147Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-25T01:04:54.2589315Z env: 2026-10-25T01:04:54.2589429Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-25T01:04:54.2589575Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 400 2026-10-25T01:04:54.2589714Z BLACKSMITH_CHECK_RUN_ID: 121036834290 2026-10-25T01:04:54.2589855Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-25T01:04:54.2589994Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-25T01:04:54.2590126Z ##[endgroup] 2026-10-25T01:04:54.2664756Z Docker container cache not activated, skipping hash computation. 2026-10-25T01:04:54.2907380Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-25T01:04:54.2949210Z Cleaning up orphan processes