2026-10-24T02:53:18.4781550Z Current runner version: '2.338.1' 2026-10-24T02:53:18.4785221Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-2kjyp76yhgai37sg' 2026-10-24T02:53:18.4786001Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T02:53:18.4786809Z Machine name: 'ip-172-31-73-130' 2026-10-24T02:53:18.4788549Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T02:53:18.4789869Z Contents: read 2026-10-24T02:53:18.4790400Z Metadata: read 2026-10-24T02:53:18.4790829Z ##[endgroup] 2026-10-24T02:53:18.4792202Z Secret source: Actions 2026-10-24T02:53:18.4792904Z Cache mode: write 2026-10-24T02:53:18.4793400Z Prepare workflow directory 2026-10-24T02:53:18.4978448Z Prepare all required actions 2026-10-24T02:53:18.5005608Z Getting action download info 2026-10-24T02:53:18.6355851Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T02:53:18.6758108Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T02:53:18.7901171Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T02:53:18.7939802Z Complete job name: Lint 2026-10-24T02:53:18.8315146Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T02:53:18.8408720Z ##[group]Run '/setup.sh' 2026-10-24T02:53:18.8417250Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:53:18.8417690Z env: 2026-10-24T02:53:18.8417928Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:18.8418229Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:18.8418520Z BLACKSMITH_CHECK_RUN_ID: 120759108944 2026-10-24T02:53:18.8418812Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T02:53:18.8419093Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T02:53:18.8419369Z ##[endgroup] 2026-10-24T02:53:18.8653354Z Logging daemon started (blacksmithd for logs) 2026-10-24T02:53:18.8765147Z Results daemon started (blacksmithd for results) 2026-10-24T02:53:18.8905752Z Background adoption and SSH setup started (PID: 3066) 2026-10-24T02:53:18.8907565Z 2026-10-24T02:53:18.8907687Z ---------------------------------------- 2026-10-24T02:53:18.8908522Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40056032845/jobs/120759108944 2026-10-24T02:53:18.8908985Z SSH Access (using your GitHub SSH key): 2026-10-24T02:53:18.8909453Z ssh -p 64004 runner@blacksmith-8vcpu-ubuntu-2404-2kjyp76yhgai37sg.vm.blacksmith.sh 2026-10-24T02:53:18.8909773Z 2026-10-24T02:53:18.8909896Z No GitHub SSH key? Add one at: 2026-10-24T02:53:18.8910399Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T02:53:18.8910807Z 2026-10-24T02:53:18.8910923Z ---------------------------------------- 2026-10-24T02:53:18.8911110Z 2026-10-24T02:53:18.8911260Z VM ID: blacksmith-8vcpu-ubuntu-2404-2kjyp76yhgai37sg 2026-10-24T02:53:18.8911601Z Host: production-152.236.41.171-x8664 2026-10-24T02:53:18.8911886Z Host Agent PID: 823459 2026-10-24T02:53:18.8912143Z Host Agent Git SHA: 1637818df 2026-10-24T02:53:18.8912426Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T02:53:18.8912721Z Blacksmith Host Generation: gen 2 2026-10-24T02:53:18.8913028Z Petname: production-smashing-possum-3347f699 2026-10-24T02:53:18.8913335Z Region: us-east 2026-10-24T02:53:18.8913585Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T02:53:18.8921030Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T02:53:18.8921491Z 2026-10-24T02:53:18.8921619Z Enabling Blacksmith transparent cache 2026-10-24T02:53:18.9220415Z ##[group]Run actions/checkout@v6 2026-10-24T02:53:18.9220736Z with: 2026-10-24T02:53:18.9221077Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T02:53:18.9221483Z sparse-checkout-cone-mode: false 2026-10-24T02:53:18.9221773Z repository: pingdotgg/t3code 2026-10-24T02:53:18.9223506Z token: *** 2026-10-24T02:53:18.9223733Z ssh-strict: true 2026-10-24T02:53:18.9223963Z ssh-user: git 2026-10-24T02:53:18.9224201Z persist-credentials: true 2026-10-24T02:53:18.9224701Z clean: true 2026-10-24T02:53:18.9224928Z fetch-depth: 1 2026-10-24T02:53:18.9225159Z fetch-tags: false 2026-10-24T02:53:18.9225394Z show-progress: true 2026-10-24T02:53:18.9225633Z lfs: false 2026-10-24T02:53:18.9225852Z submodules: false 2026-10-24T02:53:18.9226090Z set-safe-directory: true 2026-10-24T02:53:18.9226403Z allow-unsafe-pr-checkout: false 2026-10-24T02:53:18.9226693Z env: 2026-10-24T02:53:18.9226943Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:18.9227238Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:18.9227533Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:18.9227805Z ##[endgroup] 2026-10-24T02:53:19.0453340Z Syncing repository: pingdotgg/t3code 2026-10-24T02:53:19.0454318Z ##[group]Getting Git version info 2026-10-24T02:53:19.0454666Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T02:53:19.0455166Z [command]/usr/local/bin/git version 2026-10-24T02:53:19.0540080Z git version 2.55.0 2026-10-24T02:53:19.0553811Z ##[endgroup] 2026-10-24T02:53:19.0562065Z Temporarily overriding HOME='/home/runner/_work/_temp/a1191fdd-f041-40cd-9c01-dd0761ebcfa7' before making global git config changes 2026-10-24T02:53:19.0562729Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T02:53:19.0566073Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T02:53:19.0600697Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T02:53:19.0602694Z ##[group]Determining repository object format 2026-10-24T02:53:19.0603854Z ##[endgroup] 2026-10-24T02:53:19.0604236Z ##[group]Initializing the repository 2026-10-24T02:53:19.0606574Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T02:53:19.0643093Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T02:53:19.0643855Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T02:53:19.0644596Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T02:53:19.0645202Z hint: call: 2026-10-24T02:53:19.0645553Z hint: 2026-10-24T02:53:19.0645959Z hint: git config --global init.defaultBranch 2026-10-24T02:53:19.0646483Z hint: 2026-10-24T02:53:19.0646916Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T02:53:19.0647383Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T02:53:19.0647781Z hint: 2026-10-24T02:53:19.0648130Z hint: git branch -m 2026-10-24T02:53:19.0648417Z hint: 2026-10-24T02:53:19.0648741Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T02:53:19.0649218Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T02:53:19.0650047Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T02:53:19.0675312Z ##[endgroup] 2026-10-24T02:53:19.0675706Z ##[group]Disabling automatic garbage collection 2026-10-24T02:53:19.0677714Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T02:53:19.0700494Z ##[endgroup] 2026-10-24T02:53:19.0700862Z ##[group]Setting up auth 2026-10-24T02:53:19.0701135Z Removing SSH command configuration 2026-10-24T02:53:19.0704107Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T02:53:19.0726824Z [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-24T02:53:19.0890134Z Removing HTTP extra header 2026-10-24T02:53:19.0892060Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T02:53:19.0919306Z [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-24T02:53:19.1032836Z Removing includeIf entries pointing to credentials config files 2026-10-24T02:53:19.1036966Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T02:53:19.1061024Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T02:53:19.1184587Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-143fbf60-d5be-4a25-991a-849e2d892160.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T02:53:19.1211720Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-143fbf60-d5be-4a25-991a-849e2d892160.config 2026-10-24T02:53:19.1237019Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-143fbf60-d5be-4a25-991a-849e2d892160.config 2026-10-24T02:53:19.1264027Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-143fbf60-d5be-4a25-991a-849e2d892160.config 2026-10-24T02:53:19.1285850Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-143fbf60-d5be-4a25-991a-849e2d892160.config 2026-10-24T02:53:19.1306495Z ##[endgroup] 2026-10-24T02:53:19.1306882Z ##[group]Fetching the repository 2026-10-24T02:53:19.1311314Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +5bac651a03397d608a20529e8a6eb032f241e24b:refs/remotes/pull/24263/merge 2026-10-24T02:53:19.3903752Z From https://github.com/pingdotgg/t3code 2026-10-24T02:53:19.3904442Z * [new ref] 5bac651a03397d608a20529e8a6eb032f241e24b -> pull/24263/merge 2026-10-24T02:53:19.3934172Z ##[endgroup] 2026-10-24T02:53:19.3934663Z ##[group]Determining the checkout info 2026-10-24T02:53:19.3935177Z ##[endgroup] 2026-10-24T02:53:19.3935607Z ##[group]Setting up sparse checkout 2026-10-24T02:53:19.3937929Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T02:53:19.3961338Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T02:53:19.3976609Z .git/info/sparse-checkout 2026-10-24T02:53:19.3980393Z ##[endgroup] 2026-10-24T02:53:19.3980854Z ##[group]Checking out the ref 2026-10-24T02:53:19.3983263Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24263/merge 2026-10-24T02:53:26.0223117Z Updating files: 0% (1/6322) 2026-10-24T02:53:26.0252220Z Updating files: 1% (64/6322) 2026-10-24T02:53:26.0271862Z Updating files: 2% (127/6322) 2026-10-24T02:53:26.0291693Z Updating files: 3% (190/6322) 2026-10-24T02:53:26.0316010Z Updating files: 4% (253/6322) 2026-10-24T02:53:26.0347779Z Updating files: 5% (317/6322) 2026-10-24T02:53:26.0369760Z Updating files: 6% (380/6322) 2026-10-24T02:53:26.0429111Z Updating files: 7% (443/6322) 2026-10-24T02:53:26.0468190Z Updating files: 8% (506/6322) 2026-10-24T02:53:26.0497690Z Updating files: 9% (569/6322) 2026-10-24T02:53:26.0814002Z Updating files: 10% (633/6322) 2026-10-24T02:53:26.0831097Z Updating files: 11% (696/6322) 2026-10-24T02:53:26.0842775Z Updating files: 12% (759/6322) 2026-10-24T02:53:26.0857390Z Updating files: 13% (822/6322) 2026-10-24T02:53:26.0874853Z Updating files: 14% (886/6322) 2026-10-24T02:53:26.0893183Z Updating files: 15% (949/6322) 2026-10-24T02:53:26.0913540Z Updating files: 16% (1012/6322) 2026-10-24T02:53:26.0928887Z Updating files: 17% (1075/6322) 2026-10-24T02:53:26.0949518Z Updating files: 18% (1138/6322) 2026-10-24T02:53:26.0966059Z Updating files: 19% (1202/6322) 2026-10-24T02:53:26.0989402Z Updating files: 20% (1265/6322) 2026-10-24T02:53:26.1007856Z Updating files: 21% (1328/6322) 2026-10-24T02:53:26.1028396Z Updating files: 22% (1391/6322) 2026-10-24T02:53:26.1043248Z Updating files: 23% (1455/6322) 2026-10-24T02:53:26.1057959Z Updating files: 24% (1518/6322) 2026-10-24T02:53:26.1074188Z Updating files: 25% (1581/6322) 2026-10-24T02:53:26.1088892Z Updating files: 26% (1644/6322) 2026-10-24T02:53:26.1104878Z Updating files: 27% (1707/6322) 2026-10-24T02:53:26.1125769Z Updating files: 28% (1771/6322) 2026-10-24T02:53:26.1160795Z Updating files: 29% (1834/6322) 2026-10-24T02:53:26.1182624Z Updating files: 30% (1897/6322) 2026-10-24T02:53:26.1207787Z Updating files: 31% (1960/6322) 2026-10-24T02:53:26.1240724Z Updating files: 32% (2024/6322) 2026-10-24T02:53:26.1273542Z Updating files: 33% (2087/6322) 2026-10-24T02:53:26.1345530Z Updating files: 34% (2150/6322) 2026-10-24T02:53:26.1411456Z Updating files: 35% (2213/6322) 2026-10-24T02:53:26.1448522Z Updating files: 36% (2276/6322) 2026-10-24T02:53:26.1485636Z Updating files: 37% (2340/6322) 2026-10-24T02:53:26.1533660Z Updating files: 38% (2403/6322) 2026-10-24T02:53:26.1561770Z Updating files: 39% (2466/6322) 2026-10-24T02:53:26.1595151Z Updating files: 40% (2529/6322) 2026-10-24T02:53:26.1628252Z Updating files: 41% (2593/6322) 2026-10-24T02:53:26.1645069Z Updating files: 42% (2656/6322) 2026-10-24T02:53:26.1655673Z Updating files: 43% (2719/6322) 2026-10-24T02:53:26.1677941Z Updating files: 44% (2782/6322) 2026-10-24T02:53:26.1709602Z Updating files: 45% (2845/6322) 2026-10-24T02:53:26.1736075Z Updating files: 46% (2909/6322) 2026-10-24T02:53:26.1764916Z Updating files: 47% (2972/6322) 2026-10-24T02:53:26.1795530Z Updating files: 48% (3035/6322) 2026-10-24T02:53:26.1827513Z Updating files: 49% (3098/6322) 2026-10-24T02:53:26.1868836Z Updating files: 50% (3161/6322) 2026-10-24T02:53:26.1885032Z Updating files: 51% (3225/6322) 2026-10-24T02:53:26.1920932Z Updating files: 52% (3288/6322) 2026-10-24T02:53:26.1949197Z Updating files: 53% (3351/6322) 2026-10-24T02:53:26.1970992Z Updating files: 54% (3414/6322) 2026-10-24T02:53:26.1996061Z Updating files: 55% (3478/6322) 2026-10-24T02:53:26.2014856Z Updating files: 56% (3541/6322) 2026-10-24T02:53:26.2033260Z Updating files: 57% (3604/6322) 2026-10-24T02:53:26.2052713Z Updating files: 58% (3667/6322) 2026-10-24T02:53:26.2450495Z Updating files: 59% (3730/6322) 2026-10-24T02:53:26.2465548Z Updating files: 60% (3794/6322) 2026-10-24T02:53:26.2482271Z Updating files: 61% (3857/6322) 2026-10-24T02:53:26.2501110Z Updating files: 62% (3920/6322) 2026-10-24T02:53:26.2523755Z Updating files: 63% (3983/6322) 2026-10-24T02:53:26.2551899Z Updating files: 64% (4047/6322) 2026-10-24T02:53:26.2575138Z Updating files: 65% (4110/6322) 2026-10-24T02:53:26.2592351Z Updating files: 66% (4173/6322) 2026-10-24T02:53:26.2619348Z Updating files: 67% (4236/6322) 2026-10-24T02:53:26.2633407Z Updating files: 68% (4299/6322) 2026-10-24T02:53:26.2653963Z Updating files: 69% (4363/6322) 2026-10-24T02:53:26.2667841Z Updating files: 70% (4426/6322) 2026-10-24T02:53:26.2685428Z Updating files: 71% (4489/6322) 2026-10-24T02:53:26.2703274Z Updating files: 72% (4552/6322) 2026-10-24T02:53:26.2730326Z Updating files: 73% (4616/6322) 2026-10-24T02:53:26.3005583Z Updating files: 74% (4679/6322) 2026-10-24T02:53:26.3207130Z Updating files: 75% (4742/6322) 2026-10-24T02:53:26.3230387Z Updating files: 76% (4805/6322) 2026-10-24T02:53:26.3251844Z Updating files: 77% (4868/6322) 2026-10-24T02:53:26.3279396Z Updating files: 78% (4932/6322) 2026-10-24T02:53:26.3299422Z Updating files: 79% (4995/6322) 2026-10-24T02:53:26.3318291Z Updating files: 80% (5058/6322) 2026-10-24T02:53:26.3338970Z Updating files: 81% (5121/6322) 2026-10-24T02:53:26.3358504Z Updating files: 82% (5185/6322) 2026-10-24T02:53:26.3377120Z Updating files: 83% (5248/6322) 2026-10-24T02:53:26.3400617Z Updating files: 84% (5311/6322) 2026-10-24T02:53:26.3421580Z Updating files: 85% (5374/6322) 2026-10-24T02:53:26.3444918Z Updating files: 86% (5437/6322) 2026-10-24T02:53:26.3519133Z Updating files: 87% (5501/6322) 2026-10-24T02:53:26.3554159Z Updating files: 88% (5564/6322) 2026-10-24T02:53:26.3572693Z Updating files: 89% (5627/6322) 2026-10-24T02:53:26.3600526Z Updating files: 90% (5690/6322) 2026-10-24T02:53:26.3637356Z Updating files: 91% (5754/6322) 2026-10-24T02:53:26.3653483Z Updating files: 92% (5817/6322) 2026-10-24T02:53:26.3670735Z Updating files: 93% (5880/6322) 2026-10-24T02:53:26.3693715Z Updating files: 94% (5943/6322) 2026-10-24T02:53:26.3718644Z Updating files: 95% (6006/6322) 2026-10-24T02:53:26.3775362Z Updating files: 96% (6070/6322) 2026-10-24T02:53:26.3803223Z Updating files: 97% (6133/6322) 2026-10-24T02:53:26.3852766Z Updating files: 98% (6196/6322) 2026-10-24T02:53:26.3873713Z Updating files: 99% (6259/6322) 2026-10-24T02:53:26.3874868Z Updating files: 100% (6322/6322) 2026-10-24T02:53:26.3875250Z Updating files: 100% (6322/6322), done. 2026-10-24T02:53:26.4033966Z Note: switching to 'refs/remotes/pull/24263/merge'. 2026-10-24T02:53:26.4034115Z 2026-10-24T02:53:26.4034249Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T02:53:26.4034491Z changes and commit them, and you can discard any commits you make in this 2026-10-24T02:53:26.4034720Z state without impacting any branches by switching back to a branch. 2026-10-24T02:53:26.4034860Z 2026-10-24T02:53:26.4034957Z If you want to create a new branch to retain commits you create, you may 2026-10-24T02:53:26.4035186Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T02:53:26.4035318Z 2026-10-24T02:53:26.4035382Z git switch -c 2026-10-24T02:53:26.4035472Z 2026-10-24T02:53:26.4035530Z Or undo this operation with: 2026-10-24T02:53:26.4035752Z 2026-10-24T02:53:26.4035804Z git switch - 2026-10-24T02:53:26.4035876Z 2026-10-24T02:53:26.4035992Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T02:53:26.4036141Z 2026-10-24T02:53:26.4036314Z HEAD is now at 5bac651 Merge 6fc097e420b550849c74c780e746b6c0624b6a56 into 26c3625f484eadd4d5b6ca5a3dd1f8f8bd5533b4 2026-10-24T02:53:26.4048756Z ##[endgroup] 2026-10-24T02:53:26.4085111Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T02:53:26.4109258Z 5bac651a03397d608a20529e8a6eb032f241e24b 2026-10-24T02:53:26.4203146Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T02:53:26.4203491Z files="$(git ls-files .github/pr-assets)" 2026-10-24T02:53:26.4203796Z if test -n "$files"; then 2026-10-24T02:53:26.4204141Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T02:53:26.4204473Z  exit 1 2026-10-24T02:53:26.4204636Z fi 2026-10-24T02:53:26.4214936Z shell: /usr/bin/bash -e {0} 2026-10-24T02:53:26.4215116Z env: 2026-10-24T02:53:26.4215232Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:26.4215405Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:26.4215570Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:26.4215713Z ##[endgroup] 2026-10-24T02:53:26.4439561Z Prepare all required actions 2026-10-24T02:53:26.4439879Z Getting action download info 2026-10-24T02:53:26.5418464Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T02:53:26.6670084Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T02:53:26.6670246Z env: 2026-10-24T02:53:26.6670359Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:26.6670509Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:26.6670652Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:26.6670788Z ##[endgroup] 2026-10-24T02:53:26.7874671Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T02:53:26.7893768Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T02:53:26.7894243Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T02:53:26.7894548Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T02:53:26.7894789Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T02:53:26.7903416Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:53:26.7903583Z env: 2026-10-24T02:53:26.7903740Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:26.7903886Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:26.7904030Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:26.7904163Z ##[endgroup] 2026-10-24T02:53:26.7986250Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=11] 2026-10-24T02:53:26.7988519Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T02:53:26.8042037Z ##[group]Run actions/cache@v6 2026-10-24T02:53:26.8042196Z with: 2026-10-24T02:53:26.8042307Z path: ~/.vite-plus 2026-10-24T02:53:26.8042479Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T02:53:26.8042690Z enableCrossOsArchive: false 2026-10-24T02:53:26.8042827Z fail-on-cache-miss: false 2026-10-24T02:53:26.8042957Z lookup-only: false 2026-10-24T02:53:26.8043072Z save-always: false 2026-10-24T02:53:26.8043187Z env: 2026-10-24T02:53:26.8043302Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:26.8043454Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:26.8043599Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:26.8043788Z ##[endgroup] 2026-10-24T02:53:27.0146582Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T02:53:27.7626790Z Received 170349591 of 170349591 (100.0%), 224.4 MBs/sec 2026-10-24T02:53:27.7627164Z Cache Size: ~162 MB (170349591 B) 2026-10-24T02:53:27.7663618Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/dcada3dc-a6f4-456d-9e53-1879cc4fb5d7/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T02:53:28.4810854Z Cache restored successfully 2026-10-24T02:53:28.4967966Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T02:53:28.5040574Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1705] 2026-10-24T02:53:28.5043179Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T02:53:28.5067175Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T02:53:28.5067398Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T02:53:28.5067575Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T02:53:28.5077780Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:53:28.5077954Z env: 2026-10-24T02:53:28.5078076Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:28.5078226Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:28.5078374Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:28.5078526Z ##[endgroup] 2026-10-24T02:53:28.5119369Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T02:53:28.5129979Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8] 2026-10-24T02:53:28.5132330Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T02:53:28.5152725Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T02:53:28.5154238Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T02:53:28.5167084Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T02:53:28.5167272Z store_path="$(vp pm cache dir)" 2026-10-24T02:53:28.5167438Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T02:53:28.5180059Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:53:28.5180231Z env: 2026-10-24T02:53:28.5180344Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:28.5180496Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:28.5180861Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:28.5180996Z ##[endgroup] 2026-10-24T02:53:28.5329575Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=17] 2026-10-24T02:53:28.5331082Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T02:53:28.5682001Z ##[group]Run actions/cache@v6 2026-10-24T02:53:28.5682137Z with: 2026-10-24T02:53:28.5682265Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T02:53:28.5682531Z key: pnpm-full-v1-Linux-X64-045caa51c4b226597018f0d0c699ccc3936ad58bb7e4b01dc2f26bb9d6fd8aef 2026-10-24T02:53:28.5682795Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T02:53:28.5682945Z enableCrossOsArchive: false 2026-10-24T02:53:28.5683082Z fail-on-cache-miss: false 2026-10-24T02:53:28.5683208Z lookup-only: false 2026-10-24T02:53:28.5683323Z save-always: false 2026-10-24T02:53:28.5683477Z env: 2026-10-24T02:53:28.5683589Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:28.5683753Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:28.5683892Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:28.5684027Z ##[endgroup] 2026-10-24T02:53:28.7739143Z Cache hit for restore-key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-24T02:53:29.7975725Z Received 570425344 of 995020926 (57.3%), 543.5 MBs/sec 2026-10-24T02:53:30.4850816Z Received 995020926 of 995020926 (100.0%), 562.2 MBs/sec 2026-10-24T02:53:30.4851080Z Cache Size: ~949 MB (995020926 B) 2026-10-24T02:53:30.4883359Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/3988e077-60af-4537-a2d1-ccacad04ae2c/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T02:53:36.3224778Z Cache restored successfully 2026-10-24T02:53:36.3737553Z Cache restored from key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef 2026-10-24T02:53:36.3850414Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7851] 2026-10-24T02:53:36.3852635Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T02:53:36.3864156Z ##[group]Run vp install 2026-10-24T02:53:36.3864302Z vp install 2026-10-24T02:53:36.3873957Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T02:53:36.3874125Z env: 2026-10-24T02:53:36.3874242Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:36.3874389Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:36.3874557Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:36.3874698Z ##[endgroup] 2026-10-24T02:53:36.4222801Z Scope: all 33 workspace projects 2026-10-24T02:53:36.5311790Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T02:53:36.8177472Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T02:53:36.8177804Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T02:53:36.8178024Z Virtual store is at: node_modules/.pnpm 2026-10-24T02:53:38.8824321Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.4s) 2026-10-24T02:53:38.8824575Z Lockfile is up to date, resolution step is skipped 2026-10-24T02:53:38.9018157Z Packages: +1721 2026-10-24T02:53:38.9018329Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T02:53:38.9393035Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T02:53:38.9763228Z .../react-native-enriched-markdown postinstall$ node postinstall.mjs 2026-10-24T02:53:39.0073487Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] restoring vendored native assets ... 2026-10-24T02:53:39.0277591Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching runtime v0.26.3 from https://github.com/tree-sitter/tree-sitter/archive/refs/tags/v0.26.3.tar.gz 2026-10-24T02:53:39.1332971Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] runtime -> react-native-enriched-markdown/cpp/highlight/vendor/tree-sitter/src 2026-10-24T02:53:39.1335119Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-json@0.24.8 ... 2026-10-24T02:53:39.1344509Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-html@0.23.2 ... 2026-10-24T02:53:39.1346688Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-css@0.23.2 ... 2026-10-24T02:53:39.1347820Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading @tree-sitter-grammars/tree-sitter-markdown@0.3.2 ... 2026-10-24T02:53:39.1348622Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading @tree-sitter-grammars/tree-sitter-yaml@0.7.1 ... 2026-10-24T02:53:39.1349174Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-go@0.23.4 ... 2026-10-24T02:53:39.1349722Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-java@0.23.5 ... 2026-10-24T02:53:39.1350593Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-javascript@0.23.1 ... 2026-10-24T02:53:39.1351732Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-python@0.23.6 ... 2026-10-24T02:53:39.1352481Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-c@0.23.5 ... 2026-10-24T02:53:39.1353296Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-rust@0.23.2 ... 2026-10-24T02:53:39.1353991Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-bash@0.23.3 ... 2026-10-24T02:53:39.1354515Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-typescript@0.23.2 ... 2026-10-24T02:53:39.1354920Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-cpp@0.23.4 ... 2026-10-24T02:53:39.1376992Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-swift@0.7.0 ... 2026-10-24T02:53:39.1377393Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-php@0.24.2 ... 2026-10-24T02:53:39.1377783Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-ruby@0.23.1 ... 2026-10-24T02:53:39.1378186Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] downloading tree-sitter-c-sharp@0.23.1 ... 2026-10-24T02:53:40.1645858Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] json -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/json 2026-10-24T02:53:40.1663429Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] html -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/html 2026-10-24T02:53:40.1669281Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] css -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/css 2026-10-24T02:53:40.1686578Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] markdown -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/markdown 2026-10-24T02:53:40.1697916Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] yaml -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/yaml 2026-10-24T02:53:40.1708399Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] go -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/go 2026-10-24T02:53:40.1723080Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] java -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/java 2026-10-24T02:53:40.1736110Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] javascript -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/javascript 2026-10-24T02:53:40.1753068Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] python -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/python 2026-10-24T02:53:40.1778909Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] c -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/c 2026-10-24T02:53:40.1822024Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] rust -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/rust 2026-10-24T02:53:40.1891359Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] bash -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/bash 2026-10-24T02:53:40.2081200Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] typescript -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/typescript 2026-10-24T02:53:40.2232323Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] tsx -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/tsx 2026-10-24T02:53:40.2367880Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] cpp -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/cpp 2026-10-24T02:53:40.2770690Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] swift -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/swift 2026-10-24T02:53:40.2914778Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] php -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/php 2026-10-24T02:53:40.3037339Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] ruby -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/ruby 2026-10-24T02:53:40.3385397Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] c-sharp -> react-native-enriched-markdown/cpp/highlight/vendor/grammars/c-sharp 2026-10-24T02:53:40.3757244Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] grammar sources ready. 2026-10-24T02:53:40.3757608Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] done. 2026-10-24T02:53:40.4029098Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching xcframework from https://github.com/erweixin/RaTeX/releases/download/v0.1.15/RaTeX.xcframework.zip 2026-10-24T02:53:40.7584817Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] fetching source from https://github.com/erweixin/RaTeX/archive/refs/tags/v0.1.15.tar.gz 2026-10-24T02:53:41.2052333Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] RaTeX v0.1.15 -> /home/runner/_work/t3code/t3code/node_modules/.pnpm/react-native-enriched-markdown@file+apps+mobile+deps+react-native-enriched-markdown-1.2_5377bdeb56d3cc2ef9b4c8a0a7f06bc1/node_modules/react-native-enriched-markdown/ios/vendor 2026-10-24T02:53:41.2053132Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] done. 2026-10-24T02:53:41.2229567Z .../react-native-enriched-markdown postinstall: [react-native-enriched-markdown] postinstall complete. 2026-10-24T02:53:41.2250355Z .../react-native-enriched-markdown postinstall: Done 2026-10-24T02:53:41.6542087Z . prepare$ vp config --no-agent 2026-10-24T02:53:41.7589978Z . prepare: Done 2026-10-24T02:53:41.7606962Z 2026-10-24T02:53:41.7607438Z devDependencies: 2026-10-24T02:53:41.7607617Z + @coderabbitai/config 1.1.0 2026-10-24T02:53:41.7607757Z + @shadcn/lint 0.1.5 2026-10-24T02:53:41.7607873Z + @types/node 24.12.4 2026-10-24T02:53:41.7607985Z + knip 6.34.0 2026-10-24T02:53:41.7608126Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T02:53:41.7608270Z + vite-plus 1.3.0 2026-10-24T02:53:41.7608338Z 2026-10-24T02:53:41.7635887Z Done in 5.4s using pnpm v12.14.0 2026-10-24T02:53:41.7831357Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=5397] 2026-10-24T02:53:41.8322561Z ##[group]Run actions/cache@v6 2026-10-24T02:53:41.8322795Z with: 2026-10-24T02:53:41.8322959Z path: ~/.cache/electron 2026-10-24T02:53:41.8323307Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T02:53:41.8323687Z enableCrossOsArchive: false 2026-10-24T02:53:41.8323889Z fail-on-cache-miss: false 2026-10-24T02:53:41.8324098Z lookup-only: false 2026-10-24T02:53:41.8324267Z save-always: false 2026-10-24T02:53:41.8324427Z env: 2026-10-24T02:53:41.8324580Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:41.8324728Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:41.8324869Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:41.8325003Z ##[endgroup] 2026-10-24T02:53:42.0285307Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T02:53:42.1868199Z Received 122906203 of 122906203 (100.0%), 831.3 MBs/sec 2026-10-24T02:53:42.1868609Z Cache Size: ~117 MB (122906203 B) 2026-10-24T02:53:42.1884427Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/e80e6e0e-236e-4415-8b20-c52319feeb29/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T02:53:42.2510549Z Cache restored successfully 2026-10-24T02:53:42.2644130Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T02:53:42.2790431Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T02:53:42.2790694Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T02:53:42.2801763Z shell: /usr/bin/bash -e {0} 2026-10-24T02:53:42.2801898Z env: 2026-10-24T02:53:42.2802061Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:42.2802212Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:42.2802361Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:42.2802501Z ##[endgroup] 2026-10-24T02:53:42.4865962Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T02:53:43.0979501Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T02:53:43.1002593Z 2026-10-24T02:53:43.1098755Z ##[group]Run vp run knip:check 2026-10-24T02:53:43.1098932Z vp run knip:check 2026-10-24T02:53:43.1108663Z shell: /usr/bin/bash -e {0} 2026-10-24T02:53:43.1108795Z env: 2026-10-24T02:53:43.1108926Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:43.1109078Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:43.1109220Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:43.1109362Z ##[endgroup] 2026-10-24T02:53:43.2660908Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T02:53:47.3110635Z 2026-10-24T02:53:47.3114572Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-24T02:53:56.1452146Z 2026-10-24T02:53:56.1452995Z --- 2026-10-24T02:53:56.1453305Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T02:53:56.1547389Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T02:53:56.1547701Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T02:53:56.1557633Z shell: /usr/bin/bash -e {0} 2026-10-24T02:53:56.1557766Z env: 2026-10-24T02:53:56.1557882Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:56.1558034Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:56.1558177Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:56.1558316Z ##[endgroup] 2026-10-24T02:53:56.3097677Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T02:53:56.5181738Z 2026-10-24T02:53:56.5265500Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T02:53:56.5265741Z vp run --filter t3 generate --check 2026-10-24T02:53:56.5275483Z shell: /usr/bin/bash -e {0} 2026-10-24T02:53:56.5275622Z env: 2026-10-24T02:53:56.5275754Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:56.5275905Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:56.5276050Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:56.5276191Z ##[endgroup] 2026-10-24T02:53:56.7096782Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T02:53:56.8831227Z 2026-10-24T02:53:56.8915549Z ##[group]Run vp check 2026-10-24T02:53:56.8915707Z vp check 2026-10-24T02:53:56.8925415Z shell: /usr/bin/bash -e {0} 2026-10-24T02:53:56.8925549Z env: 2026-10-24T02:53:56.8925662Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 153 2026-10-24T02:53:56.8925813Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 367 2026-10-24T02:53:56.8925955Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T02:53:56.8926092Z ##[endgroup] 2026-10-24T02:53:57.4604112Z pass: All 5677 files are correctly formatted (419ms, 8 threads) 2026-10-24T02:54:03.2548700Z warn: Lint warnings found 2026-10-24T02:54:03.2549805Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2550570Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5] 2026-10-24T02:54:03.2551092Z 398 │ 2026-10-24T02:54:03.2551290Z 399 │ useEffect(() => { 2026-10-24T02:54:03.2551551Z ·  ────┬──── 2026-10-24T02:54:03.2551897Z · ╰── This is the containing effect 2026-10-24T02:54:03.2552270Z 400 │ setInspectorSelection((current) => { 2026-10-24T02:54:03.2552582Z ·  ──────────┬────────── 2026-10-24T02:54:03.2552865Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2553174Z 401 │ if (props.renderInspector === undefined) { 2026-10-24T02:54:03.2553368Z ╰──── 2026-10-24T02:54:03.2554112Z  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-24T02:54:03.2555598Z  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-24T02:54:03.2556111Z 2026-10-24T02:54:03.2556480Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T02:54:03.2557074Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24] 2026-10-24T02:54:03.2557593Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T02:54:03.2558138Z 528 │ ╭─▶ const GitInspector = () => ( 2026-10-24T02:54:03.2558556Z 529 │ │ 2026-10-24T02:54:03.2560588Z 534 │ ╰─▶ ); 2026-10-24T02:54:03.2560963Z 535 │ const FilesInspector = () => 2026-10-24T02:54:03.2561212Z ╰──── 2026-10-24T02:54:03.2561675Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T02:54:03.2562040Z 2026-10-24T02:54:03.2562395Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T02:54:03.2562985Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26] 2026-10-24T02:54:03.2563342Z 534 │ ); 2026-10-24T02:54:03.2563702Z 535 │ ╭─▶ const FilesInspector = () => 2026-10-24T02:54:03.2564227Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T02:54:03.2564637Z 537 │ │ 2026-10-24T02:54:03.2568075Z 545 │ ╰─▶ ) : null; 2026-10-24T02:54:03.2568543Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T02:54:03.2568884Z ╰──── 2026-10-24T02:54:03.2569337Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T02:54:03.2569697Z 2026-10-24T02:54:03.2569953Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.2570518Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T02:54:03.2570872Z  86 │ 2026-10-24T02:54:03.2571104Z  87 │ const cardCoverage = props.cardCoverage; 2026-10-24T02:54:03.2571410Z ·  ──────┬───── 2026-10-24T02:54:03.2571770Z · ╰── `cardCoverage` originates here 2026-10-24T02:54:03.2572144Z  88 │ const barHeightRef = useRef(0); 2026-10-24T02:54:03.2572418Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T02:54:03.2572698Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T02:54:03.2573006Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T02:54:03.2573299Z  92 │ if (!cardCoverage) { 2026-10-24T02:54:03.2573537Z  93 │ return; 2026-10-24T02:54:03.2573739Z  94 │ } 2026-10-24T02:54:03.2574081Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T02:54:03.2574478Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T02:54:03.2574740Z  97 │ return; 2026-10-24T02:54:03.2574870Z  98 │ } 2026-10-24T02:54:03.2575019Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:54:03.2575205Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:54:03.2575390Z ·  ──────┬───── 2026-10-24T02:54:03.2575702Z · ╰── `cardCoverage` cannot be modified 2026-10-24T02:54:03.2576023Z 101 │ return; 2026-10-24T02:54:03.2576811Z ╰──── 2026-10-24T02:54:03.2577397Z  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-24T02:54:03.2578316Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2578619Z 2026-10-24T02:54:03.2578781Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.2579103Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T02:54:03.2579353Z  89 │ const cardHeightRef = useRef(0); 2026-10-24T02:54:03.2579540Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T02:54:03.2579726Z ·  ─────┬──── 2026-10-24T02:54:03.2579951Z · ╰── `cardHeight` originates here 2026-10-24T02:54:03.2580402Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T02:54:03.2580714Z  92 │ if (!cardCoverage) { 2026-10-24T02:54:03.2580867Z  93 │ return; 2026-10-24T02:54:03.2580996Z  94 │ } 2026-10-24T02:54:03.2581218Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T02:54:03.2581464Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T02:54:03.2581633Z  97 │ return; 2026-10-24T02:54:03.2581762Z  98 │ } 2026-10-24T02:54:03.2581908Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:54:03.2582099Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:54:03.2582260Z 101 │ return; 2026-10-24T02:54:03.2582392Z 102 │ } 2026-10-24T02:54:03.2582558Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T02:54:03.2582779Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T02:54:03.2582985Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T02:54:03.2583151Z 106 │ }); 2026-10-24T02:54:03.2583286Z 107 │ }, [cardCoverage]); 2026-10-24T02:54:03.2583456Z 108 │ const handleBarLayout = useCallback( 2026-10-24T02:54:03.2583645Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T02:54:03.2583870Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:54:03.2584077Z 111 │ notifyCoverage(); 2026-10-24T02:54:03.2603285Z 112 │ }, 2026-10-24T02:54:03.2603453Z 113 │ [notifyCoverage], 2026-10-24T02:54:03.2603608Z 114 │ ); 2026-10-24T02:54:03.2603776Z 115 │ const handleCardLayout = useCallback( 2026-10-24T02:54:03.2603974Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T02:54:03.2604231Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:54:03.2604504Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T02:54:03.2604731Z ·  ─────┬──── 2026-10-24T02:54:03.2604979Z · ╰── `cardHeight` cannot be modified 2026-10-24T02:54:03.2605198Z 119 │ notifyCoverage(); 2026-10-24T02:54:03.2605350Z ╰──── 2026-10-24T02:54:03.2605700Z  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-24T02:54:03.2606296Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2606604Z 2026-10-24T02:54:03.2606814Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:54:03.2607194Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T02:54:03.2607457Z  90 │ const cardHeight = useSharedValue(0); 2026-10-24T02:54:03.2607667Z  91 │ const notifyCoverage = useCallback(() => { 2026-10-24T02:54:03.2607892Z ·  ───┬─── 2026-10-24T02:54:03.2608265Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T02:54:03.2608557Z  92 │ if (!cardCoverage) { 2026-10-24T02:54:03.2608755Z  93 │ return; 2026-10-24T02:54:03.2608894Z  94 │ } 2026-10-24T02:54:03.2609125Z  95 │ const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T02:54:03.2609382Z  96 │ if (coverage === cardCoverage.value) { 2026-10-24T02:54:03.2609559Z  97 │ return; 2026-10-24T02:54:03.2609691Z  98 │ } 2026-10-24T02:54:03.2609990Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:54:03.2610328Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:54:03.2610554Z ·  ──────┬───── 2026-10-24T02:54:03.2610790Z · ╰── This modifies `cardCoverage` 2026-10-24T02:54:03.2610993Z 101 │ return; 2026-10-24T02:54:03.2611130Z ╰──── 2026-10-24T02:54:03.2611548Z  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-24T02:54:03.2612375Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2612692Z 2026-10-24T02:54:03.2612907Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:54:03.2613272Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7] 2026-10-24T02:54:03.2613531Z  99 │ if (cardCoverage.value === 0) { 2026-10-24T02:54:03.2613717Z 100 │ cardCoverage.value = coverage; 2026-10-24T02:54:03.2613903Z ·  ──────┬───── 2026-10-24T02:54:03.2614130Z · ╰── This modifies `cardCoverage` 2026-10-24T02:54:03.2614331Z 101 │ return; 2026-10-24T02:54:03.2614462Z 102 │ } 2026-10-24T02:54:03.2614634Z 103 │ cardCoverage.value = withTiming(coverage, { 2026-10-24T02:54:03.2614872Z 104 │ duration: USER_INPUT_TOGGLE_DURATION_MS, 2026-10-24T02:54:03.2615075Z 105 │ easing: Easing.out(Easing.cubic), 2026-10-24T02:54:03.2615244Z 106 │ }); 2026-10-24T02:54:03.2615386Z 107 │ }, [cardCoverage]); 2026-10-24T02:54:03.2615568Z 108 │ const handleBarLayout = useCallback( 2026-10-24T02:54:03.2615757Z 109 │ (event: LayoutChangeEvent) => { 2026-10-24T02:54:03.2615970Z ·  ───────────────┬─────────────── 2026-10-24T02:54:03.2616492Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T02:54:03.2616846Z 110 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:54:03.2617044Z ╰──── 2026-10-24T02:54:03.2617452Z  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-24T02:54:03.2618106Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2618413Z 2026-10-24T02:54:03.2618619Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:54:03.2618982Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7] 2026-10-24T02:54:03.2619241Z 115 │ const handleCardLayout = useCallback( 2026-10-24T02:54:03.2619435Z 116 │ (event: LayoutChangeEvent) => { 2026-10-24T02:54:03.2619647Z ·  ───────────────┬─────────────── 2026-10-24T02:54:03.2619985Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T02:54:03.2620361Z 117 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T02:54:03.2620624Z 118 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T02:54:03.2620968Z ·  ─────┬──── 2026-10-24T02:54:03.2621317Z · ╰── This modifies `cardHeight` 2026-10-24T02:54:03.2621528Z 119 │ notifyCoverage(); 2026-10-24T02:54:03.2621679Z ╰──── 2026-10-24T02:54:03.2622085Z  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-24T02:54:03.2622722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2623020Z 2026-10-24T02:54:03.2623286Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.2623713Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7] 2026-10-24T02:54:03.2623947Z 412 │ 2026-10-24T02:54:03.2624146Z 413 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T02:54:03.2624366Z ·  ──┬── 2026-10-24T02:54:03.2624588Z · ╰── 'layer' is declared here 2026-10-24T02:54:03.2624776Z ╰──── 2026-10-24T02:54:03.2624946Z  help: Consider removing this declaration. 2026-10-24T02:54:03.2625067Z 2026-10-24T02:54:03.2625333Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2625738Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T02:54:03.2626064Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T02:54:03.2626317Z 29 │ useEffect(() => { 2026-10-24T02:54:03.2626478Z ·  ────┬──── 2026-10-24T02:54:03.2626698Z · ╰── This is the containing effect 2026-10-24T02:54:03.2626968Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T02:54:03.2627214Z ·  ───┬─── 2026-10-24T02:54:03.2627534Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2627794Z 31 │ }, [key, live, snapshot]); 2026-10-24T02:54:03.2627946Z ╰──── 2026-10-24T02:54:03.2628629Z  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-24T02:54:03.2629525Z  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-24T02:54:03.2629844Z 2026-10-24T02:54:03.2630023Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.2630370Z ╭─[apps/web/src/components/CommandPalette.tsx:1996:20] 2026-10-24T02:54:03.2630643Z 1995 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T02:54:03.2630880Z 1996 │ createdAt: new Date().toISOString(), 2026-10-24T02:54:03.2631090Z ·  ─────┬──── 2026-10-24T02:54:03.2631350Z · ╰── Cannot call impure function 2026-10-24T02:54:03.2631708Z 1997 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T02:54:03.2631989Z ╰──── 2026-10-24T02:54:03.2632340Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.2632921Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.2633212Z 2026-10-24T02:54:03.2633433Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T02:54:03.2633755Z ╭─[apps/mobile/src/Stack.tsx:1074:21] 2026-10-24T02:54:03.2633941Z 1073 │ } 2026-10-24T02:54:03.2634454Z ·  ───────────────────────────────────────────── 2026-10-24T02:54:03.2634674Z 1075 │ screenListeners={{ 2026-10-24T02:54:03.2634823Z ╰──── 2026-10-24T02:54:03.2635263Z  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-24T02:54:03.2635603Z 2026-10-24T02:54:03.2635874Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2636299Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T02:54:03.2636589Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T02:54:03.2636799Z 38 │ useLayoutEffect(() => { 2026-10-24T02:54:03.2636978Z ·  ───────┬─────── 2026-10-24T02:54:03.2637216Z · ╰── This is the containing effect 2026-10-24T02:54:03.2637422Z 39 │ reset(); 2026-10-24T02:54:03.2637570Z 40 │ setInitialized(true); 2026-10-24T02:54:03.2637744Z ·  ───────┬────── 2026-10-24T02:54:03.2638017Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2638261Z 41 │ }, [reset]); 2026-10-24T02:54:03.2638395Z ╰──── 2026-10-24T02:54:03.2639074Z  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-24T02:54:03.2640030Z  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-24T02:54:03.2640475Z 2026-10-24T02:54:03.2640746Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2641165Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T02:54:03.2641393Z 88 │ 2026-10-24T02:54:03.2641521Z 89 │ useEffect(() => { 2026-10-24T02:54:03.2641685Z ·  ────┬──── 2026-10-24T02:54:03.2641905Z · ╰── This is the containing effect 2026-10-24T02:54:03.2642210Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T02:54:03.2642484Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T02:54:03.2642687Z 92 │ let active = true; 2026-10-24T02:54:03.2642884Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T02:54:03.2643089Z ·  ─────────┬───────── 2026-10-24T02:54:03.2643359Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2643687Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T02:54:03.2643905Z ╰──── 2026-10-24T02:54:03.2644556Z  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-24T02:54:03.2645418Z  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-24T02:54:03.2645727Z 2026-10-24T02:54:03.2645898Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.2646261Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76] 2026-10-24T02:54:03.2646807Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T02:54:03.2647364Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T02:54:03.2647759Z ·  ─────┬──── 2026-10-24T02:54:03.2648083Z · ╰── Cannot call impure function 2026-10-24T02:54:03.2648385Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T02:54:03.2648582Z ╰──── 2026-10-24T02:54:03.2648925Z  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-24T02:54:03.2649529Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.2649815Z 2026-10-24T02:54:03.2649983Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.2650352Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71] 2026-10-24T02:54:03.2650597Z 717 │ const snoozePresets = useMemo( 2026-10-24T02:54:03.2650947Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T02:54:03.2651405Z ·  ─────┬──── 2026-10-24T02:54:03.2651718Z · ╰── Cannot call impure function 2026-10-24T02:54:03.2652003Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T02:54:03.2652187Z ╰──── 2026-10-24T02:54:03.2652533Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.2653540Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.2653940Z 2026-10-24T02:54:03.2654135Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:54:03.2654484Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6] 2026-10-24T02:54:03.2654825Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T02:54:03.2655127Z 719 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T02:54:03.2655355Z ·  ────────────┬─────────── 2026-10-24T02:54:03.2655639Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T02:54:03.2655869Z 720 │ ); 2026-10-24T02:54:03.2655989Z ╰──── 2026-10-24T02:54:03.2657338Z  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-24T02:54:03.2657968Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2658271Z 2026-10-24T02:54:03.2658458Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:54:03.2658802Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7] 2026-10-24T02:54:03.2659040Z 764 │ thread.pinnedAt, 2026-10-24T02:54:03.2659194Z 765 │ variant, 2026-10-24T02:54:03.2659346Z ·  ───┬─── 2026-10-24T02:54:03.2659570Z · ╰── Unnecessary dependency `variant` 2026-10-24T02:54:03.2659769Z 766 │ ], 2026-10-24T02:54:03.2659889Z ╰──── 2026-10-24T02:54:03.2660299Z  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-24T02:54:03.2660916Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2661219Z 2026-10-24T02:54:03.2661418Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.2661777Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21] 2026-10-24T02:54:03.2662086Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T02:54:03.2662362Z 1215 │ 2026-10-24T02:54:03.2662622Z ·  ────────────────────────── 2026-10-24T02:54:03.2662995Z 1216 │ 2026-10-24T02:54:03.2663224Z ╰──── 2026-10-24T02:54:03.2663430Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T02:54:03.2663591Z 2026-10-24T02:54:03.2664087Z ⚠ 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-24T02:54:03.2664691Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T02:54:03.2664974Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T02:54:03.2665291Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T02:54:03.2665588Z 567 │ │ const nextEvent = { 2026-10-24T02:54:03.2665868Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T02:54:03.2666167Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T02:54:03.2666403Z 570 │ │ threadId, 2026-10-24T02:54:03.2666619Z 571 │ │ providerInstanceId, 2026-10-24T02:54:03.2666840Z 572 │ │ occurredAt: now, 2026-10-24T02:54:03.2667107Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T02:54:03.2667390Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T02:54:03.2667649Z 575 │ │ const reader = yield* eventSink 2026-10-24T02:54:03.2667905Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T02:54:03.2668178Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T02:54:03.2668423Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.2668708Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T02:54:03.2669008Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T02:54:03.2669263Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T02:54:03.2669595Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T02:54:03.2669875Z 583 │ │ } 2026-10-24T02:54:03.2670193Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T02:54:03.2670505Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T02:54:03.2670792Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T02:54:03.2671071Z 587 │ ╰─▶ } 2026-10-24T02:54:03.2671275Z 588 │ }), 2026-10-24T02:54:03.2671401Z ╰──── 2026-10-24T02:54:03.2671460Z 2026-10-24T02:54:03.2671939Z ⚠ 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-24T02:54:03.2672541Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T02:54:03.2672878Z 2326 │ let settled = false; 2026-10-24T02:54:03.2673186Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T02:54:03.2673513Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T02:54:03.2673813Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T02:54:03.2674044Z 2330 │ │ ); 2026-10-24T02:54:03.2674275Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T02:54:03.2674557Z 2332 │ ╰─▶ } 2026-10-24T02:54:03.2674818Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T02:54:03.2675008Z ╰──── 2026-10-24T02:54:03.2675064Z 2026-10-24T02:54:03.2675340Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2675754Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5] 2026-10-24T02:54:03.2675976Z 510 │ }, []); 2026-10-24T02:54:03.2676114Z 511 │ useEffect(() => { 2026-10-24T02:54:03.2676280Z ·  ────┬──── 2026-10-24T02:54:03.2676502Z · ╰── This is the containing effect 2026-10-24T02:54:03.2676733Z 512 │ setKeyboardStateSuspect(false); 2026-10-24T02:54:03.2676930Z ·  ───────────┬─────────── 2026-10-24T02:54:03.2677211Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2677487Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T02:54:03.2677660Z ╰──── 2026-10-24T02:54:03.2678335Z  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-24T02:54:03.2679211Z  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-24T02:54:03.2679523Z 2026-10-24T02:54:03.2679785Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2680235Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7] 2026-10-24T02:54:03.2680558Z 869 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T02:54:03.2680803Z 870 │ useEffect(() => { 2026-10-24T02:54:03.2680963Z ·  ────┬──── 2026-10-24T02:54:03.2681186Z · ╰── This is the containing effect 2026-10-24T02:54:03.2681486Z 871 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T02:54:03.2681774Z 872 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T02:54:03.2682005Z ·  ─────────────┬──────────── 2026-10-24T02:54:03.2682295Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2682527Z 873 │ } 2026-10-24T02:54:03.2682648Z ╰──── 2026-10-24T02:54:03.2683398Z  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-24T02:54:03.2684307Z  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-24T02:54:03.2684621Z 2026-10-24T02:54:03.2684880Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2685288Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5] 2026-10-24T02:54:03.2685505Z 1117 │ 2026-10-24T02:54:03.2685640Z 1118 │ useEffect(() => { 2026-10-24T02:54:03.2685800Z ·  ────┬──── 2026-10-24T02:54:03.2686032Z · ╰── This is the containing effect 2026-10-24T02:54:03.2686252Z 1119 │ setAnchorMessageId(null); 2026-10-24T02:54:03.2686439Z ·  ─────────┬──────── 2026-10-24T02:54:03.2686717Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2686971Z 1120 │ setSubmittedMessageId(null); 2026-10-24T02:54:03.2687131Z ╰──── 2026-10-24T02:54:03.2687795Z  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-24T02:54:03.2688676Z  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-24T02:54:03.2688992Z 2026-10-24T02:54:03.2689201Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2689561Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7] 2026-10-24T02:54:03.2689814Z 512 │ setKeyboardStateSuspect(false); 2026-10-24T02:54:03.2690020Z 513 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T02:54:03.2690328Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T02:54:03.2690688Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T02:54:03.2691054Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T02:54:03.2691429Z 514 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T02:54:03.2691656Z ╰──── 2026-10-24T02:54:03.2692015Z  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-24T02:54:03.2692615Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2692924Z 2026-10-24T02:54:03.2693133Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2693497Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7] 2026-10-24T02:54:03.2693750Z 1066 │ userInputInsetProgress.set(1); 2026-10-24T02:54:03.2694022Z 1067 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T02:54:03.2694303Z ·  ────────────┬─────────── 2026-10-24T02:54:03.2694597Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T02:54:03.2694884Z 1068 │ const showContent = props.showContent ?? true; 2026-10-24T02:54:03.2695058Z ╰──── 2026-10-24T02:54:03.2695416Z  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-24T02:54:03.2696013Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2696459Z 2026-10-24T02:54:03.2696666Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2697030Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15] 2026-10-24T02:54:03.2697272Z 1124 │ freeze.set(false); 2026-10-24T02:54:03.2697444Z 1125 │ }, [freeze, selectedThreadKey]); 2026-10-24T02:54:03.2697696Z ·  ────────┬──────── 2026-10-24T02:54:03.2697978Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T02:54:03.2698201Z 1126 │ 2026-10-24T02:54:03.2698315Z ╰──── 2026-10-24T02:54:03.2698670Z  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-24T02:54:03.2699266Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2699568Z 2026-10-24T02:54:03.2699736Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.2700078Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5] 2026-10-24T02:54:03.2700357Z 950 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T02:54:03.2700587Z 951 │ const floatingControlCoverage = useSharedValue( 2026-10-24T02:54:03.2700807Z ·  ───────────┬─────────── 2026-10-24T02:54:03.2701079Z · ╰── `floatingControlCoverage` originates here 2026-10-24T02:54:03.2701373Z 952 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T02:54:03.2701566Z 953 │ ); 2026-10-24T02:54:03.2701697Z 954 │ useEffect(() => { 2026-10-24T02:54:03.2701888Z 955 │ floatingControlCoverage.value = withTiming( 2026-10-24T02:54:03.2702195Z ·  ───────────┬─────────── 2026-10-24T02:54:03.2702516Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T02:54:03.2702805Z 956 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T02:54:03.2702996Z ╰──── 2026-10-24T02:54:03.2703319Z  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-24T02:54:03.2703893Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2704191Z 2026-10-24T02:54:03.2704351Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.2704670Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7] 2026-10-24T02:54:03.2705021Z 963 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T02:54:03.2705337Z 964 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T02:54:03.2705590Z ·  ────────────────┬──────────────── 2026-10-24T02:54:03.2705903Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T02:54:03.2706215Z 965 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T02:54:03.2706411Z 966 │ ); 2026-10-24T02:54:03.2706542Z 967 │ useAnimatedReaction( 2026-10-24T02:54:03.2706691Z 968 │ () => 2026-10-24T02:54:03.2706850Z 969 │ contentInsetEndAdjustment.value + 2026-10-24T02:54:03.2707047Z 970 │ floatingControlCoverage.value + 2026-10-24T02:54:03.2707363Z 971 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T02:54:03.2707631Z 972 │ (value) => { 2026-10-24T02:54:03.2707827Z 973 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T02:54:03.2708066Z ·  ────────────────┬──────────────── 2026-10-24T02:54:03.2708381Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T02:54:03.2708623Z 974 │ }, 2026-10-24T02:54:03.2708742Z ╰──── 2026-10-24T02:54:03.2709069Z  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-24T02:54:03.2709644Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2709941Z 2026-10-24T02:54:03.2710290Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T02:54:03.2710735Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T02:54:03.2710971Z 472 │ onFilters, 2026-10-24T02:54:03.2711118Z 473 │ authorOptions = [], 2026-10-24T02:54:03.2711279Z ·  ── 2026-10-24T02:54:03.2711439Z 474 │ labelOptions = [], 2026-10-24T02:54:03.2711574Z ╰──── 2026-10-24T02:54:03.2711952Z  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-24T02:54:03.2712252Z 2026-10-24T02:54:03.2712613Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T02:54:03.2713090Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T02:54:03.2713331Z 473 │ authorOptions = [], 2026-10-24T02:54:03.2713480Z 474 │ labelOptions = [], 2026-10-24T02:54:03.2713641Z ·  ── 2026-10-24T02:54:03.2713796Z 475 │ optionScope, 2026-10-24T02:54:03.2713928Z ╰──── 2026-10-24T02:54:03.2714302Z  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-24T02:54:03.2714605Z 2026-10-24T02:54:03.2714868Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2715291Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T02:54:03.2715528Z 118 │ 2026-10-24T02:54:03.2715653Z 119 │ useEffect(() => { 2026-10-24T02:54:03.2715810Z ·  ────┬──── 2026-10-24T02:54:03.2716028Z · ╰── This is the containing effect 2026-10-24T02:54:03.2716253Z 120 │ if (orientationSettled) return; 2026-10-24T02:54:03.2716467Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T02:54:03.2716671Z 122 │ if (orientation === null) { 2026-10-24T02:54:03.2716848Z 123 │ setOrientationSettled(true); 2026-10-24T02:54:03.2717040Z ·  ──────────┬────────── 2026-10-24T02:54:03.2717319Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2717551Z 124 │ return; 2026-10-24T02:54:03.2717686Z ╰──── 2026-10-24T02:54:03.2718356Z  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-24T02:54:03.2719229Z  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-24T02:54:03.2719542Z 2026-10-24T02:54:03.2719805Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2720262Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T02:54:03.2720492Z 292 │ 2026-10-24T02:54:03.2720621Z 293 │ useEffect(() => { 2026-10-24T02:54:03.2720777Z ·  ────┬──── 2026-10-24T02:54:03.2720996Z · ╰── This is the containing effect 2026-10-24T02:54:03.2721191Z 294 │ if ( 2026-10-24T02:54:03.2721328Z 295 │ scene === null || 2026-10-24T02:54:03.2721488Z 296 │ requestedScene === null || 2026-10-24T02:54:03.2721665Z 297 │ scene !== requestedScene || 2026-10-24T02:54:03.2721826Z 298 │ !hasFixture || 2026-10-24T02:54:03.2721980Z 299 │ !orientationSettled || 2026-10-24T02:54:03.2722142Z 300 │ !themeApplied || 2026-10-24T02:54:03.2722344Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T02:54:03.2722615Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T02:54:03.2722816Z 303 │ ) { 2026-10-24T02:54:03.2723034Z 304 │ setReadyScene(null); 2026-10-24T02:54:03.2723242Z ·  ──────┬────── 2026-10-24T02:54:03.2723512Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2723742Z 305 │ return; 2026-10-24T02:54:03.2723870Z ╰──── 2026-10-24T02:54:03.2724534Z  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-24T02:54:03.2725405Z  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-24T02:54:03.2725717Z 2026-10-24T02:54:03.2725998Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.2726434Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T02:54:03.2726680Z 127 │ let cancelled = false; 2026-10-24T02:54:03.2726862Z 128 │ let lastOutcome: string | null = null; 2026-10-24T02:54:03.2727049Z ·  ─────┬───── 2026-10-24T02:54:03.2727281Z · ╰── 'lastOutcome' is declared here 2026-10-24T02:54:03.2727603Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T02:54:03.2727839Z ╰──── 2026-10-24T02:54:03.2728000Z  help: Consider removing this declaration. 2026-10-24T02:54:03.2728122Z 2026-10-24T02:54:03.2728389Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2728805Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:285:5] 2026-10-24T02:54:03.2729097Z 283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T02:54:03.2729294Z 284 │ useEffect(() => { 2026-10-24T02:54:03.2729441Z ·  ────┬──── 2026-10-24T02:54:03.2729655Z · ╰── This is the containing effect 2026-10-24T02:54:03.2729878Z 285 │ setNow(new Date().toISOString()); 2026-10-24T02:54:03.2730093Z ·  ───┬── 2026-10-24T02:54:03.2730345Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2730659Z 286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T02:54:03.2730859Z ╰──── 2026-10-24T02:54:03.2731526Z  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-24T02:54:03.2732396Z  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-24T02:54:03.2732707Z 2026-10-24T02:54:03.2732913Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2733280Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25] 2026-10-24T02:54:03.2733667Z 364 │ // range) the boundary string is identical and the chain would die. 2026-10-24T02:54:03.2733937Z 365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T02:54:03.2734153Z ·  ───────┬────── 2026-10-24T02:54:03.2734435Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T02:54:03.2734713Z 366 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T02:54:03.2734891Z ╰──── 2026-10-24T02:54:03.2735244Z  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-24T02:54:03.2735840Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2736260Z 2026-10-24T02:54:03.2736443Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.2736783Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53] 2026-10-24T02:54:03.2737046Z 355 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T02:54:03.2737309Z 356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T02:54:03.2737594Z ·  ─────┬──── 2026-10-24T02:54:03.2737891Z · ╰── Cannot call impure function 2026-10-24T02:54:03.2738134Z 357 │ const id = setTimeout(() => { 2026-10-24T02:54:03.2738282Z ╰──── 2026-10-24T02:54:03.2738635Z  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-24T02:54:03.2739208Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.2739495Z 2026-10-24T02:54:03.2739784Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T02:54:03.2740233Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T02:54:03.2740457Z 162 │ keys, 2026-10-24T02:54:03.2740596Z 163 │ overridingProjects = [], 2026-10-24T02:54:03.2740772Z ·  ── 2026-10-24T02:54:03.2740937Z 164 │ onClearOverrides, 2026-10-24T02:54:03.2741073Z ╰──── 2026-10-24T02:54:03.2741548Z  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-24T02:54:03.2741898Z 2026-10-24T02:54:03.2742082Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T02:54:03.2742384Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T02:54:03.2742643Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T02:54:03.2742878Z 194 │ const codes = new Array(count); 2026-10-24T02:54:03.2743099Z ·  ──────────────────────── 2026-10-24T02:54:03.2743327Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T02:54:03.2743499Z ╰──── 2026-10-24T02:54:03.2743995Z  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-24T02:54:03.2744389Z 2026-10-24T02:54:03.2744694Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.2745145Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T02:54:03.2745371Z 345 │ 2026-10-24T02:54:03.2745540Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T02:54:03.2745755Z ·  ────────────┬─────────── 2026-10-24T02:54:03.2746033Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T02:54:03.2746278Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T02:54:03.2746433Z ╰──── 2026-10-24T02:54:03.2746602Z  help: Consider removing this declaration. 2026-10-24T02:54:03.2746728Z 2026-10-24T02:54:03.2746993Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2747402Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T02:54:03.2747638Z 434 │ : null; 2026-10-24T02:54:03.2747780Z 435 │ useEffect(() => { 2026-10-24T02:54:03.2747938Z ·  ────┬──── 2026-10-24T02:54:03.2748158Z · ╰── This is the containing effect 2026-10-24T02:54:03.2748354Z 436 │ if ( 2026-10-24T02:54:03.2748504Z 437 │ props.active === false || 2026-10-24T02:54:03.2748679Z 438 │ activeDraftKey !== null || 2026-10-24T02:54:03.2748863Z 439 │ editingPendingTask !== null || 2026-10-24T02:54:03.2749052Z 440 │ selectedProject === null 2026-10-24T02:54:03.2749213Z 441 │ ) { 2026-10-24T02:54:03.2749342Z 442 │ return; 2026-10-24T02:54:03.2749470Z 443 │ } 2026-10-24T02:54:03.2749609Z 444 │ setActiveDraftKey( 2026-10-24T02:54:03.2749784Z ·  ────────┬──────── 2026-10-24T02:54:03.2750101Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2750342Z 445 │ createNewTaskDraft({ 2026-10-24T02:54:03.2750489Z ╰──── 2026-10-24T02:54:03.2751161Z  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-24T02:54:03.2752123Z  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-24T02:54:03.2752477Z 2026-10-24T02:54:03.2752725Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:54:03.2753139Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T02:54:03.2753420Z 1243 │ 2026-10-24T02:54:03.2753746Z 1244 │ {props.children} 2026-10-24T02:54:03.2754066Z ·  ───────────── 2026-10-24T02:54:03.2754266Z 1245 │ 2026-10-24T02:54:03.2754414Z ╰──── 2026-10-24T02:54:03.2754708Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:54:03.2755077Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:54:03.2755259Z 2026-10-24T02:54:03.2755453Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.2755816Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T02:54:03.2756079Z 554 │ assert.deepStrictEqual( 2026-10-24T02:54:03.2756349Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T02:54:03.2756646Z ·  ┬ 2026-10-24T02:54:03.2756946Z · ╰── '_' is declared here 2026-10-24T02:54:03.2757170Z 556 │ [ 2026-10-24T02:54:03.2757299Z ╰──── 2026-10-24T02:54:03.2757463Z  help: Consider removing this parameter. 2026-10-24T02:54:03.2757581Z 2026-10-24T02:54:03.2757770Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.2758137Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T02:54:03.2758398Z 1154 │ assert.deepStrictEqual( 2026-10-24T02:54:03.2758674Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T02:54:03.2758966Z ·  ┬ 2026-10-24T02:54:03.2759268Z · ╰── '_' is declared here 2026-10-24T02:54:03.2759491Z 1156 │ [ 2026-10-24T02:54:03.2759621Z ╰──── 2026-10-24T02:54:03.2759785Z  help: Consider removing this parameter. 2026-10-24T02:54:03.2759904Z 2026-10-24T02:54:03.2760232Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.2760650Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12366:7] 2026-10-24T02:54:03.2760860Z 12365 │ 2026-10-24T02:54:03.2761074Z 12366 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T02:54:03.2761316Z ·  ────────┬─────── 2026-10-24T02:54:03.2761571Z · ╰── 'layerUnavailable' is declared here 2026-10-24T02:54:03.2761871Z 12367 │ OrchestratorV2, 2026-10-24T02:54:03.2762056Z ╰──── 2026-10-24T02:54:03.2762221Z  help: Consider removing this declaration. 2026-10-24T02:54:03.2762343Z 2026-10-24T02:54:03.2762545Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.2762915Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T02:54:03.2763159Z 87 │
  • Promise.resolve()); 2026-10-24T02:54:03.2766594Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T02:54:03.2766852Z 226 │ │ if (!pending) { 2026-10-24T02:54:03.2767065Z 227 │ │ idlePasses++; 2026-10-24T02:54:03.2767284Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T02:54:03.2767496Z 229 │ │ return; 2026-10-24T02:54:03.2767680Z 230 │ │ } 2026-10-24T02:54:03.2767867Z 231 │ │ continue; 2026-10-24T02:54:03.2768047Z 232 │ │ } 2026-10-24T02:54:03.2768240Z 233 │ │ idlePasses = 0; 2026-10-24T02:54:03.2768467Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T02:54:03.2768817Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T02:54:03.2769107Z 236 │ │ ); 2026-10-24T02:54:03.2769319Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T02:54:03.2769554Z 238 │ │ pending.resolve(exit); 2026-10-24T02:54:03.2769752Z 239 │ │ }); 2026-10-24T02:54:03.2769986Z 240 │ ╰─▶ } 2026-10-24T02:54:03.2770222Z 241 │ }, 2026-10-24T02:54:03.2770348Z ╰──── 2026-10-24T02:54:03.2770404Z 2026-10-24T02:54:03.2770649Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T02:54:03.2771048Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9] 2026-10-24T02:54:03.2771284Z 264 │ ): boolean { 2026-10-24T02:54:03.2771516Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T02:54:03.2771938Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T02:54:03.2772280Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T02:54:03.2772489Z ╰──── 2026-10-24T02:54:03.2772625Z  help: Switch to `Set` 2026-10-24T02:54:03.2772722Z 2026-10-24T02:54:03.2772988Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2773414Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T02:54:03.2773644Z 76 │ 2026-10-24T02:54:03.2773771Z 77 │ useEffect(() => { 2026-10-24T02:54:03.2773932Z ·  ────┬──── 2026-10-24T02:54:03.2774150Z · ╰── This is the containing effect 2026-10-24T02:54:03.2774428Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T02:54:03.2774641Z 79 │ setHostInput(host); 2026-10-24T02:54:03.2774810Z ·  ──────┬───── 2026-10-24T02:54:03.2775073Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2775313Z 80 │ setCodeInput(code); 2026-10-24T02:54:03.2775452Z ╰──── 2026-10-24T02:54:03.2776231Z  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-24T02:54:03.2777283Z  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-24T02:54:03.2777601Z 2026-10-24T02:54:03.2777865Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2778285Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T02:54:03.2778524Z 82 │ 2026-10-24T02:54:03.2778647Z 83 │ useEffect(() => { 2026-10-24T02:54:03.2778806Z ·  ────┬──── 2026-10-24T02:54:03.2779024Z · ╰── This is the containing effect 2026-10-24T02:54:03.2779255Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T02:54:03.2779423Z 85 │ return; 2026-10-24T02:54:03.2779551Z 86 │ } 2026-10-24T02:54:03.2779670Z 87 │ 2026-10-24T02:54:03.2779846Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T02:54:03.2780089Z 89 │ setHostInput(host); 2026-10-24T02:54:03.2780259Z ·  ──────┬───── 2026-10-24T02:54:03.2780521Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2780755Z 90 │ setCodeInput(code); 2026-10-24T02:54:03.2780899Z ╰──── 2026-10-24T02:54:03.2781563Z  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-24T02:54:03.2782443Z  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-24T02:54:03.2782756Z 2026-10-24T02:54:03.2783110Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2783574Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T02:54:03.2789665Z 92 │ 2026-10-24T02:54:03.2789797Z 93 │ useEffect(() => { 2026-10-24T02:54:03.2789951Z ·  ────┬──── 2026-10-24T02:54:03.2790221Z · ╰── This is the containing effect 2026-10-24T02:54:03.2790442Z 94 │ if (pairingConnectionError) { 2026-10-24T02:54:03.2790612Z 95 │ setIsSubmitting(false); 2026-10-24T02:54:03.2790783Z ·  ───────┬─────── 2026-10-24T02:54:03.2791048Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2791277Z 96 │ } 2026-10-24T02:54:03.2791390Z ╰──── 2026-10-24T02:54:03.2792060Z  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-24T02:54:03.2792933Z  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-24T02:54:03.2793243Z 2026-10-24T02:54:03.2793473Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:54:03.2793829Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T02:54:03.2794044Z 20 │ [instanceId]: { 2026-10-24T02:54:03.2794204Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T02:54:03.2794410Z ·  ──────────────────────────── 2026-10-24T02:54:03.2794586Z 22 │ [model]: options, 2026-10-24T02:54:03.2794722Z ╰──── 2026-10-24T02:54:03.2795048Z  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-24T02:54:03.2795312Z 2026-10-24T02:54:03.2795572Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2795989Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7] 2026-10-24T02:54:03.2796219Z 211 │ }; 2026-10-24T02:54:03.2796347Z 212 │ useEffect(() => { 2026-10-24T02:54:03.2796505Z ·  ────┬──── 2026-10-24T02:54:03.2796826Z · ╰── This is the containing effect 2026-10-24T02:54:03.2797186Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T02:54:03.2797431Z 214 │ if (inserted) { 2026-10-24T02:54:03.2797589Z 215 │ setSelection((current) => 2026-10-24T02:54:03.2797767Z ·  ──────┬───── 2026-10-24T02:54:03.2798029Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2798373Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T02:54:03.2798599Z ╰──── 2026-10-24T02:54:03.2799277Z  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-24T02:54:03.2800182Z  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-24T02:54:03.2800494Z 2026-10-24T02:54:03.2800758Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2801173Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7] 2026-10-24T02:54:03.2801419Z 284 │ }, [hasWorkspaceSnapshot]); 2026-10-24T02:54:03.2801579Z 285 │ useEffect(() => { 2026-10-24T02:54:03.2801734Z ·  ────┬──── 2026-10-24T02:54:03.2801956Z · ╰── This is the containing effect 2026-10-24T02:54:03.2802247Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T02:54:03.2802554Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T02:54:03.2802787Z 288 │ const now = Date.now(); 2026-10-24T02:54:03.2802993Z 289 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T02:54:03.2803186Z 290 │ if ( 2026-10-24T02:54:03.2803332Z 291 │ lastRequest?.key === key && 2026-10-24T02:54:03.2803575Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T02:54:03.2803781Z 293 │ ) 2026-10-24T02:54:03.2803910Z 294 │ return; 2026-10-24T02:54:03.2804161Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T02:54:03.2804428Z 296 │ setWorkspaceRefreshRetry(null); 2026-10-24T02:54:03.2804641Z ·  ────────────┬─────────── 2026-10-24T02:54:03.2804926Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2805158Z 297 │ return; 2026-10-24T02:54:03.2805282Z ╰──── 2026-10-24T02:54:03.2805950Z  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-24T02:54:03.2806819Z  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-24T02:54:03.2807129Z 2026-10-24T02:54:03.2807420Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2807822Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5] 2026-10-24T02:54:03.2808052Z 325 │ }, [ 2026-10-24T02:54:03.2808184Z 326 │ draftMessage, 2026-10-24T02:54:03.2808347Z ·  ──────┬───── 2026-10-24T02:54:03.2808588Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T02:54:03.2808803Z 327 │ environmentId, 2026-10-24T02:54:03.2808938Z ╰──── 2026-10-24T02:54:03.2809295Z  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-24T02:54:03.2809898Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2810243Z 2026-10-24T02:54:03.2810479Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T02:54:03.2810864Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T02:54:03.2811090Z 1397 │ 2026-10-24T02:54:03.2811240Z 1398 │ function assertUserMessagesExclude( 2026-10-24T02:54:03.2811457Z ·  ────────────┬──────────── 2026-10-24T02:54:03.2811741Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T02:54:03.2812017Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T02:54:03.2812193Z ╰──── 2026-10-24T02:54:03.2812354Z  help: Consider removing this declaration. 2026-10-24T02:54:03.2812475Z 2026-10-24T02:54:03.2812743Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2813141Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T02:54:03.2813360Z 61 │ }, []); 2026-10-24T02:54:03.2813491Z 62 │ useEffect(() => { 2026-10-24T02:54:03.2813647Z ·  ────┬──── 2026-10-24T02:54:03.2813862Z · ╰── This is the containing effect 2026-10-24T02:54:03.2814151Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T02:54:03.2814431Z ·  ───────┬────── 2026-10-24T02:54:03.2814776Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2815051Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T02:54:03.2815205Z ╰──── 2026-10-24T02:54:03.2815868Z  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-24T02:54:03.2817028Z  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-24T02:54:03.2817340Z 2026-10-24T02:54:03.2817559Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:54:03.2818065Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T02:54:03.2818363Z 248 │ mountedRef.current = false; 2026-10-24T02:54:03.2818541Z 249 │ flow.setBranchQuery(""); 2026-10-24T02:54:03.2818708Z ·  ──┬─ 2026-10-24T02:54:03.2818923Z · ╰── Missing dependency `flow` 2026-10-24T02:54:03.2819114Z 250 │ }; 2026-10-24T02:54:03.2819254Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T02:54:03.2819433Z ·  ─────────┬───────── 2026-10-24T02:54:03.2819743Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T02:54:03.2819995Z 252 │ 2026-10-24T02:54:03.2820148Z ╰──── 2026-10-24T02:54:03.2820644Z  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-24T02:54:03.2821356Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2821654Z 2026-10-24T02:54:03.2821873Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:54:03.2822217Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T02:54:03.2822437Z 89 │ let cursor = prompt.length; 2026-10-24T02:54:03.2822636Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T02:54:03.2822863Z ·  ─────── 2026-10-24T02:54:03.2823059Z 91 │ let { start, end } = occurrence; 2026-10-24T02:54:03.2823214Z ╰──── 2026-10-24T02:54:03.2823542Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:54:03.2823799Z 2026-10-24T02:54:03.2824063Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2824472Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T02:54:03.2824705Z 259 │ .join("|"); 2026-10-24T02:54:03.2824848Z 260 │ useEffect(() => { 2026-10-24T02:54:03.2825004Z ·  ────┬──── 2026-10-24T02:54:03.2825222Z · ╰── This is the containing effect 2026-10-24T02:54:03.2825419Z 261 │ stop(); 2026-10-24T02:54:03.2825560Z ·  ──┬─ 2026-10-24T02:54:03.2825819Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2826051Z 262 │ }, [orderVersion]); 2026-10-24T02:54:03.2826187Z ╰──── 2026-10-24T02:54:03.2826853Z  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-24T02:54:03.2827728Z  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-24T02:54:03.2828038Z 2026-10-24T02:54:03.2828257Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:54:03.2828766Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T02:54:03.2829036Z 260 │ useEffect(() => { 2026-10-24T02:54:03.2829181Z 261 │ stop(); 2026-10-24T02:54:03.2829320Z ·  ──┬─ 2026-10-24T02:54:03.2829528Z · ╰── Missing dependency `stop` 2026-10-24T02:54:03.2829729Z 262 │ }, [orderVersion]); 2026-10-24T02:54:03.2829890Z ·  ──────┬───── 2026-10-24T02:54:03.2830589Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T02:54:03.2830800Z 263 │ useEffect( 2026-10-24T02:54:03.2830929Z ╰──── 2026-10-24T02:54:03.2831412Z  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-24T02:54:03.2832125Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2832427Z 2026-10-24T02:54:03.2832581Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2832904Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T02:54:03.2833155Z 95 │ const latest = useRef(props); 2026-10-24T02:54:03.2833328Z 96 │ latest.current = props; 2026-10-24T02:54:03.2833526Z ·  ───┬──────┬─── 2026-10-24T02:54:03.2833826Z · │ ╰── Cannot update ref value during render 2026-10-24T02:54:03.2834121Z · ╰── This value is a ref 2026-10-24T02:54:03.2834319Z 97 │ const gesture = useMemo( 2026-10-24T02:54:03.2834459Z ╰──── 2026-10-24T02:54:03.2834997Z  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-24T02:54:03.2835722Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2836002Z 2026-10-24T02:54:03.2836151Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2836468Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T02:54:03.2836707Z 103 │ .runOnJS(true) 2026-10-24T02:54:03.2836899Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T02:54:03.2837137Z ·  ───────────────┬────────────── 2026-10-24T02:54:03.2837461Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.2837794Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2837994Z ╰──── 2026-10-24T02:54:03.2838528Z  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-24T02:54:03.2839330Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2839813Z 2026-10-24T02:54:03.2839963Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2840301Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T02:54:03.2840574Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T02:54:03.2840822Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2841120Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T02:54:03.2841472Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.2841800Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2841989Z ╰──── 2026-10-24T02:54:03.2842530Z  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-24T02:54:03.2843259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2843540Z 2026-10-24T02:54:03.2843687Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2843999Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T02:54:03.2844302Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2844570Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2844860Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T02:54:03.2845211Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.2845536Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T02:54:03.2845726Z ╰──── 2026-10-24T02:54:03.2846257Z  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-24T02:54:03.2846979Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2847261Z 2026-10-24T02:54:03.2847500Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2847847Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T02:54:03.2848143Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2848403Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T02:54:03.2848682Z ·  ───────────────────────┬────────────────────── 2026-10-24T02:54:03.2849027Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.2849297Z 108 │ [props.disabled], 2026-10-24T02:54:03.2849437Z ╰──── 2026-10-24T02:54:03.2849971Z  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-24T02:54:03.2850734Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2851013Z 2026-10-24T02:54:03.2851161Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2851475Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T02:54:03.2851761Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T02:54:03.2851996Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T02:54:03.2852225Z ·  ───┬──────┬─── 2026-10-24T02:54:03.2852522Z · │ ╰── Cannot update ref value during render 2026-10-24T02:54:03.2852817Z · ╰── This value is a ref 2026-10-24T02:54:03.2852993Z 250 │ 2026-10-24T02:54:03.2853104Z ╰──── 2026-10-24T02:54:03.2853636Z  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-24T02:54:03.2854360Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2854637Z 2026-10-24T02:54:03.2854783Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2855103Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T02:54:03.2855396Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T02:54:03.2855648Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T02:54:03.2855906Z ·  ──────────────────┬────────────────── 2026-10-24T02:54:03.2856330Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.2856607Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T02:54:03.2856785Z ╰──── 2026-10-24T02:54:03.2857317Z  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-24T02:54:03.2858144Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2858470Z 2026-10-24T02:54:03.2858643Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.2858979Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T02:54:03.2859214Z 323 │ update(0); 2026-10-24T02:54:03.2859379Z 324 │ let last = performance.now(); 2026-10-24T02:54:03.2859580Z ·  ────────┬──────── 2026-10-24T02:54:03.2859830Z · ╰── Cannot call impure function 2026-10-24T02:54:03.2860043Z 325 │ const tick = () => { 2026-10-24T02:54:03.2860289Z ╰──── 2026-10-24T02:54:03.2860659Z  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-24T02:54:03.2861248Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.2861535Z 2026-10-24T02:54:03.2861725Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T02:54:03.2862072Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T02:54:03.2862303Z  98 │ () => 2026-10-24T02:54:03.2862442Z  99 │ Gesture.Pan() 2026-10-24T02:54:03.2862606Z ·  ─┬─ 2026-10-24T02:54:03.2862831Z · ╰── `Pan` may be a component 2026-10-24T02:54:03.2863057Z 100 │ .enabled(!props.disabled) 2026-10-24T02:54:03.2863210Z ╰──── 2026-10-24T02:54:03.2863548Z  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-24T02:54:03.2864262Z  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-24T02:54:03.2864674Z 2026-10-24T02:54:03.2864864Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:54:03.2865212Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T02:54:03.2865450Z 103 │ .runOnJS(true) 2026-10-24T02:54:03.2865635Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T02:54:03.2865846Z ·  ───┬── 2026-10-24T02:54:03.2866390Z · ╰── 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-24T02:54:03.2866912Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2867181Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T02:54:03.2867444Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T02:54:03.2867649Z 108 │ [props.disabled], 2026-10-24T02:54:03.2867820Z ·  ────────┬─────── 2026-10-24T02:54:03.2868185Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.2868459Z 109 │ ); 2026-10-24T02:54:03.2868576Z ╰──── 2026-10-24T02:54:03.2868840Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:54:03.2869366Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2869672Z 2026-10-24T02:54:03.2869936Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2870348Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T02:54:03.2870550Z 57 │ 2026-10-24T02:54:03.2870677Z 58 │ useEffect(() => { 2026-10-24T02:54:03.2870831Z ·  ────┬──── 2026-10-24T02:54:03.2871055Z · ╰── This is the containing effect 2026-10-24T02:54:03.2871288Z 59 │ const controller = new AbortController(); 2026-10-24T02:54:03.2871476Z 60 │ setLoadState("pending"); 2026-10-24T02:54:03.2871643Z ·  ──────┬───── 2026-10-24T02:54:03.2871904Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2872232Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T02:54:03.2872450Z ╰──── 2026-10-24T02:54:03.2873110Z  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-24T02:54:03.2873983Z  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-24T02:54:03.2874294Z 2026-10-24T02:54:03.2874499Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2874841Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T02:54:03.2875068Z 70 │ return () => controller.abort(); 2026-10-24T02:54:03.2875269Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T02:54:03.2875555Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T02:54:03.2875947Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T02:54:03.2876360Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T02:54:03.2876694Z · ╰── Unnecessary dependency `player_0` 2026-10-24T02:54:03.2876888Z 72 │ 2026-10-24T02:54:03.2877000Z ╰──── 2026-10-24T02:54:03.2877353Z  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-24T02:54:03.2877954Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2878255Z 2026-10-24T02:54:03.2878519Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2879043Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T02:54:03.2879331Z 117 │ 2026-10-24T02:54:03.2879459Z 118 │ useEffect(() => { 2026-10-24T02:54:03.2879615Z ·  ────┬──── 2026-10-24T02:54:03.2879835Z · ╰── This is the containing effect 2026-10-24T02:54:03.2880094Z 119 │ void refreshNotifications(); 2026-10-24T02:54:03.2880287Z ·  ──────────┬───────── 2026-10-24T02:54:03.2880566Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2880883Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T02:54:03.2881096Z ╰──── 2026-10-24T02:54:03.2881767Z  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-24T02:54:03.2882640Z  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-24T02:54:03.2882953Z 2026-10-24T02:54:03.2883218Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2883657Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T02:54:03.2883905Z 125 │ 2026-10-24T02:54:03.2884028Z 126 │ useEffect(() => { 2026-10-24T02:54:03.2884188Z ·  ────┬──── 2026-10-24T02:54:03.2884409Z · ╰── This is the containing effect 2026-10-24T02:54:03.2884612Z 127 │ if (!isLoaded) { 2026-10-24T02:54:03.2884790Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T02:54:03.2884988Z ·  ──────────┬────────── 2026-10-24T02:54:03.2885266Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2885497Z 129 │ return; 2026-10-24T02:54:03.2885626Z ╰──── 2026-10-24T02:54:03.2886285Z  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-24T02:54:03.2887241Z  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-24T02:54:03.2887584Z 2026-10-24T02:54:03.2887790Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T02:54:03.2888134Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T02:54:03.2888448Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T02:54:03.2888719Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T02:54:03.2888921Z ·  ───────────┬─────────── 2026-10-24T02:54:03.2889498Z · ╰── 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-24T02:54:03.2889985Z 229 │ mostRecentEventCount, 2026-10-24T02:54:03.2890156Z 230 │ ); 2026-10-24T02:54:03.2890345Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T02:54:03.2890622Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T02:54:03.2890957Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.2891234Z 232 │ const assumedValue = props.value; 2026-10-24T02:54:03.2891386Z ╰──── 2026-10-24T02:54:03.2891614Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T02:54:03.2892109Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2892414Z 2026-10-24T02:54:03.2892632Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:54:03.2892976Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T02:54:03.2893269Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T02:54:03.2893515Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T02:54:03.2893718Z ·  ───────────┬─────────── 2026-10-24T02:54:03.2894280Z · ╰── 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-24T02:54:03.2894770Z 240 │ controlledEventCount, 2026-10-24T02:54:03.2894930Z 241 │ assumedValue, 2026-10-24T02:54:03.2895068Z 242 │ ); 2026-10-24T02:54:03.2895293Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T02:54:03.2895598Z ·  ───────────┬────────── 2026-10-24T02:54:03.2895945Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T02:54:03.2896318Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T02:54:03.2896481Z ╰──── 2026-10-24T02:54:03.2896964Z  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-24T02:54:03.2897756Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2898102Z 2026-10-24T02:54:03.2898250Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2898539Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T02:54:03.2898810Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T02:54:03.2899063Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T02:54:03.2899310Z ·  ─────────────┬──────────── 2026-10-24T02:54:03.2899605Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.2899821Z 165 │ }); 2026-10-24T02:54:03.2899947Z ╰──── 2026-10-24T02:54:03.2900504Z  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-24T02:54:03.2901224Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2901505Z 2026-10-24T02:54:03.2901649Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2901940Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T02:54:03.2902209Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T02:54:03.2902460Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T02:54:03.2902707Z ·  ─────────────┬──────────── 2026-10-24T02:54:03.2902921Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.2902981Z 165 │ }); 2026-10-24T02:54:03.2903034Z ╰──── 2026-10-24T02:54:03.2903506Z  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-24T02:54:03.2903801Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2903804Z 2026-10-24T02:54:03.2903955Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2904097Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T02:54:03.2904155Z 165 │ }); 2026-10-24T02:54:03.2904246Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T02:54:03.2904373Z ·  ─────────┬────────────┬─── 2026-10-24T02:54:03.2904565Z · │ ╰── Cannot update ref value during render 2026-10-24T02:54:03.2904681Z · ╰── This value is a ref 2026-10-24T02:54:03.2904752Z 167 │ return JSON.stringify( 2026-10-24T02:54:03.2904806Z ╰──── 2026-10-24T02:54:03.2905351Z  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-24T02:54:03.2905687Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2905690Z 2026-10-24T02:54:03.2905833Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2905971Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T02:54:03.2906046Z 207 │ mostRecentEventCount, 2026-10-24T02:54:03.2906136Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T02:54:03.2906242Z ·  ───────────────┬─────────────── 2026-10-24T02:54:03.2906435Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.2906492Z 209 │ ); 2026-10-24T02:54:03.2906552Z ╰──── 2026-10-24T02:54:03.2907021Z  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-24T02:54:03.2907315Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2907317Z 2026-10-24T02:54:03.2907462Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.2907599Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T02:54:03.2907671Z 213 │ mostRecentEventCount, 2026-10-24T02:54:03.2907757Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T02:54:03.2907867Z ·  ───────────────┬─────────────── 2026-10-24T02:54:03.2908059Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.2908115Z 215 │ ); 2026-10-24T02:54:03.2908167Z ╰──── 2026-10-24T02:54:03.2908636Z  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-24T02:54:03.2908931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.2908933Z 2026-10-24T02:54:03.2909123Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:54:03.2909265Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T02:54:03.2909387Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T02:54:03.2909501Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T02:54:03.2909613Z ·  ─────────┬──────── 2026-10-24T02:54:03.2910121Z · ╰── 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-24T02:54:03.2910177Z 165 │ }); 2026-10-24T02:54:03.2910270Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T02:54:03.2910342Z 167 │ return JSON.stringify( 2026-10-24T02:54:03.2910579Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T02:54:03.2910684Z 169 │ const record = 2026-10-24T02:54:03.2910765Z 170 │ token.type === "context" 2026-10-24T02:54:03.2910932Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T02:54:03.2911000Z 172 │ : undefined; 2026-10-24T02:54:03.2911107Z 173 │ const presentation = contextChipPresentation( 2026-10-24T02:54:03.2911219Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T02:54:03.2911284Z 175 │ record, 2026-10-24T02:54:03.2911344Z 176 │ ); 2026-10-24T02:54:03.2911427Z 177 │ const icon = contextChipIcon( 2026-10-24T02:54:03.2911497Z 178 │ presentation, 2026-10-24T02:54:03.2911644Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T02:54:03.2911709Z 180 │ ); 2026-10-24T02:54:03.2911774Z 181 │ return { 2026-10-24T02:54:03.2911846Z 182 │ type: token.type, 2026-10-24T02:54:03.2911921Z 183 │ source: token.source, 2026-10-24T02:54:03.2911995Z 184 │ start: token.start, 2026-10-24T02:54:03.2912060Z 185 │ end: token.end, 2026-10-24T02:54:03.2912211Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T02:54:03.2912274Z 187 │ label: 2026-10-24T02:54:03.2912354Z 188 │ token.type === "skill" 2026-10-24T02:54:03.2912460Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T02:54:03.2912544Z 190 │ : token.type === "context" 2026-10-24T02:54:03.2912782Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T02:54:03.2912873Z 192 │ : basename(token.value), 2026-10-24T02:54:03.2913019Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T02:54:03.2913114Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T02:54:03.2913202Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T02:54:03.2913261Z 196 │ }; 2026-10-24T02:54:03.2913317Z 197 │ }), 2026-10-24T02:54:03.2913374Z 198 │ ); 2026-10-24T02:54:03.2913508Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T02:54:03.2913667Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T02:54:03.2913872Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.2914092Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T02:54:03.2914176Z ╰──── 2026-10-24T02:54:03.2914383Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:54:03.2914698Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2914701Z 2026-10-24T02:54:03.2914890Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:54:03.2915028Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T02:54:03.2915162Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T02:54:03.2915263Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T02:54:03.2915362Z ·  ───────────┬─────────── 2026-10-24T02:54:03.2915828Z · ╰── 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-24T02:54:03.2915922Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T02:54:03.2915985Z 256 │ value, 2026-10-24T02:54:03.2916063Z 257 │ selection: nextSelection, 2026-10-24T02:54:03.2916123Z 258 │ }); 2026-10-24T02:54:03.2916209Z 259 │ return acknowledgedEventCount; 2026-10-24T02:54:03.2916264Z 260 │ }, 2026-10-24T02:54:03.2916320Z 261 │ [], 2026-10-24T02:54:03.2916388Z ·  ─┬ 2026-10-24T02:54:03.2916577Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.2916632Z 262 │ ); 2026-10-24T02:54:03.2916684Z ╰──── 2026-10-24T02:54:03.2916889Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:54:03.2917204Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2917206Z 2026-10-24T02:54:03.2917367Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.2917515Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T02:54:03.2917664Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T02:54:03.2917802Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T02:54:03.2917885Z ·  ────┬─── 2026-10-24T02:54:03.2918019Z · ╰── `rotation` originates here 2026-10-24T02:54:03.2918075Z 172 │ 2026-10-24T02:54:03.2918147Z 173 │ useLayoutEffect(() => { 2026-10-24T02:54:03.2918282Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T02:54:03.2918354Z ·  ────┬─── 2026-10-24T02:54:03.2918488Z · ╰── `rotation` cannot be modified 2026-10-24T02:54:03.2918588Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T02:54:03.2918643Z ╰──── 2026-10-24T02:54:03.2918910Z  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-24T02:54:03.2919293Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.2919326Z 2026-10-24T02:54:03.2919524Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.2919679Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T02:54:03.2919746Z 1245 │ { 2026-10-24T02:54:03.2925462Z ·  ────┬──── 2026-10-24T02:54:03.2925600Z · ╰── This is the containing effect 2026-10-24T02:54:03.2925673Z 57 │ setDecodedSize(null); 2026-10-24T02:54:03.2925751Z ·  ───────┬────── 2026-10-24T02:54:03.2925922Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2925993Z 58 │ }, [props.sourceKey]); 2026-10-24T02:54:03.2926048Z ╰──── 2026-10-24T02:54:03.2926655Z  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-24T02:54:03.2926987Z  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-24T02:54:03.2926992Z 2026-10-24T02:54:03.2927252Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2927407Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T02:54:03.2927462Z 59 │ 2026-10-24T02:54:03.2927525Z 60 │ useEffect(() => { 2026-10-24T02:54:03.2927596Z ·  ────┬──── 2026-10-24T02:54:03.2927727Z · ╰── This is the containing effect 2026-10-24T02:54:03.2927797Z 61 │ setFailedUri(null); 2026-10-24T02:54:03.2927873Z ·  ──────┬───── 2026-10-24T02:54:03.2928042Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2928109Z 62 │ }, [props.uri]); 2026-10-24T02:54:03.2928169Z ╰──── 2026-10-24T02:54:03.2928775Z  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-24T02:54:03.2929100Z  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-24T02:54:03.2929103Z 2026-10-24T02:54:03.2929325Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T02:54:03.2929480Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T02:54:03.2929683Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T02:54:03.2929891Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T02:54:03.2929982Z ·  ────────┬──────── 2026-10-24T02:54:03.2930164Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T02:54:03.2930220Z 8 │ 2026-10-24T02:54:03.2930272Z ╰──── 2026-10-24T02:54:03.2930373Z  help: Consider removing this import. 2026-10-24T02:54:03.2930376Z 2026-10-24T02:54:03.2930580Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2930734Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T02:54:03.2930802Z 57 │ setDecodedSize(null); 2026-10-24T02:54:03.2930873Z 58 │ }, [props.sourceKey]); 2026-10-24T02:54:03.2930964Z ·  ───────┬─────── 2026-10-24T02:54:03.2931124Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T02:54:03.2931176Z 59 │ 2026-10-24T02:54:03.2931230Z ╰──── 2026-10-24T02:54:03.2931530Z  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-24T02:54:03.2931846Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2931849Z 2026-10-24T02:54:03.2932053Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2932203Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T02:54:03.2932279Z 61 │ setFailedUri(null); 2026-10-24T02:54:03.2932349Z 62 │ }, [props.uri]); 2026-10-24T02:54:03.2932425Z ·  ────┬──── 2026-10-24T02:54:03.2932567Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T02:54:03.2932622Z 63 │ 2026-10-24T02:54:03.2932676Z ╰──── 2026-10-24T02:54:03.2932971Z  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-24T02:54:03.2933287Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2933290Z 2026-10-24T02:54:03.2933621Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2933809Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T02:54:03.2933950Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T02:54:03.2934016Z 356 │ useEffect(() => { 2026-10-24T02:54:03.2934090Z ·  ────┬──── 2026-10-24T02:54:03.2934222Z · ╰── This is the containing effect 2026-10-24T02:54:03.2934313Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T02:54:03.2934375Z 358 │ return; 2026-10-24T02:54:03.2934433Z 359 │ } 2026-10-24T02:54:03.2934533Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T02:54:03.2934629Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T02:54:03.2934734Z ·  ──────────────┬────────────── 2026-10-24T02:54:03.2934919Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2934986Z 362 │ return; 2026-10-24T02:54:03.2935042Z ╰──── 2026-10-24T02:54:03.2935647Z  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-24T02:54:03.2935974Z  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-24T02:54:03.2935976Z 2026-10-24T02:54:03.2936304Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2936464Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T02:54:03.2936522Z 447 │ 2026-10-24T02:54:03.2936587Z 448 │ useEffect(() => { 2026-10-24T02:54:03.2936660Z ·  ────┬──── 2026-10-24T02:54:03.2936790Z · ╰── This is the containing effect 2026-10-24T02:54:03.2936895Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T02:54:03.2936955Z 450 │ return; 2026-10-24T02:54:03.2937013Z 451 │ } 2026-10-24T02:54:03.2937159Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T02:54:03.2937298Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T02:54:03.2937404Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T02:54:03.2937461Z 455 │ } 2026-10-24T02:54:03.2937612Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T02:54:03.2937746Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T02:54:03.2937850Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T02:54:03.2937926Z 459 │ const directProject = 2026-10-24T02:54:03.2937996Z 460 │ projects.find( 2026-10-24T02:54:03.2938061Z 461 │ (project) => 2026-10-24T02:54:03.2938241Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T02:54:03.2938306Z 463 │ ) ?? null; 2026-10-24T02:54:03.2938361Z 464 │ 2026-10-24T02:54:03.2938430Z 465 │ if (directProject) { 2026-10-24T02:54:03.2938573Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T02:54:03.2938803Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T02:54:03.2939063Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T02:54:03.2939202Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T02:54:03.2939267Z 470 │ return; 2026-10-24T02:54:03.2939327Z 471 │ } 2026-10-24T02:54:03.2939426Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T02:54:03.2939487Z 473 │ if ( 2026-10-24T02:54:03.2939633Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T02:54:03.2939736Z 475 │ selectedProject.id !== directProject.id 2026-10-24T02:54:03.2939800Z 476 │ ) { 2026-10-24T02:54:03.2939884Z 477 │ setProject(directProject); 2026-10-24T02:54:03.2939951Z 478 │ return; 2026-10-24T02:54:03.2940013Z 479 │ } 2026-10-24T02:54:03.2940140Z 480 │ if (!flow.draftKey) return; 2026-10-24T02:54:03.2940282Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T02:54:03.2940430Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T02:54:03.2940543Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T02:54:03.2940624Z 484 │ workspaceSelection: { 2026-10-24T02:54:03.2940693Z 485 │ mode: "local", 2026-10-24T02:54:03.2940803Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T02:54:03.2940942Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T02:54:03.2941026Z 488 │ startFromOrigin: false, 2026-10-24T02:54:03.2941086Z 489 │ }, 2026-10-24T02:54:03.2941148Z 490 │ }); 2026-10-24T02:54:03.2941213Z 491 │ } 2026-10-24T02:54:03.2941347Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T02:54:03.2941405Z 493 │ if ( 2026-10-24T02:54:03.2941551Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T02:54:03.2941651Z 495 │ selectedProject.id === directProject.id 2026-10-24T02:54:03.2941712Z 496 │ ) { 2026-10-24T02:54:03.2941774Z 497 │ return; 2026-10-24T02:54:03.2941833Z 498 │ } 2026-10-24T02:54:03.2941916Z 499 │ setProject(directProject); 2026-10-24T02:54:03.2941977Z 500 │ return; 2026-10-24T02:54:03.2942035Z 501 │ } 2026-10-24T02:54:03.2942089Z 502 │ 2026-10-24T02:54:03.2942170Z 503 │ if (projects.length > 0) { 2026-10-24T02:54:03.2942266Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T02:54:03.2942382Z ·  ──────────────┬────────────── 2026-10-24T02:54:03.2942568Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2942626Z 505 │ } 2026-10-24T02:54:03.2942678Z ╰──── 2026-10-24T02:54:03.2943286Z  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-24T02:54:03.2943614Z  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-24T02:54:03.2943617Z 2026-10-24T02:54:03.2943946Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.2944137Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T02:54:03.2944190Z 545 │ 2026-10-24T02:54:03.2944258Z 546 │ useEffect(() => { 2026-10-24T02:54:03.2944332Z ·  ────┬──── 2026-10-24T02:54:03.2944464Z · ╰── This is the containing effect 2026-10-24T02:54:03.2944559Z 547 │ const shareId = props.incomingShareId; 2026-10-24T02:54:03.2944645Z 548 │ const draftKey = flow.draftKey; 2026-10-24T02:54:03.2944749Z 549 │ const destinationProject = selectedProject; 2026-10-24T02:54:03.2944894Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T02:54:03.2945021Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T02:54:03.2945119Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T02:54:03.2945202Z 553 │ !initialEnvironmentId || 2026-10-24T02:54:03.2945275Z 554 │ !initialProjectId || 2026-10-24T02:54:03.2945405Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T02:54:03.2945515Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T02:54:03.2945576Z 557 │ if ( 2026-10-24T02:54:03.2945642Z 558 │ !shareId || 2026-10-24T02:54:03.2945706Z 559 │ !draftKey || 2026-10-24T02:54:03.2945782Z 560 │ !destinationProject || 2026-10-24T02:54:03.2945872Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T02:54:03.2945964Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T02:54:03.2946019Z 563 │ ) { 2026-10-24T02:54:03.2946083Z 564 │ return; 2026-10-24T02:54:03.2946141Z 565 │ } 2026-10-24T02:54:03.2946242Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T02:54:03.2946304Z 567 │ if ( 2026-10-24T02:54:03.2946417Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T02:54:03.2946531Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T02:54:03.2946586Z 570 │ ) { 2026-10-24T02:54:03.2946649Z 571 │ return; 2026-10-24T02:54:03.2946706Z 572 │ } 2026-10-24T02:54:03.2946761Z 573 │ 2026-10-24T02:54:03.2946829Z 574 │ if (!incomingShare) { 2026-10-24T02:54:03.2947030Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T02:54:03.2947160Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T02:54:03.2947229Z 577 │ Dialog.alert( 2026-10-24T02:54:03.2947312Z 578 │ "Shared content unavailable", 2026-10-24T02:54:03.2947495Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T02:54:03.2947558Z 580 │ ); 2026-10-24T02:54:03.2947617Z 581 │ } 2026-10-24T02:54:03.2947675Z 582 │ return; 2026-10-24T02:54:03.2947733Z 583 │ } 2026-10-24T02:54:03.2947789Z 584 │ 2026-10-24T02:54:03.2947849Z 585 │ if ( 2026-10-24T02:54:03.2948009Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T02:54:03.2948111Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T02:54:03.2948169Z 588 │ ) { 2026-10-24T02:54:03.2948227Z 589 │ return; 2026-10-24T02:54:03.2948285Z 590 │ } 2026-10-24T02:54:03.2948340Z 591 │ 2026-10-24T02:54:03.2948480Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T02:54:03.2948682Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T02:54:03.2948773Z 594 │ } 2026-10-24T02:54:03.2948883Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T02:54:03.2948955Z 596 │ const draftBackup = 2026-10-24T02:54:03.2949141Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T02:54:03.2949281Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T02:54:03.2949373Z 599 │ const importToken = Symbol(importKey); 2026-10-24T02:54:03.2949454Z 600 │ let didReserveShare = false; 2026-10-24T02:54:03.2949529Z 601 │ let didConsumeShare = false; 2026-10-24T02:54:03.2949611Z 602 │ let needsDraftRestore = false; 2026-10-24T02:54:03.2949725Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T02:54:03.2949811Z 604 │ setImportingShareKey(importKey); 2026-10-24T02:54:03.2949903Z ·  ──────────┬───────── 2026-10-24T02:54:03.2950116Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.2950186Z 605 │ void (async () => { 2026-10-24T02:54:03.2950241Z ╰──── 2026-10-24T02:54:03.2950847Z  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-24T02:54:03.2951177Z  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-24T02:54:03.2951180Z 2026-10-24T02:54:03.2951390Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2951548Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T02:54:03.2951625Z 523 │ props.initialProjectRef, 2026-10-24T02:54:03.2951697Z 524 │ props.incomingShareId, 2026-10-24T02:54:03.2951788Z ·  ──────────┬────────── 2026-10-24T02:54:03.2951958Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T02:54:03.2952032Z 525 │ props.pendingTaskId, 2026-10-24T02:54:03.2952084Z ╰──── 2026-10-24T02:54:03.2952383Z  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-24T02:54:03.2952705Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2952710Z 2026-10-24T02:54:03.2952929Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:54:03.2953083Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T02:54:03.2953198Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T02:54:03.2953270Z 543 │ flow.loadBranches(); 2026-10-24T02:54:03.2953343Z ·  ──┬─ 2026-10-24T02:54:03.2953467Z · ╰── Missing dependency `flow` 2026-10-24T02:54:03.2953564Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T02:54:03.2953653Z ·  ────────┬──────── 2026-10-24T02:54:03.2953934Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T02:54:03.2954021Z 545 │ 2026-10-24T02:54:03.2954073Z ╰──── 2026-10-24T02:54:03.2954503Z  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-24T02:54:03.2954820Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2954823Z 2026-10-24T02:54:03.2955027Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.2955178Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T02:54:03.2955251Z 765 │ flow.draftKey, 2026-10-24T02:54:03.2955334Z 766 │ hasImportedIncomingShare, 2026-10-24T02:54:03.2955427Z ·  ────────────┬─────────── 2026-10-24T02:54:03.2955603Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T02:54:03.2955672Z 767 │ incomingShare, 2026-10-24T02:54:03.2955756Z 768 │ isIncomingShareInboxLoading, 2026-10-24T02:54:03.2955853Z ·  ─────────────┬───────────── 2026-10-24T02:54:03.2956036Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T02:54:03.2956119Z 769 │ isIncomingShareUnavailable, 2026-10-24T02:54:03.2956194Z 770 │ props.incomingShareId, 2026-10-24T02:54:03.2956291Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T02:54:03.2956380Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T02:54:03.2956463Z 773 │ releaseShareReservation, 2026-10-24T02:54:03.2956533Z 774 │ reserveShare, 2026-10-24T02:54:03.2956622Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T02:54:03.2956690Z 776 │ selectedProject, 2026-10-24T02:54:03.2956762Z 777 │ shareImportAttempt, 2026-10-24T02:54:03.2956850Z ·  ─────────┬──────── 2026-10-24T02:54:03.2957017Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T02:54:03.2957073Z 778 │ ]); 2026-10-24T02:54:03.2957128Z ╰──── 2026-10-24T02:54:03.2957427Z  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-24T02:54:03.2957749Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.2957754Z 2026-10-24T02:54:03.2957949Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.2958123Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17] 2026-10-24T02:54:03.2958188Z 813 │
    { 2026-10-24T02:54:03.3024264Z 167 │ const record = 2026-10-24T02:54:03.3024422Z 168 │ token.type === "context" 2026-10-24T02:54:03.3024684Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T02:54:03.3024920Z 170 │ : undefined; 2026-10-24T02:54:03.3025111Z 171 │ const presentation = contextChipPresentation( 2026-10-24T02:54:03.3025341Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T02:54:03.3025525Z 173 │ record, 2026-10-24T02:54:03.3025658Z 174 │ ); 2026-10-24T02:54:03.3025807Z 175 │ const icon = contextChipIcon( 2026-10-24T02:54:03.3025972Z 176 │ presentation, 2026-10-24T02:54:03.3026199Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T02:54:03.3026404Z 178 │ ); 2026-10-24T02:54:03.3026530Z 179 │ return { 2026-10-24T02:54:03.3026671Z 180 │ type: token.type, 2026-10-24T02:54:03.3026831Z 181 │ source: token.source, 2026-10-24T02:54:03.3026991Z 182 │ start: token.start, 2026-10-24T02:54:03.3027150Z 183 │ end: token.end, 2026-10-24T02:54:03.3027382Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T02:54:03.3027597Z 185 │ label: 2026-10-24T02:54:03.3027746Z 186 │ token.type === "skill" 2026-10-24T02:54:03.3027946Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T02:54:03.3028146Z 188 │ : token.type === "context" 2026-10-24T02:54:03.3028484Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T02:54:03.3028792Z 190 │ : basename(token.value), 2026-10-24T02:54:03.3029034Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T02:54:03.3029277Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T02:54:03.3029550Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T02:54:03.3029740Z 194 │ }; 2026-10-24T02:54:03.3029861Z 195 │ }), 2026-10-24T02:54:03.3029980Z 196 │ ); 2026-10-24T02:54:03.3030208Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T02:54:03.3030507Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T02:54:03.3030857Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.3031184Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T02:54:03.3031382Z ╰──── 2026-10-24T02:54:03.3031645Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:54:03.3032176Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3032480Z 2026-10-24T02:54:03.3032668Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T02:54:03.3032994Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T02:54:03.3033276Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T02:54:03.3033516Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T02:54:03.3033724Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3034287Z · ╰── 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-24T02:54:03.3034793Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T02:54:03.3034962Z 254 │ value, 2026-10-24T02:54:03.3035113Z 255 │ selection: nextSelection, 2026-10-24T02:54:03.3035262Z 256 │ }); 2026-10-24T02:54:03.3035409Z 257 │ return acknowledgedEventCount; 2026-10-24T02:54:03.3035561Z 258 │ }, 2026-10-24T02:54:03.3035676Z 259 │ [], 2026-10-24T02:54:03.3035806Z ·  ─┬ 2026-10-24T02:54:03.3036067Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.3036296Z 260 │ ); 2026-10-24T02:54:03.3036403Z ╰──── 2026-10-24T02:54:03.3036661Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T02:54:03.3037253Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3037588Z 2026-10-24T02:54:03.3037833Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:54:03.3038221Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T02:54:03.3038439Z 289 │ return ( 2026-10-24T02:54:03.3038640Z 290 │ 2026-10-24T02:54:03.3038905Z ·  ───────────── 2026-10-24T02:54:03.3039094Z 291 │ {props.children} 2026-10-24T02:54:03.3039226Z ╰──── 2026-10-24T02:54:03.3039504Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:54:03.3039867Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:54:03.3040091Z 2026-10-24T02:54:03.3040333Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:54:03.3040713Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T02:54:03.3040931Z 653 │ return ( 2026-10-24T02:54:03.3041134Z 654 │ 2026-10-24T02:54:03.3041508Z ·  ───────────── 2026-10-24T02:54:03.3041786Z 655 │ {props.children} 2026-10-24T02:54:03.3041992Z ╰──── 2026-10-24T02:54:03.3042429Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:54:03.3042877Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:54:03.3043056Z 2026-10-24T02:54:03.3043302Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:54:03.3043699Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T02:54:03.3043923Z 1461 │ return ( 2026-10-24T02:54:03.3044159Z 1462 │ 2026-10-24T02:54:03.3044461Z ·  ──────────────────── 2026-10-24T02:54:03.3044685Z 1463 │ { 2026-10-24T02:54:03.3046772Z ·  ────┬──── 2026-10-24T02:54:03.3046985Z · ╰── This is the containing effect 2026-10-24T02:54:03.3047192Z 2139 │ setExpandedVideo(null); 2026-10-24T02:54:03.3047362Z ·  ────────┬─────── 2026-10-24T02:54:03.3047709Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3047977Z 2140 │ setExpandedFile(null); 2026-10-24T02:54:03.3048115Z ╰──── 2026-10-24T02:54:03.3048782Z  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-24T02:54:03.3049658Z  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-24T02:54:03.3049967Z 2026-10-24T02:54:03.3050246Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T02:54:03.3050606Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10] 2026-10-24T02:54:03.3050888Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T02:54:03.3051176Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T02:54:03.3051424Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3051692Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T02:54:03.3052009Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T02:54:03.3052223Z ╰──── 2026-10-24T02:54:03.3052373Z  help: Consider removing this import. 2026-10-24T02:54:03.3052488Z 2026-10-24T02:54:03.3052695Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T02:54:03.3053031Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3] 2026-10-24T02:54:03.3053231Z 91 │ import { 2026-10-24T02:54:03.3053361Z 92 │ createContext, 2026-10-24T02:54:03.3053508Z ·  ──────┬────── 2026-10-24T02:54:03.3053728Z · ╰── 'createContext' is imported here 2026-10-24T02:54:03.3053918Z 93 │ memo, 2026-10-24T02:54:03.3054029Z ╰──── 2026-10-24T02:54:03.3054174Z  help: Consider removing this import. 2026-10-24T02:54:03.3054285Z 2026-10-24T02:54:03.3054500Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T02:54:03.3054839Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3] 2026-10-24T02:54:03.3055036Z 107 │ import { 2026-10-24T02:54:03.3055168Z 108 │ ActivityIndicator, 2026-10-24T02:54:03.3055337Z ·  ────────┬──────── 2026-10-24T02:54:03.3055575Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T02:54:03.3055773Z 109 │ Image, 2026-10-24T02:54:03.3055888Z ╰──── 2026-10-24T02:54:03.3056034Z  help: Consider removing this import. 2026-10-24T02:54:03.3056243Z 2026-10-24T02:54:03.3056471Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T02:54:03.3056796Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3] 2026-10-24T02:54:03.3056999Z 114 │ Pressable, 2026-10-24T02:54:03.3057131Z 115 │ ScrollView, 2026-10-24T02:54:03.3057273Z ·  ─────┬──── 2026-10-24T02:54:03.3057486Z · ╰── 'ScrollView' is imported here 2026-10-24T02:54:03.3057774Z 116 │ StyleSheet, 2026-10-24T02:54:03.3057934Z ╰──── 2026-10-24T02:54:03.3058078Z  help: Consider removing this import. 2026-10-24T02:54:03.3058189Z 2026-10-24T02:54:03.3058390Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T02:54:03.3058715Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11] 2026-10-24T02:54:03.3058918Z 116 │ StyleSheet, 2026-10-24T02:54:03.3059053Z 117 │ Text as NativeText, 2026-10-24T02:54:03.3059214Z ·  ─────┬──── 2026-10-24T02:54:03.3059439Z · ╰── 'NativeText' is imported here 2026-10-24T02:54:03.3059641Z 118 │ type ColorValue, 2026-10-24T02:54:03.3059770Z ╰──── 2026-10-24T02:54:03.3059914Z  help: Consider removing this import. 2026-10-24T02:54:03.3060031Z 2026-10-24T02:54:03.3060296Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T02:54:03.3060637Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10] 2026-10-24T02:54:03.3060916Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T02:54:03.3061184Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T02:54:03.3061409Z ·  ─────────┬──────── 2026-10-24T02:54:03.3061656Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T02:54:03.3061953Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T02:54:03.3062157Z ╰──── 2026-10-24T02:54:03.3062302Z  help: Consider removing this import. 2026-10-24T02:54:03.3062411Z 2026-10-24T02:54:03.3062637Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T02:54:03.3062984Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10] 2026-10-24T02:54:03.3063261Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T02:54:03.3063528Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T02:54:03.3063750Z ·  ─────────┬───────── 2026-10-24T02:54:03.3064000Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T02:54:03.3064205Z 144 │ import { 2026-10-24T02:54:03.3064318Z ╰──── 2026-10-24T02:54:03.3064464Z  help: Consider removing this import. 2026-10-24T02:54:03.3064576Z 2026-10-24T02:54:03.3064794Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T02:54:03.3065138Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10] 2026-10-24T02:54:03.3065427Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T02:54:03.3065719Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T02:54:03.3065948Z ·  ────────┬─────── 2026-10-24T02:54:03.3066193Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T02:54:03.3066475Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T02:54:03.3066674Z ╰──── 2026-10-24T02:54:03.3066818Z  help: Consider removing this import. 2026-10-24T02:54:03.3066929Z 2026-10-24T02:54:03.3067235Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T02:54:03.3067612Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3] 2026-10-24T02:54:03.3067833Z 160 │ attachmentVideoPreviewSource, 2026-10-24T02:54:03.3068001Z 161 │ mediaVideoPreviewUri, 2026-10-24T02:54:03.3068169Z ·  ──────────┬───────── 2026-10-24T02:54:03.3068412Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T02:54:03.3068630Z 162 │ mediaVideoThumbnailKey, 2026-10-24T02:54:03.3068764Z ╰──── 2026-10-24T02:54:03.3068907Z  help: Consider removing this import. 2026-10-24T02:54:03.3069018Z 2026-10-24T02:54:03.3069244Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T02:54:03.3069596Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3] 2026-10-24T02:54:03.3069810Z 161 │ mediaVideoPreviewUri, 2026-10-24T02:54:03.3069962Z 162 │ mediaVideoThumbnailKey, 2026-10-24T02:54:03.3070178Z ·  ───────────┬────────── 2026-10-24T02:54:03.3070426Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T02:54:03.3070656Z 163 │ type MediaVideoPreviewSource, 2026-10-24T02:54:03.3070801Z ╰──── 2026-10-24T02:54:03.3070946Z  help: Consider removing this import. 2026-10-24T02:54:03.3071055Z 2026-10-24T02:54:03.3071270Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T02:54:03.3071608Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8] 2026-10-24T02:54:03.3071817Z 162 │ mediaVideoThumbnailKey, 2026-10-24T02:54:03.3071984Z 163 │ type MediaVideoPreviewSource, 2026-10-24T02:54:03.3072178Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3072437Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T02:54:03.3072681Z 164 │ } from "../../lib/videoPreviewSource"; 2026-10-24T02:54:03.3072830Z ╰──── 2026-10-24T02:54:03.3072975Z  help: Consider removing this import. 2026-10-24T02:54:03.3073086Z 2026-10-24T02:54:03.3073286Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T02:54:03.3073613Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15] 2026-10-24T02:54:03.3073930Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T02:54:03.3074328Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T02:54:03.3074596Z ·  ───────┬─────── 2026-10-24T02:54:03.3074843Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T02:54:03.3075043Z 172 │ import { 2026-10-24T02:54:03.3075156Z ╰──── 2026-10-24T02:54:03.3075299Z  help: Consider removing this import. 2026-10-24T02:54:03.3075409Z 2026-10-24T02:54:03.3075641Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T02:54:03.3075995Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3] 2026-10-24T02:54:03.3076190Z 185 │ import { 2026-10-24T02:54:03.3076326Z 186 │ resolveMarkdownFontSizes, 2026-10-24T02:54:03.3076502Z ·  ────────────┬─────────── 2026-10-24T02:54:03.3076760Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T02:54:03.3077002Z 187 │ resolveNativeMarkdownTypography, 2026-10-24T02:54:03.3077154Z ╰──── 2026-10-24T02:54:03.3077296Z  help: Consider removing this import. 2026-10-24T02:54:03.3077406Z 2026-10-24T02:54:03.3077630Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used. 2026-10-24T02:54:03.3077977Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10] 2026-10-24T02:54:03.3078255Z 190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon"; 2026-10-24T02:54:03.3078531Z 191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons"; 2026-10-24T02:54:03.3078773Z ·  ───────────┬────────── 2026-10-24T02:54:03.3079037Z · ╰── 'markdownLinkIconSource' is imported here 2026-10-24T02:54:03.3079253Z 192 │ import { 2026-10-24T02:54:03.3079366Z ╰──── 2026-10-24T02:54:03.3079509Z  help: Consider removing this import. 2026-10-24T02:54:03.3079621Z 2026-10-24T02:54:03.3079884Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T02:54:03.3080290Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3] 2026-10-24T02:54:03.3080510Z 193 │ normalizeNativeMarkdownUrl, 2026-10-24T02:54:03.3080697Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T02:54:03.3080914Z ·  ──────────────────┬────────────────── 2026-10-24T02:54:03.3081217Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T02:54:03.3081480Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T02:54:03.3081623Z ╰──── 2026-10-24T02:54:03.3081767Z  help: Consider removing this import. 2026-10-24T02:54:03.3081877Z 2026-10-24T02:54:03.3082104Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used. 2026-10-24T02:54:03.3082453Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3] 2026-10-24T02:54:03.3082685Z 194 │ resolveMarkdownInlineCodePresentation, 2026-10-24T02:54:03.3082862Z 195 │ resolveMarkdownLinkIcon, 2026-10-24T02:54:03.3083037Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3083287Z · ╰── 'resolveMarkdownLinkIcon' is imported here 2026-10-24T02:54:03.3083523Z 196 │ resolveMarkdownLinkPresentation, 2026-10-24T02:54:03.3083673Z ╰──── 2026-10-24T02:54:03.3083893Z  help: Consider removing this import. 2026-10-24T02:54:03.3084034Z 2026-10-24T02:54:03.3084263Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T02:54:03.3084617Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10] 2026-10-24T02:54:03.3084864Z 233 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T02:54:03.3085129Z 234 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T02:54:03.3085387Z ·  ────────────┬─────────── 2026-10-24T02:54:03.3085655Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T02:54:03.3085868Z 235 │ import { 2026-10-24T02:54:03.3085981Z ╰──── 2026-10-24T02:54:03.3086125Z  help: Consider removing this import. 2026-10-24T02:54:03.3086236Z 2026-10-24T02:54:03.3086455Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T02:54:03.3086793Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3] 2026-10-24T02:54:03.3086996Z 237 │ useAssetUrl, 2026-10-24T02:54:03.3087135Z 238 │ useAssetUrlState, 2026-10-24T02:54:03.3087293Z ·  ────────┬─────── 2026-10-24T02:54:03.3087524Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T02:54:03.3087730Z 239 │ useRefreshAssetUrl, 2026-10-24T02:54:03.3087864Z ╰──── 2026-10-24T02:54:03.3088007Z  help: Consider removing this import. 2026-10-24T02:54:03.3088118Z 2026-10-24T02:54:03.3088321Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3088655Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7] 2026-10-24T02:54:03.3088876Z 2140 │ setExpandedFile(null); 2026-10-24T02:54:03.3089124Z 2141 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T02:54:03.3089514Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T02:54:03.3089996Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T02:54:03.3090483Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T02:54:03.3090837Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T02:54:03.3091143Z 2142 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T02:54:03.3091341Z ╰──── 2026-10-24T02:54:03.3091689Z  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-24T02:54:03.3092285Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3092583Z 2026-10-24T02:54:03.3092785Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3093116Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7] 2026-10-24T02:54:03.3093359Z 2608 │ reportHeaderMaterialVisibility(false); 2026-10-24T02:54:03.3093659Z 2609 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T02:54:03.3093921Z ·  ──────┬────── 2026-10-24T02:54:03.3094164Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T02:54:03.3094364Z 2610 │ 2026-10-24T02:54:03.3094471Z ╰──── 2026-10-24T02:54:03.3094819Z  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-24T02:54:03.3095411Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3095709Z 2026-10-24T02:54:03.3095909Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3096313Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7] 2026-10-24T02:54:03.3096515Z 2624 │ } 2026-10-24T02:54:03.3096708Z 2625 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T02:54:03.3096927Z ·  ──────┬───── 2026-10-24T02:54:03.3097167Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T02:54:03.3097364Z 2626 │ 2026-10-24T02:54:03.3097471Z ╰──── 2026-10-24T02:54:03.3097814Z  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-24T02:54:03.3098398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3098693Z 2026-10-24T02:54:03.3098896Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3099230Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7] 2026-10-24T02:54:03.3099427Z 2781 │ } 2026-10-24T02:54:03.3099674Z 2782 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T02:54:03.3100080Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T02:54:03.3100505Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T02:54:03.3100930Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T02:54:03.3101361Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T02:54:03.3101604Z 2783 │ 2026-10-24T02:54:03.3101711Z ╰──── 2026-10-24T02:54:03.3102053Z  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-24T02:54:03.3102640Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3102934Z 2026-10-24T02:54:03.3103114Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:54:03.3103426Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9] 2026-10-24T02:54:03.3103623Z 612 │ }; 2026-10-24T02:54:03.3103808Z 613 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T02:54:03.3104127Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T02:54:03.3104535Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T02:54:03.3104941Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T02:54:03.3105286Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T02:54:03.3105499Z 614 │ ); 2026-10-24T02:54:03.3105608Z ╰──── 2026-10-24T02:54:03.3105983Z  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-24T02:54:03.3106597Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3106898Z 2026-10-24T02:54:03.3107054Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3107371Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T02:54:03.3107630Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T02:54:03.3107836Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T02:54:03.3108024Z ·  ──────┬────── 2026-10-24T02:54:03.3108257Z · ╰── `pulseProgress` originates here 2026-10-24T02:54:03.3108448Z 55 │ 2026-10-24T02:54:03.3108568Z 56 │ useEffect(() => { 2026-10-24T02:54:03.3108717Z 57 │ if (pulse) { 2026-10-24T02:54:03.3108879Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T02:54:03.3109061Z ·  ──────┬────── 2026-10-24T02:54:03.3109291Z · ╰── `pulseProgress` cannot be modified 2026-10-24T02:54:03.3109499Z 59 │ withTiming(1, { 2026-10-24T02:54:03.3109629Z ╰──── 2026-10-24T02:54:03.3109949Z  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-24T02:54:03.3110550Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3110841Z 2026-10-24T02:54:03.3111117Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.3111481Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T02:54:03.3111719Z 35 │ startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T02:54:03.3114122Z ·  ─────┬───── 2026-10-24T02:54:03.3114464Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T02:54:03.3114721Z 101 │ const readEditor = useCallback( 2026-10-24T02:54:03.3114868Z ╰──── 2026-10-24T02:54:03.3115235Z  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-24T02:54:03.3115849Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3116150Z 2026-10-24T02:54:03.3116330Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:54:03.3116668Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T02:54:03.3116892Z 120 │ setEditor, 2026-10-24T02:54:03.3117031Z 121 │ startEditor, 2026-10-24T02:54:03.3117185Z ·  ─────┬───── 2026-10-24T02:54:03.3117416Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T02:54:03.3117620Z 122 │ hasChanges, 2026-10-24T02:54:03.3117746Z ╰──── 2026-10-24T02:54:03.3118111Z  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-24T02:54:03.3118730Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3119032Z 2026-10-24T02:54:03.3119200Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:54:03.3119562Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T02:54:03.3119804Z 52 │ 2026-10-24T02:54:03.3119922Z 53 │ for (const {} of [ 2026-10-24T02:54:03.3120113Z ·  ── 2026-10-24T02:54:03.3120265Z 54 │ { healthy: true }, 2026-10-24T02:54:03.3120395Z ╰──── 2026-10-24T02:54:03.3120677Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:54:03.3120903Z 2026-10-24T02:54:03.3121237Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3121689Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T02:54:03.3121919Z 58 │ 2026-10-24T02:54:03.3122035Z 59 │ useEffect(() => { 2026-10-24T02:54:03.3122187Z ·  ────┬──── 2026-10-24T02:54:03.3122400Z · ╰── This is the containing effect 2026-10-24T02:54:03.3122615Z 60 │ setMountedModes((current) => { 2026-10-24T02:54:03.3122794Z ·  ───────┬─────── 2026-10-24T02:54:03.3123058Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3123308Z 61 │ if (current.has(props.mode)) { 2026-10-24T02:54:03.3123465Z ╰──── 2026-10-24T02:54:03.3124141Z  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-24T02:54:03.3125024Z  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-24T02:54:03.3125337Z 2026-10-24T02:54:03.3125616Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3126032Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T02:54:03.3126244Z 60 │ ) { 2026-10-24T02:54:03.3126484Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T02:54:03.3126743Z ·  ──────┬────── 2026-10-24T02:54:03.3126984Z · ╰── 'useDragRegion' is declared here 2026-10-24T02:54:03.3127219Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T02:54:03.3127385Z ╰──── 2026-10-24T02:54:03.3127545Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3127669Z 2026-10-24T02:54:03.3127929Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3128314Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T02:54:03.3128521Z 3754 │ 2026-10-24T02:54:03.3128790Z 3755 │ const layer: Layer.Layer = 2026-10-24T02:54:03.3129071Z ·  ──┬── 2026-10-24T02:54:03.3129372Z · ╰── 'layer' is declared here 2026-10-24T02:54:03.3129625Z 3756 │ Layer.effect( 2026-10-24T02:54:03.3129804Z ╰──── 2026-10-24T02:54:03.3130033Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3130225Z 2026-10-24T02:54:03.3130468Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:54:03.3130882Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T02:54:03.3131204Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T02:54:03.3131505Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T02:54:03.3131823Z ·  ────────────┬──────────── 2026-10-24T02:54:03.3132223Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T02:54:03.3132671Z 774 │ } 2026-10-24T02:54:03.3132990Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T02:54:03.3133374Z ·  ────────────────┬──────────────── 2026-10-24T02:54:03.3133840Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T02:54:03.3134233Z 776 │ 2026-10-24T02:54:03.3134393Z ╰──── 2026-10-24T02:54:03.3134916Z  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-24T02:54:03.3135716Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3136057Z 2026-10-24T02:54:03.3136307Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3136780Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T02:54:03.3137163Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T02:54:03.3137526Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T02:54:03.3137832Z ·  ──────────┬───────── 2026-10-24T02:54:03.3138135Z · ╰── `animatedBorderRadius` originates here 2026-10-24T02:54:03.3138533Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T02:54:03.3138814Z 390 │ useLayoutEffect(() => { 2026-10-24T02:54:03.3139090Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T02:54:03.3139340Z ·  ──────────┬───────── 2026-10-24T02:54:03.3139760Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T02:54:03.3140113Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T02:54:03.3140314Z ╰──── 2026-10-24T02:54:03.3140714Z  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-24T02:54:03.3141322Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3141681Z 2026-10-24T02:54:03.3141873Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3142258Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T02:54:03.3142552Z 107 │ ); 2026-10-24T02:54:03.3142814Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T02:54:03.3143248Z ·  ─────────┬──────── 2026-10-24T02:54:03.3143545Z · ╰── `separationProgress` originates here 2026-10-24T02:54:03.3143825Z 109 │ 2026-10-24T02:54:03.3144005Z 110 │ useEffect(() => { 2026-10-24T02:54:03.3144328Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T02:54:03.3144654Z ·  ─────────┬──────── 2026-10-24T02:54:03.3145064Z · ╰── `separationProgress` cannot be modified 2026-10-24T02:54:03.3145425Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T02:54:03.3145670Z ╰──── 2026-10-24T02:54:03.3146147Z  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-24T02:54:03.3146788Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3147115Z 2026-10-24T02:54:03.3147276Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3147695Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T02:54:03.3148023Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T02:54:03.3148364Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T02:54:03.3148622Z ·  ──────┬───── 2026-10-24T02:54:03.3148930Z · ╰── `capsuleWidth` originates here 2026-10-24T02:54:03.3149228Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T02:54:03.3149637Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T02:54:03.3149772Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T02:54:03.3149906Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T02:54:03.3150001Z 134 │ return; 2026-10-24T02:54:03.3150137Z 135 │ } 2026-10-24T02:54:03.3150268Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T02:54:03.3150399Z 137 │ measuredWidthRef.current = width; 2026-10-24T02:54:03.3150583Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T02:54:03.3150693Z ·  ──────┬───── 2026-10-24T02:54:03.3150840Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T02:54:03.3150949Z 139 │ }; 2026-10-24T02:54:03.3151032Z ╰──── 2026-10-24T02:54:03.3151332Z  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-24T02:54:03.3151667Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3151670Z 2026-10-24T02:54:03.3151856Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3152063Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T02:54:03.3152378Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T02:54:03.3152605Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T02:54:03.3152691Z ·  ──────┬───── 2026-10-24T02:54:03.3152879Z · ╰── `capsuleWidth` originates here 2026-10-24T02:54:03.3153020Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T02:54:03.3153170Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T02:54:03.3153289Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T02:54:03.3153421Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T02:54:03.3153524Z 134 │ return; 2026-10-24T02:54:03.3153615Z 135 │ } 2026-10-24T02:54:03.3153735Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T02:54:03.3153850Z 137 │ measuredWidthRef.current = width; 2026-10-24T02:54:03.3154048Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T02:54:03.3154138Z 139 │ }; 2026-10-24T02:54:03.3154242Z 140 │ const hasStatus = props.status !== null; 2026-10-24T02:54:03.3154410Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T02:54:03.3154515Z 142 │ useEffect(() => { 2026-10-24T02:54:03.3154622Z 143 │ if (!hasStatus) { 2026-10-24T02:54:03.3154825Z 144 │ measuredWidthRef.current = null; 2026-10-24T02:54:03.3154935Z 145 │ capsuleWidth.value = null; 2026-10-24T02:54:03.3155037Z ·  ──────┬───── 2026-10-24T02:54:03.3155233Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T02:54:03.3155307Z 146 │ } 2026-10-24T02:54:03.3155392Z ╰──── 2026-10-24T02:54:03.3155696Z  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-24T02:54:03.3156044Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3156047Z 2026-10-24T02:54:03.3156295Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:54:03.3156476Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T02:54:03.3156644Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T02:54:03.3156734Z 142 │ useEffect(() => { 2026-10-24T02:54:03.3156870Z ·  ───┬─── 2026-10-24T02:54:03.3157113Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T02:54:03.3157216Z 143 │ if (!hasStatus) { 2026-10-24T02:54:03.3157335Z 144 │ measuredWidthRef.current = null; 2026-10-24T02:54:03.3157453Z 145 │ capsuleWidth.value = null; 2026-10-24T02:54:03.3157556Z ·  ──────┬───── 2026-10-24T02:54:03.3157831Z · ╰── This modifies `capsuleWidth` 2026-10-24T02:54:03.3157919Z 146 │ } 2026-10-24T02:54:03.3157995Z ╰──── 2026-10-24T02:54:03.3158369Z  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-24T02:54:03.3158799Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3158836Z 2026-10-24T02:54:03.3159069Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:54:03.3159272Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T02:54:03.3159420Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T02:54:03.3159559Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T02:54:03.3159719Z ·  ───────────────┬─────────────── 2026-10-24T02:54:03.3160000Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T02:54:03.3160169Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T02:54:03.3160297Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T02:54:03.3160405Z 134 │ return; 2026-10-24T02:54:03.3160493Z 135 │ } 2026-10-24T02:54:03.3160634Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T02:54:03.3160726Z 137 │ measuredWidthRef.current = width; 2026-10-24T02:54:03.3161020Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T02:54:03.3161128Z ·  ──────┬───── 2026-10-24T02:54:03.3161301Z · ╰── This modifies `capsuleWidth` 2026-10-24T02:54:03.3161369Z 139 │ }; 2026-10-24T02:54:03.3161457Z ╰──── 2026-10-24T02:54:03.3161841Z  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-24T02:54:03.3162192Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3162197Z 2026-10-24T02:54:03.3162424Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.3162582Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T02:54:03.3162743Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T02:54:03.3162873Z 223 │ 2026-10-24T02:54:03.3163017Z ·  ─────────────── 2026-10-24T02:54:03.3163125Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T02:54:03.3163212Z ╰──── 2026-10-24T02:54:03.3163407Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T02:54:03.3163413Z 2026-10-24T02:54:03.3163646Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.3163831Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T02:54:03.3163914Z 226 │ { 2026-10-24T02:54:03.3165561Z ·  ────┬──── 2026-10-24T02:54:03.3165723Z · ╰── This is the containing effect 2026-10-24T02:54:03.3165836Z 324 │ if (!guidesEnabled && section === "guide") { 2026-10-24T02:54:03.3165964Z 325 │ requestedSection.current = "overview"; 2026-10-24T02:54:03.3166177Z 326 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T02:54:03.3166296Z 327 │ setSection("overview"); 2026-10-24T02:54:03.3166389Z ·  ─────┬──── 2026-10-24T02:54:03.3166703Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3166789Z 328 │ } 2026-10-24T02:54:03.3166892Z ╰──── 2026-10-24T02:54:03.3167519Z  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-24T02:54:03.3167880Z  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-24T02:54:03.3167883Z 2026-10-24T02:54:03.3168128Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T02:54:03.3168342Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:329:6] 2026-10-24T02:54:03.3168484Z 324 │ if (!guidesEnabled && section === "guide") { 2026-10-24T02:54:03.3168592Z 325 │ requestedSection.current = "overview"; 2026-10-24T02:54:03.3168712Z ·  ────────┬─────── 2026-10-24T02:54:03.3169189Z · ╰── 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-24T02:54:03.3169405Z 326 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T02:54:03.3169587Z ·  ─────────┬───────── ──────┬────── 2026-10-24T02:54:03.3170161Z · │ ╰── 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-24T02:54:03.3170654Z · ╰── 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-24T02:54:03.3170763Z 327 │ setSection("overview"); 2026-10-24T02:54:03.3170857Z 328 │ } 2026-10-24T02:54:03.3171084Z 329 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T02:54:03.3171212Z ·  ──────────────────┬───────────────── 2026-10-24T02:54:03.3171431Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.3171653Z 330 │ const tabContent = activityContent; 2026-10-24T02:54:03.3171777Z ╰──── 2026-10-24T02:54:03.3171963Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T02:54:03.3172317Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3172319Z 2026-10-24T02:54:03.3172566Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T02:54:03.3172790Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:864:6] 2026-10-24T02:54:03.3172885Z 847 │ if ( 2026-10-24T02:54:03.3173017Z 848 │ lastSelection.current.path === route.params.path && 2026-10-24T02:54:03.3173122Z ·  ──────┬────── 2026-10-24T02:54:03.3173623Z · ╰── 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-24T02:54:03.3173788Z 849 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T02:54:03.3173858Z 850 │ ) 2026-10-24T02:54:03.3173957Z 851 │ return; 2026-10-24T02:54:03.3179419Z 852 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T02:54:03.3179589Z 853 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T02:54:03.3179681Z 854 │ setJumpPath(route.params.path); 2026-10-24T02:54:03.3179754Z 855 │ setSelectedRowId(null); 2026-10-24T02:54:03.3179832Z 856 │ jumpStarted.current = false; 2026-10-24T02:54:03.3179987Z 857 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T02:54:03.3180151Z 858 │ if (!file || !nativeView.current) return; 2026-10-24T02:54:03.3180243Z ·  ─────┬──── 2026-10-24T02:54:03.3180689Z · ╰── 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-24T02:54:03.3180815Z 859 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T02:54:03.3180892Z 860 │ jumpStarted.current = true; 2026-10-24T02:54:03.3181027Z 861 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T02:54:03.3181106Z 862 │ jumpStarted.current = false; 2026-10-24T02:54:03.3181163Z 863 │ }); 2026-10-24T02:54:03.3181364Z 864 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T02:54:03.3181571Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T02:54:03.3181791Z · ╰── This dependency list is missing values used by the callback 2026-10-24T02:54:03.3181900Z 865 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T02:54:03.3181953Z ╰──── 2026-10-24T02:54:03.3182122Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T02:54:03.3182438Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3182441Z 2026-10-24T02:54:03.3182801Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3182991Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T02:54:03.3183074Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T02:54:03.3183182Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T02:54:03.3183324Z ·  ──────┬────── ────┬─── 2026-10-24T02:54:03.3183523Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T02:54:03.3183671Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T02:54:03.3183731Z 455 │ const { 2026-10-24T02:54:03.3183781Z ╰──── 2026-10-24T02:54:03.3184089Z  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-24T02:54:03.3184407Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3184410Z 2026-10-24T02:54:03.3184597Z ⚠ react(static-components): Cannot create components during render 2026-10-24T02:54:03.3184734Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T02:54:03.3184795Z 492 │ // same check. 2026-10-24T02:54:03.3184923Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T02:54:03.3185043Z ·  ─────────────┬───────────── 2026-10-24T02:54:03.3185229Z · ╰── The component is created during render here 2026-10-24T02:54:03.3185381Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T02:54:03.3185501Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T02:54:03.3185632Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T02:54:03.3185724Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T02:54:03.3185799Z 498 │ setIsPullRefreshing(true); 2026-10-24T02:54:03.3185882Z 499 │ await refreshSelectedSection(); 2026-10-24T02:54:03.3185959Z 500 │ setIsPullRefreshing(false); 2026-10-24T02:54:03.3186012Z 501 │ }; 2026-10-24T02:54:03.3186153Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T02:54:03.3186295Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T02:54:03.3186563Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T02:54:03.3186681Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T02:54:03.3186769Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T02:54:03.3186836Z 507 │ files: reviewFiles, 2026-10-24T02:54:03.3186935Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T02:54:03.3187065Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T02:54:03.3187127Z 510 │ : undefined, 2026-10-24T02:54:03.3187222Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T02:54:03.3187343Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T02:54:03.3187406Z 513 │ : undefined, 2026-10-24T02:54:03.3187458Z 514 │ }); 2026-10-24T02:54:03.3187656Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T02:54:03.3187788Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T02:54:03.3187850Z 517 │ environmentId, 2026-10-24T02:54:03.3187909Z 518 │ threadId, 2026-10-24T02:54:03.3187975Z 519 │ selectedSection, 2026-10-24T02:54:03.3188044Z 520 │ nativeReviewDiffData, 2026-10-24T02:54:03.3188098Z 521 │ }); 2026-10-24T02:54:03.3188201Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T02:54:03.3188285Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T02:54:03.3188372Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T02:54:03.3188447Z 525 │ diff: selectedSection?.diff, 2026-10-24T02:54:03.3188522Z 526 │ data: nativeReviewDiffData, 2026-10-24T02:54:03.3188589Z 527 │ collapsedFileIds, 2026-10-24T02:54:03.3188651Z 528 │ viewedFileIds, 2026-10-24T02:54:03.3188764Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T02:54:03.3188863Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T02:54:03.3188917Z 531 │ }); 2026-10-24T02:54:03.3188988Z 532 │ const showcaseReviewKey = 2026-10-24T02:54:03.3189119Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T02:54:03.3189325Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T02:54:03.3189387Z 535 │ : null; 2026-10-24T02:54:03.3189554Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T02:54:03.3189630Z 537 │ nativeBridge.onDebug(event); 2026-10-24T02:54:03.3189687Z 538 │ if ( 2026-10-24T02:54:03.3189766Z 539 │ showcaseReviewKey === null || 2026-10-24T02:54:03.3189892Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T02:54:03.3190001Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T02:54:03.3190105Z 542 │ ) { 2026-10-24T02:54:03.3190166Z 543 │ return; 2026-10-24T02:54:03.3190219Z 544 │ } 2026-10-24T02:54:03.3190328Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T02:54:03.3190492Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T02:54:03.3190545Z 547 │ }; 2026-10-24T02:54:03.3190598Z 548 │ 2026-10-24T02:54:03.3190712Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T02:54:03.3190791Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T02:54:03.3190880Z 551 │ commentSelection.clearSelection(); 2026-10-24T02:54:03.3191001Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T02:54:03.3191155Z 553 │ toggleExpandedFile(fileId); 2026-10-24T02:54:03.3191241Z 554 │ } 2026-10-24T02:54:03.3191350Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T02:54:03.3191421Z 556 │ if (!nativeView) return; 2026-10-24T02:54:03.3191513Z 557 │ const result = await settlePromise(() => 2026-10-24T02:54:03.3191687Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T02:54:03.3191743Z 559 │ ); 2026-10-24T02:54:03.3191829Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T02:54:03.3192010Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T02:54:03.3192063Z 562 │ } 2026-10-24T02:54:03.3192115Z 563 │ }; 2026-10-24T02:54:03.3192196Z 564 │ const handleVisibleFileChange = ( 2026-10-24T02:54:03.3192332Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T02:54:03.3192393Z 566 │ ) => { 2026-10-24T02:54:03.3192499Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T02:54:03.3192665Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T02:54:03.3192717Z 569 │ }; 2026-10-24T02:54:03.3192796Z 570 │ const renderInspector = () => ( 2026-10-24T02:54:03.3192864Z 571 │ void handleSelectFile(fileId)} 2026-10-24T02:54:03.3193367Z 577 │ /> 2026-10-24T02:54:03.3193425Z 578 │ ); 2026-10-24T02:54:03.3193479Z 579 │ 2026-10-24T02:54:03.3193662Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T02:54:03.3193748Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T02:54:03.3193812Z 582 │ if (fileId) { 2026-10-24T02:54:03.3193893Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T02:54:03.3193970Z 584 │ toggleExpandedFile(fileId); 2026-10-24T02:54:03.3194024Z 585 │ } 2026-10-24T02:54:03.3194076Z 586 │ }; 2026-10-24T02:54:03.3194125Z 587 │ 2026-10-24T02:54:03.3194215Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T02:54:03.3194333Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T02:54:03.3194388Z 590 │ ) => { 2026-10-24T02:54:03.3194472Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T02:54:03.3194540Z 592 │ if (fileId) { 2026-10-24T02:54:03.3194617Z 593 │ toggleViewedFile(fileId); 2026-10-24T02:54:03.3194670Z 594 │ } 2026-10-24T02:54:03.3194722Z 595 │ }; 2026-10-24T02:54:03.3194773Z 596 │ 2026-10-24T02:54:03.3194844Z 597 │ const parsedDiffNotice = 2026-10-24T02:54:03.3195003Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T02:54:03.3195124Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T02:54:03.3195280Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T02:54:03.3195400Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T02:54:03.3195557Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T02:54:03.3195667Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T02:54:03.3195846Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T02:54:03.3195949Z 605 │ hasCachedSelectedDiff, 2026-10-24T02:54:03.3196017Z 606 │ hasAnyCachedDiff, 2026-10-24T02:54:03.3196069Z 607 │ }); 2026-10-24T02:54:03.3196157Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T02:54:03.3196244Z 609 │ void retryEnvironment(environmentId); 2026-10-24T02:54:03.3196299Z 610 │ }; 2026-10-24T02:54:03.3196382Z 611 │ const handleReturnToThread = () => { 2026-10-24T02:54:03.3196460Z 612 │ if (navigation.canGoBack()) { 2026-10-24T02:54:03.3196530Z 613 │ navigation.goBack(); 2026-10-24T02:54:03.3196588Z 614 │ return; 2026-10-24T02:54:03.3196641Z 615 │ } 2026-10-24T02:54:03.3196724Z 616 │ navigation.navigate("Thread", { 2026-10-24T02:54:03.3196813Z 617 │ environmentId: String(environmentId), 2026-10-24T02:54:03.3196894Z 618 │ threadId: String(threadId), 2026-10-24T02:54:03.3196954Z 619 │ }); 2026-10-24T02:54:03.3197008Z 620 │ }; 2026-10-24T02:54:03.3197086Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T02:54:03.3197155Z 622 │ selectedSection?.title, 2026-10-24T02:54:03.3197235Z 623 │ headerDiffSummary.additions, 2026-10-24T02:54:03.3197314Z 624 │ headerDiffSummary.deletions, 2026-10-24T02:54:03.3197367Z 625 │ ] 2026-10-24T02:54:03.3197470Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T02:54:03.3197534Z 627 │ .join(" · "); 2026-10-24T02:54:03.3197587Z 628 │ 2026-10-24T02:54:03.3197662Z 629 │ const showChangedFilesPane = 2026-10-24T02:54:03.3197734Z 630 │ !showConnectionNotice && 2026-10-24T02:54:03.3197809Z 631 │ selectedSection !== null && 2026-10-24T02:54:03.3197886Z 632 │ parsedDiff.kind === "files" && 2026-10-24T02:54:03.3197970Z 633 │ NativeReviewDiffView !== null; 2026-10-24T02:54:03.3198144Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T02:54:03.3198317Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T02:54:03.3198369Z 636 │ 2026-10-24T02:54:03.3198438Z 637 │ const listHeader = (() => { 2026-10-24T02:54:03.3198523Z 638 │ const children: ReactElement[] = []; 2026-10-24T02:54:03.3198575Z 639 │ 2026-10-24T02:54:03.3198638Z 640 │ if (error) { 2026-10-24T02:54:03.3198703Z 641 │ children.push( 2026-10-24T02:54:03.3198764Z 642 │ 2026-10-24T02:54:03.3199425Z 649 │ Review unavailable 2026-10-24T02:54:03.3199583Z 650 │ {error} 2026-10-24T02:54:03.3199645Z 651 │ , 2026-10-24T02:54:03.3199701Z 652 │ ); 2026-10-24T02:54:03.3199753Z 653 │ } 2026-10-24T02:54:03.3199805Z 654 │ 2026-10-24T02:54:03.3199879Z 655 │ if (parsedDiffNotice) { 2026-10-24T02:54:03.3200038Z 656 │ children.push(); 2026-10-24T02:54:03.3200126Z 657 │ } 2026-10-24T02:54:03.3200178Z 658 │ 2026-10-24T02:54:03.3200336Z 659 │ if (children.length === 0) { 2026-10-24T02:54:03.3200430Z 660 │ return null; 2026-10-24T02:54:03.3200484Z 661 │ } 2026-10-24T02:54:03.3200535Z 662 │ 2026-10-24T02:54:03.3200605Z 663 │ return <>{children}; 2026-10-24T02:54:03.3200658Z 664 │ })(); 2026-10-24T02:54:03.3200729Z 665 │ const headerSubtitle = [ 2026-10-24T02:54:03.3200809Z 666 │ headerDiffSummary.additions, 2026-10-24T02:54:03.3200887Z 667 │ headerDiffSummary.deletions, 2026-10-24T02:54:03.3200965Z 668 │ pendingReviewCommentCount > 0 2026-10-24T02:54:03.3201138Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T02:54:03.3201198Z 670 │ : null, 2026-10-24T02:54:03.3201251Z 671 │ ] 2026-10-24T02:54:03.3201315Z 672 │ .filter(Boolean) 2026-10-24T02:54:03.3201377Z 673 │ .join(" · "); 2026-10-24T02:54:03.3201518Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T02:54:03.3201571Z 675 │ 2026-10-24T02:54:03.3201629Z 676 │ return ( 2026-10-24T02:54:03.3201684Z 677 │ <> 2026-10-24T02:54:03.3201749Z 678 │ 2026-10-24T02:54:03.3203065Z 694 │ 2026-10-24T02:54:03.3203130Z 695 │ 2026-10-24T02:54:03.3203250Z 696 │ 2026-10-24T02:54:03.3203331Z 697 │ {showConnectionNotice ? ( 2026-10-24T02:54:03.3203469Z 698 │ 2026-10-24T02:54:03.3203560Z 699 │ 2026-10-24T02:54:03.3204574Z 711 │ 2026-10-24T02:54:03.3204811Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T02:54:03.3204906Z 713 │ 2026-10-24T02:54:03.3205338Z 719 │ 2026-10-24T02:54:03.3205691Z 723 │ {listHeader} 2026-10-24T02:54:03.3205810Z 724 │ 2026-10-24T02:54:03.3205898Z 725 │ { 2026-10-24T02:54:03.3207517Z ·  ────┬──── 2026-10-24T02:54:03.3207651Z · ╰── This is the containing effect 2026-10-24T02:54:03.3207752Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T02:54:03.3207836Z 103 │ setHighlightedLinesById({}); 2026-10-24T02:54:03.3207928Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3208101Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3208160Z 104 │ return; 2026-10-24T02:54:03.3208214Z ╰──── 2026-10-24T02:54:03.3208830Z  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-24T02:54:03.3209160Z  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-24T02:54:03.3209163Z 2026-10-24T02:54:03.3209422Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3209596Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T02:54:03.3209654Z 55 │ 2026-10-24T02:54:03.3209814Z 56 │ useEffect(() => { 2026-10-24T02:54:03.3209916Z ·  ────┬──── 2026-10-24T02:54:03.3210042Z · ╰── This is the containing effect 2026-10-24T02:54:03.3210140Z 57 │ scheduler.reset(); 2026-10-24T02:54:03.3210238Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T02:54:03.3210324Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T02:54:03.3210437Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T02:54:03.3210517Z ·  ───────┬─────── 2026-10-24T02:54:03.3210689Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3210802Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T02:54:03.3210852Z ╰──── 2026-10-24T02:54:03.3211465Z  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-24T02:54:03.3211790Z  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-24T02:54:03.3211793Z 2026-10-24T02:54:03.3211997Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3212172Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T02:54:03.3212249Z 62 │ return () => scheduler.cancel(); 2026-10-24T02:54:03.3212350Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T02:54:03.3212480Z ·  ───┬─── ─────┬───── 2026-10-24T02:54:03.3212673Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T02:54:03.3212807Z · ╰── Unnecessary dependency `enabled` 2026-10-24T02:54:03.3212859Z 64 │ 2026-10-24T02:54:03.3212909Z ╰──── 2026-10-24T02:54:03.3213205Z  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-24T02:54:03.3213517Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3213521Z 2026-10-24T02:54:03.3213853Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T02:54:03.3214034Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T02:54:03.3214188Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T02:54:03.3214266Z 12 │ this.onmessage = listener; 2026-10-24T02:54:03.3214343Z ·  ───────── 2026-10-24T02:54:03.3214398Z 13 │ } 2026-10-24T02:54:03.3214450Z ╰──── 2026-10-24T02:54:03.3214768Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T02:54:03.3214771Z 2026-10-24T02:54:03.3214975Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T02:54:03.3215118Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T02:54:03.3215186Z 15 │ constructor() { 2026-10-24T02:54:03.3215250Z 16 │ source = this; 2026-10-24T02:54:03.3215320Z ·  ────── 2026-10-24T02:54:03.3215374Z 17 │ } 2026-10-24T02:54:03.3215424Z ╰──── 2026-10-24T02:54:03.3215700Z  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-24T02:54:03.3215702Z 2026-10-24T02:54:03.3215932Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T02:54:03.3216056Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T02:54:03.3216306Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T02:54:03.3216408Z 35 │ instanceId === configured ? true : false, 2026-10-24T02:54:03.3216527Z ·  ──────────────────────────────────────── 2026-10-24T02:54:03.3216579Z 36 │ ); 2026-10-24T02:54:03.3216628Z ╰──── 2026-10-24T02:54:03.3216722Z  help: Remove this ternary operator 2026-10-24T02:54:03.3216725Z 2026-10-24T02:54:03.3217201Z ⚠ 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-24T02:54:03.3217333Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T02:54:03.3217388Z 93 │ ) { 2026-10-24T02:54:03.3217597Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:54:03.3217774Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T02:54:03.3217892Z 96 │ │ if (predicate(project)) return project; 2026-10-24T02:54:03.3217992Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3218114Z 98 │ ╰─▶ } 2026-10-24T02:54:03.3218262Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T02:54:03.3218311Z ╰──── 2026-10-24T02:54:03.3218314Z 2026-10-24T02:54:03.3218785Z ⚠ 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-24T02:54:03.3219033Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T02:54:03.3219133Z 27 │ ) { 2026-10-24T02:54:03.3219330Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:54:03.3219471Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T02:54:03.3219595Z 30 │ │ if (predicate(available)) return available; 2026-10-24T02:54:03.3219693Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3219812Z 32 │ ╰─▶ } 2026-10-24T02:54:03.3219988Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T02:54:03.3220039Z ╰──── 2026-10-24T02:54:03.3220041Z 2026-10-24T02:54:03.3220288Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T02:54:03.3220415Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T02:54:03.3220466Z 78 │ 2026-10-24T02:54:03.3220600Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T02:54:03.3220686Z ·  ────────┬─────── 2026-10-24T02:54:03.3220834Z · ╰── 'describeSchedule' is declared here 2026-10-24T02:54:03.3220937Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T02:54:03.3220986Z ╰──── 2026-10-24T02:54:03.3221091Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3221093Z 2026-10-24T02:54:03.3221238Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3221395Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T02:54:03.3221578Z 151 │ 2026-10-24T02:54:03.3221655Z 152 │ {props.children(open)} 2026-10-24T02:54:03.3221743Z ·  ──┬─ 2026-10-24T02:54:03.3221900Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3221961Z 153 │ 2026-10-24T02:54:03.3222012Z ╰──── 2026-10-24T02:54:03.3222487Z  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-24T02:54:03.3222789Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3222793Z 2026-10-24T02:54:03.3222989Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T02:54:03.3223139Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T02:54:03.3223220Z 139 │ if (action.id !== undefined) { 2026-10-24T02:54:03.3223296Z 140 │ props.onPressAction?.({ 2026-10-24T02:54:03.3223366Z ·  ──┬── 2026-10-24T02:54:03.3223496Z · ╰── Missing dependency `props` 2026-10-24T02:54:03.3223588Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T02:54:03.3223735Z 142 │ } as Parameters>[0]); 2026-10-24T02:54:03.3223865Z 143 │ } 2026-10-24T02:54:03.3223955Z 144 │ }, 2026-10-24T02:54:03.3224036Z 145 │ [close, props.onPressAction], 2026-10-24T02:54:03.3224129Z ·  ─────────┬───────── 2026-10-24T02:54:03.3224341Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T02:54:03.3224395Z 146 │ ); 2026-10-24T02:54:03.3224445Z ╰──── 2026-10-24T02:54:03.3224929Z  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-24T02:54:03.3225249Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3225256Z 2026-10-24T02:54:03.3225525Z ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3225634Z ╭─[packages/shared/src/model.test.ts:36:7] 2026-10-24T02:54:03.3225685Z 35 │ 2026-10-24T02:54:03.3225817Z 36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({ 2026-10-24T02:54:03.3225889Z ·  ─────┬──── 2026-10-24T02:54:03.3226022Z · ╰── 'claudeCaps' is declared here 2026-10-24T02:54:03.3226090Z 37 │ optionDescriptors: [ 2026-10-24T02:54:03.3226141Z ╰──── 2026-10-24T02:54:03.3226245Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3226247Z 2026-10-24T02:54:03.3226723Z ⚠ 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-24T02:54:03.3226911Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T02:54:03.3226981Z 520 │ })).delivery; 2026-10-24T02:54:03.3227174Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T02:54:03.3227287Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3227431Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T02:54:03.3227530Z 524 │ │ id: task.id, 2026-10-24T02:54:03.3227650Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T02:54:03.3227749Z 526 │ │ })).delivery; 2026-10-24T02:54:03.3227888Z 527 │ ╰─▶ } 2026-10-24T02:54:03.3228004Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T02:54:03.3228054Z ╰──── 2026-10-24T02:54:03.3228056Z 2026-10-24T02:54:03.3228250Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.3228399Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25] 2026-10-24T02:54:03.3228504Z 266 │ {record.elements?.map((element, index) => ( 2026-10-24T02:54:03.3228671Z 267 │ 2026-10-24T02:54:03.3228900Z ·  ─────────────────────────────────────────────────────── 2026-10-24T02:54:03.3229008Z 268 │ { 2026-10-24T02:54:03.3229836Z ·  ────┬──── 2026-10-24T02:54:03.3229963Z · ╰── This is the containing effect 2026-10-24T02:54:03.3230031Z 68 │ setUri(null); 2026-10-24T02:54:03.3230144Z ·  ───┬── 2026-10-24T02:54:03.3230306Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3230368Z 69 │ setError(null); 2026-10-24T02:54:03.3230418Z ╰──── 2026-10-24T02:54:03.3231022Z  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-24T02:54:03.3231348Z  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-24T02:54:03.3231351Z 2026-10-24T02:54:03.3231556Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3231693Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T02:54:03.3231747Z 90 │ }; 2026-10-24T02:54:03.3231821Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T02:54:03.3231934Z ·  ──────┬───── ───┬─── 2026-10-24T02:54:03.3232116Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T02:54:03.3232260Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T02:54:03.3232394Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T02:54:03.3232443Z ╰──── 2026-10-24T02:54:03.3232745Z  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-24T02:54:03.3233062Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3233064Z 2026-10-24T02:54:03.3233280Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T02:54:03.3233420Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T02:54:03.3233483Z 212 │ useEffect(() => { 2026-10-24T02:54:03.3233593Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T02:54:03.3233690Z ·  ──┬── 2026-10-24T02:54:03.3233909Z · ╰── Missing dependency `props` 2026-10-24T02:54:03.3234052Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T02:54:03.3234163Z ·  ──────────┬───────── 2026-10-24T02:54:03.3234389Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T02:54:03.3234460Z 215 │ const { source } = props; 2026-10-24T02:54:03.3234510Z ╰──── 2026-10-24T02:54:03.3234937Z  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-24T02:54:03.3235251Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3235259Z 2026-10-24T02:54:03.3235517Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3235648Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:159:5] 2026-10-24T02:54:03.3235836Z 154 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T02:54:03.3235906Z 155 │ useLayoutEffect(() => { 2026-10-24T02:54:03.3235982Z ·  ───────┬─────── 2026-10-24T02:54:03.3236111Z · ╰── This is the containing effect 2026-10-24T02:54:03.3236197Z 156 │ if (faviconRequest === null) return; 2026-10-24T02:54:03.3236250Z 157 │ 2026-10-24T02:54:03.3236380Z 158 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T02:54:03.3236482Z 159 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T02:54:03.3236574Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3236744Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3236810Z 160 │ return endRequest; 2026-10-24T02:54:03.3236861Z ╰──── 2026-10-24T02:54:03.3237466Z  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-24T02:54:03.3237790Z  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-24T02:54:03.3237793Z 2026-10-24T02:54:03.3238066Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T02:54:03.3238260Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T02:54:03.3238333Z 3 │ AuthProvidersManageScope, 2026-10-24T02:54:03.3238398Z 4 │ type AuthSessionState, 2026-10-24T02:54:03.3238480Z ·  ────────┬─────── 2026-10-24T02:54:03.3238623Z · ╰── 'AuthSessionState' is imported here 2026-10-24T02:54:03.3238687Z 5 │ type EnvironmentId, 2026-10-24T02:54:03.3238737Z ╰──── 2026-10-24T02:54:03.3238835Z  help: Consider removing this import. 2026-10-24T02:54:03.3238837Z 2026-10-24T02:54:03.3239058Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:54:03.3239191Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T02:54:03.3239261Z 113 │ const declared = { 2026-10-24T02:54:03.3239352Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T02:54:03.3239462Z ·  ──────────────────────────────── 2026-10-24T02:54:03.3239565Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T02:54:03.3239614Z ╰──── 2026-10-24T02:54:03.3239881Z  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-24T02:54:03.3239884Z 2026-10-24T02:54:03.3240131Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:54:03.3240256Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T02:54:03.3240348Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T02:54:03.3240453Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T02:54:03.3240572Z ·  ──────────────────────────────────────── 2026-10-24T02:54:03.3240668Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T02:54:03.3240717Z ╰──── 2026-10-24T02:54:03.3240982Z  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-24T02:54:03.3240984Z 2026-10-24T02:54:03.3241203Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:54:03.3241325Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T02:54:03.3241425Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T02:54:03.3241522Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T02:54:03.3241637Z ·  ──────────────────────────────────── 2026-10-24T02:54:03.3241696Z 117 │ }; 2026-10-24T02:54:03.3241745Z ╰──── 2026-10-24T02:54:03.3242009Z  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-24T02:54:03.3242012Z 2026-10-24T02:54:03.3242212Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3242340Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T02:54:03.3242394Z 81 │ }, 2026-10-24T02:54:03.3242454Z 82 │ [draftKey], 2026-10-24T02:54:03.3242525Z ·  ────┬─── 2026-10-24T02:54:03.3242742Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T02:54:03.3242828Z 83 │ ); 2026-10-24T02:54:03.3242877Z ╰──── 2026-10-24T02:54:03.3243173Z  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-24T02:54:03.3243488Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3243490Z 2026-10-24T02:54:03.3243748Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3243876Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T02:54:03.3243928Z 407 │ 2026-10-24T02:54:03.3243996Z 408 │ const layer: Layer.Layer< 2026-10-24T02:54:03.3244069Z ·  ──┬── 2026-10-24T02:54:03.3244193Z · ╰── 'layer' is declared here 2026-10-24T02:54:03.3244284Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T02:54:03.3244333Z ╰──── 2026-10-24T02:54:03.3244434Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3244437Z 2026-10-24T02:54:03.3244691Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T02:54:03.3244842Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T02:54:03.3244896Z 1619 │ 2026-10-24T02:54:03.3245105Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T02:54:03.3245225Z ·  ──────────────────┬────────────────── 2026-10-24T02:54:03.3245429Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T02:54:03.3245505Z 1621 │ const meta = response._meta; 2026-10-24T02:54:03.3245556Z ╰──── 2026-10-24T02:54:03.3245656Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3245660Z 2026-10-24T02:54:03.3246115Z ⚠ 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-24T02:54:03.3246244Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1043:32] 2026-10-24T02:54:03.3246379Z 1042 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T02:54:03.3246569Z 1043 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T02:54:03.3246683Z ·  ─────────────────── 2026-10-24T02:54:03.3246777Z 1044 │ expect(encoded).not.toContain(url); 2026-10-24T02:54:03.3246828Z ╰──── 2026-10-24T02:54:03.3246831Z 2026-10-24T02:54:03.3247298Z ⚠ 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-24T02:54:03.3247445Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T02:54:03.3247575Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T02:54:03.3247720Z 133 │ ╭─▶ for ( 2026-10-24T02:54:03.3247893Z 134 │ │ let attempt = 0; 2026-10-24T02:54:03.3248096Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T02:54:03.3248193Z 136 │ │ attempt += 1 2026-10-24T02:54:03.3248275Z 137 │ │ ) { 2026-10-24T02:54:03.3248384Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3248518Z 139 │ ╰─▶ } 2026-10-24T02:54:03.3248640Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T02:54:03.3248690Z ╰──── 2026-10-24T02:54:03.3248693Z 2026-10-24T02:54:03.3248922Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T02:54:03.3249048Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31] 2026-10-24T02:54:03.3249106Z 730 │ ); 2026-10-24T02:54:03.3249279Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T02:54:03.3249373Z ·  ────── 2026-10-24T02:54:03.3249486Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T02:54:03.3249535Z ╰──── 2026-10-24T02:54:03.3249710Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T02:54:03.3249712Z 2026-10-24T02:54:03.3249903Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3250039Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T02:54:03.3250245Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T02:54:03.3250336Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T02:54:03.3250419Z ·  ┬ 2026-10-24T02:54:03.3250549Z · ╰── '_' is declared here 2026-10-24T02:54:03.3250648Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T02:54:03.3250699Z ╰──── 2026-10-24T02:54:03.3250800Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3250802Z 2026-10-24T02:54:03.3250987Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3251122Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T02:54:03.3251175Z 133 │ ); 2026-10-24T02:54:03.3251279Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T02:54:03.3251381Z ·  ┬ 2026-10-24T02:54:03.3251522Z · ╰── '_' is declared here 2026-10-24T02:54:03.3251587Z 135 │ Effect.succeed( 2026-10-24T02:54:03.3251637Z ╰──── 2026-10-24T02:54:03.3251736Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3251739Z 2026-10-24T02:54:03.3251919Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3252052Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T02:54:03.3252105Z 177 │ }); 2026-10-24T02:54:03.3252202Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T02:54:03.3252288Z ·  ┬ 2026-10-24T02:54:03.3252498Z · ╰── '_' is declared here 2026-10-24T02:54:03.3252633Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T02:54:03.3252682Z ╰──── 2026-10-24T02:54:03.3252781Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3252783Z 2026-10-24T02:54:03.3252962Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3253094Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T02:54:03.3253148Z 202 │ ); 2026-10-24T02:54:03.3253243Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T02:54:03.3253329Z ·  ┬ 2026-10-24T02:54:03.3253464Z · ╰── '_' is declared here 2026-10-24T02:54:03.3253549Z 204 │ options.removeWorktreeFails 2026-10-24T02:54:03.3253600Z ╰──── 2026-10-24T02:54:03.3253698Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3253700Z 2026-10-24T02:54:03.3253877Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3254009Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T02:54:03.3254062Z 207 │ ); 2026-10-24T02:54:03.3254161Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T02:54:03.3254254Z ·  ┬ 2026-10-24T02:54:03.3254389Z · ╰── '_' is declared here 2026-10-24T02:54:03.3254473Z 209 │ options.deleteLocalBranchFails 2026-10-24T02:54:03.3254522Z ╰──── 2026-10-24T02:54:03.3254625Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3254631Z 2026-10-24T02:54:03.3254808Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3254941Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T02:54:03.3254992Z 212 │ ); 2026-10-24T02:54:03.3255103Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T02:54:03.3255201Z ·  ┬ 2026-10-24T02:54:03.3255341Z · ╰── '_' is declared here 2026-10-24T02:54:03.3255424Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T02:54:03.3255473Z ╰──── 2026-10-24T02:54:03.3255571Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3255573Z 2026-10-24T02:54:03.3255819Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3256080Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T02:54:03.3256192Z 253 │ ); 2026-10-24T02:54:03.3256282Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T02:54:03.3256368Z ·  ┬ 2026-10-24T02:54:03.3256498Z · ╰── '_' is declared here 2026-10-24T02:54:03.3256565Z 255 │ Effect.succeed({ 2026-10-24T02:54:03.3256616Z ╰──── 2026-10-24T02:54:03.3256713Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3256715Z 2026-10-24T02:54:03.3256891Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3257030Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T02:54:03.3257087Z 263 │ ); 2026-10-24T02:54:03.3257238Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T02:54:03.3257325Z ·  ┬ 2026-10-24T02:54:03.3257459Z · ╰── '_' is declared here 2026-10-24T02:54:03.3257604Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T02:54:03.3257653Z ╰──── 2026-10-24T02:54:03.3257749Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3257753Z 2026-10-24T02:54:03.3257895Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3258013Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T02:54:03.3258199Z 53 │ const child = children as ReactElement>; 2026-10-24T02:54:03.3258373Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T02:54:03.3258477Z 55 │ │ onTouchStart: (event) => { 2026-10-24T02:54:03.3258634Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T02:54:03.3258789Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T02:54:03.3258913Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T02:54:03.3259078Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T02:54:03.3259189Z 60 │ │ pendingPress.current = null; 2026-10-24T02:54:03.3259313Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T02:54:03.3259393Z 62 │ │ }, 2026-10-24T02:54:03.3259491Z 63 │ │ onPress: (event) => { 2026-10-24T02:54:03.3259658Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T02:54:03.3259792Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T02:54:03.3259956Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T02:54:03.3260182Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T02:54:03.3260267Z 68 │ │ return; 2026-10-24T02:54:03.3260344Z 69 │ │ } 2026-10-24T02:54:03.3260568Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T02:54:03.3260776Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T02:54:03.3260941Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T02:54:03.3261039Z 73 │ │ event.persist(); 2026-10-24T02:54:03.3261196Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T02:54:03.3261281Z 75 │ │ return; 2026-10-24T02:54:03.3261355Z 76 │ │ } 2026-10-24T02:54:03.3261466Z 77 │ │ child.props.onPress?.(event); 2026-10-24T02:54:03.3261540Z 78 │ │ }, 2026-10-24T02:54:03.3261673Z 79 │ ├─▶ }); 2026-10-24T02:54:03.3261914Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.3262016Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T02:54:03.3262067Z ╰──── 2026-10-24T02:54:03.3262540Z  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-24T02:54:03.3262833Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3262835Z 2026-10-24T02:54:03.3263047Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T02:54:03.3263172Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T02:54:03.3263271Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T02:54:03.3263429Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T02:54:03.3263557Z 159 │ │ constructor(data: Record) { 2026-10-24T02:54:03.3263674Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T02:54:03.3263748Z 161 │ │ } 2026-10-24T02:54:03.3263873Z 162 │ ╰─▶ }, 2026-10-24T02:54:03.3263937Z 163 │ clipboard: { 2026-10-24T02:54:03.3263987Z ╰──── 2026-10-24T02:54:03.3264161Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T02:54:03.3264167Z 2026-10-24T02:54:03.3264614Z ⚠ 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-24T02:54:03.3264737Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T02:54:03.3264907Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T02:54:03.3265089Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T02:54:03.3265201Z ·  ─────────────────── 2026-10-24T02:54:03.3265307Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T02:54:03.3265358Z ╰──── 2026-10-24T02:54:03.3265360Z 2026-10-24T02:54:03.3265879Z ⚠ 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-24T02:54:03.3266032Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T02:54:03.3266214Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T02:54:03.3266320Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T02:54:03.3266436Z ·  ─────────────────── 2026-10-24T02:54:03.3266552Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T02:54:03.3266602Z ╰──── 2026-10-24T02:54:03.3266605Z 2026-10-24T02:54:03.3266867Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3267059Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T02:54:03.3267111Z 104 │ 2026-10-24T02:54:03.3267175Z 105 │ useEffect(() => { 2026-10-24T02:54:03.3267245Z ·  ────┬──── 2026-10-24T02:54:03.3267376Z · ╰── This is the containing effect 2026-10-24T02:54:03.3267453Z 106 │ clearReviewCommentTarget(); 2026-10-24T02:54:03.3267550Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T02:54:03.3267652Z ·  ────────────────┬─────────────── 2026-10-24T02:54:03.3267828Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3267900Z 108 │ }, [selectedSection?.id]); 2026-10-24T02:54:03.3267958Z ╰──── 2026-10-24T02:54:03.3268569Z  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-24T02:54:03.3268893Z  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-24T02:54:03.3268896Z 2026-10-24T02:54:03.3269154Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3269341Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T02:54:03.3269396Z 109 │ 2026-10-24T02:54:03.3269461Z 110 │ useEffect(() => { 2026-10-24T02:54:03.3269531Z ·  ────┬──── 2026-10-24T02:54:03.3269659Z · ╰── This is the containing effect 2026-10-24T02:54:03.3269746Z 111 │ if (activeCommentTarget === null) { 2026-10-24T02:54:03.3269843Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T02:54:03.3269951Z ·  ────────────────┬─────────────── 2026-10-24T02:54:03.3270166Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3270220Z 113 │ } 2026-10-24T02:54:03.3270269Z ╰──── 2026-10-24T02:54:03.3270949Z  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-24T02:54:03.3271303Z  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-24T02:54:03.3271306Z 2026-10-24T02:54:03.3271505Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3271691Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T02:54:03.3271787Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T02:54:03.3271860Z 108 │ }, [selectedSection?.id]); 2026-10-24T02:54:03.3271945Z ·  ─────────┬───────── 2026-10-24T02:54:03.3272111Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T02:54:03.3272163Z 109 │ 2026-10-24T02:54:03.3272214Z ╰──── 2026-10-24T02:54:03.3272509Z  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-24T02:54:03.3272823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3272825Z 2026-10-24T02:54:03.3272977Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T02:54:03.3273101Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T02:54:03.3273212Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T02:54:03.3273310Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T02:54:03.3273406Z ·  ───────────────────────────── 2026-10-24T02:54:03.3273532Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T02:54:03.3273582Z ╰──── 2026-10-24T02:54:03.3273742Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T02:54:03.3273744Z 2026-10-24T02:54:03.3274033Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3274154Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T02:54:03.3274206Z 217 │ 2026-10-24T02:54:03.3274355Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T02:54:03.3274444Z ·  ──────────┬────────── 2026-10-24T02:54:03.3274604Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T02:54:03.3274797Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T02:54:03.3274847Z ╰──── 2026-10-24T02:54:03.3274950Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3274953Z 2026-10-24T02:54:03.3275262Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3275385Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T02:54:03.3275436Z 220 │ 2026-10-24T02:54:03.3275569Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T02:54:03.3275669Z ·  ──────────────┬────────────── 2026-10-24T02:54:03.3275920Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T02:54:03.3276112Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T02:54:03.3276162Z ╰──── 2026-10-24T02:54:03.3276262Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3276265Z 2026-10-24T02:54:03.3276445Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T02:54:03.3276630Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T02:54:03.3276697Z 115 │ return [...commands]; 2026-10-24T02:54:03.3276827Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T02:54:03.3276939Z ·  ─────────┬───────── 2026-10-24T02:54:03.3277129Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T02:54:03.3277183Z 117 │ 2026-10-24T02:54:03.3277234Z ╰──── 2026-10-24T02:54:03.3277548Z  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-24T02:54:03.3277863Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3277865Z 2026-10-24T02:54:03.3278076Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:54:03.3278213Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T02:54:03.3278341Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T02:54:03.3278451Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T02:54:03.3278557Z ·  ─────── 2026-10-24T02:54:03.3278668Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T02:54:03.3278717Z ╰──── 2026-10-24T02:54:03.3278975Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:54:03.3278978Z 2026-10-24T02:54:03.3279142Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T02:54:03.3279335Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T02:54:03.3279475Z 219 │ 2026-10-24T02:54:03.3279680Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T02:54:03.3279816Z ·  ──┬─ 2026-10-24T02:54:03.3279979Z · ╰── 'U+001B' is a control character. 2026-10-24T02:54:03.3280044Z 221 │ 2026-10-24T02:54:03.3280121Z ╰──── 2026-10-24T02:54:03.3280353Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T02:54:03.3280356Z 2026-10-24T02:54:03.3280610Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3280730Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T02:54:03.3280785Z 727 │ 2026-10-24T02:54:03.3280870Z 728 │ const layer = layerWithOptions(); 2026-10-24T02:54:03.3280939Z ·  ──┬── 2026-10-24T02:54:03.3281060Z · ╰── 'layer' is declared here 2026-10-24T02:54:03.3281110Z ╰──── 2026-10-24T02:54:03.3281212Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3281215Z 2026-10-24T02:54:03.3281418Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T02:54:03.3281586Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T02:54:03.3281656Z 14 │ } from "@t3tools/contracts"; 2026-10-24T02:54:03.3281747Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T02:54:03.3281816Z ·  ── 2026-10-24T02:54:03.3282004Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl"; 2026-10-24T02:54:03.3282056Z ╰──── 2026-10-24T02:54:03.3282137Z  help: Remove empty braces 2026-10-24T02:54:03.3282139Z 2026-10-24T02:54:03.3282596Z ⚠ 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-24T02:54:03.3282720Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T02:54:03.3282787Z 38 │ JSON.stringify( 2026-10-24T02:54:03.3282903Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T02:54:03.3282998Z ·  ──────────────────────── 2026-10-24T02:54:03.3283064Z 40 │ { name: "a" }, 2026-10-24T02:54:03.3283115Z ╰──── 2026-10-24T02:54:03.3283117Z 2026-10-24T02:54:03.3283593Z ⚠ 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-24T02:54:03.3283716Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T02:54:03.3283793Z 138 │ Effect.gen(function* () { 2026-10-24T02:54:03.3283985Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T02:54:03.3284105Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T02:54:03.3284428Z 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-24T02:54:03.3284686Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T02:54:03.3284853Z 143 │ ╰─▶ } 2026-10-24T02:54:03.3284939Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T02:54:03.3284988Z ╰──── 2026-10-24T02:54:03.3284990Z 2026-10-24T02:54:03.3285192Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T02:54:03.3285296Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T02:54:03.3285361Z 296 │ } from "./device.ts"; 2026-10-24T02:54:03.3285450Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T02:54:03.3285518Z ·  ── 2026-10-24T02:54:03.3285576Z 298 │ import { 2026-10-24T02:54:03.3285626Z ╰──── 2026-10-24T02:54:03.3285712Z  help: Remove empty braces 2026-10-24T02:54:03.3285718Z 2026-10-24T02:54:03.3285907Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T02:54:03.3285999Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T02:54:03.3286087Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T02:54:03.3286169Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T02:54:03.3286243Z ·  ──┬── 2026-10-24T02:54:03.3286373Z · ╰── 'Fiber' is imported here 2026-10-24T02:54:03.3286473Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T02:54:03.3286522Z ╰──── 2026-10-24T02:54:03.3286617Z  help: Consider removing this import. 2026-10-24T02:54:03.3286620Z 2026-10-24T02:54:03.3286820Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T02:54:03.3286914Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T02:54:03.3286991Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T02:54:03.3287083Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T02:54:03.3287159Z ·  ────┬─── 2026-10-24T02:54:03.3287294Z · ╰── 'Schedule' is imported here 2026-10-24T02:54:03.3287377Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T02:54:03.3287427Z ╰──── 2026-10-24T02:54:03.3287522Z  help: Consider removing this import. 2026-10-24T02:54:03.3287524Z 2026-10-24T02:54:03.3287824Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3287926Z ╭─[apps/server/src/ws.ts:1285:13] 2026-10-24T02:54:03.3288082Z 1284 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T02:54:03.3288281Z 1285 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T02:54:03.3288384Z ·  ────────────┬─────────── 2026-10-24T02:54:03.3288554Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T02:54:03.3288723Z 1286 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T02:54:03.3288778Z ╰──── 2026-10-24T02:54:03.3288878Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3288881Z 2026-10-24T02:54:03.3289074Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T02:54:03.3289251Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T02:54:03.3289371Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T02:54:03.3289461Z 28 │ import { identity } from "effect/Function"; 2026-10-24T02:54:03.3289535Z ·  ────┬─── 2026-10-24T02:54:03.3289668Z · ╰── 'identity' is imported here 2026-10-24T02:54:03.3289749Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T02:54:03.3289799Z ╰──── 2026-10-24T02:54:03.3289892Z  help: Consider removing this import. 2026-10-24T02:54:03.3289895Z 2026-10-24T02:54:03.3290299Z ⚠ 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-24T02:54:03.3290429Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T02:54:03.3290568Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T02:54:03.3290698Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T02:54:03.3290802Z ·  ──────────────────────── 2026-10-24T02:54:03.3290940Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T02:54:03.3290993Z ╰──── 2026-10-24T02:54:03.3290996Z 2026-10-24T02:54:03.3291362Z ⚠ 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-24T02:54:03.3291483Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T02:54:03.3291582Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T02:54:03.3291747Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T02:54:03.3291864Z ·  ──────────────────────── 2026-10-24T02:54:03.3291926Z 257 │ return [ 2026-10-24T02:54:03.3291981Z ╰──── 2026-10-24T02:54:03.3291983Z 2026-10-24T02:54:03.3292214Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T02:54:03.3292329Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T02:54:03.3292381Z 11 │ 2026-10-24T02:54:03.3292480Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T02:54:03.3292579Z ·  ────────────┬──────────── 2026-10-24T02:54:03.3292751Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T02:54:03.3292817Z 13 │ readonly thread: { 2026-10-24T02:54:03.3292874Z ╰──── 2026-10-24T02:54:03.3292979Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3292982Z 2026-10-24T02:54:03.3293187Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T02:54:03.3293334Z ╭─[packages/client-runtime/src/work-log/presentation.ts:234:10] 2026-10-24T02:54:03.3293387Z 233 │ 2026-10-24T02:54:03.3293501Z 234 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T02:54:03.3293585Z ·  ───────┬────── 2026-10-24T02:54:03.3293729Z · ╰── 'nonEmptyString' is declared here 2026-10-24T02:54:03.3293874Z 235 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T02:54:03.3293930Z ╰──── 2026-10-24T02:54:03.3294107Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3294142Z 2026-10-24T02:54:03.3294365Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:54:03.3294482Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T02:54:03.3294585Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T02:54:03.3294718Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T02:54:03.3294870Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T02:54:03.3294926Z 347 │ }; 2026-10-24T02:54:03.3294976Z ╰──── 2026-10-24T02:54:03.3295247Z  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-24T02:54:03.3295250Z 2026-10-24T02:54:03.3295479Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T02:54:03.3295601Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T02:54:03.3295669Z 447 │ const favorites = 2026-10-24T02:54:03.3295779Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T02:54:03.3295870Z ·  ───┬── 2026-10-24T02:54:03.3295993Z · ╰── For this reduce 2026-10-24T02:54:03.3296072Z 449 │ const exists = current.some( 2026-10-24T02:54:03.3296453Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T02:54:03.3296513Z 451 │ ); 2026-10-24T02:54:03.3296586Z 452 │ return change.favorite 2026-10-24T02:54:03.3296659Z 453 │ ? exists 2026-10-24T02:54:03.3296726Z 454 │ ? current 2026-10-24T02:54:03.3296864Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T02:54:03.3296945Z ·  ─────┬──── 2026-10-24T02:54:03.3297066Z · ╰── From this spread 2026-10-24T02:54:03.3297137Z 456 │ : current.filter( 2026-10-24T02:54:03.3297192Z ╰──── 2026-10-24T02:54:03.3297397Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T02:54:03.3297562Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T02:54:03.3297565Z 2026-10-24T02:54:03.3297755Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T02:54:03.3297978Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T02:54:03.3298076Z 464 │ null; 2026-10-24T02:54:03.3298192Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T02:54:03.3298280Z ·  ──────────┬───────── 2026-10-24T02:54:03.3298406Z · ╰── From this accumulator 2026-10-24T02:54:03.3298504Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T02:54:03.3298572Z ·  ─┬─ 2026-10-24T02:54:03.3298675Z · ╰── For this loop 2026-10-24T02:54:03.3298808Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T02:54:03.3298874Z 468 │ hiddenModels: [], 2026-10-24T02:54:03.3298942Z 469 │ modelOrder: [], 2026-10-24T02:54:03.3298995Z 470 │ }; 2026-10-24T02:54:03.3299182Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T02:54:03.3299292Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T02:54:03.3299364Z 473 │ nextModelPreferences = { 2026-10-24T02:54:03.3299439Z 474 │ ...nextModelPreferences, 2026-10-24T02:54:03.3299534Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3299654Z · ╰── From this spread 2026-10-24T02:54:03.3299766Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T02:54:03.3299818Z ╰──── 2026-10-24T02:54:03.3299972Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T02:54:03.3300161Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T02:54:03.3300164Z 2026-10-24T02:54:03.3300539Z ⚠ 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-24T02:54:03.3300654Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T02:54:03.3300809Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T02:54:03.3300973Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T02:54:03.3301075Z ·  ──────────────────────── 2026-10-24T02:54:03.3301140Z 18 │ "review:write", 2026-10-24T02:54:03.3301189Z ╰──── 2026-10-24T02:54:03.3301192Z 2026-10-24T02:54:03.3301562Z ⚠ 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-24T02:54:03.3301674Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T02:54:03.3301729Z 19 │ ]); 2026-10-24T02:54:03.3301891Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T02:54:03.3301994Z ·  ──────────────────────── 2026-10-24T02:54:03.3302122Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T02:54:03.3302173Z ╰──── 2026-10-24T02:54:03.3302176Z 2026-10-24T02:54:03.3302538Z ⚠ 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-24T02:54:03.3302646Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T02:54:03.3302884Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T02:54:03.3303049Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T02:54:03.3303154Z ·  ──────────────────────── 2026-10-24T02:54:03.3303223Z 59 │ authenticated: true, 2026-10-24T02:54:03.3303272Z ╰──── 2026-10-24T02:54:03.3303275Z 2026-10-24T02:54:03.3303500Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T02:54:03.3303645Z ╭─[packages/client-runtime/src/operations/projects.ts:228:51] 2026-10-24T02:54:03.3303705Z 227 │ ): string { 2026-10-24T02:54:03.3303857Z 228 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T02:54:03.3303966Z ·  ────── 2026-10-24T02:54:03.3304102Z 229 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T02:54:03.3304155Z ╰──── 2026-10-24T02:54:03.3304327Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T02:54:03.3304332Z 2026-10-24T02:54:03.3304703Z ⚠ 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-24T02:54:03.3304823Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T02:54:03.3304880Z 145 │ name, 2026-10-24T02:54:03.3305019Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T02:54:03.3305120Z ·  ────────────────────────── 2026-10-24T02:54:03.3305239Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T02:54:03.3305295Z ╰──── 2026-10-24T02:54:03.3305301Z 2026-10-24T02:54:03.3305464Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T02:54:03.3305621Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1526:12] 2026-10-24T02:54:03.3305675Z 1525 │ 2026-10-24T02:54:03.3305740Z 1526 │ for (const [] of [ 2026-10-24T02:54:03.3305811Z ·  ── 2026-10-24T02:54:03.3305880Z 1527 │ ["github", "github.com"], 2026-10-24T02:54:03.3305932Z ╰──── 2026-10-24T02:54:03.3306216Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T02:54:03.3306219Z 2026-10-24T02:54:03.3306433Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3306566Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:533:25] 2026-10-24T02:54:03.3306696Z 532 │ // range) the boundary string is identical and the chain would die. 2026-10-24T02:54:03.3306785Z 533 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T02:54:03.3306883Z ·  ───────┬────── 2026-10-24T02:54:03.3307046Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T02:54:03.3307183Z 534 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T02:54:03.3307234Z ╰──── 2026-10-24T02:54:03.3307527Z  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-24T02:54:03.3307917Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3307952Z 2026-10-24T02:54:03.3308118Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.3308245Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:524:53] 2026-10-24T02:54:03.3308330Z 523 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T02:54:03.3308487Z 524 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T02:54:03.3308604Z ·  ─────┬──── 2026-10-24T02:54:03.3308771Z · ╰── Cannot call impure function 2026-10-24T02:54:03.3308849Z 525 │ const id = setTimeout(() => { 2026-10-24T02:54:03.3308899Z ╰──── 2026-10-24T02:54:03.3309190Z  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-24T02:54:03.3309491Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.3309494Z 2026-10-24T02:54:03.3309637Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3309791Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T02:54:03.3309848Z 493 │ > 2026-10-24T02:54:03.3309924Z 494 │ {props.children(close)} 2026-10-24T02:54:03.3310011Z ·  ──┬── 2026-10-24T02:54:03.3310200Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3310279Z 495 │ 2026-10-24T02:54:03.3310327Z ╰──── 2026-10-24T02:54:03.3310801Z  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-24T02:54:03.3311095Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3311098Z 2026-10-24T02:54:03.3311556Z ⚠ 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-24T02:54:03.3311695Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T02:54:03.3311831Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T02:54:03.3312009Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T02:54:03.3312113Z ·  ──────────────────────── 2026-10-24T02:54:03.3312176Z 182 │ version: 1, 2026-10-24T02:54:03.3312225Z ╰──── 2026-10-24T02:54:03.3312227Z 2026-10-24T02:54:03.3312700Z ⚠ 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-24T02:54:03.3312855Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T02:54:03.3313036Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T02:54:03.3313280Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T02:54:03.3313415Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T02:54:03.3313520Z 137 │ │ if (predicate(lastState)) { 2026-10-24T02:54:03.3313616Z 138 │ │ return lastState; 2026-10-24T02:54:03.3313689Z 139 │ │ } 2026-10-24T02:54:03.3313788Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3313913Z 141 │ ╰─▶ } 2026-10-24T02:54:03.3313987Z 142 │ return yield* Effect.die( 2026-10-24T02:54:03.3314035Z ╰──── 2026-10-24T02:54:03.3314039Z 2026-10-24T02:54:03.3314512Z ⚠ 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-24T02:54:03.3314648Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T02:54:03.3314708Z 130 │ ) { 2026-10-24T02:54:03.3314914Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:54:03.3315035Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T02:54:03.3315124Z 133 │ │ return; 2026-10-24T02:54:03.3315204Z 134 │ │ } 2026-10-24T02:54:03.3315315Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3315447Z 136 │ ╰─▶ } 2026-10-24T02:54:03.3315610Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T02:54:03.3315660Z ╰──── 2026-10-24T02:54:03.3315662Z 2026-10-24T02:54:03.3316129Z ⚠ 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-24T02:54:03.3316260Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T02:54:03.3316420Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T02:54:03.3316673Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T02:54:03.3316779Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3316907Z 254 │ ╰─▶ } 2026-10-24T02:54:03.3317029Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T02:54:03.3317079Z ╰──── 2026-10-24T02:54:03.3317082Z 2026-10-24T02:54:03.3317542Z ⚠ 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-24T02:54:03.3317673Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T02:54:03.3317725Z 257 │ 2026-10-24T02:54:03.3318039Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T02:54:03.3318175Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3318304Z 260 │ ╰─▶ } 2026-10-24T02:54:03.3318408Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T02:54:03.3318457Z ╰──── 2026-10-24T02:54:03.3318460Z 2026-10-24T02:54:03.3318919Z ⚠ 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-24T02:54:03.3319048Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T02:54:03.3319111Z 321 │ ); 2026-10-24T02:54:03.3319367Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T02:54:03.3319470Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3319597Z 324 │ ╰─▶ } 2026-10-24T02:54:03.3319650Z 325 │ 2026-10-24T02:54:03.3319699Z ╰──── 2026-10-24T02:54:03.3319702Z 2026-10-24T02:54:03.3320199Z ⚠ 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-24T02:54:03.3320331Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T02:54:03.3320499Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T02:54:03.3320747Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T02:54:03.3320848Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3320974Z 332 │ ╰─▶ } 2026-10-24T02:54:03.3321076Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T02:54:03.3321126Z ╰──── 2026-10-24T02:54:03.3321128Z 2026-10-24T02:54:03.3321387Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3321527Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T02:54:03.3321584Z 150 │ 2026-10-24T02:54:03.3321651Z 151 │ useEffect(() => { 2026-10-24T02:54:03.3321721Z ·  ────┬──── 2026-10-24T02:54:03.3321849Z · ╰── This is the containing effect 2026-10-24T02:54:03.3321930Z 152 │ if (!controlledSelectedPath) { 2026-10-24T02:54:03.3321992Z 153 │ return; 2026-10-24T02:54:03.3322045Z 154 │ } 2026-10-24T02:54:03.3322127Z 155 │ setExpandedPaths((current) => { 2026-10-24T02:54:03.3322206Z ·  ────────┬─────── 2026-10-24T02:54:03.3322378Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3322499Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T02:54:03.3322548Z ╰──── 2026-10-24T02:54:03.3323234Z  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-24T02:54:03.3323598Z  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-24T02:54:03.3323601Z 2026-10-24T02:54:03.3323802Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3323948Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T02:54:03.3324044Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T02:54:03.3324123Z 257 │ }, [props.path, targetIndex]); 2026-10-24T02:54:03.3324202Z ·  ─────┬──── 2026-10-24T02:54:03.3324346Z · ╰── Unnecessary dependency `props.path` 2026-10-24T02:54:03.3324398Z 258 │ 2026-10-24T02:54:03.3324447Z ╰──── 2026-10-24T02:54:03.3324743Z  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-24T02:54:03.3325054Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3325057Z 2026-10-24T02:54:03.3325250Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T02:54:03.3325397Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T02:54:03.3325474Z 292 │ 2026-10-24T02:54:03.3326538Z ·  ─────────── 2026-10-24T02:54:03.3326673Z 310 │ {body} 2026-10-24T02:54:03.3326757Z ╰──── 2026-10-24T02:54:03.3326902Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T02:54:03.3326906Z 2026-10-24T02:54:03.3327368Z ⚠ 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-24T02:54:03.3327501Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T02:54:03.3327556Z 225 │ ) { 2026-10-24T02:54:03.3327759Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:54:03.3327869Z 227 │ │ const socket = sockets[index]; 2026-10-24T02:54:03.3327962Z 228 │ │ if (socket) { 2026-10-24T02:54:03.3328057Z 229 │ │ return socket; 2026-10-24T02:54:03.3328129Z 230 │ │ } 2026-10-24T02:54:03.3328229Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3328353Z 232 │ ╰─▶ } 2026-10-24T02:54:03.3328526Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T02:54:03.3328577Z ╰──── 2026-10-24T02:54:03.3328580Z 2026-10-24T02:54:03.3329038Z ⚠ 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-24T02:54:03.3329175Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T02:54:03.3329233Z 239 │ ) { 2026-10-24T02:54:03.3329431Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:54:03.3329645Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T02:54:03.3329734Z 242 │ │ if (request) { 2026-10-24T02:54:03.3329828Z 243 │ │ return request; 2026-10-24T02:54:03.3329899Z 244 │ │ } 2026-10-24T02:54:03.3329999Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3330169Z 246 │ ╰─▶ } 2026-10-24T02:54:03.3330340Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T02:54:03.3330393Z ╰──── 2026-10-24T02:54:03.3330396Z 2026-10-24T02:54:03.3330601Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T02:54:03.3330722Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T02:54:03.3330788Z 37 │ get isConnected() { 2026-10-24T02:54:03.3330878Z 38 │ let current: FakeElement | null = this; 2026-10-24T02:54:03.3330951Z ·  ─────── 2026-10-24T02:54:03.3331021Z 39 │ while (current?.parent) { 2026-10-24T02:54:03.3331072Z ╰──── 2026-10-24T02:54:03.3331348Z  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-24T02:54:03.3331351Z 2026-10-24T02:54:03.3331612Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T02:54:03.3331925Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T02:54:03.3331979Z  80 │ 2026-10-24T02:54:03.3333812Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T02:54:03.3333941Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T02:54:03.3334062Z  83 │ │ ): Effect.fn.Return { 2026-10-24T02:54:03.3334229Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T02:54:03.3334367Z  85 │ │ const connections = new Map(); 2026-10-24T02:54:03.3334437Z  86 │ │ 2026-10-24T02:54:03.3334655Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T02:54:03.3334756Z  88 │ │ Effect.suspend(() => { 2026-10-24T02:54:03.3334892Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T02:54:03.3335002Z  90 │ │ return connection === undefined 2026-10-24T02:54:03.3335216Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T02:54:03.3335323Z  92 │ │ : Effect.succeed(connection); 2026-10-24T02:54:03.3335399Z  93 │ │ }); 2026-10-24T02:54:03.3335466Z  94 │ │ 2026-10-24T02:54:03.3335551Z  95 │ │ const send = ( 2026-10-24T02:54:03.3335652Z  96 │ │ connection: Connection, 2026-10-24T02:54:03.3335745Z  97 │ │ message: unknown, 2026-10-24T02:54:03.3335904Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T02:54:03.3336017Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T02:54:03.3336119Z 100 │ │ Effect.gen(function* () { 2026-10-24T02:54:03.3336298Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T02:54:03.3336436Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T02:54:03.3336648Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T02:54:03.3336725Z 104 │ │ } 2026-10-24T02:54:03.3336863Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T02:54:03.3336963Z 106 │ │ try: (signal) => 2026-10-24T02:54:03.3337092Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T02:54:03.3337192Z 108 │ │ method: "POST", 2026-10-24T02:54:03.3337283Z 109 │ │ signal, 2026-10-24T02:54:03.3337378Z 110 │ │ headers: { 2026-10-24T02:54:03.3337503Z 111 │ │ "content-type": "application/json", 2026-10-24T02:54:03.3337643Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T02:54:03.3337773Z 113 │ │ authorization: options.authorization, 2026-10-24T02:54:03.3337998Z 114 │ │ ...(connection.sessionId === null 2026-10-24T02:54:03.3338138Z 115 │ │ ? {} 2026-10-24T02:54:03.3338280Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T02:54:03.3338413Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T02:54:03.3338504Z 118 │ │ ? {} 2026-10-24T02:54:03.3338666Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T02:54:03.3338750Z 120 │ │ }, 2026-10-24T02:54:03.3338838Z 121 │ │ body, 2026-10-24T02:54:03.3338921Z 122 │ │ }), 2026-10-24T02:54:03.3339023Z 123 │ │ catch: bridgeError, 2026-10-24T02:54:03.3339108Z 124 │ │ }); 2026-10-24T02:54:03.3339324Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T02:54:03.3339424Z 126 │ │ if (!response.ok) { 2026-10-24T02:54:03.3339529Z 127 │ │ yield* Effect.promise( 2026-10-24T02:54:03.3339709Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T02:54:03.3339788Z 129 │ │ ); 2026-10-24T02:54:03.3339897Z 130 │ │ return yield* Effect.fail( 2026-10-24T02:54:03.3340156Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T02:54:03.3340242Z 132 │ │ ); 2026-10-24T02:54:03.3340320Z 133 │ │ } 2026-10-24T02:54:03.3340528Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T02:54:03.3340646Z 135 │ │ for (const payload of payloads) { 2026-10-24T02:54:03.3340861Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T02:54:03.3340936Z 137 │ │ } 2026-10-24T02:54:03.3341033Z 138 │ │ return payloads; 2026-10-24T02:54:03.3341154Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T02:54:03.3341228Z 140 │ │ ); 2026-10-24T02:54:03.3341294Z 141 │ │ 2026-10-24T02:54:03.3341476Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T02:54:03.3341603Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T02:54:03.3341786Z 144 │ │ ): Effect.fn.Return { 2026-10-24T02:54:03.3341944Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T02:54:03.3342069Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T02:54:03.3342188Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T02:54:03.3342287Z 148 │ │ if (sessionId !== null) { 2026-10-24T02:54:03.3342414Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T02:54:03.3342578Z 150 │ │ try: (signal) => 2026-10-24T02:54:03.3342743Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T02:54:03.3342841Z 152 │ │ method: "DELETE", 2026-10-24T02:54:03.3342929Z 153 │ │ signal, 2026-10-24T02:54:03.3343020Z 154 │ │ headers: { 2026-10-24T02:54:03.3343148Z 155 │ │ authorization: options.authorization, 2026-10-24T02:54:03.3343264Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T02:54:03.3343393Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T02:54:03.3343481Z 158 │ │ ? {} 2026-10-24T02:54:03.3343648Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T02:54:03.3343731Z 160 │ │ }, 2026-10-24T02:54:03.3343811Z 161 │ │ }), 2026-10-24T02:54:03.3343907Z 162 │ │ catch: bridgeError, 2026-10-24T02:54:03.3343983Z 163 │ │ }); 2026-10-24T02:54:03.3344113Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T02:54:03.3344220Z 165 │ │ return yield* Effect.fail( 2026-10-24T02:54:03.3344326Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T02:54:03.3344509Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T02:54:03.3344587Z 168 │ │ ), 2026-10-24T02:54:03.3344664Z 169 │ │ ); 2026-10-24T02:54:03.3344742Z 170 │ │ } 2026-10-24T02:54:03.3344847Z 171 │ │ yield* Effect.promise( 2026-10-24T02:54:03.3345024Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T02:54:03.3345099Z 173 │ │ ); 2026-10-24T02:54:03.3345170Z 174 │ │ } 2026-10-24T02:54:03.3345252Z 175 │ │ return {}; 2026-10-24T02:54:03.3345323Z 176 │ │ }); 2026-10-24T02:54:03.3345390Z 177 │ │ 2026-10-24T02:54:03.3345466Z 178 │ │ return { 2026-10-24T02:54:03.3345637Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T02:54:03.3345762Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T02:54:03.3345872Z 181 │ │ return yield* Effect.fail( 2026-10-24T02:54:03.3346053Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T02:54:03.3346130Z 183 │ │ ); 2026-10-24T02:54:03.3346203Z 184 │ │ } 2026-10-24T02:54:03.3346327Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T02:54:03.3346536Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T02:54:03.3346610Z 187 │ │ } 2026-10-24T02:54:03.3346764Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T02:54:03.3346946Z 189 │ │ connections.set(connectionId, { 2026-10-24T02:54:03.3347091Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T02:54:03.3347186Z 191 │ │ sessionId: null, 2026-10-24T02:54:03.3347288Z 192 │ │ protocolVersion: null, 2026-10-24T02:54:03.3347386Z 193 │ │ nextRequestId: 0, 2026-10-24T02:54:03.3347460Z 194 │ │ }); 2026-10-24T02:54:03.3347562Z 195 │ │ return { connectionId }; 2026-10-24T02:54:03.3347635Z 196 │ │ }), 2026-10-24T02:54:03.3347805Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T02:54:03.3347964Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T02:54:03.3348092Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T02:54:03.3348221Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T02:54:03.3348316Z 201 │ │ jsonrpc: "2.0", 2026-10-24T02:54:03.3348395Z 202 │ │ id, 2026-10-24T02:54:03.3348497Z 203 │ │ method: request.method, 2026-10-24T02:54:03.3348654Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T02:54:03.3348730Z 205 │ │ }); 2026-10-24T02:54:03.3348913Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T02:54:03.3349033Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T02:54:03.3349138Z 208 │ │ if (envelope === null) { 2026-10-24T02:54:03.3349248Z 209 │ │ return yield* Effect.fail( 2026-10-24T02:54:03.3349433Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T02:54:03.3349509Z 211 │ │ ); 2026-10-24T02:54:03.3349583Z 212 │ │ } 2026-10-24T02:54:03.3349699Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T02:54:03.3349892Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T02:54:03.3349964Z 215 │ │ } 2026-10-24T02:54:03.3350185Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T02:54:03.3350258Z 217 │ │ }), 2026-10-24T02:54:03.3350456Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T02:54:03.3350620Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T02:54:03.3350722Z 220 │ │ yield* send(connection, { 2026-10-24T02:54:03.3350816Z 221 │ │ jsonrpc: "2.0", 2026-10-24T02:54:03.3350918Z 222 │ │ method: request.method, 2026-10-24T02:54:03.3351072Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T02:54:03.3351148Z 224 │ │ }); 2026-10-24T02:54:03.3351220Z 225 │ │ }), 2026-10-24T02:54:03.3351305Z 226 │ │ disconnect, 2026-10-24T02:54:03.3351483Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T02:54:03.3351609Z 228 │ │ Effect.forEach( 2026-10-24T02:54:03.3351711Z 229 │ │ [...connections.keys()], 2026-10-24T02:54:03.3351879Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T02:54:03.3351975Z 231 │ │ { discard: true }, 2026-10-24T02:54:03.3352051Z 232 │ │ ), 2026-10-24T02:54:03.3352123Z 233 │ │ ), 2026-10-24T02:54:03.3352194Z 234 │ │ }; 2026-10-24T02:54:03.3352317Z 235 │ ╰─▶ }); 2026-10-24T02:54:03.3352368Z ╰──── 2026-10-24T02:54:03.3352626Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T02:54:03.3352633Z 2026-10-24T02:54:03.3352843Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T02:54:03.3352980Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T02:54:03.3353031Z 21 │ 2026-10-24T02:54:03.3353188Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T02:54:03.3353273Z ·  ────────┬─────── 2026-10-24T02:54:03.3353420Z · ╰── 'summarizePayload' is declared here 2026-10-24T02:54:03.3353522Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T02:54:03.3353572Z ╰──── 2026-10-24T02:54:03.3353673Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3353676Z 2026-10-24T02:54:03.3353947Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3354082Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T02:54:03.3354133Z 339 │ 2026-10-24T02:54:03.3354232Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T02:54:03.3354304Z ·  ────┬──── 2026-10-24T02:54:03.3354435Z · ╰── 'layerTest' is declared here 2026-10-24T02:54:03.3354484Z ╰──── 2026-10-24T02:54:03.3354586Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3354588Z 2026-10-24T02:54:03.3355124Z ⚠ 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-24T02:54:03.3355290Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T02:54:03.3355342Z 499 │ 2026-10-24T02:54:03.3355454Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T02:54:03.3355571Z ·  ────────────────────────── 2026-10-24T02:54:03.3355676Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T02:54:03.3355726Z ╰──── 2026-10-24T02:54:03.3355728Z 2026-10-24T02:54:03.3355916Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T02:54:03.3356047Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T02:54:03.3356161Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T02:54:03.3356246Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T02:54:03.3356319Z ·  ─┬─ 2026-10-24T02:54:03.3356441Z · ╰── 'Arr' is imported here 2026-10-24T02:54:03.3356521Z 5 │ import * as Order from "effect/Order"; 2026-10-24T02:54:03.3356571Z ╰──── 2026-10-24T02:54:03.3356667Z  help: Consider removing this import. 2026-10-24T02:54:03.3356670Z 2026-10-24T02:54:03.3356861Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T02:54:03.3356989Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T02:54:03.3357067Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T02:54:03.3357146Z 5 │ import * as Order from "effect/Order"; 2026-10-24T02:54:03.3357218Z ·  ──┬── 2026-10-24T02:54:03.3357351Z · ╰── 'Order' is imported here 2026-10-24T02:54:03.3357405Z 6 │ 2026-10-24T02:54:03.3357454Z ╰──── 2026-10-24T02:54:03.3357551Z  help: Consider removing this import. 2026-10-24T02:54:03.3357553Z 2026-10-24T02:54:03.3357737Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T02:54:03.3357893Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T02:54:03.3358061Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T02:54:03.3358137Z 602 │ const gesture = Gesture.Pan() 2026-10-24T02:54:03.3358221Z ·  ─┬─ 2026-10-24T02:54:03.3358360Z · ╰── `Pan` may be a component 2026-10-24T02:54:03.3358433Z 603 │ .enabled(!props.disabled) 2026-10-24T02:54:03.3358489Z ╰──── 2026-10-24T02:54:03.3358772Z  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-24T02:54:03.3359217Z  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-24T02:54:03.3359220Z 2026-10-24T02:54:03.3359403Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T02:54:03.3359507Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T02:54:03.3359572Z 457 │ ): Array { 2026-10-24T02:54:03.3359675Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T02:54:03.3359844Z ·  ┬ 2026-10-24T02:54:03.3360016Z · ╰── '_' is declared here 2026-10-24T02:54:03.3360129Z 459 │ for (const b of data) { 2026-10-24T02:54:03.3360178Z ╰──── 2026-10-24T02:54:03.3360278Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3360281Z 2026-10-24T02:54:03.3360751Z ⚠ 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-24T02:54:03.3360907Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1228:7] 2026-10-24T02:54:03.3360997Z 1227 │ yield* harness.replaceSession; 2026-10-24T02:54:03.3361212Z 1228 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:54:03.3361365Z 1229 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T02:54:03.3361451Z 1230 │ │ break; 2026-10-24T02:54:03.3361528Z 1231 │ │ } 2026-10-24T02:54:03.3361633Z 1232 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3361764Z 1233 │ ╰─▶ } 2026-10-24T02:54:03.3361837Z 1234 │ yield* Queue.offer( 2026-10-24T02:54:03.3361887Z ╰──── 2026-10-24T02:54:03.3361890Z 2026-10-24T02:54:03.3362362Z ⚠ 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-24T02:54:03.3362517Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1337:7] 2026-10-24T02:54:03.3362606Z 1336 │ yield* harness.replaceSession; 2026-10-24T02:54:03.3362810Z 1337 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T02:54:03.3362966Z 1338 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T02:54:03.3363070Z 1339 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3363198Z 1340 │ ╰─▶ } 2026-10-24T02:54:03.3363326Z 1341 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T02:54:03.3363375Z ╰──── 2026-10-24T02:54:03.3363378Z 2026-10-24T02:54:03.3363587Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T02:54:03.3363720Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T02:54:03.3363792Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T02:54:03.3363860Z 3 │ type AuthSessionState, 2026-10-24T02:54:03.3363942Z ·  ────────┬─────── 2026-10-24T02:54:03.3364086Z · ╰── 'AuthSessionState' is imported here 2026-10-24T02:54:03.3364154Z 4 │ sessionGrantsScope, 2026-10-24T02:54:03.3364202Z ╰──── 2026-10-24T02:54:03.3364298Z  help: Consider removing this import. 2026-10-24T02:54:03.3364300Z 2026-10-24T02:54:03.3364839Z ⚠ 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-24T02:54:03.3365019Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T02:54:03.3365080Z 168 │ }); 2026-10-24T02:54:03.3365274Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T02:54:03.3365467Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T02:54:03.3365570Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3365699Z 172 │ ╰─▶ } 2026-10-24T02:54:03.3365752Z 173 │ 2026-10-24T02:54:03.3365803Z ╰──── 2026-10-24T02:54:03.3365805Z 2026-10-24T02:54:03.3366274Z ⚠ 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-24T02:54:03.3366421Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T02:54:03.3366526Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T02:54:03.3366716Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T02:54:03.3366846Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T02:54:03.3366948Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3367076Z 181 │ ╰─▶ } 2026-10-24T02:54:03.3367132Z 182 │ 2026-10-24T02:54:03.3367185Z ╰──── 2026-10-24T02:54:03.3367187Z 2026-10-24T02:54:03.3367648Z ⚠ 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-24T02:54:03.3367791Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T02:54:03.3367913Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T02:54:03.3368101Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T02:54:03.3368220Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T02:54:03.3368417Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T02:54:03.3368504Z 310 │ │ break; 2026-10-24T02:54:03.3368580Z 311 │ │ } 2026-10-24T02:54:03.3368682Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3368810Z 313 │ ╰─▶ } 2026-10-24T02:54:03.3368861Z 314 │ 2026-10-24T02:54:03.3368911Z ╰──── 2026-10-24T02:54:03.3368914Z 2026-10-24T02:54:03.3369111Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T02:54:03.3369247Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T02:54:03.3369307Z 1 │ import type { 2026-10-24T02:54:03.3369370Z 2 │ EnvironmentId, 2026-10-24T02:54:03.3369443Z ·  ──────┬────── 2026-10-24T02:54:03.3369648Z · ╰── 'EnvironmentId' is imported here 2026-10-24T02:54:03.3369764Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T02:54:03.3369813Z ╰──── 2026-10-24T02:54:03.3369909Z  help: Consider removing this import. 2026-10-24T02:54:03.3369911Z 2026-10-24T02:54:03.3370110Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:54:03.3370256Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T02:54:03.3370307Z 465 │ 2026-10-24T02:54:03.3370411Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T02:54:03.3370483Z ·  ── 2026-10-24T02:54:03.3370535Z 467 │ } 2026-10-24T02:54:03.3370585Z ╰──── 2026-10-24T02:54:03.3370825Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:54:03.3370831Z 2026-10-24T02:54:03.3371113Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T02:54:03.3371238Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T02:54:03.3371292Z 284 │ }, 2026-10-24T02:54:03.3371373Z 285 │ (effect, flow, stopSessions) => 2026-10-24T02:54:03.3371464Z ·  ──────┬───── 2026-10-24T02:54:03.3371613Z · ╰── 'stopSessions' is declared here 2026-10-24T02:54:03.3371676Z 286 │ effect.pipe( 2026-10-24T02:54:03.3371725Z ╰──── 2026-10-24T02:54:03.3371825Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3371828Z 2026-10-24T02:54:03.3372015Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T02:54:03.3372151Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T02:54:03.3372236Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T02:54:03.3372326Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T02:54:03.3372402Z ·  ──┬── 2026-10-24T02:54:03.3372532Z · ╰── 'Scope' is imported here 2026-10-24T02:54:03.3372618Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T02:54:03.3372668Z ╰──── 2026-10-24T02:54:03.3372761Z  help: Consider removing this import. 2026-10-24T02:54:03.3372764Z 2026-10-24T02:54:03.3373103Z ⚠ 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-24T02:54:03.3373250Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T02:54:03.3373412Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T02:54:03.3373580Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T02:54:03.3373662Z ·  ───────── 2026-10-24T02:54:03.3373842Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T02:54:03.3373891Z ╰──── 2026-10-24T02:54:03.3373894Z 2026-10-24T02:54:03.3374228Z ⚠ 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-24T02:54:03.3374444Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T02:54:03.3374640Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T02:54:03.3374816Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T02:54:03.3374897Z ·  ───────── 2026-10-24T02:54:03.3374949Z 52 │ } 2026-10-24T02:54:03.3374997Z ╰──── 2026-10-24T02:54:03.3375000Z 2026-10-24T02:54:03.3375332Z ⚠ 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-24T02:54:03.3375472Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T02:54:03.3375533Z 54 │ assert.equal( 2026-10-24T02:54:03.3375708Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T02:54:03.3375781Z ·  ───────── 2026-10-24T02:54:03.3375837Z 56 │ true, 2026-10-24T02:54:03.3375885Z ╰──── 2026-10-24T02:54:03.3375888Z 2026-10-24T02:54:03.3376269Z ⚠ 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-24T02:54:03.3376408Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T02:54:03.3376468Z 58 │ assert.equal( 2026-10-24T02:54:03.3376648Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T02:54:03.3376717Z ·  ───────── 2026-10-24T02:54:03.3376771Z 60 │ true, 2026-10-24T02:54:03.3376820Z ╰──── 2026-10-24T02:54:03.3376823Z 2026-10-24T02:54:03.3377158Z ⚠ 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-24T02:54:03.3377307Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T02:54:03.3377358Z 102 │ 2026-10-24T02:54:03.3377525Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T02:54:03.3377608Z ·  ───────── 2026-10-24T02:54:03.3377659Z 104 │ }); 2026-10-24T02:54:03.3377709Z ╰──── 2026-10-24T02:54:03.3377712Z 2026-10-24T02:54:03.3377875Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:54:03.3378014Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T02:54:03.3378064Z 185 │ 2026-10-24T02:54:03.3378263Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T02:54:03.3378372Z ·  ── 2026-10-24T02:54:03.3378424Z 187 │ } 2026-10-24T02:54:03.3378472Z ╰──── 2026-10-24T02:54:03.3378703Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:54:03.3378705Z 2026-10-24T02:54:03.3378867Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:54:03.3379004Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T02:54:03.3379053Z 188 │ 2026-10-24T02:54:03.3379117Z 189 │ for (const {} of [ 2026-10-24T02:54:03.3379184Z ·  ── 2026-10-24T02:54:03.3379272Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T02:54:03.3379321Z ╰──── 2026-10-24T02:54:03.3379554Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:54:03.3379559Z 2026-10-24T02:54:03.3379721Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:54:03.3379857Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T02:54:03.3379907Z 310 │ 2026-10-24T02:54:03.3380035Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T02:54:03.3380137Z ·  ── 2026-10-24T02:54:03.3380188Z 312 │ } 2026-10-24T02:54:03.3380236Z ╰──── 2026-10-24T02:54:03.3380461Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:54:03.3380464Z 2026-10-24T02:54:03.3380631Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:54:03.3380769Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T02:54:03.3380818Z 313 │ 2026-10-24T02:54:03.3380879Z 314 │ for (const {} of [ 2026-10-24T02:54:03.3380948Z ·  ── 2026-10-24T02:54:03.3381000Z 315 │ { 2026-10-24T02:54:03.3381049Z ╰──── 2026-10-24T02:54:03.3381273Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:54:03.3381276Z 2026-10-24T02:54:03.3381461Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T02:54:03.3381585Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T02:54:03.3381701Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T02:54:03.3381770Z 187 │ let next = initial; 2026-10-24T02:54:03.3381839Z ·  ──┬─ 2026-10-24T02:54:03.3381958Z · ╰── From this accumulator 2026-10-24T02:54:03.3382037Z 188 │ let receivedSnapshot = false; 2026-10-24T02:54:03.3382112Z 189 │ for (const item of items) { 2026-10-24T02:54:03.3382180Z ·  ─┬─ 2026-10-24T02:54:03.3382283Z · ╰── For this loop 2026-10-24T02:54:03.3382369Z 190 │ if (item.kind === "synchronized") { 2026-10-24T02:54:03.3382436Z 191 │ waiting = false; 2026-10-24T02:54:03.3382526Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T02:54:03.3382641Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T02:54:03.3382725Z ·  ───┬─── 2026-10-24T02:54:03.3382928Z · ╰── From this spread 2026-10-24T02:54:03.3383024Z 194 │ } 2026-10-24T02:54:03.3383075Z ╰──── 2026-10-24T02:54:03.3383230Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T02:54:03.3383385Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T02:54:03.3383389Z 2026-10-24T02:54:03.3383814Z ⚠ 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-24T02:54:03.3383960Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T02:54:03.3384041Z 262 │ ...(update._meta !== undefined 2026-10-24T02:54:03.3384207Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T02:54:03.3384297Z ·  ───────── 2026-10-24T02:54:03.3384356Z 264 │ : {}), 2026-10-24T02:54:03.3384405Z ╰──── 2026-10-24T02:54:03.3384408Z 2026-10-24T02:54:03.3384607Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T02:54:03.3384735Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T02:54:03.3384806Z 2 │ AuthFilesystemReadScope, 2026-10-24T02:54:03.3384873Z 3 │ type AuthSessionState, 2026-10-24T02:54:03.3384953Z ·  ────────┬─────── 2026-10-24T02:54:03.3385099Z · ╰── 'AuthSessionState' is imported here 2026-10-24T02:54:03.3385171Z 4 │ type FilesystemBrowseEntry, 2026-10-24T02:54:03.3385226Z ╰──── 2026-10-24T02:54:03.3385323Z  help: Consider removing this import. 2026-10-24T02:54:03.3385326Z 2026-10-24T02:54:03.3385559Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T02:54:03.3385695Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T02:54:03.3385815Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T02:54:03.3386053Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T02:54:03.3386171Z 986 │ │ (approval) => approval.requestId, 2026-10-24T02:54:03.3386301Z 987 │ ╰─▶ ); 2026-10-24T02:54:03.3386442Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T02:54:03.3386494Z ╰──── 2026-10-24T02:54:03.3386568Z  help: Switch to `Set` 2026-10-24T02:54:03.3386571Z 2026-10-24T02:54:03.3386772Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T02:54:03.3386861Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T02:54:03.3386929Z 21 │ EnvironmentThreadShell, 2026-10-24T02:54:03.3386993Z 22 │ ThreadRunSummary, 2026-10-24T02:54:03.3387069Z ·  ────────┬─────── 2026-10-24T02:54:03.3387209Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T02:54:03.3387275Z 23 │ ThreadRuntimeSummary, 2026-10-24T02:54:03.3387324Z ╰──── 2026-10-24T02:54:03.3387419Z  help: Consider removing this import. 2026-10-24T02:54:03.3387490Z 2026-10-24T02:54:03.3387778Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3387906Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T02:54:03.3387957Z 3404 │ 2026-10-24T02:54:03.3388145Z 3405 │ const layer: Layer.Layer = 2026-10-24T02:54:03.3388216Z ·  ──┬── 2026-10-24T02:54:03.3388340Z · ╰── 'layer' is declared here 2026-10-24T02:54:03.3388402Z 3406 │ Layer.effect( 2026-10-24T02:54:03.3388451Z ╰──── 2026-10-24T02:54:03.3388555Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3388557Z 2026-10-24T02:54:03.3388774Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T02:54:03.3388900Z ╭─[apps/mobile/src/lib/markdownDocument.ts:278:28] 2026-10-24T02:54:03.3388997Z 277 │ visit(parser.parse(markdown), false, false); 2026-10-24T02:54:03.3389081Z 278 │ for (const edit of edits.reverse()) 2026-10-24T02:54:03.3389177Z ·  ─────── 2026-10-24T02:54:03.3389341Z 279 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T02:54:03.3389392Z ╰──── 2026-10-24T02:54:03.3389654Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T02:54:03.3389656Z 2026-10-24T02:54:03.3389842Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T02:54:03.3389960Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T02:54:03.3390020Z 7 │ () => 2026-10-24T02:54:03.3390124Z 8 │ Gesture.Hover() 2026-10-24T02:54:03.3390199Z ·  ──┬── 2026-10-24T02:54:03.3390328Z · ╰── `Hover` may be a component 2026-10-24T02:54:03.3390401Z 9 │ .manualActivation(true) 2026-10-24T02:54:03.3390451Z ╰──── 2026-10-24T02:54:03.3390733Z  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-24T02:54:03.3391185Z  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-24T02:54:03.3391189Z 2026-10-24T02:54:03.3391391Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T02:54:03.3391527Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T02:54:03.3391619Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T02:54:03.3391709Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T02:54:03.3391786Z ·  ────┬─── 2026-10-24T02:54:03.3391918Z · ╰── 'Duration' is imported here 2026-10-24T02:54:03.3392003Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T02:54:03.3392054Z ╰──── 2026-10-24T02:54:03.3392149Z  help: Consider removing this import. 2026-10-24T02:54:03.3392152Z 2026-10-24T02:54:03.3392395Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.3392574Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T02:54:03.3392683Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T02:54:03.3392845Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T02:54:03.3392966Z ·  ─────┬──── 2026-10-24T02:54:03.3393133Z · ╰── Cannot call impure function 2026-10-24T02:54:03.3393186Z 179 │ } 2026-10-24T02:54:03.3393235Z ╰──── 2026-10-24T02:54:03.3393517Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.3393820Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.3393826Z 2026-10-24T02:54:03.3394093Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3394230Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T02:54:03.3394279Z 913 │ 2026-10-24T02:54:03.3394467Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T02:54:03.3394541Z ·  ─────┬───── 2026-10-24T02:54:03.3394673Z · ╰── 'layerDaemon' is declared here 2026-10-24T02:54:03.3394757Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T02:54:03.3394806Z ╰──── 2026-10-24T02:54:03.3394915Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3394921Z 2026-10-24T02:54:03.3395121Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T02:54:03.3395288Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T02:54:03.3395353Z 1782 │ assert.equal( 2026-10-24T02:54:03.3395495Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T02:54:03.3395597Z ·  ────────────────────────── 2026-10-24T02:54:03.3395674Z 1784 │ stored.attachments[0]?.id, 2026-10-24T02:54:03.3395725Z ╰──── 2026-10-24T02:54:03.3395897Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T02:54:03.3395900Z 2026-10-24T02:54:03.3396126Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T02:54:03.3396261Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T02:54:03.3396327Z 1021 │ instanceId, 2026-10-24T02:54:03.3396466Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T02:54:03.3396602Z ·  ────────────────────────────────────────────────── 2026-10-24T02:54:03.3396661Z 1023 │ ]), 2026-10-24T02:54:03.3396711Z ╰──── 2026-10-24T02:54:03.3396975Z  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-24T02:54:03.3396977Z 2026-10-24T02:54:03.3397178Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3397362Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T02:54:03.3397472Z 28 │ getPendingThreadOrder(); 2026-10-24T02:54:03.3397549Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T02:54:03.3397670Z ·  ────┬──── ───────┬────── 2026-10-24T02:54:03.3397860Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T02:54:03.3397997Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T02:54:03.3398061Z 30 │ return pending; 2026-10-24T02:54:03.3398111Z ╰──── 2026-10-24T02:54:03.3398403Z  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-24T02:54:03.3398724Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3398730Z 2026-10-24T02:54:03.3398894Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.3399029Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T02:54:03.3399162Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T02:54:03.3399307Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T02:54:03.3399429Z ·  ─────┬──── 2026-10-24T02:54:03.3399597Z · ╰── Cannot call impure function 2026-10-24T02:54:03.3399698Z 141 │ onSelect={(selected) => { 2026-10-24T02:54:03.3399749Z ╰──── 2026-10-24T02:54:03.3400030Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.3400363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.3400366Z 2026-10-24T02:54:03.3400530Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.3400649Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T02:54:03.3400750Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T02:54:03.3400909Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T02:54:03.3401032Z ·  ─────┬──── 2026-10-24T02:54:03.3401201Z · ╰── Cannot call impure function 2026-10-24T02:54:03.3401279Z 822 │ return AsyncResult.failure( 2026-10-24T02:54:03.3401330Z ╰──── 2026-10-24T02:54:03.3401606Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.3401900Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.3401902Z 2026-10-24T02:54:03.3402066Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.3402249Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T02:54:03.3402350Z 708 │ const wokeAt = resolved 2026-10-24T02:54:03.3402483Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T02:54:03.3402593Z ·  ─────┬──── 2026-10-24T02:54:03.3402750Z · ╰── Cannot call impure function 2026-10-24T02:54:03.3402812Z 710 │ : null; 2026-10-24T02:54:03.3402862Z ╰──── 2026-10-24T02:54:03.3403137Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.3403436Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.3403441Z 2026-10-24T02:54:03.3403605Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T02:54:03.3403724Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T02:54:03.3403775Z 265 │ 2026-10-24T02:54:03.3403877Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T02:54:03.3403947Z ·  ── 2026-10-24T02:54:03.3403999Z 267 │ } 2026-10-24T02:54:03.3404048Z ╰──── 2026-10-24T02:54:03.3404276Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T02:54:03.3404279Z 2026-10-24T02:54:03.3404483Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T02:54:03.3404651Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T02:54:03.3404739Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T02:54:03.3404854Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T02:54:03.3404935Z ·  ─────┬───── 2026-10-24T02:54:03.3405073Z · ╰── 'HostProcess' is imported here 2026-10-24T02:54:03.3405124Z 26 │ 2026-10-24T02:54:03.3405172Z ╰──── 2026-10-24T02:54:03.3405268Z  help: Consider removing this import. 2026-10-24T02:54:03.3405271Z 2026-10-24T02:54:03.3405541Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3405706Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T02:54:03.3405954Z 123 │ const path = yield* Path.Path; 2026-10-24T02:54:03.3406102Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T02:54:03.3406183Z ·  ──────┬───── 2026-10-24T02:54:03.3406319Z · ╰── 'serverConfig' is declared here 2026-10-24T02:54:03.3406460Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T02:54:03.3406509Z ╰──── 2026-10-24T02:54:03.3406612Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3406614Z 2026-10-24T02:54:03.3406889Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3407053Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T02:54:03.3407170Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T02:54:03.3407309Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T02:54:03.3407392Z ·  ───────┬────── 2026-10-24T02:54:03.3407534Z · ╰── 'serverSettings' is declared here 2026-10-24T02:54:03.3407668Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T02:54:03.3407717Z ╰──── 2026-10-24T02:54:03.3407818Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3407821Z 2026-10-24T02:54:03.3408156Z ⚠ 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-24T02:54:03.3408274Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T02:54:03.3408437Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T02:54:03.3408561Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T02:54:03.3408636Z ·  ───────── 2026-10-24T02:54:03.3408695Z 19 │ expect( 2026-10-24T02:54:03.3408744Z ╰──── 2026-10-24T02:54:03.3408746Z 2026-10-24T02:54:03.3409079Z ⚠ 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-24T02:54:03.3409196Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T02:54:03.3409254Z 19 │ expect( 2026-10-24T02:54:03.3409419Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T02:54:03.3409499Z ·  ───────── 2026-10-24T02:54:03.3409563Z 21 │ ).toBe(true); 2026-10-24T02:54:03.3409613Z ╰──── 2026-10-24T02:54:03.3409616Z 2026-10-24T02:54:03.3409780Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.3409930Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T02:54:03.3410101Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T02:54:03.3410256Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T02:54:03.3410367Z ·  ─────┬──── 2026-10-24T02:54:03.3410526Z · ╰── Cannot call impure function 2026-10-24T02:54:03.3410585Z 373 │ return ( 2026-10-24T02:54:03.3410634Z ╰──── 2026-10-24T02:54:03.3410985Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.3411315Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.3411318Z 2026-10-24T02:54:03.3411482Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T02:54:03.3411628Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T02:54:03.3411719Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T02:54:03.3411845Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T02:54:03.3411951Z ·  ─────┬──── 2026-10-24T02:54:03.3412110Z · ╰── Cannot call impure function 2026-10-24T02:54:03.3412166Z 854 │ } 2026-10-24T02:54:03.3412215Z ╰──── 2026-10-24T02:54:03.3412491Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T02:54:03.3412786Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T02:54:03.3412789Z 2026-10-24T02:54:03.3412987Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3413127Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5] 2026-10-24T02:54:03.3413206Z 1314 │ queuedMessagesByThreadKey, 2026-10-24T02:54:03.3413273Z 1315 │ retryTick, 2026-10-24T02:54:03.3413346Z ·  ────┬──── 2026-10-24T02:54:03.3413484Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T02:54:03.3413555Z 1316 │ restoreQueuedMessage, 2026-10-24T02:54:03.3413606Z ╰──── 2026-10-24T02:54:03.3413900Z  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-24T02:54:03.3414214Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3414219Z 2026-10-24T02:54:03.3414472Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T02:54:03.3414656Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T02:54:03.3414709Z 959 │ 2026-10-24T02:54:03.3414817Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T02:54:03.3414928Z ·  ──────────────────┬───────────────── 2026-10-24T02:54:03.3415126Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T02:54:03.3415227Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T02:54:03.3415277Z ╰──── 2026-10-24T02:54:03.3415377Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3415380Z 2026-10-24T02:54:03.3415916Z ⚠ 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-24T02:54:03.3416068Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T02:54:03.3416472Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T02:54:03.3416581Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T02:54:03.3416696Z ·  ────────────────────────── 2026-10-24T02:54:03.3416762Z 130 │ Schema.Struct({ 2026-10-24T02:54:03.3416813Z ╰──── 2026-10-24T02:54:03.3416816Z 2026-10-24T02:54:03.3417149Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3417311Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T02:54:03.3417364Z 1443 │ 2026-10-24T02:54:03.3417485Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T02:54:03.3417602Z ·  ───────────────────┬─────────────────── 2026-10-24T02:54:03.3417807Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T02:54:03.3417925Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T02:54:03.3417977Z ╰──── 2026-10-24T02:54:03.3418078Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3418080Z 2026-10-24T02:54:03.3418334Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3418496Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T02:54:03.3418549Z 1679 │ 2026-10-24T02:54:03.3418625Z 1680 │ const layer: Layer.Layer< 2026-10-24T02:54:03.3418697Z ·  ──┬── 2026-10-24T02:54:03.3418821Z · ╰── 'layer' is declared here 2026-10-24T02:54:03.3418914Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T02:54:03.3418964Z ╰──── 2026-10-24T02:54:03.3419062Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3419065Z 2026-10-24T02:54:03.3419324Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3419451Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T02:54:03.3419556Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T02:54:03.3419618Z 84 │ useEffect(() => { 2026-10-24T02:54:03.3419689Z ·  ────┬──── 2026-10-24T02:54:03.3419820Z · ╰── This is the containing effect 2026-10-24T02:54:03.3419908Z 85 │ if (!actionState.isRunning) return; 2026-10-24T02:54:03.3419973Z 86 │ setNowMs(Date.now()); 2026-10-24T02:54:03.3420042Z ·  ────┬─── 2026-10-24T02:54:03.3420229Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3420352Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T02:54:03.3420401Z ╰──── 2026-10-24T02:54:03.3421009Z  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-24T02:54:03.3421436Z  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-24T02:54:03.3421476Z 2026-10-24T02:54:03.3421852Z ⚠ 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-24T02:54:03.3421966Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T02:54:03.3422116Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T02:54:03.3422290Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T02:54:03.3422393Z ·  ────────────────────────── 2026-10-24T02:54:03.3422545Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T02:54:03.3422597Z ╰──── 2026-10-24T02:54:03.3422600Z 2026-10-24T02:54:03.3422881Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3423037Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T02:54:03.3423088Z 14 │ 2026-10-24T02:54:03.3423157Z 15 │ const legacyCredentials = { 2026-10-24T02:54:03.3423238Z ·  ────────┬──────── 2026-10-24T02:54:03.3423383Z · ╰── 'legacyCredentials' is declared here 2026-10-24T02:54:03.3423449Z 16 │ version: 1 as const, 2026-10-24T02:54:03.3423498Z ╰──── 2026-10-24T02:54:03.3423599Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3423602Z 2026-10-24T02:54:03.3423882Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T02:54:03.3424014Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T02:54:03.3424070Z 248 │ }, 2026-10-24T02:54:03.3424150Z 249 │ (effect, flow, stopSessions) => 2026-10-24T02:54:03.3424241Z ·  ──────┬───── 2026-10-24T02:54:03.3424387Z · ╰── 'stopSessions' is declared here 2026-10-24T02:54:03.3424451Z 250 │ effect.pipe( 2026-10-24T02:54:03.3424500Z ╰──── 2026-10-24T02:54:03.3424601Z  help: Consider removing this parameter. 2026-10-24T02:54:03.3424603Z 2026-10-24T02:54:03.3425146Z ⚠ 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-24T02:54:03.3425309Z ╭─[apps/server/src/usage/UsageService.test.ts:2383:7] 2026-10-24T02:54:03.3425403Z 2382 │ let orphanedAt: number | undefined; 2026-10-24T02:54:03.3425634Z 2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T02:54:03.3425754Z 2384 │ │ const tasks: Array<() => void> = []; 2026-10-24T02:54:03.3425902Z 2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T02:54:03.3426031Z 2386 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T02:54:03.3426127Z 2387 │ │ flush: () => { 2026-10-24T02:54:03.3426255Z 2388 │ │ let task: (() => void) | undefined; 2026-10-24T02:54:03.3426403Z 2389 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T02:54:03.3426484Z 2390 │ │ }, 2026-10-24T02:54:03.3426563Z 2391 │ │ }; 2026-10-24T02:54:03.3426632Z 2392 │ │ 2026-10-24T02:54:03.3426791Z 2393 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T02:54:03.3426895Z 2394 │ │ let requestChecks = 0; 2026-10-24T02:54:03.3427022Z 2395 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T02:54:03.3427130Z 2396 │ │ executionMode: "async", 2026-10-24T02:54:03.3427255Z 2397 │ │ makeDispatcher: () => dispatcher, 2026-10-24T02:54:03.3427367Z 2398 │ │ shouldYield: (fiber) => { 2026-10-24T02:54:03.3427496Z 2399 │ │ if (fiber !== requestFiber) return false; 2026-10-24T02:54:03.3427599Z 2400 │ │ requestChecks += 1; 2026-10-24T02:54:03.3427740Z 2401 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T02:54:03.3427852Z 2402 │ │ fiber.interruptUnsafe(); 2026-10-24T02:54:03.3427947Z 2403 │ │ return true; 2026-10-24T02:54:03.3428027Z 2404 │ │ }, 2026-10-24T02:54:03.3428106Z 2405 │ │ }; 2026-10-24T02:54:03.3428175Z 2406 │ │ 2026-10-24T02:54:03.3428299Z 2407 │ │ const input: UsageSummaryInput = { 2026-10-24T02:54:03.3428395Z 2408 │ │ ...WINDOW, 2026-10-24T02:54:03.3428523Z 2409 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T02:54:03.3428713Z 2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T02:54:03.3428791Z 2411 │ │ }; 2026-10-24T02:54:03.3428901Z 2412 │ │ const first = yield* service 2026-10-24T02:54:03.3429005Z 2413 │ │ .readSummary(input) 2026-10-24T02:54:03.3429091Z 2414 │ │ .pipe( 2026-10-24T02:54:03.3429184Z 2415 │ │ Effect.exit, 2026-10-24T02:54:03.3429341Z 2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T02:54:03.3429523Z 2417 │ │ Effect.forkChild, 2026-10-24T02:54:03.3429636Z 2418 │ │ ); 2026-10-24T02:54:03.3429735Z 2419 │ │ requestFiber = first; 2026-10-24T02:54:03.3429838Z 2420 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3429940Z 2421 │ │ dispatcher.flush(); 2026-10-24T02:54:03.3430009Z 2422 │ │ 2026-10-24T02:54:03.3430197Z 2423 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T02:54:03.3430294Z 2424 │ │ Effect.match({ 2026-10-24T02:54:03.3430419Z 2425 │ │ onFailure: (error) => error.reason, 2026-10-24T02:54:03.3430541Z 2426 │ │ onSuccess: () => "success" as const, 2026-10-24T02:54:03.3430629Z 2427 │ │ }), 2026-10-24T02:54:03.3430787Z 2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T02:54:03.3430887Z 2429 │ │ Effect.forkChild, 2026-10-24T02:54:03.3430965Z 2430 │ │ ); 2026-10-24T02:54:03.3431067Z 2431 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3431167Z 2432 │ │ dispatcher.flush(); 2026-10-24T02:54:03.3431292Z 2433 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T02:54:03.3431406Z 2434 │ │ if (secondExit === undefined) { 2026-10-24T02:54:03.3431517Z 2435 │ │ second.interruptUnsafe(); 2026-10-24T02:54:03.3431632Z 2436 │ │ orphanedAt = interruptAt; 2026-10-24T02:54:03.3431721Z 2437 │ │ break; 2026-10-24T02:54:03.3431799Z 2438 │ │ } 2026-10-24T02:54:03.3431915Z 2439 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T02:54:03.3432071Z 2440 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T02:54:03.3432148Z 2441 │ │ } 2026-10-24T02:54:03.3432296Z 2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T02:54:03.3432426Z 2443 │ ╰─▶ } 2026-10-24T02:54:03.3432480Z 2444 │ 2026-10-24T02:54:03.3432531Z ╰──── 2026-10-24T02:54:03.3432534Z 2026-10-24T02:54:03.3432769Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T02:54:03.3432941Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T02:54:03.3433006Z 1997 │ assert.equal( 2026-10-24T02:54:03.3433153Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T02:54:03.3433230Z ·  ────── 2026-10-24T02:54:03.3433305Z 1999 │ "authoritative answer", 2026-10-24T02:54:03.3433356Z ╰──── 2026-10-24T02:54:03.3433525Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T02:54:03.3433528Z 2026-10-24T02:54:03.3434069Z ⚠ 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-24T02:54:03.3434288Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T02:54:03.3434468Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T02:54:03.3434670Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T02:54:03.3434775Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3434905Z 3953 │ ╰─▶ } 2026-10-24T02:54:03.3435023Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T02:54:03.3435072Z ╰──── 2026-10-24T02:54:03.3435075Z 2026-10-24T02:54:03.3435544Z ⚠ 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-24T02:54:03.3435717Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T02:54:03.3435803Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T02:54:03.3435983Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T02:54:03.3436092Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3436223Z 6064 │ ╰─▶ } 2026-10-24T02:54:03.3436392Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T02:54:03.3436441Z ╰──── 2026-10-24T02:54:03.3436444Z 2026-10-24T02:54:03.3436910Z ⚠ 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-24T02:54:03.3437079Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T02:54:03.3437164Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T02:54:03.3437343Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T02:54:03.3437449Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T02:54:03.3437581Z 6199 │ ╰─▶ } 2026-10-24T02:54:03.3437743Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T02:54:03.3437798Z ╰──── 2026-10-24T02:54:03.3437803Z 2026-10-24T02:54:03.3438069Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3438186Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T02:54:03.3438237Z 168 │ 2026-10-24T02:54:03.3438315Z 169 │ const layerTest = Layer.succeed( 2026-10-24T02:54:03.3438388Z ·  ────┬──── 2026-10-24T02:54:03.3438519Z · ╰── 'layerTest' is declared here 2026-10-24T02:54:03.3438583Z 170 │ UsageService, 2026-10-24T02:54:03.3438633Z ╰──── 2026-10-24T02:54:03.3438735Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3438738Z 2026-10-24T02:54:03.3439066Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T02:54:03.3439267Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7] 2026-10-24T02:54:03.3439321Z 10577 │ 2026-10-24T02:54:03.3439391Z 10578 │ const layer: Layer.Layer< 2026-10-24T02:54:03.3439462Z ·  ──┬── 2026-10-24T02:54:03.3439586Z · ╰── 'layer' is declared here 2026-10-24T02:54:03.3439679Z 10579 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T02:54:03.3439729Z ╰──── 2026-10-24T02:54:03.3439831Z  help: Consider removing this declaration. 2026-10-24T02:54:03.3439834Z 2026-10-24T02:54:03.3440114Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3440281Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T02:54:03.3440450Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T02:54:03.3440516Z 113 │ useEffect(() => { 2026-10-24T02:54:03.3440586Z ·  ────┬──── 2026-10-24T02:54:03.3440714Z · ╰── This is the containing effect 2026-10-24T02:54:03.3440876Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T02:54:03.3440936Z 115 │ return; 2026-10-24T02:54:03.3440990Z 116 │ } 2026-10-24T02:54:03.3441107Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T02:54:03.3441177Z ·  ────┬─── 2026-10-24T02:54:03.3441344Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3441470Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T02:54:03.3441523Z ╰──── 2026-10-24T02:54:03.3442132Z  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-24T02:54:03.3442456Z  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-24T02:54:03.3442459Z 2026-10-24T02:54:03.3442615Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3442779Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T02:54:03.3442832Z 35 │ 2026-10-24T02:54:03.3442967Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T02:54:03.3443054Z ·  ────────┬──────── 2026-10-24T02:54:03.3443200Z · ╰── `inspectorProgress` originates here 2026-10-24T02:54:03.3443292Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T02:54:03.3443420Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T02:54:03.3443471Z 39 │ 2026-10-24T02:54:03.3443552Z 40 │ const onClosed = props.onClosed; 2026-10-24T02:54:03.3443616Z 41 │ useEffect(() => { 2026-10-24T02:54:03.3443703Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T02:54:03.3443784Z ·  ────────┬──────── 2026-10-24T02:54:03.3444012Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T02:54:03.3444119Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T02:54:03.3444168Z ╰──── 2026-10-24T02:54:03.3444436Z  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-24T02:54:03.3444744Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3444747Z 2026-10-24T02:54:03.3444899Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3445058Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T02:54:03.3445148Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T02:54:03.3445282Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T02:54:03.3445373Z ·  ──────────┬───────── 2026-10-24T02:54:03.3445525Z · ╰── `renderedContentWidth` originates here 2026-10-24T02:54:03.3445575Z 39 │ 2026-10-24T02:54:03.3445653Z 40 │ const onClosed = props.onClosed; 2026-10-24T02:54:03.3445716Z 41 │ useEffect(() => { 2026-10-24T02:54:03.3445801Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T02:54:03.3445876Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T02:54:03.3445946Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T02:54:03.3446010Z 45 │ (finished) => { 2026-10-24T02:54:03.3446146Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T02:54:03.3446217Z 47 │ runOnJS(onClosed)(); 2026-10-24T02:54:03.3446272Z 48 │ } 2026-10-24T02:54:03.3446333Z 49 │ }, 2026-10-24T02:54:03.3446388Z 50 │ ); 2026-10-24T02:54:03.3446518Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T02:54:03.3446595Z 52 │ renderedInspectorWidth.set( 2026-10-24T02:54:03.3446736Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T02:54:03.3446787Z 54 │ ); 2026-10-24T02:54:03.3446840Z 55 │ }, [ 2026-10-24T02:54:03.3446909Z 56 │ inspectorProgress, 2026-10-24T02:54:03.3446974Z 57 │ inspectorVisible, 2026-10-24T02:54:03.3447035Z 58 │ inspectorWidth, 2026-10-24T02:54:03.3447094Z 59 │ onClosed, 2026-10-24T02:54:03.3447165Z 60 │ renderedInspectorWidth, 2026-10-24T02:54:03.3447222Z 61 │ resizing, 2026-10-24T02:54:03.3447274Z 62 │ ]); 2026-10-24T02:54:03.3447325Z 63 │ 2026-10-24T02:54:03.3447386Z 64 │ useEffect(() => { 2026-10-24T02:54:03.3447483Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T02:54:03.3447571Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T02:54:03.3447668Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T02:54:03.3447754Z ·  ──────────┬───────── 2026-10-24T02:54:03.3447911Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T02:54:03.3447969Z 68 │ return; 2026-10-24T02:54:03.3448020Z ╰──── 2026-10-24T02:54:03.3448287Z  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-24T02:54:03.3448592Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3448597Z 2026-10-24T02:54:03.3448871Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3449067Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7] 2026-10-24T02:54:03.3449121Z 214 │ } 2026-10-24T02:54:03.3449189Z 215 │ }, [wrappedRender]); 2026-10-24T02:54:03.3449267Z ·  ──────┬────── 2026-10-24T02:54:03.3449417Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T02:54:03.3449468Z 216 │ 2026-10-24T02:54:03.3449517Z ╰──── 2026-10-24T02:54:03.3449812Z  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-24T02:54:03.3450259Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3450265Z 2026-10-24T02:54:03.3450509Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T02:54:03.3450671Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35] 2026-10-24T02:54:03.3450726Z 816 │ > 2026-10-24T02:54:03.3450838Z 817 │ 2026-10-24T02:54:03.3450953Z ·  ──────────────────── 2026-10-24T02:54:03.3451049Z 818 │ 2026-10-24T02:54:03.3452057Z 832 │ 2026-10-24T02:54:03.3452178Z ·  ──────────────────── 2026-10-24T02:54:03.3452277Z 833 │ 2026-10-24T02:54:03.3452326Z ╰──── 2026-10-24T02:54:03.3452550Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T02:54:03.3452758Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T02:54:03.3452794Z 2026-10-24T02:54:03.3453053Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3453220Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T02:54:03.3453273Z 638 │ 2026-10-24T02:54:03.3453338Z 639 │ useEffect(() => { 2026-10-24T02:54:03.3453408Z ·  ────┬──── 2026-10-24T02:54:03.3453535Z · ╰── This is the containing effect 2026-10-24T02:54:03.3453645Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T02:54:03.3453705Z 641 │ return; 2026-10-24T02:54:03.3453758Z 642 │ } 2026-10-24T02:54:03.3453835Z 643 │ setPendingLaunchEntry({ 2026-10-24T02:54:03.3453923Z ·  ──────────┬────────── 2026-10-24T02:54:03.3454096Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3454166Z 644 │ key: launchTargetKey, 2026-10-24T02:54:03.3454215Z ╰──── 2026-10-24T02:54:03.3454822Z  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-24T02:54:03.3455148Z  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-24T02:54:03.3455150Z 2026-10-24T02:54:03.3455409Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3455580Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T02:54:03.3455631Z 648 │ 2026-10-24T02:54:03.3455695Z 649 │ useEffect(() => { 2026-10-24T02:54:03.3455764Z ·  ────┬──── 2026-10-24T02:54:03.3455891Z · ╰── This is the containing effect 2026-10-24T02:54:03.3456003Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T02:54:03.3456064Z 651 │ return; 2026-10-24T02:54:03.3456117Z 652 │ } 2026-10-24T02:54:03.3456262Z 653 │ setInitialAttachGridEntry({ 2026-10-24T02:54:03.3456354Z ·  ────────────┬──────────── 2026-10-24T02:54:03.3456530Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3456605Z 654 │ key: launchTargetKey, 2026-10-24T02:54:03.3456655Z ╰──── 2026-10-24T02:54:03.3457260Z  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-24T02:54:03.3457584Z  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-24T02:54:03.3457586Z 2026-10-24T02:54:03.3457925Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T02:54:03.3458133Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T02:54:03.3458184Z 743 │ 2026-10-24T02:54:03.3458247Z 744 │ useEffect(() => { 2026-10-24T02:54:03.3458316Z ·  ────┬──── 2026-10-24T02:54:03.3458443Z · ╰── This is the containing effect 2026-10-24T02:54:03.3458541Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T02:54:03.3458608Z 746 │ setLastGridSize({ 2026-10-24T02:54:03.3458690Z ·  ───────┬─────── 2026-10-24T02:54:03.3458857Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T02:54:03.3458937Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T02:54:03.3458988Z ╰──── 2026-10-24T02:54:03.3459593Z  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-24T02:54:03.3459918Z  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-24T02:54:03.3459921Z 2026-10-24T02:54:03.3460153Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3460322Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T02:54:03.3460377Z 537 │ }); 2026-10-24T02:54:03.3460500Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T02:54:03.3460611Z ·  ───────────┬────────── 2026-10-24T02:54:03.3460857Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T02:54:03.3461020Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T02:54:03.3461071Z ╰──── 2026-10-24T02:54:03.3461366Z  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-24T02:54:03.3461681Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3461684Z 2026-10-24T02:54:03.3461889Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3462060Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T02:54:03.3462155Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T02:54:03.3462219Z 709 │ }, [terminalKey]); 2026-10-24T02:54:03.3462293Z ·  ─────┬───── 2026-10-24T02:54:03.3462434Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T02:54:03.3462486Z 710 │ 2026-10-24T02:54:03.3462536Z ╰──── 2026-10-24T02:54:03.3462828Z  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-24T02:54:03.3463217Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3463257Z 2026-10-24T02:54:03.3463457Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T02:54:03.3463626Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T02:54:03.3463681Z 799 │ }; 2026-10-24T02:54:03.3463857Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T02:54:03.3464036Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T02:54:03.3464265Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T02:54:03.3464479Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T02:54:03.3464533Z 801 │ 2026-10-24T02:54:03.3464584Z ╰──── 2026-10-24T02:54:03.3464879Z  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-24T02:54:03.3465192Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T02:54:03.3465195Z 2026-10-24T02:54:03.3465341Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3465508Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T02:54:03.3465561Z 792 │ } 2026-10-24T02:54:03.3465670Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T02:54:03.3465782Z ·  ───────────┬─────────── 2026-10-24T02:54:03.3465941Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3465993Z 794 │ 2026-10-24T02:54:03.3466043Z ╰──── 2026-10-24T02:54:03.3466512Z  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-24T02:54:03.3466806Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3466810Z 2026-10-24T02:54:03.3467173Z ⚠ 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-24T02:54:03.3467312Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T02:54:03.3467447Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T02:54:03.3467593Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T02:54:03.3467706Z ·  ─────────────────── 2026-10-24T02:54:03.3467770Z 1787 │ cwd, 2026-10-24T02:54:03.3467820Z ╰──── 2026-10-24T02:54:03.3467823Z 2026-10-24T02:54:03.3468064Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T02:54:03.3468254Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11] 2026-10-24T02:54:03.3468391Z 508 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T02:54:03.3468528Z 509 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T02:54:03.3468615Z ·  ─────────────── 2026-10-24T02:54:03.3468668Z 510 │ ) 2026-10-24T02:54:03.3468719Z ╰──── 2026-10-24T02:54:03.3468874Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T02:54:03.3468877Z 2026-10-24T02:54:03.3469087Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T02:54:03.3469189Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T02:54:03.3469329Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T02:54:03.3469450Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T02:54:03.3469538Z ·  ──────┬────── 2026-10-24T02:54:03.3469679Z · ╰── 'HookForwarder' is imported here 2026-10-24T02:54:03.3469781Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T02:54:03.3469834Z ╰──── 2026-10-24T02:54:03.3469931Z  help: Consider removing this import. 2026-10-24T02:54:03.3469934Z 2026-10-24T02:54:03.3470100Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3470270Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T02:54:03.3470354Z 26 │ const latestInput = useRef(input); 2026-10-24T02:54:03.3470429Z 27 │ latestInput.current = input; 2026-10-24T02:54:03.3470537Z ·  ─────┬─────────┬─── 2026-10-24T02:54:03.3470725Z · │ ╰── Cannot update ref value during render 2026-10-24T02:54:03.3470842Z · ╰── This value is a ref 2026-10-24T02:54:03.3470916Z 28 │ const mounted = useRef(true); 2026-10-24T02:54:03.3470965Z ╰──── 2026-10-24T02:54:03.3471434Z  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-24T02:54:03.3471728Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3471730Z 2026-10-24T02:54:03.3471878Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3472040Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T02:54:03.3472093Z 276 │ 2026-10-24T02:54:03.3472275Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T02:54:03.3472369Z 278 │ │ ...nativeProps, 2026-10-24T02:54:03.3472514Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T02:54:03.3472603Z 280 │ │ ref: nativeRef, 2026-10-24T02:54:03.3472731Z 281 │ ├─▶ }); 2026-10-24T02:54:03.3472966Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.3473023Z 282 │ } 2026-10-24T02:54:03.3473146Z ╰──── 2026-10-24T02:54:03.3473650Z  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-24T02:54:03.3473945Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3473948Z 2026-10-24T02:54:03.3474102Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3474270Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T02:54:03.3474372Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T02:54:03.3474456Z 66 │ const progress = useSharedValue(0); 2026-10-24T02:54:03.3474535Z ·  ────┬─── 2026-10-24T02:54:03.3474668Z · ╰── `progress` originates here 2026-10-24T02:54:03.3474732Z 67 │ useEffect(() => { 2026-10-24T02:54:03.3474855Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T02:54:03.3474927Z ·  ────┬─── 2026-10-24T02:54:03.3475059Z · ╰── `progress` cannot be modified 2026-10-24T02:54:03.3475128Z 69 │ }, [expanded, progress]); 2026-10-24T02:54:03.3475180Z ╰──── 2026-10-24T02:54:03.3475448Z  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-24T02:54:03.3475761Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3475766Z 2026-10-24T02:54:03.3475921Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3476089Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T02:54:03.3476143Z 90 │ }) { 2026-10-24T02:54:03.3476255Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T02:54:03.3476328Z ·  ────┬─── 2026-10-24T02:54:03.3476454Z · ╰── `rotation` originates here 2026-10-24T02:54:03.3476523Z 92 │ useLayoutEffect(() => { 2026-10-24T02:54:03.3476664Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T02:54:03.3476734Z ·  ────┬─── 2026-10-24T02:54:03.3476932Z · ╰── `rotation` cannot be modified 2026-10-24T02:54:03.3477148Z 94 │ }, [props.hidden, rotation]); 2026-10-24T02:54:03.3477199Z ╰──── 2026-10-24T02:54:03.3477464Z  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-24T02:54:03.3477770Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3477773Z 2026-10-24T02:54:03.3477928Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3478099Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T02:54:03.3478195Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T02:54:03.3478329Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T02:54:03.3478417Z ·  ────────┬──────── 2026-10-24T02:54:03.3478566Z · ╰── `loadingVisibility` originates here 2026-10-24T02:54:03.3478634Z 268 │ useLayoutEffect(() => { 2026-10-24T02:54:03.3478789Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T02:54:03.3478871Z ·  ────────┬──────── 2026-10-24T02:54:03.3479019Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T02:54:03.3479110Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T02:54:03.3479159Z ╰──── 2026-10-24T02:54:03.3479425Z  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-24T02:54:03.3479738Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3479744Z 2026-10-24T02:54:03.3479896Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3480088Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T02:54:03.3480142Z 325 │ }) { 2026-10-24T02:54:03.3480299Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T02:54:03.3480385Z ·  ─────────┬───────── 2026-10-24T02:54:03.3480537Z · ╰── `recordingVisibility` originates here 2026-10-24T02:54:03.3480605Z 327 │ useLayoutEffect(() => { 2026-10-24T02:54:03.3480797Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T02:54:03.3480885Z ·  ─────────┬───────── 2026-10-24T02:54:03.3481038Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T02:54:03.3481126Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T02:54:03.3481178Z ╰──── 2026-10-24T02:54:03.3481443Z  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-24T02:54:03.3481750Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3481753Z 2026-10-24T02:54:03.3481895Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3482131Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T02:54:03.3482320Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T02:54:03.3482443Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T02:54:03.3482566Z ·  ───────────┬────────── 2026-10-24T02:54:03.3482737Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3482855Z 123 │ const sessionRef = useRef(null); 2026-10-24T02:54:03.3482906Z ╰──── 2026-10-24T02:54:03.3483384Z  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-24T02:54:03.3483678Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3483683Z 2026-10-24T02:54:03.3483822Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3483979Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T02:54:03.3484031Z 125 │ 2026-10-24T02:54:03.3484138Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:54:03.3484224Z ·  ─────────┬──────── 2026-10-24T02:54:03.3484373Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3484474Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:54:03.3484523Z ╰──── 2026-10-24T02:54:03.3484996Z  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-24T02:54:03.3485292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3485295Z 2026-10-24T02:54:03.3485436Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3485594Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T02:54:03.3485646Z 125 │ 2026-10-24T02:54:03.3485752Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:54:03.3485838Z ·  ─────────┬───────── 2026-10-24T02:54:03.3485988Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3486087Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:54:03.3486139Z ╰──── 2026-10-24T02:54:03.3486606Z  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-24T02:54:03.3486896Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3486899Z 2026-10-24T02:54:03.3487038Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3487267Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T02:54:03.3487349Z 125 │ 2026-10-24T02:54:03.3487454Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:54:03.3487567Z ·  ─────────┬───────── 2026-10-24T02:54:03.3487734Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3487832Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:54:03.3487883Z ╰──── 2026-10-24T02:54:03.3488351Z  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-24T02:54:03.3488648Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3488653Z 2026-10-24T02:54:03.3488793Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3488953Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T02:54:03.3489006Z 125 │ 2026-10-24T02:54:03.3489110Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:54:03.3489219Z ·  ──────────┬───────── 2026-10-24T02:54:03.3489384Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3489484Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:54:03.3489536Z ╰──── 2026-10-24T02:54:03.3490006Z  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-24T02:54:03.3490345Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3490348Z 2026-10-24T02:54:03.3490487Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3490646Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T02:54:03.3492171Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:54:03.3492370Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:54:03.3492550Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T02:54:03.3492677Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T02:54:03.3492829Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T02:54:03.3492945Z 131 │ │ isFinished: status.isFinished, 2026-10-24T02:54:03.3493122Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T02:54:03.3493225Z 133 │ │ error: status.error, 2026-10-24T02:54:03.3493323Z 134 │ │ url: status.url, 2026-10-24T02:54:03.3493401Z 135 │ │ }); 2026-10-24T02:54:03.3493480Z 136 │ │ }, 2026-10-24T02:54:03.3493766Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T02:54:03.3493907Z 138 │ │ selectInput: (inputs) => { 2026-10-24T02:54:03.3494060Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T02:54:03.3494204Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T02:54:03.3494367Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T02:54:03.3494503Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T02:54:03.3494601Z 143 │ │ if (order !== known) { 2026-10-24T02:54:03.3494739Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T02:54:03.3494856Z 145 │ │ transform: (current) => ({ 2026-10-24T02:54:03.3495066Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T02:54:03.3495149Z 147 │ │ }), 2026-10-24T02:54:03.3495228Z 148 │ │ }); 2026-10-24T02:54:03.3495306Z 149 │ │ } 2026-10-24T02:54:03.3495445Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T02:54:03.3495521Z 151 │ │ }, 2026-10-24T02:54:03.3495649Z 152 │ ├─▶ }); 2026-10-24T02:54:03.3495887Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T02:54:03.3495978Z 153 │ recorderRef.current = recorder; 2026-10-24T02:54:03.3496033Z ╰──── 2026-10-24T02:54:03.3496602Z  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-24T02:54:03.3496897Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3496900Z 2026-10-24T02:54:03.3497043Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3497203Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T02:54:03.3497259Z 152 │ }); 2026-10-24T02:54:03.3497339Z 153 │ recorderRef.current = recorder; 2026-10-24T02:54:03.3497455Z ·  ─────┬─────────┬─── 2026-10-24T02:54:03.3497640Z · │ ╰── Cannot update ref value during render 2026-10-24T02:54:03.3497757Z · ╰── This value is a ref 2026-10-24T02:54:03.3497859Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:54:03.3497910Z ╰──── 2026-10-24T02:54:03.3498378Z  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-24T02:54:03.3498670Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3498760Z 2026-10-24T02:54:03.3498945Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3499103Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T02:54:03.3499187Z 153 │ recorderRef.current = recorder; 2026-10-24T02:54:03.3499380Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:54:03.3499463Z 155 │ │ recorder, 2026-10-24T02:54:03.3499590Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T02:54:03.3499706Z 157 │ │ requestPermission: async () => { 2026-10-24T02:54:03.3499871Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T02:54:03.3500102Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T02:54:03.3500180Z 160 │ │ }, 2026-10-24T02:54:03.3500320Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T02:54:03.3500453Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T02:54:03.3500584Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T02:54:03.3500695Z 164 │ │ onStateChange: (nextState) => 2026-10-24T02:54:03.3500784Z 165 │ │ setState({ 2026-10-24T02:54:03.3500884Z 166 │ │ state: nextState, 2026-10-24T02:54:03.3501021Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T02:54:03.3501152Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T02:54:03.3501235Z 169 │ │ }), 2026-10-24T02:54:03.3501362Z 170 │ ├─▶ }); 2026-10-24T02:54:03.3501558Z · ╰──── Cannot access ref value during render 2026-10-24T02:54:03.3501612Z 171 │ } 2026-10-24T02:54:03.3501663Z ╰──── 2026-10-24T02:54:03.3502131Z  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-24T02:54:03.3502490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3502524Z 2026-10-24T02:54:03.3502666Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3502823Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T02:54:03.3502904Z 153 │ recorderRef.current = recorder; 2026-10-24T02:54:03.3503006Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:54:03.3503117Z ·  ─────┬────────┬─── 2026-10-24T02:54:03.3503297Z · │ ╰── Cannot update ref value during render 2026-10-24T02:54:03.3503412Z · ╰── This value is a ref 2026-10-24T02:54:03.3503475Z 155 │ recorder, 2026-10-24T02:54:03.3503525Z ╰──── 2026-10-24T02:54:03.3503996Z  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-24T02:54:03.3504290Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3504292Z 2026-10-24T02:54:03.3504435Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3504593Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T02:54:03.3504678Z 184 │ return () => subscription.remove(); 2026-10-24T02:54:03.3504741Z 185 │ }, [controller]); 2026-10-24T02:54:03.3504818Z ·  ─────┬──── 2026-10-24T02:54:03.3504965Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3505020Z 186 │ 2026-10-24T02:54:03.3505068Z ╰──── 2026-10-24T02:54:03.3505534Z  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-24T02:54:03.3505823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3505825Z 2026-10-24T02:54:03.3505966Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3506122Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T02:54:03.3506212Z 184 │ return () => subscription.remove(); 2026-10-24T02:54:03.3506277Z 185 │ }, [controller]); 2026-10-24T02:54:03.3506352Z ·  ──────┬───── 2026-10-24T02:54:03.3506492Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3506544Z 186 │ 2026-10-24T02:54:03.3506594Z ╰──── 2026-10-24T02:54:03.3507060Z  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-24T02:54:03.3507352Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3507354Z 2026-10-24T02:54:03.3507567Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3507759Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T02:54:03.3507814Z 191 │ }, 2026-10-24T02:54:03.3507885Z 192 │ [controller, recorder], 2026-10-24T02:54:03.3507957Z ·  ─────┬──── 2026-10-24T02:54:03.3508098Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3508152Z 193 │ ); 2026-10-24T02:54:03.3508201Z ╰──── 2026-10-24T02:54:03.3508663Z  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-24T02:54:03.3508960Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3508966Z 2026-10-24T02:54:03.3509106Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3509263Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T02:54:03.3509352Z 174 │ const controller = session.controller; 2026-10-24T02:54:03.3509436Z 175 │ const recorder = recorderRef.current; 2026-10-24T02:54:03.3509538Z ·  ─────────┬───────── 2026-10-24T02:54:03.3509696Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3509747Z 176 │ 2026-10-24T02:54:03.3509795Z ╰──── 2026-10-24T02:54:03.3510304Z  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-24T02:54:03.3510596Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3510598Z 2026-10-24T02:54:03.3510739Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3510894Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T02:54:03.3510949Z 191 │ }, 2026-10-24T02:54:03.3511019Z 192 │ [controller, recorder], 2026-10-24T02:54:03.3511109Z ·  ───────────┬────────── 2026-10-24T02:54:03.3511254Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3511311Z 193 │ ); 2026-10-24T02:54:03.3511362Z ╰──── 2026-10-24T02:54:03.3511829Z  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-24T02:54:03.3512120Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3512122Z 2026-10-24T02:54:03.3512262Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3512419Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T02:54:03.3512509Z 245 │ return () => clearInterval(intervalId); 2026-10-24T02:54:03.3512687Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T02:54:03.3512807Z ·  ─────┬──── 2026-10-24T02:54:03.3512960Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3513011Z 247 │ 2026-10-24T02:54:03.3513061Z ╰──── 2026-10-24T02:54:03.3513525Z  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-24T02:54:03.3513815Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3513817Z 2026-10-24T02:54:03.3513961Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3514122Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T02:54:03.3514211Z 245 │ return () => clearInterval(intervalId); 2026-10-24T02:54:03.3514317Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T02:54:03.3514445Z ·  ────────────────────────┬─────────────────────── 2026-10-24T02:54:03.3514603Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3514654Z 247 │ 2026-10-24T02:54:03.3514703Z ╰──── 2026-10-24T02:54:03.3515169Z  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-24T02:54:03.3515465Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3515471Z 2026-10-24T02:54:03.3515611Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3515767Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T02:54:03.3515834Z 260 │ setOwnerFocused, 2026-10-24T02:54:03.3515894Z 261 │ session, 2026-10-24T02:54:03.3515964Z ·  ───┬─── 2026-10-24T02:54:03.3516099Z · ╰── Cannot access ref value during render 2026-10-24T02:54:03.3516158Z 262 │ stop, 2026-10-24T02:54:03.3516208Z ╰──── 2026-10-24T02:54:03.3516678Z  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-24T02:54:03.3516971Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3516974Z 2026-10-24T02:54:03.3517112Z ⚠ react(refs): Cannot access refs during render 2026-10-24T02:54:03.3517268Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T02:54:03.3517321Z 250 │ 2026-10-24T02:54:03.3517456Z 251 │ ╭─▶ return { 2026-10-24T02:54:03.3517664Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T02:54:03.3517819Z 253 │ │ state, 2026-10-24T02:54:03.3517935Z 254 │ │ audioLevels, 2026-10-24T02:54:03.3518028Z 255 │ │ elapsedSeconds, 2026-10-24T02:54:03.3518156Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T02:54:03.3518237Z 257 │ │ ownerKey, 2026-10-24T02:54:03.3518315Z 258 │ │ label, 2026-10-24T02:54:03.3518405Z 259 │ │ focusedOwners, 2026-10-24T02:54:03.3518497Z 260 │ │ setOwnerFocused, 2026-10-24T02:54:03.3518577Z 261 │ │ session, 2026-10-24T02:54:03.3518655Z 262 │ │ stop, 2026-10-24T02:54:03.3518736Z 263 │ │ cancel, 2026-10-24T02:54:03.3518869Z 264 │ ├─▶ }; 2026-10-24T02:54:03.3519070Z · ╰──── Cannot access ref value during render 2026-10-24T02:54:03.3519125Z 265 │ } 2026-10-24T02:54:03.3519175Z ╰──── 2026-10-24T02:54:03.3519641Z  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-24T02:54:03.3519931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T02:54:03.3519934Z 2026-10-24T02:54:03.3520111Z ⚠ react(immutability): This value cannot be modified 2026-10-24T02:54:03.3520275Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T02:54:03.3520436Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T02:54:03.3520555Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T02:54:03.3520634Z ·  ─────┬───── 2026-10-24T02:54:03.3520768Z · ╰── `audioLevels` originates here 2026-10-24T02:54:03.3520887Z 123 │ const sessionRef = useRef(null); 2026-10-24T02:54:03.3521030Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T02:54:03.3521082Z 125 │ 2026-10-24T02:54:03.3521186Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T02:54:03.3521284Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T02:54:03.3521427Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T02:54:03.3521524Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T02:54:03.3521643Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T02:54:03.3521730Z 131 │ isFinished: status.isFinished, 2026-10-24T02:54:03.3521872Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T02:54:03.3521946Z 133 │ error: status.error, 2026-10-24T02:54:03.3522012Z 134 │ url: status.url, 2026-10-24T02:54:03.3522070Z 135 │ }); 2026-10-24T02:54:03.3522125Z 136 │ }, 2026-10-24T02:54:03.3522290Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T02:54:03.3522368Z 138 │ selectInput: (inputs) => { 2026-10-24T02:54:03.3522562Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T02:54:03.3522704Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T02:54:03.3522835Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T02:54:03.3522941Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T02:54:03.3523013Z 143 │ if (order !== known) { 2026-10-24T02:54:03.3523117Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T02:54:03.3523199Z 145 │ transform: (current) => ({ 2026-10-24T02:54:03.3523372Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T02:54:03.3523433Z 147 │ }), 2026-10-24T02:54:03.3523491Z 148 │ }); 2026-10-24T02:54:03.3523548Z 149 │ } 2026-10-24T02:54:03.3523655Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T02:54:03.3523715Z 151 │ }, 2026-10-24T02:54:03.3523773Z 152 │ }); 2026-10-24T02:54:03.3523854Z 153 │ recorderRef.current = recorder; 2026-10-24T02:54:03.3523954Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T02:54:03.3524015Z 155 │ recorder, 2026-10-24T02:54:03.3524113Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T02:54:03.3524196Z 157 │ requestPermission: async () => { 2026-10-24T02:54:03.3524325Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T02:54:03.3524480Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T02:54:03.3524534Z 160 │ }, 2026-10-24T02:54:03.3524642Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T02:54:03.3524747Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T02:54:03.3524854Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T02:54:03.3524935Z 164 │ onStateChange: (nextState) => 2026-10-24T02:54:03.3524999Z 165 │ setState({ 2026-10-24T02:54:03.3525068Z 166 │ state: nextState, 2026-10-24T02:54:03.3525171Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T02:54:03.3525267Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T02:54:03.3525326Z 169 │ }), 2026-10-24T02:54:03.3525380Z 170 │ }); 2026-10-24T02:54:03.3525431Z 171 │ } 2026-10-24T02:54:03.3525482Z 172 │ 2026-10-24T02:54:03.3525566Z 173 │ const session = sessionRef.current; 2026-10-24T02:54:03.3525652Z 174 │ const controller = session.controller; 2026-10-24T02:54:03.3525735Z 175 │ const recorder = recorderRef.current; 2026-10-24T02:54:03.3525786Z 176 │ 2026-10-24T02:54:03.3525856Z 177 │ useEffect(() => { 2026-10-24T02:54:03.3526008Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T02:54:03.3526147Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T02:54:03.3526284Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T02:54:03.3526386Z 181 │ // calls and route interruptions during capture. 2026-10-24T02:54:03.3526522Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T02:54:03.3526576Z 183 │ }); 2026-10-24T02:54:03.3526660Z 184 │ return () => subscription.remove(); 2026-10-24T02:54:03.3526723Z 185 │ }, [controller]); 2026-10-24T02:54:03.3526774Z 186 │ 2026-10-24T02:54:03.3526834Z 187 │ useEffect( 2026-10-24T02:54:03.3526896Z 188 │ () => () => { 2026-10-24T02:54:03.3527042Z 189 │ controller.dispose(); 2026-10-24T02:54:03.3527138Z 190 │ recorder.release(); 2026-10-24T02:54:03.3527192Z 191 │ }, 2026-10-24T02:54:03.3527260Z 192 │ [controller, recorder], 2026-10-24T02:54:03.3527312Z 193 │ ); 2026-10-24T02:54:03.3527361Z 194 │ 2026-10-24T02:54:03.3527424Z 195 │ useEffect(() => { 2026-10-24T02:54:03.3527514Z 196 │ if (state.phase !== "recording") return; 2026-10-24T02:54:03.3527566Z 197 │ 2026-10-24T02:54:03.3527712Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T02:54:03.3527814Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T02:54:03.3527894Z 200 │ void activation.catch(() => {}); 2026-10-24T02:54:03.3527955Z 201 │ return () => { 2026-10-24T02:54:03.3528104Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T02:54:03.3528247Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T02:54:03.3528304Z 204 │ }; 2026-10-24T02:54:03.3528380Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T02:54:03.3528430Z 206 │ 2026-10-24T02:54:03.3528492Z 207 │ useEffect(() => { 2026-10-24T02:54:03.3528625Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T02:54:03.3528674Z 209 │ 2026-10-24T02:54:03.3528794Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T02:54:03.3528947Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T02:54:03.3529049Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T02:54:03.3529123Z ·  ─────┬───── 2026-10-24T02:54:03.3529263Z · ╰── `audioLevels` cannot be modified 2026-10-24T02:54:03.3529323Z 213 │ } 2026-10-24T02:54:03.3529377Z ╰──── 2026-10-24T02:54:03.3529646Z  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-24T02:54:03.3529956Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3529959Z 2026-10-24T02:54:03.3530203Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T02:54:03.3530363Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T02:54:03.3530414Z 206 │ 2026-10-24T02:54:03.3530476Z 207 │ useEffect(() => { 2026-10-24T02:54:03.3530553Z ·  ───┬─── 2026-10-24T02:54:03.3530778Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T02:54:03.3530916Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T02:54:03.3530966Z 209 │ 2026-10-24T02:54:03.3531085Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T02:54:03.3531237Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T02:54:03.3531336Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T02:54:03.3531410Z ·  ─────┬───── 2026-10-24T02:54:03.3531542Z · ╰── This modifies `audioLevels` 2026-10-24T02:54:03.3531595Z 213 │ } 2026-10-24T02:54:03.3531645Z ╰──── 2026-10-24T02:54:03.3532057Z  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-24T02:54:03.3532398Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T02:54:03.3532401Z 2026-10-24T02:54:03.3532587Z ⚠ react(static-components): Cannot create components during render 2026-10-24T02:54:03.3532749Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T02:54:03.3532833Z 196 │ const { onInput, onResize } = props; 2026-10-24T02:54:03.3532979Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T02:54:03.3533107Z ·  ────────────────┬─────────────── 2026-10-24T02:54:03.3533299Z · ╰── The component is created during render here 2026-10-24T02:54:03.3533427Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T02:54:03.3533476Z 199 │ 2026-10-24T02:54:03.3533538Z 200 │ useEffect(() => { 2026-10-24T02:54:03.3533624Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T02:54:03.3533707Z 202 │ terminalKey: props.terminalKey, 2026-10-24T02:54:03.3533782Z 203 │ native: hasNativeSurface, 2026-10-24T02:54:03.3533913Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T02:54:03.3533995Z 205 │ bufferLen: props.buffer.length, 2026-10-24T02:54:03.3534071Z 206 │ isRunning: props.isRunning, 2026-10-24T02:54:03.3534125Z 207 │ }); 2026-10-24T02:54:03.3534287Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T02:54:03.3534376Z 209 │ const handleNativeInput = useCallback( 2026-10-24T02:54:03.3534489Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T02:54:03.3534585Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T02:54:03.3534645Z 212 │ return; 2026-10-24T02:54:03.3534699Z 213 │ } 2026-10-24T02:54:03.3534786Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T02:54:03.3534936Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T02:54:03.3534991Z 216 │ }); 2026-10-24T02:54:03.3535077Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T02:54:03.3535129Z 218 │ }, 2026-10-24T02:54:03.3535226Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T02:54:03.3535278Z 220 │ ); 2026-10-24T02:54:03.3535442Z 221 │ const handleNativeResize = useCallback( 2026-10-24T02:54:03.3535583Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T02:54:03.3535644Z 223 │ onResize({ 2026-10-24T02:54:03.3535725Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T02:54:03.3535805Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T02:54:03.3535860Z 226 │ }); 2026-10-24T02:54:03.3535914Z 227 │ }, 2026-10-24T02:54:03.3535973Z 228 │ [onResize], 2026-10-24T02:54:03.3536023Z 229 │ ); 2026-10-24T02:54:03.3536073Z 230 │ 2026-10-24T02:54:03.3536207Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T02:54:03.3536266Z 232 │ return ( 2026-10-24T02:54:03.3536340Z 233 │ 2026-10-24T02:54:03.3536421Z 234 │