2026-10-24T22:23:56.4260961Z Current runner version: '2.338.1' 2026-10-24T22:23:56.4265839Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-b2hqerztj4zn6lgf' 2026-10-24T22:23:56.4266555Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T22:23:56.4267333Z Machine name: 'ip-172-31-73-130' 2026-10-24T22:23:56.4268961Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T22:23:56.4270295Z Contents: read 2026-10-24T22:23:56.4270682Z Metadata: read 2026-10-24T22:23:56.4271141Z ##[endgroup] 2026-10-24T22:23:56.4272442Z Secret source: Actions 2026-10-24T22:23:56.4273106Z Cache mode: write 2026-10-24T22:23:56.4273630Z Prepare workflow directory 2026-10-24T22:23:56.4453981Z Prepare all required actions 2026-10-24T22:23:56.4480237Z Getting action download info 2026-10-24T22:23:56.5494248Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T22:23:56.5860198Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T22:23:56.7038629Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T22:23:56.7076649Z Complete job name: Lint 2026-10-24T22:23:56.7454771Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T22:23:56.7525899Z ##[group]Run '/setup.sh' 2026-10-24T22:23:56.7541109Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T22:23:56.7541538Z env: 2026-10-24T22:23:56.7541764Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:23:56.7542060Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:23:56.7542343Z BLACKSMITH_CHECK_RUN_ID: 121004670553 2026-10-24T22:23:56.7542623Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T22:23:56.7542893Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T22:23:56.7543155Z ##[endgroup] 2026-10-24T22:23:56.7762149Z Logging daemon started (blacksmithd for logs) 2026-10-24T22:23:56.7882366Z Results daemon started (blacksmithd for results) 2026-10-24T22:23:56.8003371Z Background adoption and SSH setup started (PID: 3141) 2026-10-24T22:23:56.8005677Z 2026-10-24T22:23:56.8006029Z ---------------------------------------- 2026-10-24T22:23:56.8006601Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40138375921/jobs/121004670553 2026-10-24T22:23:56.8007772Z SSH Access (using your GitHub SSH key): 2026-10-24T22:23:56.8008243Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-b2hqerztj4zn6lgf.vm.blacksmith.sh 2026-10-24T22:23:56.8008560Z 2026-10-24T22:23:56.8008682Z No GitHub SSH key? Add one at: 2026-10-24T22:23:56.8009177Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T22:23:56.8009580Z 2026-10-24T22:23:56.8009685Z ---------------------------------------- 2026-10-24T22:23:56.8009861Z 2026-10-24T22:23:56.8010006Z VM ID: blacksmith-8vcpu-ubuntu-2404-b2hqerztj4zn6lgf 2026-10-24T22:23:56.8010324Z Host: production-152.236.39.235-x8664 2026-10-24T22:23:56.8010595Z Host Agent PID: 3802836 2026-10-24T22:23:56.8011421Z Host Agent Git SHA: 1637818df 2026-10-24T22:23:56.8011684Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T22:23:56.8011960Z Blacksmith Host Generation: gen 2 2026-10-24T22:23:56.8012242Z Petname: production-sweeping-wren-adcade9f 2026-10-24T22:23:56.8012526Z Region: us-east 2026-10-24T22:23:56.8012754Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T22:23:56.8016855Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T22:23:56.8017681Z 2026-10-24T22:23:56.8058150Z Enabling Blacksmith transparent cache 2026-10-24T22:23:56.8239773Z ##[group]Run actions/checkout@v6 2026-10-24T22:23:56.8240091Z with: 2026-10-24T22:23:56.8240428Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T22:23:56.8240837Z sparse-checkout-cone-mode: false 2026-10-24T22:23:56.8241122Z repository: pingdotgg/t3code 2026-10-24T22:23:56.8242915Z token: *** 2026-10-24T22:23:56.8243134Z ssh-strict: true 2026-10-24T22:23:56.8243364Z ssh-user: git 2026-10-24T22:23:56.8243594Z persist-credentials: true 2026-10-24T22:23:56.8244094Z clean: true 2026-10-24T22:23:56.8244315Z fetch-depth: 1 2026-10-24T22:23:56.8244535Z fetch-tags: false 2026-10-24T22:23:56.8244769Z show-progress: true 2026-10-24T22:23:56.8244999Z lfs: false 2026-10-24T22:23:56.8245212Z submodules: false 2026-10-24T22:23:56.8245444Z set-safe-directory: true 2026-10-24T22:23:56.8245702Z allow-unsafe-pr-checkout: false 2026-10-24T22:23:56.8245966Z env: 2026-10-24T22:23:56.8246211Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:23:56.8246513Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:23:56.8246803Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:23:56.8247072Z ##[endgroup] 2026-10-24T22:23:56.9173547Z Syncing repository: pingdotgg/t3code 2026-10-24T22:23:56.9174428Z ##[group]Getting Git version info 2026-10-24T22:23:56.9174765Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T22:23:56.9175247Z [command]/usr/local/bin/git version 2026-10-24T22:23:56.9244520Z git version 2.55.0 2026-10-24T22:23:56.9255610Z ##[endgroup] 2026-10-24T22:23:56.9262051Z Temporarily overriding HOME='/home/runner/_work/_temp/29712f8e-31c2-4c1d-8ba6-d3de9d1e59a1' before making global git config changes 2026-10-24T22:23:56.9262724Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T22:23:56.9265233Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T22:23:56.9293088Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T22:23:56.9294773Z ##[group]Determining repository object format 2026-10-24T22:23:56.9295727Z ##[endgroup] 2026-10-24T22:23:56.9296289Z ##[group]Initializing the repository 2026-10-24T22:23:56.9297911Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T22:23:56.9333463Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T22:23:56.9334034Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T22:23:56.9334506Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T22:23:56.9334867Z hint: call: 2026-10-24T22:23:56.9335070Z hint: 2026-10-24T22:23:56.9335328Z hint: git config --global init.defaultBranch 2026-10-24T22:23:56.9335630Z hint: 2026-10-24T22:23:56.9336035Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T22:23:56.9336490Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T22:23:56.9336853Z hint: 2026-10-24T22:23:56.9337064Z hint: git branch -m 2026-10-24T22:23:56.9337298Z hint: 2026-10-24T22:23:56.9337608Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T22:23:56.9338174Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T22:23:56.9339045Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T22:23:56.9361175Z ##[endgroup] 2026-10-24T22:23:56.9361544Z ##[group]Disabling automatic garbage collection 2026-10-24T22:23:56.9363331Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T22:23:56.9381823Z ##[endgroup] 2026-10-24T22:23:56.9382165Z ##[group]Setting up auth 2026-10-24T22:23:56.9382506Z Removing SSH command configuration 2026-10-24T22:23:56.9385902Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T22:23:56.9406337Z [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-24T22:23:56.9528243Z Removing HTTP extra header 2026-10-24T22:23:56.9531979Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T22:23:56.9554005Z [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-24T22:23:56.9648849Z Removing includeIf entries pointing to credentials config files 2026-10-24T22:23:56.9653047Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T22:23:56.9677286Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T22:23:56.9773502Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-8dad3dfe-8b94-4f6f-a84a-5820b0cadd72.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T22:23:56.9802620Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-8dad3dfe-8b94-4f6f-a84a-5820b0cadd72.config 2026-10-24T22:23:56.9825434Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-8dad3dfe-8b94-4f6f-a84a-5820b0cadd72.config 2026-10-24T22:23:56.9844551Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-8dad3dfe-8b94-4f6f-a84a-5820b0cadd72.config 2026-10-24T22:23:56.9867655Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-8dad3dfe-8b94-4f6f-a84a-5820b0cadd72.config 2026-10-24T22:23:56.9881638Z ##[endgroup] 2026-10-24T22:23:56.9882232Z ##[group]Fetching the repository 2026-10-24T22:23:56.9886593Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +3cc31ed27c8956b36cee35a50509fb7c6869592b:refs/remotes/origin/main 2026-10-24T22:23:57.2921516Z From https://github.com/pingdotgg/t3code 2026-10-24T22:23:57.2922929Z * [new ref] 3cc31ed27c8956b36cee35a50509fb7c6869592b -> origin/main 2026-10-24T22:23:57.2950255Z [command]/usr/local/bin/git branch --list --remote origin/main 2026-10-24T22:23:57.2968870Z origin/main 2026-10-24T22:23:57.2973088Z [command]/usr/local/bin/git rev-parse refs/remotes/origin/main 2026-10-24T22:23:57.2988531Z 3cc31ed27c8956b36cee35a50509fb7c6869592b 2026-10-24T22:23:57.2990537Z ##[endgroup] 2026-10-24T22:23:57.2991255Z ##[group]Determining the checkout info 2026-10-24T22:23:57.2992100Z ##[endgroup] 2026-10-24T22:23:57.2992924Z ##[group]Setting up sparse checkout 2026-10-24T22:23:57.2993655Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T22:23:57.3012341Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T22:23:57.3027010Z .git/info/sparse-checkout 2026-10-24T22:23:57.3030513Z ##[endgroup] 2026-10-24T22:23:57.3031483Z ##[group]Checking out the ref 2026-10-24T22:23:57.3032723Z [command]/usr/local/bin/git checkout --progress --force -B main refs/remotes/origin/main 2026-10-24T22:24:04.4196618Z Updating files: 0% (1/6402) 2026-10-24T22:24:04.4224839Z Updating files: 1% (65/6402) 2026-10-24T22:24:04.4242795Z Updating files: 2% (129/6402) 2026-10-24T22:24:04.4263727Z Updating files: 3% (193/6402) 2026-10-24T22:24:04.4284591Z Updating files: 4% (257/6402) 2026-10-24T22:24:04.4315233Z Updating files: 5% (321/6402) 2026-10-24T22:24:04.4339852Z Updating files: 6% (385/6402) 2026-10-24T22:24:04.4404544Z Updating files: 7% (449/6402) 2026-10-24T22:24:04.4446322Z Updating files: 8% (513/6402) 2026-10-24T22:24:04.4472333Z Updating files: 9% (577/6402) 2026-10-24T22:24:04.4770014Z Updating files: 10% (641/6402) 2026-10-24T22:24:04.4787090Z Updating files: 11% (705/6402) 2026-10-24T22:24:04.4797652Z Updating files: 12% (769/6402) 2026-10-24T22:24:04.4813143Z Updating files: 13% (833/6402) 2026-10-24T22:24:04.4829812Z Updating files: 14% (897/6402) 2026-10-24T22:24:04.4847708Z Updating files: 15% (961/6402) 2026-10-24T22:24:04.4866701Z Updating files: 16% (1025/6402) 2026-10-24T22:24:04.4883307Z Updating files: 17% (1089/6402) 2026-10-24T22:24:04.4901936Z Updating files: 18% (1153/6402) 2026-10-24T22:24:04.4916803Z Updating files: 19% (1217/6402) 2026-10-24T22:24:04.4941030Z Updating files: 20% (1281/6402) 2026-10-24T22:24:04.4957553Z Updating files: 21% (1345/6402) 2026-10-24T22:24:04.4976537Z Updating files: 22% (1409/6402) 2026-10-24T22:24:04.4990018Z Updating files: 23% (1473/6402) 2026-10-24T22:24:04.5003503Z Updating files: 24% (1537/6402) 2026-10-24T22:24:04.5019690Z Updating files: 25% (1601/6402) 2026-10-24T22:24:04.5033585Z Updating files: 26% (1665/6402) 2026-10-24T22:24:04.5046785Z Updating files: 27% (1729/6402) 2026-10-24T22:24:04.5066889Z Updating files: 28% (1793/6402) 2026-10-24T22:24:04.5101895Z Updating files: 29% (1857/6402) 2026-10-24T22:24:04.5122644Z Updating files: 30% (1921/6402) 2026-10-24T22:24:04.5146567Z Updating files: 31% (1985/6402) 2026-10-24T22:24:04.5177252Z Updating files: 32% (2049/6402) 2026-10-24T22:24:04.5206615Z Updating files: 33% (2113/6402) 2026-10-24T22:24:04.5277976Z Updating files: 34% (2177/6402) 2026-10-24T22:24:04.5336085Z Updating files: 35% (2241/6402) 2026-10-24T22:24:04.5372213Z Updating files: 36% (2305/6402) 2026-10-24T22:24:04.5403585Z Updating files: 37% (2369/6402) 2026-10-24T22:24:04.5450889Z Updating files: 38% (2433/6402) 2026-10-24T22:24:04.5478406Z Updating files: 39% (2497/6402) 2026-10-24T22:24:04.5507492Z Updating files: 40% (2561/6402) 2026-10-24T22:24:04.5533690Z Updating files: 41% (2625/6402) 2026-10-24T22:24:04.5551302Z Updating files: 42% (2689/6402) 2026-10-24T22:24:04.5561145Z Updating files: 43% (2753/6402) 2026-10-24T22:24:04.5590070Z Updating files: 44% (2817/6402) 2026-10-24T22:24:04.5617889Z Updating files: 45% (2881/6402) 2026-10-24T22:24:04.5644435Z Updating files: 46% (2945/6402) 2026-10-24T22:24:04.5670335Z Updating files: 47% (3009/6402) 2026-10-24T22:24:04.5697431Z Updating files: 48% (3073/6402) 2026-10-24T22:24:04.5737322Z Updating files: 49% (3137/6402) 2026-10-24T22:24:04.5764993Z Updating files: 50% (3201/6402) 2026-10-24T22:24:04.5780999Z Updating files: 51% (3266/6402) 2026-10-24T22:24:04.5816476Z Updating files: 52% (3330/6402) 2026-10-24T22:24:04.5844082Z Updating files: 53% (3394/6402) 2026-10-24T22:24:04.5863521Z Updating files: 54% (3458/6402) 2026-10-24T22:24:04.5885854Z Updating files: 55% (3522/6402) 2026-10-24T22:24:04.5901363Z Updating files: 56% (3586/6402) 2026-10-24T22:24:04.5920540Z Updating files: 57% (3650/6402) 2026-10-24T22:24:04.5940419Z Updating files: 58% (3714/6402) 2026-10-24T22:24:04.6303906Z Updating files: 59% (3778/6402) 2026-10-24T22:24:04.6318626Z Updating files: 60% (3842/6402) 2026-10-24T22:24:04.6338149Z Updating files: 61% (3906/6402) 2026-10-24T22:24:04.6356140Z Updating files: 62% (3970/6402) 2026-10-24T22:24:04.6378595Z Updating files: 63% (4034/6402) 2026-10-24T22:24:04.6405653Z Updating files: 64% (4098/6402) 2026-10-24T22:24:04.6425338Z Updating files: 65% (4162/6402) 2026-10-24T22:24:04.6442499Z Updating files: 66% (4226/6402) 2026-10-24T22:24:04.6465676Z Updating files: 67% (4290/6402) 2026-10-24T22:24:04.6480215Z Updating files: 68% (4354/6402) 2026-10-24T22:24:04.6498081Z Updating files: 69% (4418/6402) 2026-10-24T22:24:04.6510773Z Updating files: 70% (4482/6402) 2026-10-24T22:24:04.6531701Z Updating files: 71% (4546/6402) 2026-10-24T22:24:04.6544225Z Updating files: 72% (4610/6402) 2026-10-24T22:24:04.6590698Z Updating files: 73% (4674/6402) 2026-10-24T22:24:04.6996694Z Updating files: 74% (4738/6402) 2026-10-24T22:24:04.7023389Z Updating files: 75% (4802/6402) 2026-10-24T22:24:04.7045806Z Updating files: 76% (4866/6402) 2026-10-24T22:24:04.7071010Z Updating files: 77% (4930/6402) 2026-10-24T22:24:04.7092367Z Updating files: 78% (4994/6402) 2026-10-24T22:24:04.7108308Z Updating files: 79% (5058/6402) 2026-10-24T22:24:04.7130698Z Updating files: 80% (5122/6402) 2026-10-24T22:24:04.7146609Z Updating files: 81% (5186/6402) 2026-10-24T22:24:04.7164920Z Updating files: 82% (5250/6402) 2026-10-24T22:24:04.7186944Z Updating files: 83% (5314/6402) 2026-10-24T22:24:04.7211881Z Updating files: 84% (5378/6402) 2026-10-24T22:24:04.7229875Z Updating files: 85% (5442/6402) 2026-10-24T22:24:04.7254597Z Updating files: 86% (5506/6402) 2026-10-24T22:24:04.7326222Z Updating files: 87% (5570/6402) 2026-10-24T22:24:04.7355866Z Updating files: 88% (5634/6402) 2026-10-24T22:24:04.7375683Z Updating files: 89% (5698/6402) 2026-10-24T22:24:04.7403400Z Updating files: 90% (5762/6402) 2026-10-24T22:24:04.7430861Z Updating files: 91% (5826/6402) 2026-10-24T22:24:04.7445464Z Updating files: 92% (5890/6402) 2026-10-24T22:24:04.7469295Z Updating files: 93% (5954/6402) 2026-10-24T22:24:04.7489317Z Updating files: 94% (6018/6402) 2026-10-24T22:24:04.7513037Z Updating files: 95% (6082/6402) 2026-10-24T22:24:04.7568525Z Updating files: 96% (6146/6402) 2026-10-24T22:24:04.7591952Z Updating files: 97% (6210/6402) 2026-10-24T22:24:04.7638845Z Updating files: 98% (6274/6402) 2026-10-24T22:24:04.7658386Z Updating files: 99% (6338/6402) 2026-10-24T22:24:04.7658612Z Updating files: 100% (6402/6402) 2026-10-24T22:24:04.7658760Z Updating files: 100% (6402/6402), done. 2026-10-24T22:24:04.7810358Z Switched to a new branch 'main' 2026-10-24T22:24:04.7811570Z branch 'main' set up to track 'origin/main'. 2026-10-24T22:24:04.7823020Z ##[endgroup] 2026-10-24T22:24:04.7855536Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T22:24:04.7873168Z 3cc31ed27c8956b36cee35a50509fb7c6869592b 2026-10-24T22:24:04.7942563Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T22:24:04.7942792Z files="$(git ls-files .github/pr-assets)" 2026-10-24T22:24:04.7942972Z if test -n "$files"; then 2026-10-24T22:24:04.7943192Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T22:24:04.7943397Z  exit 1 2026-10-24T22:24:04.7943499Z fi 2026-10-24T22:24:04.7960488Z shell: /usr/bin/bash -e {0} 2026-10-24T22:24:04.7960618Z env: 2026-10-24T22:24:04.7960729Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:04.7960887Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:04.7961025Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:04.7961156Z ##[endgroup] 2026-10-24T22:24:04.8109460Z Prepare all required actions 2026-10-24T22:24:04.8109761Z Getting action download info 2026-10-24T22:24:04.8901791Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T22:24:05.0088540Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T22:24:05.0088701Z env: 2026-10-24T22:24:05.0088816Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:05.0088965Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:05.0089106Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:05.0089241Z ##[endgroup] 2026-10-24T22:24:05.0163103Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T22:24:05.0175908Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T22:24:05.0176263Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T22:24:05.0176560Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T22:24:05.0176805Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T22:24:05.0192582Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T22:24:05.0192750Z env: 2026-10-24T22:24:05.0192864Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:05.0193010Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:05.0193150Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:05.0193285Z ##[endgroup] 2026-10-24T22:24:05.0262887Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=9] 2026-10-24T22:24:05.0264125Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T22:24:05.0307839Z ##[group]Run actions/cache@v6 2026-10-24T22:24:05.0307977Z with: 2026-10-24T22:24:05.0308233Z path: ~/.vite-plus 2026-10-24T22:24:05.0308397Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T22:24:05.0308596Z enableCrossOsArchive: false 2026-10-24T22:24:05.0308726Z fail-on-cache-miss: false 2026-10-24T22:24:05.0308852Z lookup-only: false 2026-10-24T22:24:05.0308962Z save-always: false 2026-10-24T22:24:05.0309071Z env: 2026-10-24T22:24:05.0309179Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:05.0309332Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:05.0309478Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:05.0309609Z ##[endgroup] 2026-10-24T22:24:05.2180225Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T22:24:05.6067805Z Received 170349591 of 170349591 (100.0%), 445.1 MBs/sec 2026-10-24T22:24:05.6068806Z Cache Size: ~162 MB (170349591 B) 2026-10-24T22:24:05.6119281Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/8b7794f9-1d24-4cf4-a3b2-455afabbd7dd/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T22:24:06.2936624Z Cache restored successfully 2026-10-24T22:24:06.3074211Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T22:24:06.3151057Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1288] 2026-10-24T22:24:06.3153487Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T22:24:06.3172732Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T22:24:06.3172977Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T22:24:06.3173151Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T22:24:06.3190600Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T22:24:06.3190767Z env: 2026-10-24T22:24:06.3190887Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:06.3191031Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:06.3191177Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:06.3191310Z ##[endgroup] 2026-10-24T22:24:06.3232288Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T22:24:06.3239987Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=8] 2026-10-24T22:24:06.3241752Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T22:24:06.3246531Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T22:24:06.3248124Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T22:24:06.3259367Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T22:24:06.3259634Z store_path="$(vp pm cache dir)" 2026-10-24T22:24:06.3259896Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T22:24:06.3275205Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T22:24:06.3275382Z env: 2026-10-24T22:24:06.3275493Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:06.3275644Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:06.3275798Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:06.3275999Z ##[endgroup] 2026-10-24T22:24:06.3404349Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=15] 2026-10-24T22:24:06.3405673Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T22:24:06.3723391Z ##[group]Run actions/cache@v6 2026-10-24T22:24:06.3723591Z with: 2026-10-24T22:24:06.3723787Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T22:24:06.3724148Z key: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T22:24:06.3724441Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T22:24:06.3724666Z enableCrossOsArchive: false 2026-10-24T22:24:06.3724830Z fail-on-cache-miss: false 2026-10-24T22:24:06.3725002Z lookup-only: false 2026-10-24T22:24:06.3725206Z save-always: false 2026-10-24T22:24:06.3725357Z env: 2026-10-24T22:24:06.3725514Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:06.3725845Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:06.3726032Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:06.3726194Z ##[endgroup] 2026-10-24T22:24:06.5670869Z Cache hit for: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T22:24:07.5900190Z Received 641728512 of 995395870 (64.5%), 611.4 MBs/sec 2026-10-24T22:24:08.1449005Z Received 995395870 of 995395870 (100.0%), 610.1 MBs/sec 2026-10-24T22:24:08.1449892Z Cache Size: ~949 MB (995395870 B) 2026-10-24T22:24:08.1471875Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/838542b1-e22c-4fb5-9b31-39182d2a13cc/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T22:24:13.3236237Z Cache restored successfully 2026-10-24T22:24:13.3694848Z Cache restored from key: pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6 2026-10-24T22:24:13.3771997Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7036] 2026-10-24T22:24:13.3774363Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T22:24:13.3784322Z ##[group]Run vp install 2026-10-24T22:24:13.3784465Z vp install 2026-10-24T22:24:13.3800762Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T22:24:13.3800930Z env: 2026-10-24T22:24:13.3801047Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:13.3801196Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:13.3801341Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:13.3801471Z ##[endgroup] 2026-10-24T22:24:13.4118779Z Scope: all 34 workspace projects 2026-10-24T22:24:13.5205096Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T22:24:13.7509970Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T22:24:13.7510307Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T22:24:13.7510529Z Virtual store is at: node_modules/.pnpm 2026-10-24T22:24:15.9743244Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.5s) 2026-10-24T22:24:15.9743502Z Lockfile is up to date, resolution step is skipped 2026-10-24T22:24:15.9902095Z Packages: +1721 2026-10-24T22:24:15.9902285Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T22:24:16.0212511Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T22:24:16.8981468Z . prepare$ vp config --no-agent 2026-10-24T22:24:16.9864999Z . prepare: Done 2026-10-24T22:24:16.9879048Z 2026-10-24T22:24:16.9879229Z devDependencies: 2026-10-24T22:24:16.9879395Z + @coderabbitai/config 1.1.0 2026-10-24T22:24:16.9879537Z + @shadcn/lint 0.1.5 2026-10-24T22:24:16.9879693Z + @types/node 24.12.4 2026-10-24T22:24:16.9879818Z + knip 6.34.0 2026-10-24T22:24:16.9879953Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T22:24:16.9880100Z + vite-plus 1.3.0 2026-10-24T22:24:16.9880171Z 2026-10-24T22:24:16.9895113Z Done in 3.6s using pnpm v12.14.0 2026-10-24T22:24:17.0040927Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3626] 2026-10-24T22:24:17.0754389Z ##[group]Run actions/cache@v6 2026-10-24T22:24:17.0754617Z with: 2026-10-24T22:24:17.0754756Z path: ~/.cache/electron 2026-10-24T22:24:17.0755080Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T22:24:17.0755400Z enableCrossOsArchive: false 2026-10-24T22:24:17.0755639Z fail-on-cache-miss: false 2026-10-24T22:24:17.0755836Z lookup-only: false 2026-10-24T22:24:17.0756026Z save-always: false 2026-10-24T22:24:17.0756201Z env: 2026-10-24T22:24:17.0756380Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:17.0756619Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:17.0756849Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:17.0756996Z ##[endgroup] 2026-10-24T22:24:17.2823499Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T22:24:17.4276047Z Received 122906203 of 122906203 (100.0%), 908.6 MBs/sec 2026-10-24T22:24:17.4276681Z Cache Size: ~117 MB (122906203 B) 2026-10-24T22:24:17.4293734Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/9e631d39-5db0-4f86-a75b-9a7f265937ef/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T22:24:17.4811018Z Cache restored successfully 2026-10-24T22:24:17.4928683Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T22:24:17.4991678Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T22:24:17.4991942Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T22:24:17.5008247Z shell: /usr/bin/bash -e {0} 2026-10-24T22:24:17.5008372Z env: 2026-10-24T22:24:17.5008621Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:17.5008770Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:17.5008911Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:17.5009044Z ##[endgroup] 2026-10-24T22:24:17.6552803Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T22:24:18.2122771Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T22:24:18.2139019Z 2026-10-24T22:24:18.2216080Z ##[group]Run vp run knip:check 2026-10-24T22:24:18.2216366Z vp run knip:check 2026-10-24T22:24:18.2232785Z shell: /usr/bin/bash -e {0} 2026-10-24T22:24:18.2232932Z env: 2026-10-24T22:24:18.2233044Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:18.2233192Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:18.2233332Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:18.2233464Z ##[endgroup] 2026-10-24T22:24:18.3644213Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T22:24:21.9861665Z 2026-10-24T22:24:21.9864512Z $ knip --workspace apps/server --workspace apps/desktop --workspace apps/web --workspace packages/client-runtime --workspace packages/contracts --workspace packages/effect-acp --workspace packages/effect-codex-app-server --workspace packages/shared --workspace packages/ssh --workspace packages/tailscale --workspace packages/provider-core --workspace packages/provider-acp --workspace packages/provider-acp-registry --workspace packages/provider-testing --workspace packages/provider-pi --workspace packages/provider-muse --workspace packages/provider-opencode --workspace packages/provider-cursor --workspace packages/provider-grok --workspace packages/source-control-core --workspace packages/source-control-definitions --workspace packages/source-control-azure-devops --workspace packages/source-control-bitbucket --workspace packages/source-control-forgejo --workspace packages/source-control-gitcafe --workspace packages/source-control-github --workspace packages/source-control-gitlab --workspace packages/source-control-testing --exports --preprocessor ./scripts/knip-schemas.ts --no-config-hints ⊘ cache disabled 2026-10-24T22:24:30.0612163Z 2026-10-24T22:24:30.0613491Z --- 2026-10-24T22:24:30.0613776Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T22:24:30.0677223Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T22:24:30.0677501Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T22:24:30.0694423Z shell: /usr/bin/bash -e {0} 2026-10-24T22:24:30.0694576Z env: 2026-10-24T22:24:30.0694689Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:30.0694835Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:30.0694978Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:30.0695111Z ##[endgroup] 2026-10-24T22:24:30.2133393Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T22:24:30.3944203Z 2026-10-24T22:24:30.4039473Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T22:24:30.4039703Z vp run --filter t3 generate --check 2026-10-24T22:24:30.4056050Z shell: /usr/bin/bash -e {0} 2026-10-24T22:24:30.4056179Z env: 2026-10-24T22:24:30.4056302Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:30.4056444Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:30.4056587Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:30.4056717Z ##[endgroup] 2026-10-24T22:24:30.5468800Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T22:24:30.6972718Z 2026-10-24T22:24:30.7038966Z ##[group]Run vp check 2026-10-24T22:24:30.7039190Z vp check 2026-10-24T22:24:30.7056654Z shell: /usr/bin/bash -e {0} 2026-10-24T22:24:30.7056810Z env: 2026-10-24T22:24:30.7056922Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 175 2026-10-24T22:24:30.7057073Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485 2026-10-24T22:24:30.7057214Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T22:24:30.7057348Z ##[endgroup] 2026-10-24T22:24:31.2540557Z pass: All 5751 files are correctly formatted (415ms, 8 threads) 2026-10-24T22:24:36.9327856Z warn: Lint warnings found 2026-10-24T22:24:36.9329097Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9329552Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7] 2026-10-24T22:24:36.9329785Z 10601 │ 2026-10-24T22:24:36.9329947Z 10602 │ const layer: Layer.Layer< 2026-10-24T22:24:36.9330139Z ·  ──┬── 2026-10-24T22:24:36.9330368Z · ╰── 'layer' is declared here 2026-10-24T22:24:36.9330607Z 10603 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T22:24:36.9330856Z ╰──── 2026-10-24T22:24:36.9331032Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9331163Z 2026-10-24T22:24:36.9331397Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T22:24:36.9331753Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T22:24:36.9331997Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T22:24:36.9332205Z 259 │ for (const edit of edits.reverse()) 2026-10-24T22:24:36.9332404Z ·  ─────── 2026-10-24T22:24:36.9332682Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T22:24:36.9332901Z ╰──── 2026-10-24T22:24:36.9333221Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T22:24:36.9333472Z 2026-10-24T22:24:36.9333682Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T22:24:36.9334017Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T22:24:36.9334263Z 289 │ visit(parser.parse(markdown)); 2026-10-24T22:24:36.9334445Z 290 │ for (const edit of edits.reverse()) 2026-10-24T22:24:36.9334639Z ·  ─────── 2026-10-24T22:24:36.9334910Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T22:24:36.9335126Z ╰──── 2026-10-24T22:24:36.9335441Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T22:24:36.9335685Z 2026-10-24T22:24:36.9335896Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T22:24:36.9336220Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T22:24:36.9336435Z 343 │ visit(parser.parse(markdown)); 2026-10-24T22:24:36.9336646Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T22:24:36.9336875Z ·  ─────── 2026-10-24T22:24:36.9337379Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T22:24:36.9337598Z ╰──── 2026-10-24T22:24:36.9337905Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T22:24:36.9338151Z 2026-10-24T22:24:36.9338485Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9338957Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T22:24:36.9339335Z 1443 │ 2026-10-24T22:24:36.9339562Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T22:24:36.9339810Z ·  ───────────────────┬─────────────────── 2026-10-24T22:24:36.9340140Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T22:24:36.9340461Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T22:24:36.9340647Z ╰──── 2026-10-24T22:24:36.9340811Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9340929Z 2026-10-24T22:24:36.9341188Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9341591Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T22:24:36.9341810Z 1679 │ 2026-10-24T22:24:36.9341950Z 1680 │ const layer: Layer.Layer< 2026-10-24T22:24:36.9342115Z ·  ──┬── 2026-10-24T22:24:36.9342328Z · ╰── 'layer' is declared here 2026-10-24T22:24:36.9342560Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T22:24:36.9342725Z ╰──── 2026-10-24T22:24:36.9342889Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9343010Z 2026-10-24T22:24:36.9343229Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T22:24:36.9343560Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T22:24:36.9343791Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T22:24:36.9344042Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T22:24:36.9344367Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T22:24:36.9344579Z 347 │ }; 2026-10-24T22:24:36.9344701Z ╰──── 2026-10-24T22:24:36.9345025Z  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-24T22:24:36.9345278Z 2026-10-24T22:24:36.9345513Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T22:24:36.9345847Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T22:24:36.9346041Z 447 │ const favorites = 2026-10-24T22:24:36.9346234Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T22:24:36.9346439Z ·  ───┬── 2026-10-24T22:24:36.9346689Z · ╰── For this reduce 2026-10-24T22:24:36.9346901Z 449 │ const exists = current.some( 2026-10-24T22:24:36.9347178Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T22:24:36.9347411Z 451 │ ); 2026-10-24T22:24:36.9347554Z 452 │ return change.favorite 2026-10-24T22:24:36.9347706Z 453 │ ? exists 2026-10-24T22:24:36.9347847Z 454 │ ? current 2026-10-24T22:24:36.9348061Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T22:24:36.9348289Z ·  ─────┬──── 2026-10-24T22:24:36.9348506Z · ╰── From this spread 2026-10-24T22:24:36.9348700Z 456 │ : current.filter( 2026-10-24T22:24:36.9348835Z ╰──── 2026-10-24T22:24:36.9349180Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T22:24:36.9349598Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T22:24:36.9349769Z 2026-10-24T22:24:36.9349958Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T22:24:36.9350262Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T22:24:36.9350450Z 464 │ null; 2026-10-24T22:24:36.9350640Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T22:24:36.9350858Z ·  ──────────┬───────── 2026-10-24T22:24:36.9351087Z · ╰── From this accumulator 2026-10-24T22:24:36.9351317Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T22:24:36.9351503Z ·  ─┬─ 2026-10-24T22:24:36.9351693Z · ╰── For this loop 2026-10-24T22:24:36.9351946Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T22:24:36.9352161Z 468 │ hiddenModels: [], 2026-10-24T22:24:36.9352310Z 469 │ modelOrder: [], 2026-10-24T22:24:36.9352459Z 470 │ }; 2026-10-24T22:24:36.9352708Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T22:24:36.9353003Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T22:24:36.9353199Z 473 │ nextModelPreferences = { 2026-10-24T22:24:36.9353373Z 474 │ ...nextModelPreferences, 2026-10-24T22:24:36.9353564Z ·  ───────────┬─────────── 2026-10-24T22:24:36.9353794Z · ╰── From this spread 2026-10-24T22:24:36.9354042Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T22:24:36.9354251Z ╰──── 2026-10-24T22:24:36.9354459Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T22:24:36.9354780Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T22:24:36.9354942Z 2026-10-24T22:24:36.9355145Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9355505Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T22:24:36.9355768Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T22:24:36.9355981Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T22:24:36.9356206Z ·  ──────┬───── 2026-10-24T22:24:36.9356489Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T22:24:36.9356760Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T22:24:36.9356934Z ╰──── 2026-10-24T22:24:36.9357286Z  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-24T22:24:36.9357895Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9358195Z 2026-10-24T22:24:36.9358571Z ⚠ 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-24T22:24:36.9359036Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T22:24:36.9359302Z 145 │ name, 2026-10-24T22:24:36.9359552Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T22:24:36.9359817Z ·  ────────────────────────── 2026-10-24T22:24:36.9360056Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T22:24:36.9360247Z ╰──── 2026-10-24T22:24:36.9360304Z 2026-10-24T22:24:36.9360541Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T22:24:36.9360928Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T22:24:36.9361162Z 261 │ ): boolean { 2026-10-24T22:24:36.9361391Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T22:24:36.9361726Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T22:24:36.9362030Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T22:24:36.9362238Z ╰──── 2026-10-24T22:24:36.9362383Z  help: Switch to `Set` 2026-10-24T22:24:36.9362479Z 2026-10-24T22:24:36.9362650Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T22:24:36.9362967Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T22:24:36.9363284Z 465 │ 2026-10-24T22:24:36.9363459Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T22:24:36.9363651Z ·  ── 2026-10-24T22:24:36.9363800Z 467 │ } 2026-10-24T22:24:36.9363910Z ╰──── 2026-10-24T22:24:36.9364233Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T22:24:36.9364465Z 2026-10-24T22:24:36.9364631Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:36.9364939Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T22:24:36.9365215Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T22:24:36.9365504Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T22:24:36.9365778Z ·  ─────┬──── 2026-10-24T22:24:36.9366078Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9366336Z 141 │ onSelect={(selected) => { 2026-10-24T22:24:36.9366524Z ╰──── 2026-10-24T22:24:36.9366926Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T22:24:36.9367523Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9367808Z 2026-10-24T22:24:36.9367973Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T22:24:36.9368283Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T22:24:36.9368485Z 185 │ 2026-10-24T22:24:36.9368649Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T22:24:36.9368841Z ·  ── 2026-10-24T22:24:36.9368988Z 187 │ } 2026-10-24T22:24:36.9369099Z ╰──── 2026-10-24T22:24:36.9369389Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T22:24:36.9369613Z 2026-10-24T22:24:36.9369779Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T22:24:36.9370083Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T22:24:36.9370287Z 188 │ 2026-10-24T22:24:36.9370413Z 189 │ for (const {} of [ 2026-10-24T22:24:36.9370571Z ·  ── 2026-10-24T22:24:36.9370823Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T22:24:36.9370993Z ╰──── 2026-10-24T22:24:36.9371275Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T22:24:36.9371502Z 2026-10-24T22:24:36.9371676Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T22:24:36.9371983Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T22:24:36.9372185Z 310 │ 2026-10-24T22:24:36.9372376Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T22:24:36.9372586Z ·  ── 2026-10-24T22:24:36.9372725Z 312 │ } 2026-10-24T22:24:36.9372836Z ╰──── 2026-10-24T22:24:36.9373119Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T22:24:36.9373343Z 2026-10-24T22:24:36.9373506Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T22:24:36.9373812Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T22:24:36.9374013Z 313 │ 2026-10-24T22:24:36.9374194Z 314 │ for (const {} of [ 2026-10-24T22:24:36.9374347Z ·  ── 2026-10-24T22:24:36.9374490Z 315 │ { 2026-10-24T22:24:36.9374605Z ╰──── 2026-10-24T22:24:36.9374889Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T22:24:36.9375110Z 2026-10-24T22:24:36.9375281Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:36.9375569Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T22:24:36.9375800Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T22:24:36.9375983Z 1136 │ Date.now(), 2026-10-24T22:24:36.9376153Z ·  ─────┬──── 2026-10-24T22:24:36.9376384Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9376756Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T22:24:36.9376998Z ╰──── 2026-10-24T22:24:36.9377345Z  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-24T22:24:36.9377912Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9378199Z 2026-10-24T22:24:36.9378387Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9378706Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T22:24:36.9379018Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T22:24:36.9379284Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T22:24:36.9379488Z ·  ┬ 2026-10-24T22:24:36.9379719Z · ╰── '_' is declared here 2026-10-24T22:24:36.9379961Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T22:24:36.9380133Z ╰──── 2026-10-24T22:24:36.9380291Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9380408Z 2026-10-24T22:24:36.9380593Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9380911Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T22:24:36.9381111Z 133 │ ); 2026-10-24T22:24:36.9381281Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T22:24:36.9381505Z ·  ┬ 2026-10-24T22:24:36.9381761Z · ╰── '_' is declared here 2026-10-24T22:24:36.9381973Z 135 │ Effect.succeed( 2026-10-24T22:24:36.9382107Z ╰──── 2026-10-24T22:24:36.9382265Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9382384Z 2026-10-24T22:24:36.9382567Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9382889Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T22:24:36.9383092Z 177 │ }); 2026-10-24T22:24:36.9383258Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T22:24:36.9383463Z ·  ┬ 2026-10-24T22:24:36.9383702Z · ╰── '_' is declared here 2026-10-24T22:24:36.9383939Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T22:24:36.9384137Z ╰──── 2026-10-24T22:24:36.9384323Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9384442Z 2026-10-24T22:24:36.9384623Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9384941Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T22:24:36.9385139Z 202 │ ); 2026-10-24T22:24:36.9385307Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T22:24:36.9385515Z ·  ┬ 2026-10-24T22:24:36.9385758Z · ╰── '_' is declared here 2026-10-24T22:24:36.9385976Z 204 │ options.removeWorktreeFails 2026-10-24T22:24:36.9386134Z ╰──── 2026-10-24T22:24:36.9386349Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9386506Z 2026-10-24T22:24:36.9386691Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9387007Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T22:24:36.9387207Z 207 │ ); 2026-10-24T22:24:36.9387378Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T22:24:36.9387597Z ·  ┬ 2026-10-24T22:24:36.9387926Z · ╰── '_' is declared here 2026-10-24T22:24:36.9388174Z 209 │ options.deleteLocalBranchFails 2026-10-24T22:24:36.9388339Z ╰──── 2026-10-24T22:24:36.9388495Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9388613Z 2026-10-24T22:24:36.9388802Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9389122Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T22:24:36.9389329Z 212 │ ); 2026-10-24T22:24:36.9389509Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T22:24:36.9389745Z ·  ┬ 2026-10-24T22:24:36.9390003Z · ╰── '_' is declared here 2026-10-24T22:24:36.9390236Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T22:24:36.9390398Z ╰──── 2026-10-24T22:24:36.9390853Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9391001Z 2026-10-24T22:24:36.9391248Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9391628Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T22:24:36.9391848Z 253 │ ); 2026-10-24T22:24:36.9392013Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T22:24:36.9392232Z ·  ┬ 2026-10-24T22:24:36.9392482Z · ╰── '_' is declared here 2026-10-24T22:24:36.9392693Z 255 │ Effect.succeed({ 2026-10-24T22:24:36.9392836Z ╰──── 2026-10-24T22:24:36.9393006Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9393126Z 2026-10-24T22:24:36.9393321Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:36.9393654Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T22:24:36.9393861Z 263 │ ); 2026-10-24T22:24:36.9394145Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T22:24:36.9394409Z ·  ┬ 2026-10-24T22:24:36.9394659Z · ╰── '_' is declared here 2026-10-24T22:24:36.9394949Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T22:24:36.9395165Z ╰──── 2026-10-24T22:24:36.9395331Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9395454Z 2026-10-24T22:24:36.9395613Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T22:24:36.9395907Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T22:24:36.9396165Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T22:24:36.9396535Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T22:24:36.9396798Z ·  ───────────────────────────── 2026-10-24T22:24:36.9397042Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T22:24:36.9397238Z ╰──── 2026-10-24T22:24:36.9397463Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T22:24:36.9397634Z 2026-10-24T22:24:36.9397940Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9398359Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T22:24:36.9398555Z 217 │ 2026-10-24T22:24:36.9398773Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T22:24:36.9399032Z ·  ──────────┬────────── 2026-10-24T22:24:36.9399307Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T22:24:36.9399664Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T22:24:36.9399918Z ╰──── 2026-10-24T22:24:36.9400084Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9400210Z 2026-10-24T22:24:36.9400528Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9400950Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T22:24:36.9401140Z 220 │ 2026-10-24T22:24:36.9401340Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T22:24:36.9401592Z ·  ──────────────┬────────────── 2026-10-24T22:24:36.9401891Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T22:24:36.9402234Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T22:24:36.9402464Z ╰──── 2026-10-24T22:24:36.9402624Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9402746Z 2026-10-24T22:24:36.9403184Z ⚠ 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-24T22:24:36.9403741Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T22:24:36.9403983Z 262 │ ...(update._meta !== undefined 2026-10-24T22:24:36.9404303Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T22:24:36.9404575Z ·  ───────── 2026-10-24T22:24:36.9404748Z 264 │ : {}), 2026-10-24T22:24:36.9404881Z ╰──── 2026-10-24T22:24:36.9404937Z 2026-10-24T22:24:36.9405206Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9405612Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T22:24:36.9405914Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T22:24:36.9406137Z 356 │ useEffect(() => { 2026-10-24T22:24:36.9406296Z ·  ────┬──── 2026-10-24T22:24:36.9406517Z · ╰── This is the containing effect 2026-10-24T22:24:36.9406752Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T22:24:36.9406987Z 358 │ return; 2026-10-24T22:24:36.9407156Z 359 │ } 2026-10-24T22:24:36.9407320Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T22:24:36.9407536Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T22:24:36.9407757Z ·  ──────────────┬────────────── 2026-10-24T22:24:36.9408051Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9408285Z 362 │ return; 2026-10-24T22:24:36.9408416Z ╰──── 2026-10-24T22:24:36.9409081Z  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-24T22:24:36.9409972Z  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-24T22:24:36.9410294Z 2026-10-24T22:24:36.9410555Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9411062Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T22:24:36.9411282Z 447 │ 2026-10-24T22:24:36.9411415Z 448 │ useEffect(() => { 2026-10-24T22:24:36.9411573Z ·  ────┬──── 2026-10-24T22:24:36.9411793Z · ╰── This is the containing effect 2026-10-24T22:24:36.9412038Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T22:24:36.9412219Z 450 │ return; 2026-10-24T22:24:36.9412352Z 451 │ } 2026-10-24T22:24:36.9412569Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T22:24:36.9412870Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T22:24:36.9413130Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T22:24:36.9413315Z 455 │ } 2026-10-24T22:24:36.9413524Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T22:24:36.9413819Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T22:24:36.9414070Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T22:24:36.9414310Z 459 │ const directProject = 2026-10-24T22:24:36.9414474Z 460 │ projects.find( 2026-10-24T22:24:36.9414629Z 461 │ (project) => 2026-10-24T22:24:36.9414895Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T22:24:36.9415147Z 463 │ ) ?? null; 2026-10-24T22:24:36.9415289Z 464 │ 2026-10-24T22:24:36.9415422Z 465 │ if (directProject) { 2026-10-24T22:24:36.9415660Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T22:24:36.9415958Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T22:24:36.9416281Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T22:24:36.9416591Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T22:24:36.9416811Z 470 │ return; 2026-10-24T22:24:36.9416951Z 471 │ } 2026-10-24T22:24:36.9417124Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T22:24:36.9417306Z 473 │ if ( 2026-10-24T22:24:36.9417629Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T22:24:36.9417944Z 475 │ selectedProject.id !== directProject.id 2026-10-24T22:24:36.9418123Z 476 │ ) { 2026-10-24T22:24:36.9418289Z 477 │ setProject(directProject); 2026-10-24T22:24:36.9418460Z 478 │ return; 2026-10-24T22:24:36.9418610Z 479 │ } 2026-10-24T22:24:36.9418766Z 480 │ if (!flow.draftKey) return; 2026-10-24T22:24:36.9419018Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T22:24:36.9419319Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T22:24:36.9419601Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T22:24:36.9419813Z 484 │ workspaceSelection: { 2026-10-24T22:24:36.9419988Z 485 │ mode: "local", 2026-10-24T22:24:36.9420202Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T22:24:36.9420480Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T22:24:36.9420731Z 488 │ startFromOrigin: false, 2026-10-24T22:24:36.9420897Z 489 │ }, 2026-10-24T22:24:36.9421046Z 490 │ }); 2026-10-24T22:24:36.9421186Z 491 │ } 2026-10-24T22:24:36.9421415Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T22:24:36.9421631Z 493 │ if ( 2026-10-24T22:24:36.9421861Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T22:24:36.9422136Z 495 │ selectedProject.id === directProject.id 2026-10-24T22:24:36.9422327Z 496 │ ) { 2026-10-24T22:24:36.9422475Z 497 │ return; 2026-10-24T22:24:36.9422616Z 498 │ } 2026-10-24T22:24:36.9422790Z 499 │ setProject(directProject); 2026-10-24T22:24:36.9422969Z 500 │ return; 2026-10-24T22:24:36.9423117Z 501 │ } 2026-10-24T22:24:36.9423250Z 502 │ 2026-10-24T22:24:36.9423401Z 503 │ if (projects.length > 0) { 2026-10-24T22:24:36.9423618Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T22:24:36.9423864Z ·  ──────────────┬────────────── 2026-10-24T22:24:36.9424217Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9424463Z 505 │ } 2026-10-24T22:24:36.9424592Z ╰──── 2026-10-24T22:24:36.9425340Z  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-24T22:24:36.9426293Z  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-24T22:24:36.9426616Z 2026-10-24T22:24:36.9426890Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9427317Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T22:24:36.9427543Z 545 │ 2026-10-24T22:24:36.9427678Z 546 │ useEffect(() => { 2026-10-24T22:24:36.9427842Z ·  ────┬──── 2026-10-24T22:24:36.9443804Z · ╰── This is the containing effect 2026-10-24T22:24:36.9444134Z 547 │ const shareId = props.incomingShareId; 2026-10-24T22:24:36.9444383Z 548 │ const draftKey = flow.draftKey; 2026-10-24T22:24:36.9444654Z 549 │ const destinationProject = selectedProject; 2026-10-24T22:24:36.9444937Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T22:24:36.9445239Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T22:24:36.9445483Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T22:24:36.9445679Z 553 │ !initialEnvironmentId || 2026-10-24T22:24:36.9445854Z 554 │ !initialProjectId || 2026-10-24T22:24:36.9446095Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T22:24:36.9446361Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T22:24:36.9446552Z 557 │ if ( 2026-10-24T22:24:36.9446691Z 558 │ !shareId || 2026-10-24T22:24:36.9446841Z 559 │ !draftKey || 2026-10-24T22:24:36.9447010Z 560 │ !destinationProject || 2026-10-24T22:24:36.9447201Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T22:24:36.9447410Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T22:24:36.9447581Z 563 │ ) { 2026-10-24T22:24:36.9447714Z 564 │ return; 2026-10-24T22:24:36.9447847Z 565 │ } 2026-10-24T22:24:36.9448019Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T22:24:36.9448197Z 567 │ if ( 2026-10-24T22:24:36.9448390Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T22:24:36.9448652Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T22:24:36.9448848Z 570 │ ) { 2026-10-24T22:24:36.9448985Z 571 │ return; 2026-10-24T22:24:36.9449121Z 572 │ } 2026-10-24T22:24:36.9449247Z 573 │ 2026-10-24T22:24:36.9449384Z 574 │ if (!incomingShare) { 2026-10-24T22:24:36.9449694Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T22:24:36.9450055Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T22:24:36.9450283Z 577 │ Dialog.alert( 2026-10-24T22:24:36.9450468Z 578 │ "Shared content unavailable", 2026-10-24T22:24:36.9450837Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T22:24:36.9451084Z 580 │ ); 2026-10-24T22:24:36.9451214Z 581 │ } 2026-10-24T22:24:36.9451345Z 582 │ return; 2026-10-24T22:24:36.9451476Z 583 │ } 2026-10-24T22:24:36.9451599Z 584 │ 2026-10-24T22:24:36.9451718Z 585 │ if ( 2026-10-24T22:24:36.9451955Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T22:24:36.9452364Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T22:24:36.9452594Z 588 │ ) { 2026-10-24T22:24:36.9452727Z 589 │ return; 2026-10-24T22:24:36.9452859Z 590 │ } 2026-10-24T22:24:36.9452980Z 591 │ 2026-10-24T22:24:36.9453185Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T22:24:36.9453469Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T22:24:36.9453667Z 594 │ } 2026-10-24T22:24:36.9453843Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T22:24:36.9454045Z 596 │ const draftBackup = 2026-10-24T22:24:36.9454368Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T22:24:36.9454713Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T22:24:36.9454962Z 599 │ const importToken = Symbol(importKey); 2026-10-24T22:24:36.9455162Z 600 │ let didReserveShare = false; 2026-10-24T22:24:36.9455348Z 601 │ let didConsumeShare = false; 2026-10-24T22:24:36.9455533Z 602 │ let needsDraftRestore = false; 2026-10-24T22:24:36.9455753Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T22:24:36.9455974Z 604 │ setImportingShareKey(importKey); 2026-10-24T22:24:36.9456180Z ·  ──────────┬───────── 2026-10-24T22:24:36.9456474Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9456725Z 605 │ void (async () => { 2026-10-24T22:24:36.9456868Z ╰──── 2026-10-24T22:24:36.9457563Z  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-24T22:24:36.9458460Z  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-24T22:24:36.9458786Z 2026-10-24T22:24:36.9459003Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9459380Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T22:24:36.9459625Z 523 │ props.initialProjectRef, 2026-10-24T22:24:36.9459801Z 524 │ props.incomingShareId, 2026-10-24T22:24:36.9459994Z ·  ──────────┬────────── 2026-10-24T22:24:36.9460276Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T22:24:36.9460536Z 525 │ props.pendingTaskId, 2026-10-24T22:24:36.9460690Z ╰──── 2026-10-24T22:24:36.9461059Z  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-24T22:24:36.9461669Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9461981Z 2026-10-24T22:24:36.9462209Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T22:24:36.9462589Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T22:24:36.9462882Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T22:24:36.9463095Z 543 │ flow.loadBranches(); 2026-10-24T22:24:36.9463403Z ·  ──┬─ 2026-10-24T22:24:36.9463661Z · ╰── Missing dependency `flow` 2026-10-24T22:24:36.9463903Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T22:24:36.9464149Z ·  ────────┬──────── 2026-10-24T22:24:36.9464467Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T22:24:36.9464729Z 545 │ 2026-10-24T22:24:36.9464851Z ╰──── 2026-10-24T22:24:36.9465343Z  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-24T22:24:36.9466076Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9466386Z 2026-10-24T22:24:36.9466600Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9466967Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T22:24:36.9467201Z 765 │ flow.draftKey, 2026-10-24T22:24:36.9467370Z 766 │ hasImportedIncomingShare, 2026-10-24T22:24:36.9467571Z ·  ────────────┬─────────── 2026-10-24T22:24:36.9467862Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T22:24:36.9468112Z 767 │ incomingShare, 2026-10-24T22:24:36.9468283Z 768 │ isIncomingShareInboxLoading, 2026-10-24T22:24:36.9468497Z ·  ─────────────┬───────────── 2026-10-24T22:24:36.9468807Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T22:24:36.9469081Z 769 │ isIncomingShareUnavailable, 2026-10-24T22:24:36.9469261Z 770 │ props.incomingShareId, 2026-10-24T22:24:36.9469459Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T22:24:36.9469679Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T22:24:36.9469872Z 773 │ releaseShareReservation, 2026-10-24T22:24:36.9470039Z 774 │ reserveShare, 2026-10-24T22:24:36.9470215Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T22:24:36.9470404Z 776 │ selectedProject, 2026-10-24T22:24:36.9470566Z 777 │ shareImportAttempt, 2026-10-24T22:24:36.9470757Z ·  ─────────┬──────── 2026-10-24T22:24:36.9471034Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T22:24:36.9471269Z 778 │ ]); 2026-10-24T22:24:36.9471401Z ╰──── 2026-10-24T22:24:36.9471777Z  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-24T22:24:36.9472394Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9472709Z 2026-10-24T22:24:36.9472918Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:36.9473274Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T22:24:36.9473535Z 35 │ { 2026-10-24T22:24:36.9476020Z ·  ────┬──── 2026-10-24T22:24:36.9476260Z · ╰── This is the containing effect 2026-10-24T22:24:36.9476469Z 261 │ stop(); 2026-10-24T22:24:36.9476624Z ·  ──┬─ 2026-10-24T22:24:36.9476899Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9477148Z 262 │ }, [orderVersion]); 2026-10-24T22:24:36.9477295Z ╰──── 2026-10-24T22:24:36.9477986Z  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-24T22:24:36.9478892Z  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-24T22:24:36.9479214Z 2026-10-24T22:24:36.9479446Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T22:24:36.9479851Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T22:24:36.9480111Z 260 │ useEffect(() => { 2026-10-24T22:24:36.9480265Z 261 │ stop(); 2026-10-24T22:24:36.9480416Z ·  ──┬─ 2026-10-24T22:24:36.9480643Z · ╰── Missing dependency `stop` 2026-10-24T22:24:36.9480857Z 262 │ }, [orderVersion]); 2026-10-24T22:24:36.9481031Z ·  ──────┬───── 2026-10-24T22:24:36.9481291Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T22:24:36.9481523Z 263 │ useEffect( 2026-10-24T22:24:36.9481661Z ╰──── 2026-10-24T22:24:36.9482182Z  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-24T22:24:36.9482936Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9483260Z 2026-10-24T22:24:36.9483424Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9483758Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T22:24:36.9484022Z 95 │ const latest = useRef(props); 2026-10-24T22:24:36.9484249Z 96 │ latest.current = props; 2026-10-24T22:24:36.9484469Z ·  ───┬──────┬─── 2026-10-24T22:24:36.9484793Z · │ ╰── Cannot update ref value during render 2026-10-24T22:24:36.9485177Z · ╰── This value is a ref 2026-10-24T22:24:36.9485431Z 97 │ const gesture = useMemo( 2026-10-24T22:24:36.9485587Z ╰──── 2026-10-24T22:24:36.9486157Z  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-24T22:24:36.9486933Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9487238Z 2026-10-24T22:24:36.9487397Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9487739Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T22:24:36.9487995Z 103 │ .runOnJS(true) 2026-10-24T22:24:36.9488209Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T22:24:36.9488470Z ·  ───────────────┬────────────── 2026-10-24T22:24:36.9488831Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:36.9489188Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9489406Z ╰──── 2026-10-24T22:24:36.9489974Z  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-24T22:24:36.9490819Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9491125Z 2026-10-24T22:24:36.9491282Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9491623Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T22:24:36.9491912Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T22:24:36.9492193Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9492515Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T22:24:36.9492909Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:36.9493266Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9493476Z ╰──── 2026-10-24T22:24:36.9494151Z  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-24T22:24:36.9494981Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9495288Z 2026-10-24T22:24:36.9495444Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9495789Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T22:24:36.9496114Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9496410Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9496728Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T22:24:36.9497122Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:36.9497474Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T22:24:36.9497689Z ╰──── 2026-10-24T22:24:36.9498264Z  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-24T22:24:36.9499042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9499349Z 2026-10-24T22:24:36.9499512Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9499865Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T22:24:36.9500189Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9500481Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T22:24:36.9500791Z ·  ───────────────────────┬────────────────────── 2026-10-24T22:24:36.9501190Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:36.9501487Z 108 │ [props.disabled], 2026-10-24T22:24:36.9501647Z ╰──── 2026-10-24T22:24:36.9502227Z  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-24T22:24:36.9503022Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9503331Z 2026-10-24T22:24:36.9503489Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9503835Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T22:24:36.9504160Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T22:24:36.9504454Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T22:24:36.9504708Z ·  ───┬──────┬─── 2026-10-24T22:24:36.9505097Z · │ ╰── Cannot update ref value during render 2026-10-24T22:24:36.9505457Z · ╰── This value is a ref 2026-10-24T22:24:36.9505656Z 250 │ 2026-10-24T22:24:36.9505785Z ╰──── 2026-10-24T22:24:36.9506360Z  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-24T22:24:36.9507147Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9507460Z 2026-10-24T22:24:36.9507622Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9507970Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T22:24:36.9508298Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T22:24:36.9508578Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T22:24:36.9508866Z ·  ──────────────────┬────────────────── 2026-10-24T22:24:36.9509195Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9509502Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T22:24:36.9509700Z ╰──── 2026-10-24T22:24:36.9510274Z  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-24T22:24:36.9511063Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9511376Z 2026-10-24T22:24:36.9511567Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:36.9511937Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T22:24:36.9512198Z 323 │ update(0); 2026-10-24T22:24:36.9512377Z 324 │ let last = performance.now(); 2026-10-24T22:24:36.9512602Z ·  ────────┬──────── 2026-10-24T22:24:36.9512879Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9513115Z 325 │ const tick = () => { 2026-10-24T22:24:36.9513273Z ╰──── 2026-10-24T22:24:36.9513674Z  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-24T22:24:36.9514365Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9514676Z 2026-10-24T22:24:36.9514890Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T22:24:36.9515274Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T22:24:36.9515523Z  98 │ () => 2026-10-24T22:24:36.9515680Z  99 │ Gesture.Pan() 2026-10-24T22:24:36.9515859Z ·  ─┬─ 2026-10-24T22:24:36.9516115Z · ╰── `Pan` may be a component 2026-10-24T22:24:36.9516415Z 100 │ .enabled(!props.disabled) 2026-10-24T22:24:36.9516617Z ╰──── 2026-10-24T22:24:36.9516987Z  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-24T22:24:36.9517766Z  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-24T22:24:36.9518215Z 2026-10-24T22:24:36.9518424Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T22:24:36.9518810Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T22:24:36.9519069Z 103 │ .runOnJS(true) 2026-10-24T22:24:36.9519277Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T22:24:36.9519511Z ·  ───┬── 2026-10-24T22:24:36.9520111Z · ╰── 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-24T22:24:36.9520686Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9520984Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T22:24:36.9521270Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T22:24:36.9521501Z 108 │ [props.disabled], 2026-10-24T22:24:36.9521696Z ·  ────────┬─────── 2026-10-24T22:24:36.9522018Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:36.9522284Z 109 │ ); 2026-10-24T22:24:36.9522417Z ╰──── 2026-10-24T22:24:36.9522704Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T22:24:36.9523272Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9523602Z 2026-10-24T22:24:36.9524116Z ⚠ 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-24T22:24:36.9524756Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T22:24:36.9525074Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T22:24:36.9525439Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T22:24:36.9525767Z ·  ──────────────────────── 2026-10-24T22:24:36.9525971Z 182 │ version: 1, 2026-10-24T22:24:36.9526116Z ╰──── 2026-10-24T22:24:36.9526179Z 2026-10-24T22:24:36.9526488Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9526957Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T22:24:36.9527196Z 14 │ 2026-10-24T22:24:36.9527352Z 15 │ const legacyCredentials = { 2026-10-24T22:24:36.9527551Z ·  ────────┬──────── 2026-10-24T22:24:36.9527893Z · ╰── 'legacyCredentials' is declared here 2026-10-24T22:24:36.9528225Z 16 │ version: 1 as const, 2026-10-24T22:24:36.9528378Z ╰──── 2026-10-24T22:24:36.9528556Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9528688Z 2026-10-24T22:24:36.9529204Z ⚠ 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-24T22:24:36.9529862Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T22:24:36.9530145Z 222 │ let idlePasses = 0; 2026-10-24T22:24:36.9530413Z 223 │ ╭─▶ for (;;) { 2026-10-24T22:24:36.9531147Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T22:24:36.9531505Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T22:24:36.9531797Z 226 │ │ if (!pending) { 2026-10-24T22:24:36.9532030Z 227 │ │ idlePasses++; 2026-10-24T22:24:36.9532276Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T22:24:36.9532501Z 229 │ │ return; 2026-10-24T22:24:36.9532703Z 230 │ │ } 2026-10-24T22:24:36.9532908Z 231 │ │ continue; 2026-10-24T22:24:36.9533105Z 232 │ │ } 2026-10-24T22:24:36.9533317Z 233 │ │ idlePasses = 0; 2026-10-24T22:24:36.9533566Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T22:24:36.9533961Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T22:24:36.9534315Z 236 │ │ ); 2026-10-24T22:24:36.9534542Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T22:24:36.9534794Z 238 │ │ pending.resolve(exit); 2026-10-24T22:24:36.9535012Z 239 │ │ }); 2026-10-24T22:24:36.9535264Z 240 │ ╰─▶ } 2026-10-24T22:24:36.9535482Z 241 │ }, 2026-10-24T22:24:36.9535619Z ╰──── 2026-10-24T22:24:36.9535683Z 2026-10-24T22:24:36.9535897Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T22:24:36.9536282Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T22:24:36.9536659Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T22:24:36.9536945Z 602 │ const gesture = Gesture.Pan() 2026-10-24T22:24:36.9537152Z ·  ─┬─ 2026-10-24T22:24:36.9537427Z · ╰── `Pan` may be a component 2026-10-24T22:24:36.9537669Z 603 │ .enabled(!props.disabled) 2026-10-24T22:24:36.9537844Z ╰──── 2026-10-24T22:24:36.9538217Z  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-24T22:24:36.9539003Z  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-24T22:24:36.9539452Z 2026-10-24T22:24:36.9539845Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T22:24:36.9540332Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T22:24:36.9540551Z 284 │ }, 2026-10-24T22:24:36.9540721Z 285 │ (effect, flow, stopSessions) => 2026-10-24T22:24:36.9540937Z ·  ──────┬───── 2026-10-24T22:24:36.9541223Z · ╰── 'stopSessions' is declared here 2026-10-24T22:24:36.9541459Z 286 │ effect.pipe( 2026-10-24T22:24:36.9541613Z ╰──── 2026-10-24T22:24:36.9541787Z  help: Consider removing this parameter. 2026-10-24T22:24:36.9541918Z 2026-10-24T22:24:36.9542133Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T22:24:36.9542489Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T22:24:36.9542748Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T22:24:36.9542966Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T22:24:36.9543175Z ·  ──┬── 2026-10-24T22:24:36.9543431Z · ╰── 'Scope' is imported here 2026-10-24T22:24:36.9543675Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T22:24:36.9543851Z ╰──── 2026-10-24T22:24:36.9544020Z  help: Consider removing this import. 2026-10-24T22:24:36.9544161Z 2026-10-24T22:24:36.9544598Z ⚠ 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-24T22:24:36.9545093Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T22:24:36.9545411Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T22:24:36.9545782Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T22:24:36.9546087Z ·  ──────────────────────── 2026-10-24T22:24:36.9546285Z 18 │ "review:write", 2026-10-24T22:24:36.9546436Z ╰──── 2026-10-24T22:24:36.9546496Z 2026-10-24T22:24:36.9546895Z ⚠ 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-24T22:24:36.9547385Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T22:24:36.9547589Z 19 │ ]); 2026-10-24T22:24:36.9547912Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T22:24:36.9548256Z ·  ──────────────────────── 2026-10-24T22:24:36.9548531Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T22:24:36.9548747Z ╰──── 2026-10-24T22:24:36.9548810Z 2026-10-24T22:24:36.9549209Z ⚠ 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-24T22:24:36.9549691Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T22:24:36.9550017Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T22:24:36.9550349Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T22:24:36.9550630Z ·  ──────────────────────── 2026-10-24T22:24:36.9550840Z 59 │ authenticated: true, 2026-10-24T22:24:36.9550993Z ╰──── 2026-10-24T22:24:36.9551059Z 2026-10-24T22:24:36.9551220Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9551559Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T22:24:36.9551808Z 276 │ 2026-10-24T22:24:36.9552080Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T22:24:36.9552385Z 278 │ │ ...nativeProps, 2026-10-24T22:24:36.9552668Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T22:24:36.9552941Z 280 │ │ ref: nativeRef, 2026-10-24T22:24:36.9553213Z 281 │ ├─▶ }); 2026-10-24T22:24:36.9553636Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T22:24:36.9553943Z 282 │ } 2026-10-24T22:24:36.9554085Z ╰──── 2026-10-24T22:24:36.9554694Z  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-24T22:24:36.9555489Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9555800Z 2026-10-24T22:24:36.9556036Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T22:24:36.9556382Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T22:24:36.9556588Z 296 │ } from "./device.ts"; 2026-10-24T22:24:36.9556788Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T22:24:36.9556987Z ·  ── 2026-10-24T22:24:36.9557151Z 298 │ import { 2026-10-24T22:24:36.9557282Z ╰──── 2026-10-24T22:24:36.9557433Z  help: Remove empty braces 2026-10-24T22:24:36.9557548Z 2026-10-24T22:24:36.9557837Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9558288Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T22:24:36.9558542Z 434 │ : null; 2026-10-24T22:24:36.9558698Z 435 │ useEffect(() => { 2026-10-24T22:24:36.9558936Z ·  ────┬──── 2026-10-24T22:24:36.9559214Z · ╰── This is the containing effect 2026-10-24T22:24:36.9559433Z 436 │ if ( 2026-10-24T22:24:36.9559594Z 437 │ props.active === false || 2026-10-24T22:24:36.9559789Z 438 │ activeDraftKey !== null || 2026-10-24T22:24:36.9559989Z 439 │ editingPendingTask !== null || 2026-10-24T22:24:36.9560188Z 440 │ selectedProject === null 2026-10-24T22:24:36.9560358Z 441 │ ) { 2026-10-24T22:24:36.9560501Z 442 │ return; 2026-10-24T22:24:36.9560646Z 443 │ } 2026-10-24T22:24:36.9560795Z 444 │ setActiveDraftKey( 2026-10-24T22:24:36.9560985Z ·  ────────┬──────── 2026-10-24T22:24:36.9561279Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9561546Z 445 │ createNewTaskDraft({ 2026-10-24T22:24:36.9561708Z ╰──── 2026-10-24T22:24:36.9562431Z  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-24T22:24:36.9563369Z  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-24T22:24:36.9563709Z 2026-10-24T22:24:36.9563984Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T22:24:36.9564466Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T22:24:36.9564779Z 1243 │ 2026-10-24T22:24:36.9565126Z 1244 │ {props.children} 2026-10-24T22:24:36.9565469Z ·  ───────────── 2026-10-24T22:24:36.9565684Z 1245 │ 2026-10-24T22:24:36.9565847Z ╰──── 2026-10-24T22:24:36.9566154Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T22:24:36.9566548Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T22:24:36.9566740Z 2026-10-24T22:24:36.9566964Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9567334Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T22:24:36.9567593Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T22:24:36.9567828Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T22:24:36.9568124Z ·  ──────┬────── ────┬─── 2026-10-24T22:24:36.9568504Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T22:24:36.9568871Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T22:24:36.9569100Z 455 │ const { 2026-10-24T22:24:36.9569238Z ╰──── 2026-10-24T22:24:36.9569622Z  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-24T22:24:36.9570346Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9570761Z 2026-10-24T22:24:36.9570966Z ⚠ react(static-components): Cannot create components during render 2026-10-24T22:24:36.9571325Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T22:24:36.9571558Z 492 │ // same check. 2026-10-24T22:24:36.9571794Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T22:24:36.9572087Z ·  ─────────────┬───────────── 2026-10-24T22:24:36.9572434Z · ╰── The component is created during render here 2026-10-24T22:24:36.9572790Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T22:24:36.9573115Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T22:24:36.9573418Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T22:24:36.9573682Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T22:24:36.9573895Z 498 │ setIsPullRefreshing(true); 2026-10-24T22:24:36.9574128Z 499 │ await refreshSelectedSection(); 2026-10-24T22:24:36.9574324Z 500 │ setIsPullRefreshing(false); 2026-10-24T22:24:36.9574492Z 501 │ }; 2026-10-24T22:24:36.9574725Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T22:24:36.9575057Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T22:24:36.9575352Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T22:24:36.9575585Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T22:24:36.9575812Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T22:24:36.9576009Z 507 │ files: reviewFiles, 2026-10-24T22:24:36.9576218Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T22:24:36.9576497Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T22:24:36.9576731Z 510 │ : undefined, 2026-10-24T22:24:36.9576927Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T22:24:36.9577193Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T22:24:36.9577414Z 513 │ : undefined, 2026-10-24T22:24:36.9577563Z 514 │ }); 2026-10-24T22:24:36.9577849Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T22:24:36.9578211Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T22:24:36.9578449Z 517 │ environmentId, 2026-10-24T22:24:36.9578613Z 518 │ threadId, 2026-10-24T22:24:36.9578773Z 519 │ selectedSection, 2026-10-24T22:24:36.9578943Z 520 │ nativeReviewDiffData, 2026-10-24T22:24:36.9579106Z 521 │ }); 2026-10-24T22:24:36.9579292Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T22:24:36.9579524Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T22:24:36.9579742Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T22:24:36.9579949Z 525 │ diff: selectedSection?.diff, 2026-10-24T22:24:36.9580145Z 526 │ data: nativeReviewDiffData, 2026-10-24T22:24:36.9580330Z 527 │ collapsedFileIds, 2026-10-24T22:24:36.9580498Z 528 │ viewedFileIds, 2026-10-24T22:24:36.9580712Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T22:24:36.9580962Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T22:24:36.9581152Z 531 │ }); 2026-10-24T22:24:36.9581383Z 532 │ const showcaseReviewKey = 2026-10-24T22:24:36.9581682Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T22:24:36.9582076Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T22:24:36.9582375Z 535 │ : null; 2026-10-24T22:24:36.9582643Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T22:24:36.9582926Z 537 │ nativeBridge.onDebug(event); 2026-10-24T22:24:36.9583098Z 538 │ if ( 2026-10-24T22:24:36.9583268Z 539 │ showcaseReviewKey === null || 2026-10-24T22:24:36.9583516Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T22:24:36.9583797Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T22:24:36.9583999Z 542 │ ) { 2026-10-24T22:24:36.9584152Z 543 │ return; 2026-10-24T22:24:36.9584332Z 544 │ } 2026-10-24T22:24:36.9584531Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T22:24:36.9584859Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T22:24:36.9585111Z 547 │ }; 2026-10-24T22:24:36.9585236Z 548 │ 2026-10-24T22:24:36.9585431Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T22:24:36.9585667Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T22:24:36.9585877Z 551 │ commentSelection.clearSelection(); 2026-10-24T22:24:36.9586128Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T22:24:36.9586363Z 553 │ toggleExpandedFile(fileId); 2026-10-24T22:24:36.9586533Z 554 │ } 2026-10-24T22:24:36.9586733Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T22:24:36.9586961Z 556 │ if (!nativeView) return; 2026-10-24T22:24:36.9587167Z 557 │ const result = await settlePromise(() => 2026-10-24T22:24:36.9587479Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T22:24:36.9587740Z 559 │ ); 2026-10-24T22:24:36.9587908Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T22:24:36.9588226Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T22:24:36.9588490Z 562 │ } 2026-10-24T22:24:36.9588622Z 563 │ }; 2026-10-24T22:24:36.9588785Z 564 │ const handleVisibleFileChange = ( 2026-10-24T22:24:36.9589045Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T22:24:36.9589271Z 566 │ ) => { 2026-10-24T22:24:36.9589465Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T22:24:36.9589796Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T22:24:36.9590053Z 569 │ }; 2026-10-24T22:24:36.9590208Z 570 │ const renderInspector = () => ( 2026-10-24T22:24:36.9590394Z 571 │ void handleSelectFile(fileId)} 2026-10-24T22:24:36.9591654Z 577 │ /> 2026-10-24T22:24:36.9591780Z 578 │ ); 2026-10-24T22:24:36.9591907Z 579 │ 2026-10-24T22:24:36.9592174Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T22:24:36.9592542Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T22:24:36.9592758Z 582 │ if (fileId) { 2026-10-24T22:24:36.9592934Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T22:24:36.9593131Z 584 │ toggleExpandedFile(fileId); 2026-10-24T22:24:36.9593295Z 585 │ } 2026-10-24T22:24:36.9593424Z 586 │ }; 2026-10-24T22:24:36.9593547Z 587 │ 2026-10-24T22:24:36.9593714Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T22:24:36.9593963Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T22:24:36.9594209Z 590 │ ) => { 2026-10-24T22:24:36.9594376Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T22:24:36.9594559Z 592 │ if (fileId) { 2026-10-24T22:24:36.9594735Z 593 │ toggleViewedFile(fileId); 2026-10-24T22:24:36.9594900Z 594 │ } 2026-10-24T22:24:36.9595029Z 595 │ }; 2026-10-24T22:24:36.9595157Z 596 │ 2026-10-24T22:24:36.9595304Z 597 │ const parsedDiffNotice = 2026-10-24T22:24:36.9595659Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T22:24:36.9595977Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T22:24:36.9596304Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T22:24:36.9596628Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T22:24:36.9596955Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T22:24:36.9597265Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T22:24:36.9597517Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T22:24:36.9597726Z 605 │ hasCachedSelectedDiff, 2026-10-24T22:24:36.9597901Z 606 │ hasAnyCachedDiff, 2026-10-24T22:24:36.9598060Z 607 │ }); 2026-10-24T22:24:36.9598227Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T22:24:36.9598436Z 609 │ void retryEnvironment(environmentId); 2026-10-24T22:24:36.9598610Z 610 │ }; 2026-10-24T22:24:36.9598768Z 611 │ const handleReturnToThread = () => { 2026-10-24T22:24:36.9598967Z 612 │ if (navigation.canGoBack()) { 2026-10-24T22:24:36.9599150Z 613 │ navigation.goBack(); 2026-10-24T22:24:36.9599310Z 614 │ return; 2026-10-24T22:24:36.9599452Z 615 │ } 2026-10-24T22:24:36.9599609Z 616 │ navigation.navigate("Thread", { 2026-10-24T22:24:36.9599820Z 617 │ environmentId: String(environmentId), 2026-10-24T22:24:36.9600023Z 618 │ threadId: String(threadId), 2026-10-24T22:24:36.9600191Z 619 │ }); 2026-10-24T22:24:36.9600322Z 620 │ }; 2026-10-24T22:24:36.9600475Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T22:24:36.9600669Z 622 │ selectedSection?.title, 2026-10-24T22:24:36.9600858Z 623 │ headerDiffSummary.additions, 2026-10-24T22:24:36.9601060Z 624 │ headerDiffSummary.deletions, 2026-10-24T22:24:36.9601226Z 625 │ ] 2026-10-24T22:24:36.9601418Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T22:24:36.9601619Z 627 │ .join(" · "); 2026-10-24T22:24:36.9601765Z 628 │ 2026-10-24T22:24:36.9601913Z 629 │ const showChangedFilesPane = 2026-10-24T22:24:36.9602101Z 630 │ !showConnectionNotice && 2026-10-24T22:24:36.9602290Z 631 │ selectedSection !== null && 2026-10-24T22:24:36.9602482Z 632 │ parsedDiff.kind === "files" && 2026-10-24T22:24:36.9602679Z 633 │ NativeReviewDiffView !== null; 2026-10-24T22:24:36.9602978Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T22:24:36.9603438Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T22:24:36.9603727Z 636 │ 2026-10-24T22:24:36.9603876Z 637 │ const listHeader = (() => { 2026-10-24T22:24:36.9604104Z 638 │ const children: ReactElement[] = []; 2026-10-24T22:24:36.9604280Z 639 │ 2026-10-24T22:24:36.9604417Z 640 │ if (error) { 2026-10-24T22:24:36.9604579Z 641 │ children.push( 2026-10-24T22:24:36.9604745Z 642 │ 2026-10-24T22:24:36.9606181Z 649 │ Review unavailable 2026-10-24T22:24:36.9606539Z 650 │ {error} 2026-10-24T22:24:36.9606786Z 651 │ , 2026-10-24T22:24:36.9606930Z 652 │ ); 2026-10-24T22:24:36.9607063Z 653 │ } 2026-10-24T22:24:36.9607188Z 654 │ 2026-10-24T22:24:36.9607330Z 655 │ if (parsedDiffNotice) { 2026-10-24T22:24:36.9607601Z 656 │ children.push(); 2026-10-24T22:24:36.9607849Z 657 │ } 2026-10-24T22:24:36.9607979Z 658 │ 2026-10-24T22:24:36.9608126Z 659 │ if (children.length === 0) { 2026-10-24T22:24:36.9608306Z 660 │ return null; 2026-10-24T22:24:36.9608453Z 661 │ } 2026-10-24T22:24:36.9608582Z 662 │ 2026-10-24T22:24:36.9608728Z 663 │ return <>{children}; 2026-10-24T22:24:36.9608890Z 664 │ })(); 2026-10-24T22:24:36.9609040Z 665 │ const headerSubtitle = [ 2026-10-24T22:24:36.9609225Z 666 │ headerDiffSummary.additions, 2026-10-24T22:24:36.9609426Z 667 │ headerDiffSummary.deletions, 2026-10-24T22:24:36.9609623Z 668 │ pendingReviewCommentCount > 0 2026-10-24T22:24:36.9609935Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T22:24:36.9615893Z 670 │ : null, 2026-10-24T22:24:36.9616062Z 671 │ ] 2026-10-24T22:24:36.9616204Z 672 │ .filter(Boolean) 2026-10-24T22:24:36.9616367Z 673 │ .join(" · "); 2026-10-24T22:24:36.9616607Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T22:24:36.9616828Z 675 │ 2026-10-24T22:24:36.9616959Z 676 │ return ( 2026-10-24T22:24:36.9617096Z 677 │ <> 2026-10-24T22:24:36.9617248Z 678 │ 2026-10-24T22:24:36.9620682Z 694 │ 2026-10-24T22:24:36.9620823Z 695 │ 2026-10-24T22:24:36.9621059Z 696 │ 2026-10-24T22:24:36.9621300Z 697 │ {showConnectionNotice ? ( 2026-10-24T22:24:36.9621579Z 698 │ 2026-10-24T22:24:36.9621850Z 699 │ 2026-10-24T22:24:36.9624451Z 711 │ 2026-10-24T22:24:36.9624717Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T22:24:36.9624972Z 713 │ 2026-10-24T22:24:36.9626084Z 719 │ 2026-10-24T22:24:36.9626954Z 723 │ {listHeader} 2026-10-24T22:24:36.9627191Z 724 │ 2026-10-24T22:24:36.9627441Z 725 │ { 2026-10-24T22:24:36.9630396Z ·  ────┬──── 2026-10-24T22:24:36.9630551Z · ╰── This is the containing effect 2026-10-24T22:24:36.9630758Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T22:24:36.9630835Z 216 │ if (inserted) { 2026-10-24T22:24:36.9630919Z 217 │ setSelection((current) => 2026-10-24T22:24:36.9631008Z ·  ──────┬───── 2026-10-24T22:24:36.9631198Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9631387Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T22:24:36.9631442Z ╰──── 2026-10-24T22:24:36.9632104Z  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-24T22:24:36.9632460Z  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-24T22:24:36.9632463Z 2026-10-24T22:24:36.9632746Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9632927Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T22:24:36.9633010Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T22:24:36.9633083Z 287 │ useEffect(() => { 2026-10-24T22:24:36.9633162Z ·  ────┬──── 2026-10-24T22:24:36.9633307Z · ╰── This is the containing effect 2026-10-24T22:24:36.9633524Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T22:24:36.9633725Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T22:24:36.9633803Z 290 │ const now = Date.now(); 2026-10-24T22:24:36.9633930Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T22:24:36.9633992Z 292 │ if ( 2026-10-24T22:24:36.9634092Z 293 │ lastRequest?.key === key && 2026-10-24T22:24:36.9634273Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T22:24:36.9634335Z 295 │ ) 2026-10-24T22:24:36.9634401Z 296 │ return; 2026-10-24T22:24:36.9634593Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T22:24:36.9634695Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T22:24:36.9634802Z ·  ────────────┬─────────── 2026-10-24T22:24:36.9635003Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9635075Z 299 │ return; 2026-10-24T22:24:36.9635134Z ╰──── 2026-10-24T22:24:36.9635779Z  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-24T22:24:36.9636131Z  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-24T22:24:36.9636136Z 2026-10-24T22:24:36.9636355Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9636538Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T22:24:36.9636603Z 327 │ }, [ 2026-10-24T22:24:36.9636675Z 328 │ draftMessage, 2026-10-24T22:24:36.9636760Z ·  ──────┬───── 2026-10-24T22:24:36.9636919Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T22:24:36.9636993Z 329 │ environmentId, 2026-10-24T22:24:36.9637049Z ╰──── 2026-10-24T22:24:36.9637367Z  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-24T22:24:36.9637705Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9637709Z 2026-10-24T22:24:36.9637994Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9638178Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7] 2026-10-24T22:24:36.9638235Z 100 │ 2026-10-24T22:24:36.9638307Z 101 │ useEffect(() => { 2026-10-24T22:24:36.9638388Z ·  ────┬──── 2026-10-24T22:24:36.9638532Z · ╰── This is the containing effect 2026-10-24T22:24:36.9638643Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T22:24:36.9638738Z 103 │ setHighlightedLinesById({}); 2026-10-24T22:24:36.9638841Z ·  ───────────┬─────────── 2026-10-24T22:24:36.9639033Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9639157Z 104 │ return; 2026-10-24T22:24:36.9639254Z ╰──── 2026-10-24T22:24:36.9639898Z  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-24T22:24:36.9640246Z  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-24T22:24:36.9640249Z 2026-10-24T22:24:36.9640528Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9640719Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T22:24:36.9640784Z 58 │ 2026-10-24T22:24:36.9640859Z 59 │ useEffect(() => { 2026-10-24T22:24:36.9640939Z ·  ────┬──── 2026-10-24T22:24:36.9641081Z · ╰── This is the containing effect 2026-10-24T22:24:36.9641171Z 60 │ setMountedModes((current) => { 2026-10-24T22:24:36.9641261Z ·  ───────┬─────── 2026-10-24T22:24:36.9641447Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9641536Z 61 │ if (current.has(props.mode)) { 2026-10-24T22:24:36.9641596Z ╰──── 2026-10-24T22:24:36.9642245Z  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-24T22:24:36.9642596Z  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-24T22:24:36.9642599Z 2026-10-24T22:24:36.9642878Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9643080Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T22:24:36.9643141Z 104 │ 2026-10-24T22:24:36.9643214Z 105 │ useEffect(() => { 2026-10-24T22:24:36.9643295Z ·  ────┬──── 2026-10-24T22:24:36.9643434Z · ╰── This is the containing effect 2026-10-24T22:24:36.9643522Z 106 │ clearReviewCommentTarget(); 2026-10-24T22:24:36.9643638Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T22:24:36.9643762Z ·  ────────────────┬─────────────── 2026-10-24T22:24:36.9643952Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9644034Z 108 │ }, [selectedSection?.id]); 2026-10-24T22:24:36.9644102Z ╰──── 2026-10-24T22:24:36.9644779Z  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-24T22:24:36.9645179Z  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-24T22:24:36.9645217Z 2026-10-24T22:24:36.9645496Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9645699Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T22:24:36.9645759Z 109 │ 2026-10-24T22:24:36.9645830Z 110 │ useEffect(() => { 2026-10-24T22:24:36.9645906Z ·  ────┬──── 2026-10-24T22:24:36.9646049Z · ╰── This is the containing effect 2026-10-24T22:24:36.9646144Z 111 │ if (activeCommentTarget === null) { 2026-10-24T22:24:36.9646257Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T22:24:36.9646376Z ·  ────────────────┬─────────────── 2026-10-24T22:24:36.9646580Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9646645Z 113 │ } 2026-10-24T22:24:36.9646702Z ╰──── 2026-10-24T22:24:36.9647341Z  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-24T22:24:36.9647691Z  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-24T22:24:36.9647694Z 2026-10-24T22:24:36.9647913Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9648120Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T22:24:36.9648232Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T22:24:36.9648310Z 108 │ }, [selectedSection?.id]); 2026-10-24T22:24:36.9648406Z ·  ─────────┬───────── 2026-10-24T22:24:36.9648586Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T22:24:36.9648646Z 109 │ 2026-10-24T22:24:36.9648701Z ╰──── 2026-10-24T22:24:36.9649020Z  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-24T22:24:36.9649358Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9649361Z 2026-10-24T22:24:36.9649646Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9649800Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2195:5] 2026-10-24T22:24:36.9649866Z 2193 │ ); 2026-10-24T22:24:36.9649943Z 2194 │ useEffect(() => { 2026-10-24T22:24:36.9650025Z ·  ────┬──── 2026-10-24T22:24:36.9650168Z · ╰── This is the containing effect 2026-10-24T22:24:36.9650250Z 2195 │ setExpandedVideo(null); 2026-10-24T22:24:36.9650341Z ·  ────────┬─────── 2026-10-24T22:24:36.9650530Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9650608Z 2196 │ setExpandedFile(null); 2026-10-24T22:24:36.9650806Z ╰──── 2026-10-24T22:24:36.9651491Z  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-24T22:24:36.9651840Z  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-24T22:24:36.9651843Z 2026-10-24T22:24:36.9652121Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9652271Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2700:9] 2026-10-24T22:24:36.9652427Z 2691 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T22:24:36.9652501Z 2692 │ useEffect(() => { 2026-10-24T22:24:36.9652586Z ·  ────┬──── 2026-10-24T22:24:36.9652729Z · ╰── This is the containing effect 2026-10-24T22:24:36.9652871Z 2693 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T22:24:36.9652978Z 2694 │ const index = presentedFeed.findIndex( 2026-10-24T22:24:36.9653125Z 2695 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T22:24:36.9653185Z 2696 │ ); 2026-10-24T22:24:36.9653270Z 2697 │ if (index === -1) { 2026-10-24T22:24:36.9653414Z 2698 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T22:24:36.9653529Z 2699 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T22:24:36.9653637Z 2700 │ setInteractionState((current) => ({ 2026-10-24T22:24:36.9653742Z ·  ─────────┬───────── 2026-10-24T22:24:36.9653937Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9654012Z 2701 │ ...current, 2026-10-24T22:24:36.9654069Z ╰──── 2026-10-24T22:24:36.9654745Z  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-24T22:24:36.9655099Z  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-24T22:24:36.9655102Z 2026-10-24T22:24:36.9655411Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T22:24:36.9655596Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-24T22:24:36.9655747Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T22:24:36.9655901Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T22:24:36.9656007Z ·  ───────────┬─────────── 2026-10-24T22:24:36.9656188Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T22:24:36.9656360Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T22:24:36.9656418Z ╰──── 2026-10-24T22:24:36.9656528Z  help: Consider removing this import. 2026-10-24T22:24:36.9656531Z 2026-10-24T22:24:36.9656764Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T22:24:36.9656912Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-24T22:24:36.9656974Z 95 │ import { 2026-10-24T22:24:36.9657047Z 96 │ createContext, 2026-10-24T22:24:36.9657131Z ·  ──────┬────── 2026-10-24T22:24:36.9657280Z · ╰── 'createContext' is imported here 2026-10-24T22:24:36.9657345Z 97 │ memo, 2026-10-24T22:24:36.9657403Z ╰──── 2026-10-24T22:24:36.9657513Z  help: Consider removing this import. 2026-10-24T22:24:36.9657515Z 2026-10-24T22:24:36.9657747Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T22:24:36.9657899Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-24T22:24:36.9657966Z 111 │ import { 2026-10-24T22:24:36.9658041Z 112 │ ActivityIndicator, 2026-10-24T22:24:36.9658132Z ·  ────────┬──────── 2026-10-24T22:24:36.9658288Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T22:24:36.9658353Z 113 │ Image, 2026-10-24T22:24:36.9658411Z ╰──── 2026-10-24T22:24:36.9658517Z  help: Consider removing this import. 2026-10-24T22:24:36.9658520Z 2026-10-24T22:24:36.9658734Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T22:24:36.9658880Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-24T22:24:36.9658950Z 118 │ Pressable, 2026-10-24T22:24:36.9659021Z 119 │ ScrollView, 2026-10-24T22:24:36.9659106Z ·  ─────┬──── 2026-10-24T22:24:36.9659255Z · ╰── 'ScrollView' is imported here 2026-10-24T22:24:36.9659324Z 120 │ StyleSheet, 2026-10-24T22:24:36.9659382Z ╰──── 2026-10-24T22:24:36.9659486Z  help: Consider removing this import. 2026-10-24T22:24:36.9659489Z 2026-10-24T22:24:36.9659706Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T22:24:36.9659853Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-24T22:24:36.9659920Z 120 │ StyleSheet, 2026-10-24T22:24:36.9659993Z 121 │ Text as NativeText, 2026-10-24T22:24:36.9660084Z ·  ─────┬──── 2026-10-24T22:24:36.9660235Z · ╰── 'NativeText' is imported here 2026-10-24T22:24:36.9660363Z 122 │ type ColorValue, 2026-10-24T22:24:36.9660463Z ╰──── 2026-10-24T22:24:36.9660569Z  help: Consider removing this import. 2026-10-24T22:24:36.9660571Z 2026-10-24T22:24:36.9660807Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T22:24:36.9660953Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-24T22:24:36.9661103Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T22:24:36.9661243Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T22:24:36.9661345Z ·  ─────────┬──────── 2026-10-24T22:24:36.9661516Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T22:24:36.9661678Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T22:24:36.9661742Z ╰──── 2026-10-24T22:24:36.9661850Z  help: Consider removing this import. 2026-10-24T22:24:36.9661853Z 2026-10-24T22:24:36.9662092Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T22:24:36.9662236Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-24T22:24:36.9662384Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T22:24:36.9662523Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T22:24:36.9662623Z ·  ─────────┬───────── 2026-10-24T22:24:36.9662794Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T22:24:36.9662858Z 148 │ import { 2026-10-24T22:24:36.9662915Z ╰──── 2026-10-24T22:24:36.9663027Z  help: Consider removing this import. 2026-10-24T22:24:36.9663032Z 2026-10-24T22:24:36.9663265Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T22:24:36.9663408Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-24T22:24:36.9663571Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T22:24:36.9663717Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T22:24:36.9663814Z ·  ────────┬─────── 2026-10-24T22:24:36.9663976Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T22:24:36.9664160Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T22:24:36.9664216Z ╰──── 2026-10-24T22:24:36.9664329Z  help: Consider removing this import. 2026-10-24T22:24:36.9664334Z 2026-10-24T22:24:36.9664574Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T22:24:36.9664720Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-24T22:24:36.9664811Z 164 │ attachmentVideoPreviewSource, 2026-10-24T22:24:36.9664888Z 165 │ mediaVideoPreviewUri, 2026-10-24T22:24:36.9664980Z ·  ──────────┬───────── 2026-10-24T22:24:36.9665151Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T22:24:36.9665231Z 166 │ mediaVideoThumbnailKey, 2026-10-24T22:24:36.9665290Z ╰──── 2026-10-24T22:24:36.9665393Z  help: Consider removing this import. 2026-10-24T22:24:36.9665395Z 2026-10-24T22:24:36.9665720Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T22:24:36.9665899Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-24T22:24:36.9665975Z 165 │ mediaVideoPreviewUri, 2026-10-24T22:24:36.9666056Z 166 │ mediaVideoThumbnailKey, 2026-10-24T22:24:36.9666154Z ·  ───────────┬────────── 2026-10-24T22:24:36.9666326Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T22:24:36.9666416Z 167 │ type MediaVideoPreviewSource, 2026-10-24T22:24:36.9666471Z ╰──── 2026-10-24T22:24:36.9666577Z  help: Consider removing this import. 2026-10-24T22:24:36.9666579Z 2026-10-24T22:24:36.9666813Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T22:24:36.9666963Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-24T22:24:36.9667046Z 166 │ mediaVideoThumbnailKey, 2026-10-24T22:24:36.9667131Z 167 │ type MediaVideoPreviewSource, 2026-10-24T22:24:36.9667239Z ·  ───────────┬─────────── 2026-10-24T22:24:36.9667420Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T22:24:36.9667515Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-24T22:24:36.9667574Z ╰──── 2026-10-24T22:24:36.9667678Z  help: Consider removing this import. 2026-10-24T22:24:36.9667681Z 2026-10-24T22:24:36.9667899Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T22:24:36.9668046Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:175:15] 2026-10-24T22:24:36.9668244Z 174 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T22:24:36.9668400Z 175 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T22:24:36.9668501Z ·  ───────┬─────── 2026-10-24T22:24:36.9668667Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T22:24:36.9668730Z 176 │ import { 2026-10-24T22:24:36.9668787Z ╰──── 2026-10-24T22:24:36.9668892Z  help: Consider removing this import. 2026-10-24T22:24:36.9668895Z 2026-10-24T22:24:36.9669150Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T22:24:36.9669292Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-24T22:24:36.9669356Z 189 │ import { 2026-10-24T22:24:36.9669445Z 190 │ resolveMarkdownFontSizes, 2026-10-24T22:24:36.9669549Z ·  ────────────┬─────────── 2026-10-24T22:24:36.9669723Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T22:24:36.9669820Z 191 │ resolveNativeMarkdownTypography, 2026-10-24T22:24:36.9669876Z ╰──── 2026-10-24T22:24:36.9669981Z  help: Consider removing this import. 2026-10-24T22:24:36.9669984Z 2026-10-24T22:24:36.9670269Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T22:24:36.9670415Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:197:3] 2026-10-24T22:24:36.9670501Z 196 │ normalizeNativeMarkdownUrl, 2026-10-24T22:24:36.9670607Z 197 │ resolveMarkdownInlineCodePresentation, 2026-10-24T22:24:36.9670786Z ·  ──────────────────┬────────────────── 2026-10-24T22:24:36.9671045Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T22:24:36.9671140Z 198 │ resolveMarkdownLinkPresentation, 2026-10-24T22:24:36.9671199Z ╰──── 2026-10-24T22:24:36.9671301Z  help: Consider removing this import. 2026-10-24T22:24:36.9671304Z 2026-10-24T22:24:36.9671558Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T22:24:36.9671704Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:242:10] 2026-10-24T22:24:36.9671819Z 241 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T22:24:36.9671978Z 242 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T22:24:36.9672091Z ·  ────────────┬─────────── 2026-10-24T22:24:36.9672282Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T22:24:36.9672351Z 243 │ import { 2026-10-24T22:24:36.9672406Z ╰──── 2026-10-24T22:24:36.9672512Z  help: Consider removing this import. 2026-10-24T22:24:36.9672515Z 2026-10-24T22:24:36.9672747Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T22:24:36.9672893Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:246:3] 2026-10-24T22:24:36.9672966Z 245 │ useAssetUrl, 2026-10-24T22:24:36.9673038Z 246 │ useAssetUrlState, 2026-10-24T22:24:36.9673128Z ·  ────────┬─────── 2026-10-24T22:24:36.9673287Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T22:24:36.9673361Z 247 │ useRefreshAssetUrl, 2026-10-24T22:24:36.9673424Z ╰──── 2026-10-24T22:24:36.9673536Z  help: Consider removing this import. 2026-10-24T22:24:36.9673538Z 2026-10-24T22:24:36.9673763Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9673913Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2197:7] 2026-10-24T22:24:36.9673994Z 2196 │ setExpandedFile(null); 2026-10-24T22:24:36.9674209Z 2197 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T22:24:36.9674463Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T22:24:36.9674845Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T22:24:36.9675111Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T22:24:36.9675293Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T22:24:36.9675449Z 2198 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T22:24:36.9675509Z ╰──── 2026-10-24T22:24:36.9675837Z  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-24T22:24:36.9676185Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9676188Z 2026-10-24T22:24:36.9676417Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9676569Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2669:7] 2026-10-24T22:24:36.9676678Z 2668 │ reportHeaderMaterialVisibility(false); 2026-10-24T22:24:36.9676804Z 2669 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T22:24:36.9676894Z ·  ──────┬────── 2026-10-24T22:24:36.9677063Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T22:24:36.9677125Z 2670 │ 2026-10-24T22:24:36.9677182Z ╰──── 2026-10-24T22:24:36.9677508Z  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-24T22:24:36.9677860Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9677867Z 2026-10-24T22:24:36.9678088Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9678236Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2685:7] 2026-10-24T22:24:36.9678299Z 2684 │ } 2026-10-24T22:24:36.9678445Z 2685 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T22:24:36.9678534Z ·  ──────┬───── 2026-10-24T22:24:36.9678697Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T22:24:36.9678859Z 2686 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T22:24:36.9678918Z ╰──── 2026-10-24T22:24:36.9679249Z  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-24T22:24:36.9679595Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9679598Z 2026-10-24T22:24:36.9679816Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9679965Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2881:7] 2026-10-24T22:24:36.9680028Z 2880 │ } 2026-10-24T22:24:36.9680231Z 2881 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T22:24:36.9680462Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T22:24:36.9680806Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T22:24:36.9681068Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T22:24:36.9681239Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T22:24:36.9681299Z 2882 │ 2026-10-24T22:24:36.9681355Z ╰──── 2026-10-24T22:24:36.9681677Z  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-24T22:24:36.9682026Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9682031Z 2026-10-24T22:24:36.9682233Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T22:24:36.9682381Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:627:9] 2026-10-24T22:24:36.9682443Z 626 │ }; 2026-10-24T22:24:36.9682574Z 627 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T22:24:36.9682790Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T22:24:36.9683056Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T22:24:36.9683274Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T22:24:36.9683469Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T22:24:36.9683536Z 628 │ ); 2026-10-24T22:24:36.9683593Z ╰──── 2026-10-24T22:24:36.9683938Z  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-24T22:24:36.9684311Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9684314Z 2026-10-24T22:24:36.9684490Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9684654Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T22:24:36.9684818Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T22:24:36.9684974Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T22:24:36.9685061Z ·  ────┬─── 2026-10-24T22:24:36.9685209Z · ╰── `rotation` originates here 2026-10-24T22:24:36.9685267Z 172 │ 2026-10-24T22:24:36.9685346Z 173 │ useLayoutEffect(() => { 2026-10-24T22:24:36.9685495Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T22:24:36.9685576Z ·  ────┬─── 2026-10-24T22:24:36.9685723Z · ╰── `rotation` cannot be modified 2026-10-24T22:24:36.9685833Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T22:24:36.9685891Z ╰──── 2026-10-24T22:24:36.9686240Z  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-24T22:24:36.9686613Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9686616Z 2026-10-24T22:24:36.9686830Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:36.9686999Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T22:24:36.9687076Z 1245 │ ({ thread, now: Date.now() })); 2026-10-24T22:24:36.9688382Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T22:24:36.9688534Z ·  ─────┬──── 2026-10-24T22:24:36.9688738Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9688896Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T22:24:36.9688958Z ╰──── 2026-10-24T22:24:36.9689275Z  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-24T22:24:36.9689601Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9689607Z 2026-10-24T22:24:36.9689797Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:36.9689971Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T22:24:36.9690062Z 718 │ const snoozePresets = useMemo( 2026-10-24T22:24:36.9690264Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T22:24:36.9690417Z ·  ─────┬──── 2026-10-24T22:24:36.9690615Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9690818Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T22:24:36.9690874Z ╰──── 2026-10-24T22:24:36.9691182Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T22:24:36.9691508Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9691511Z 2026-10-24T22:24:36.9691783Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T22:24:36.9692000Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T22:24:36.9692199Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T22:24:36.9692328Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T22:24:36.9692433Z ·  ────────────┬─────────── 2026-10-24T22:24:36.9692631Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T22:24:36.9692691Z 721 │ ); 2026-10-24T22:24:36.9692750Z ╰──── 2026-10-24T22:24:36.9693097Z  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-24T22:24:36.9693448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9693454Z 2026-10-24T22:24:36.9693655Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T22:24:36.9693824Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T22:24:36.9693902Z 765 │ thread.pinnedAt, 2026-10-24T22:24:36.9693973Z 766 │ variant, 2026-10-24T22:24:36.9694054Z ·  ───┬─── 2026-10-24T22:24:36.9694234Z · ╰── Unnecessary dependency `variant` 2026-10-24T22:24:36.9694299Z 767 │ ], 2026-10-24T22:24:36.9694355Z ╰──── 2026-10-24T22:24:36.9694704Z  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-24T22:24:36.9695047Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9695050Z 2026-10-24T22:24:36.9695266Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:36.9695442Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T22:24:36.9695585Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T22:24:36.9695734Z 1216 │ 2026-10-24T22:24:36.9695863Z ·  ────────────────────────── 2026-10-24T22:24:36.9696037Z 1217 │ 2026-10-24T22:24:36.9696127Z ╰──── 2026-10-24T22:24:36.9696289Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T22:24:36.9696293Z 2026-10-24T22:24:36.9696579Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9696775Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T22:24:36.9696835Z 55 │ 2026-10-24T22:24:36.9696908Z 56 │ useEffect(() => { 2026-10-24T22:24:36.9696986Z ·  ────┬──── 2026-10-24T22:24:36.9697132Z · ╰── This is the containing effect 2026-10-24T22:24:36.9697206Z 57 │ scheduler.reset(); 2026-10-24T22:24:36.9697316Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T22:24:36.9697421Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T22:24:36.9697554Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T22:24:36.9697644Z ·  ───────┬─────── 2026-10-24T22:24:36.9697833Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9697959Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T22:24:36.9698016Z ╰──── 2026-10-24T22:24:36.9698675Z  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-24T22:24:36.9699037Z  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-24T22:24:36.9699042Z 2026-10-24T22:24:36.9699264Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9699460Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T22:24:36.9699553Z 62 │ return () => scheduler.cancel(); 2026-10-24T22:24:36.9699666Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T22:24:36.9699809Z ·  ───┬─── ─────┬───── 2026-10-24T22:24:36.9700020Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T22:24:36.9700172Z · ╰── Unnecessary dependency `enabled` 2026-10-24T22:24:36.9700238Z 64 │ 2026-10-24T22:24:36.9700301Z ╰──── 2026-10-24T22:24:36.9700625Z  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-24T22:24:36.9700970Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9700973Z 2026-10-24T22:24:36.9701478Z ⚠ 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-24T22:24:36.9701622Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T22:24:36.9701697Z 38 │ JSON.stringify( 2026-10-24T22:24:36.9701885Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T22:24:36.9702025Z ·  ──────────────────────── 2026-10-24T22:24:36.9702101Z 40 │ { name: "a" }, 2026-10-24T22:24:36.9702157Z ╰──── 2026-10-24T22:24:36.9702162Z 2026-10-24T22:24:36.9702375Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:36.9702546Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T22:24:36.9702668Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T22:24:36.9702773Z 223 │ 2026-10-24T22:24:36.9702890Z ·  ─────────────── 2026-10-24T22:24:36.9702995Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T22:24:36.9703055Z ╰──── 2026-10-24T22:24:36.9703226Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T22:24:36.9703232Z 2026-10-24T22:24:36.9703445Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:36.9703614Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T22:24:36.9703699Z 226 │ { 2026-10-24T22:24:36.9704931Z ·  ────┬──── 2026-10-24T22:24:36.9705079Z · ╰── This is the containing effect 2026-10-24T22:24:36.9705155Z 57 │ setDecodedSize(null); 2026-10-24T22:24:36.9705242Z ·  ───────┬────── 2026-10-24T22:24:36.9705428Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9705505Z 58 │ }, [props.sourceKey]); 2026-10-24T22:24:36.9705563Z ╰──── 2026-10-24T22:24:36.9706233Z  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-24T22:24:36.9706593Z  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-24T22:24:36.9706596Z 2026-10-24T22:24:36.9706880Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9707047Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T22:24:36.9707106Z 59 │ 2026-10-24T22:24:36.9707178Z 60 │ useEffect(() => { 2026-10-24T22:24:36.9707255Z ·  ────┬──── 2026-10-24T22:24:36.9707454Z · ╰── This is the containing effect 2026-10-24T22:24:36.9707564Z 61 │ setFailedUri(null); 2026-10-24T22:24:36.9707649Z ·  ──────┬───── 2026-10-24T22:24:36.9707833Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9707906Z 62 │ }, [props.uri]); 2026-10-24T22:24:36.9707963Z ╰──── 2026-10-24T22:24:36.9708621Z  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-24T22:24:36.9708979Z  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-24T22:24:36.9708987Z 2026-10-24T22:24:36.9709223Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T22:24:36.9709393Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T22:24:36.9709533Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T22:24:36.9709733Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T22:24:36.9709831Z ·  ────────┬──────── 2026-10-24T22:24:36.9710000Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T22:24:36.9710060Z 8 │ 2026-10-24T22:24:36.9710118Z ╰──── 2026-10-24T22:24:36.9710234Z  help: Consider removing this import. 2026-10-24T22:24:36.9710240Z 2026-10-24T22:24:36.9710463Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9710631Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T22:24:36.9710708Z 57 │ setDecodedSize(null); 2026-10-24T22:24:36.9710783Z 58 │ }, [props.sourceKey]); 2026-10-24T22:24:36.9710875Z ·  ───────┬─────── 2026-10-24T22:24:36.9711047Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T22:24:36.9711107Z 59 │ 2026-10-24T22:24:36.9711163Z ╰──── 2026-10-24T22:24:36.9711488Z  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-24T22:24:36.9711839Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9711845Z 2026-10-24T22:24:36.9712068Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9712231Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T22:24:36.9712308Z 61 │ setFailedUri(null); 2026-10-24T22:24:36.9712382Z 62 │ }, [props.uri]); 2026-10-24T22:24:36.9712466Z ·  ────┬──── 2026-10-24T22:24:36.9712621Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T22:24:36.9712680Z 63 │ 2026-10-24T22:24:36.9712737Z ╰──── 2026-10-24T22:24:36.9713112Z  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-24T22:24:36.9713490Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9713493Z 2026-10-24T22:24:36.9713776Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9713944Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T22:24:36.9714137Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T22:24:36.9714255Z 29 │ useEffect(() => { 2026-10-24T22:24:36.9714332Z ·  ────┬──── 2026-10-24T22:24:36.9714484Z · ╰── This is the containing effect 2026-10-24T22:24:36.9714630Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T22:24:36.9714753Z ·  ───┬─── 2026-10-24T22:24:36.9714964Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9715048Z 31 │ }, [key, live, snapshot]); 2026-10-24T22:24:36.9715106Z ╰──── 2026-10-24T22:24:36.9715762Z  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-24T22:24:36.9716121Z  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-24T22:24:36.9716127Z 2026-10-24T22:24:36.9716410Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9716595Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T22:24:36.9716657Z 409 │ 2026-10-24T22:24:36.9716802Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T22:24:36.9716878Z ·  ──┬── 2026-10-24T22:24:36.9717020Z · ╰── 'layer' is declared here 2026-10-24T22:24:36.9717080Z ╰──── 2026-10-24T22:24:36.9717200Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9717203Z 2026-10-24T22:24:36.9717397Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:36.9717563Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T22:24:36.9717688Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T22:24:36.9717870Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T22:24:36.9718006Z ·  ─────┬──── 2026-10-24T22:24:36.9718195Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9718258Z 179 │ } 2026-10-24T22:24:36.9718316Z ╰──── 2026-10-24T22:24:36.9718621Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T22:24:36.9719001Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9719042Z 2026-10-24T22:24:36.9719328Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9719497Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T22:24:36.9719564Z 568 │ }, []); 2026-10-24T22:24:36.9719636Z 569 │ useEffect(() => { 2026-10-24T22:24:36.9719718Z ·  ────┬──── 2026-10-24T22:24:36.9719864Z · ╰── This is the containing effect 2026-10-24T22:24:36.9719962Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T22:24:36.9720062Z ·  ───────────┬─────────── 2026-10-24T22:24:36.9720262Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9720379Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T22:24:36.9720438Z ╰──── 2026-10-24T22:24:36.9721092Z  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-24T22:24:36.9721445Z  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-24T22:24:36.9721448Z 2026-10-24T22:24:36.9721737Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9721909Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T22:24:36.9722085Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T22:24:36.9722157Z 964 │ useEffect(() => { 2026-10-24T22:24:36.9722238Z ·  ────┬──── 2026-10-24T22:24:36.9722385Z · ╰── This is the containing effect 2026-10-24T22:24:36.9722562Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T22:24:36.9722686Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T22:24:36.9722796Z ·  ─────────────┬──────────── 2026-10-24T22:24:36.9722993Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9723112Z 967 │ } 2026-10-24T22:24:36.9723201Z ╰──── 2026-10-24T22:24:36.9723859Z  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-24T22:24:36.9724248Z  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-24T22:24:36.9724251Z 2026-10-24T22:24:36.9724535Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9724707Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T22:24:36.9724770Z 1220 │ 2026-10-24T22:24:36.9724848Z 1221 │ useEffect(() => { 2026-10-24T22:24:36.9724930Z ·  ────┬──── 2026-10-24T22:24:36.9725078Z · ╰── This is the containing effect 2026-10-24T22:24:36.9725165Z 1222 │ setAnchorMessageId(null); 2026-10-24T22:24:36.9725262Z ·  ─────────┬──────── 2026-10-24T22:24:36.9725454Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9725548Z 1223 │ setSubmittedMessageId(null); 2026-10-24T22:24:36.9725604Z ╰──── 2026-10-24T22:24:36.9726263Z  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-24T22:24:36.9726624Z  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-24T22:24:36.9726627Z 2026-10-24T22:24:36.9726850Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9727019Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T22:24:36.9727113Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T22:24:36.9727227Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T22:24:36.9727390Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T22:24:36.9727630Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T22:24:36.9727809Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T22:24:36.9727951Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T22:24:36.9728010Z ╰──── 2026-10-24T22:24:36.9728336Z  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-24T22:24:36.9728682Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9728685Z 2026-10-24T22:24:36.9728904Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9729132Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T22:24:36.9729261Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T22:24:36.9729442Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T22:24:36.9729547Z ·  ────────────┬─────────── 2026-10-24T22:24:36.9729751Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T22:24:36.9729870Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T22:24:36.9729929Z ╰──── 2026-10-24T22:24:36.9730249Z  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-24T22:24:36.9730603Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9730609Z 2026-10-24T22:24:36.9730890Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9731063Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T22:24:36.9731140Z 1227 │ freeze.set(false); 2026-10-24T22:24:36.9731230Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T22:24:36.9731338Z ·  ────────┬──────── 2026-10-24T22:24:36.9731520Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T22:24:36.9731582Z 1229 │ 2026-10-24T22:24:36.9731639Z ╰──── 2026-10-24T22:24:36.9731966Z  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-24T22:24:36.9732313Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9732316Z 2026-10-24T22:24:36.9732491Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9732657Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T22:24:36.9732782Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T22:24:36.9732905Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T22:24:36.9733014Z ·  ───────────┬─────────── 2026-10-24T22:24:36.9733323Z · ╰── `floatingControlCoverage` originates here 2026-10-24T22:24:36.9733655Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T22:24:36.9733877Z 1056 │ ); 2026-10-24T22:24:36.9734032Z 1057 │ useEffect(() => { 2026-10-24T22:24:36.9734291Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T22:24:36.9734529Z ·  ───────────┬─────────── 2026-10-24T22:24:36.9734830Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T22:24:36.9735153Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T22:24:36.9735369Z ╰──── 2026-10-24T22:24:36.9735732Z  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-24T22:24:36.9736734Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9737109Z 2026-10-24T22:24:36.9737285Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9737633Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T22:24:36.9738046Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T22:24:36.9738400Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T22:24:36.9738687Z ·  ────────────────┬──────────────── 2026-10-24T22:24:36.9739029Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T22:24:36.9739382Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T22:24:36.9739602Z 1069 │ ); 2026-10-24T22:24:36.9739760Z 1070 │ useAnimatedReaction( 2026-10-24T22:24:36.9739930Z 1071 │ () => 2026-10-24T22:24:36.9740111Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T22:24:36.9740333Z 1073 │ floatingControlCoverage.value + 2026-10-24T22:24:36.9740670Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T22:24:36.9740965Z 1075 │ (value) => { 2026-10-24T22:24:36.9741182Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T22:24:36.9741454Z ·  ────────────────┬──────────────── 2026-10-24T22:24:36.9741795Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T22:24:36.9742064Z 1077 │ }, 2026-10-24T22:24:36.9742195Z ╰──── 2026-10-24T22:24:36.9742565Z  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-24T22:24:36.9743187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9743512Z 2026-10-24T22:24:36.9743797Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T22:24:36.9744304Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T22:24:36.9744570Z 959 │ 2026-10-24T22:24:36.9744762Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T22:24:36.9745032Z ·  ──────────────────┬───────────────── 2026-10-24T22:24:36.9745389Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T22:24:36.9746285Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T22:24:36.9746478Z ╰──── 2026-10-24T22:24:36.9746656Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9746789Z 2026-10-24T22:24:36.9747310Z ⚠ 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-24T22:24:36.9747911Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T22:24:36.9748121Z 499 │ 2026-10-24T22:24:36.9748313Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T22:24:36.9748593Z ·  ────────────────────────── 2026-10-24T22:24:36.9748920Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T22:24:36.9749166Z ╰──── 2026-10-24T22:24:36.9749230Z 2026-10-24T22:24:36.9749483Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T22:24:36.9749909Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T22:24:36.9750152Z 1397 │ 2026-10-24T22:24:36.9750317Z 1398 │ function assertUserMessagesExclude( 2026-10-24T22:24:36.9750552Z ·  ────────────┬──────────── 2026-10-24T22:24:36.9750858Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T22:24:36.9751158Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T22:24:36.9751352Z ╰──── 2026-10-24T22:24:36.9751528Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9751663Z 2026-10-24T22:24:36.9752035Z ⚠ 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-24T22:24:36.9752507Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T22:24:36.9752828Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T22:24:36.9753146Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T22:24:36.9753378Z ·  ───────── 2026-10-24T22:24:36.9753549Z 19 │ expect( 2026-10-24T22:24:36.9753684Z ╰──── 2026-10-24T22:24:36.9753746Z 2026-10-24T22:24:36.9754127Z ⚠ 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-24T22:24:36.9754617Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T22:24:36.9754824Z 19 │ expect( 2026-10-24T22:24:36.9755178Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T22:24:36.9755449Z ·  ───────── 2026-10-24T22:24:36.9755617Z 21 │ ).toBe(true); 2026-10-24T22:24:36.9755932Z ╰──── 2026-10-24T22:24:36.9755993Z 2026-10-24T22:24:36.9756285Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T22:24:36.9756783Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T22:24:36.9757121Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T22:24:36.9757391Z 12 │ this.onmessage = listener; 2026-10-24T22:24:36.9757646Z ·  ───────── 2026-10-24T22:24:36.9757845Z 13 │ } 2026-10-24T22:24:36.9757976Z ╰──── 2026-10-24T22:24:36.9758385Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T22:24:36.9758710Z 2026-10-24T22:24:36.9758937Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T22:24:36.9759318Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T22:24:36.9759561Z 15 │ constructor() { 2026-10-24T22:24:36.9759727Z 16 │ source = this; 2026-10-24T22:24:36.9759900Z ·  ────── 2026-10-24T22:24:36.9760057Z 17 │ } 2026-10-24T22:24:36.9760188Z ╰──── 2026-10-24T22:24:36.9760557Z  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-24T22:24:36.9760844Z 2026-10-24T22:24:36.9761355Z ⚠ 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-24T22:24:36.9761947Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T22:24:36.9762201Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T22:24:36.9762447Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T22:24:36.9762720Z ·  ────────────────────────── 2026-10-24T22:24:36.9762929Z 130 │ Schema.Struct({ 2026-10-24T22:24:36.9763083Z ╰──── 2026-10-24T22:24:36.9763149Z 2026-10-24T22:24:36.9763327Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9763670Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T22:24:36.9763904Z 83 │ 2026-10-24T22:24:36.9764083Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T22:24:36.9764324Z ·  ──────┬───── 2026-10-24T22:24:36.9764575Z · ╰── `cardCoverage` originates here 2026-10-24T22:24:36.9764819Z 85 │ const barHeightRef = useRef(0); 2026-10-24T22:24:36.9765018Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T22:24:36.9765302Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T22:24:36.9765515Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T22:24:36.9765712Z 89 │ if (!cardCoverage) { 2026-10-24T22:24:36.9765945Z 90 │ return; 2026-10-24T22:24:36.9766094Z 91 │ } 2026-10-24T22:24:36.9766348Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T22:24:36.9766643Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T22:24:36.9766948Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T22:24:36.9767216Z ·  ──────┬───── 2026-10-24T22:24:36.9767472Z · ╰── `cardCoverage` cannot be modified 2026-10-24T22:24:36.9767701Z 95 │ }, [cardCoverage]); 2026-10-24T22:24:36.9767854Z ╰──── 2026-10-24T22:24:36.9768244Z  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-24T22:24:36.9768978Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9769336Z 2026-10-24T22:24:36.9769510Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9769856Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T22:24:36.9770124Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T22:24:36.9770336Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T22:24:36.9770535Z ·  ─────┬──── 2026-10-24T22:24:36.9770860Z · ╰── `cardHeight` originates here 2026-10-24T22:24:36.9771115Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T22:24:36.9771313Z  89 │ if (!cardCoverage) { 2026-10-24T22:24:36.9771479Z  90 │ return; 2026-10-24T22:24:36.9771627Z  91 │ } 2026-10-24T22:24:36.9771886Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T22:24:36.9772182Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T22:24:36.9772478Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T22:24:36.9772732Z  95 │ }, [cardCoverage]); 2026-10-24T22:24:36.9772919Z  96 │ const handleBarLayout = useCallback( 2026-10-24T22:24:36.9773121Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T22:24:36.9773371Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T22:24:36.9773592Z  99 │ notifyCoverage(); 2026-10-24T22:24:36.9773746Z 100 │ }, 2026-10-24T22:24:36.9773892Z 101 │ [notifyCoverage], 2026-10-24T22:24:36.9774043Z 102 │ ); 2026-10-24T22:24:36.9774249Z 103 │ const handleCardLayout = useCallback( 2026-10-24T22:24:36.9774456Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T22:24:36.9774709Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T22:24:36.9774987Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T22:24:36.9775214Z ·  ─────┬──── 2026-10-24T22:24:36.9775462Z · ╰── `cardHeight` cannot be modified 2026-10-24T22:24:36.9775693Z 107 │ notifyCoverage(); 2026-10-24T22:24:36.9775850Z ╰──── 2026-10-24T22:24:36.9776205Z  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-24T22:24:36.9776830Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9777156Z 2026-10-24T22:24:36.9777380Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T22:24:36.9777767Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T22:24:36.9778040Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T22:24:36.9778254Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T22:24:36.9778488Z ·  ───┬─── 2026-10-24T22:24:36.9778879Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T22:24:36.9779193Z 89 │ if (!cardCoverage) { 2026-10-24T22:24:36.9779357Z 90 │ return; 2026-10-24T22:24:36.9779494Z 91 │ } 2026-10-24T22:24:36.9779825Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T22:24:36.9780166Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T22:24:36.9780472Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T22:24:36.9780739Z ·  ──────┬───── 2026-10-24T22:24:36.9780989Z · ╰── This modifies `cardCoverage` 2026-10-24T22:24:36.9781215Z 95 │ }, [cardCoverage]); 2026-10-24T22:24:36.9781368Z ╰──── 2026-10-24T22:24:36.9781810Z  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-24T22:24:36.9782507Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9782838Z 2026-10-24T22:24:36.9783060Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T22:24:36.9783449Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T22:24:36.9783739Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T22:24:36.9784042Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T22:24:36.9784344Z ·  ──────┬───── 2026-10-24T22:24:36.9784587Z · ╰── This modifies `cardCoverage` 2026-10-24T22:24:36.9784812Z 95 │ }, [cardCoverage]); 2026-10-24T22:24:36.9784999Z 96 │ const handleBarLayout = useCallback( 2026-10-24T22:24:36.9785206Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T22:24:36.9785437Z ·  ───────────────┬─────────────── 2026-10-24T22:24:36.9785811Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T22:24:36.9786176Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T22:24:36.9786386Z ╰──── 2026-10-24T22:24:36.9786823Z  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-24T22:24:36.9787509Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9787832Z 2026-10-24T22:24:36.9788053Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T22:24:36.9788448Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T22:24:36.9788725Z 103 │ const handleCardLayout = useCallback( 2026-10-24T22:24:36.9788939Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T22:24:36.9789169Z ·  ───────────────┬─────────────── 2026-10-24T22:24:36.9789537Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T22:24:36.9789907Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T22:24:36.9790191Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T22:24:36.9790422Z ·  ─────┬──── 2026-10-24T22:24:36.9790669Z · ╰── This modifies `cardHeight` 2026-10-24T22:24:36.9827957Z 107 │ notifyCoverage(); 2026-10-24T22:24:36.9828258Z ╰──── 2026-10-24T22:24:36.9828684Z  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-24T22:24:36.9829338Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9829645Z 2026-10-24T22:24:36.9829884Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9830255Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T22:24:36.9830519Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T22:24:36.9830717Z 257 │ }, [props.path, targetIndex]); 2026-10-24T22:24:36.9830907Z ·  ─────┬──── 2026-10-24T22:24:36.9831160Z · ╰── Unnecessary dependency `props.path` 2026-10-24T22:24:36.9831368Z 258 │ 2026-10-24T22:24:36.9831480Z ╰──── 2026-10-24T22:24:36.9831835Z  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-24T22:24:36.9832438Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9832743Z 2026-10-24T22:24:36.9832943Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:36.9833289Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T22:24:36.9833525Z 292 │ 2026-10-24T22:24:36.9835809Z ·  ─────────── 2026-10-24T22:24:36.9836041Z 310 │ {body} 2026-10-24T22:24:36.9836203Z ╰──── 2026-10-24T22:24:36.9836403Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T22:24:36.9836560Z 2026-10-24T22:24:36.9836792Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T22:24:36.9837188Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T22:24:36.9837426Z 1997 │ assert.equal( 2026-10-24T22:24:36.9837663Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T22:24:36.9837899Z ·  ────── 2026-10-24T22:24:36.9838072Z 1999 │ "authoritative answer", 2026-10-24T22:24:36.9838223Z ╰──── 2026-10-24T22:24:36.9838455Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T22:24:36.9838635Z 2026-10-24T22:24:36.9839113Z ⚠ 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-24T22:24:36.9839713Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T22:24:36.9840073Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T22:24:36.9840476Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T22:24:36.9840791Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9841059Z 3953 │ ╰─▶ } 2026-10-24T22:24:36.9841324Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T22:24:36.9841510Z ╰──── 2026-10-24T22:24:36.9841567Z 2026-10-24T22:24:36.9842043Z ⚠ 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-24T22:24:36.9842644Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T22:24:36.9842907Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T22:24:36.9843199Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T22:24:36.9843490Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9843758Z 6064 │ ╰─▶ } 2026-10-24T22:24:36.9844113Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T22:24:36.9844341Z ╰──── 2026-10-24T22:24:36.9844397Z 2026-10-24T22:24:36.9844866Z ⚠ 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-24T22:24:36.9845461Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T22:24:36.9845719Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T22:24:36.9846006Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T22:24:36.9846351Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9846643Z 6199 │ ╰─▶ } 2026-10-24T22:24:36.9846954Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T22:24:36.9847176Z ╰──── 2026-10-24T22:24:36.9847232Z 2026-10-24T22:24:36.9847391Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9847718Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T22:24:36.9847949Z 107 │ ); 2026-10-24T22:24:36.9848166Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T22:24:36.9848419Z ·  ─────────┬──────── 2026-10-24T22:24:36.9848678Z · ╰── `separationProgress` originates here 2026-10-24T22:24:36.9848891Z 109 │ 2026-10-24T22:24:36.9849018Z 110 │ useEffect(() => { 2026-10-24T22:24:36.9849281Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T22:24:36.9849545Z ·  ─────────┬──────── 2026-10-24T22:24:36.9849797Z · ╰── `separationProgress` cannot be modified 2026-10-24T22:24:36.9850064Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T22:24:36.9850245Z ╰──── 2026-10-24T22:24:36.9850589Z  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-24T22:24:36.9851254Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9851570Z 2026-10-24T22:24:36.9851735Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9852071Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T22:24:36.9852370Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T22:24:36.9852624Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T22:24:36.9852848Z ·  ──────┬───── 2026-10-24T22:24:36.9853090Z · ╰── `capsuleWidth` originates here 2026-10-24T22:24:36.9853357Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T22:24:36.9853610Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T22:24:36.9853870Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T22:24:36.9854112Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T22:24:36.9854332Z 134 │ return; 2026-10-24T22:24:36.9854464Z 135 │ } 2026-10-24T22:24:36.9854642Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T22:24:36.9854859Z 137 │ measuredWidthRef.current = width; 2026-10-24T22:24:36.9855119Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T22:24:36.9855361Z ·  ──────┬───── 2026-10-24T22:24:36.9855604Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T22:24:36.9855812Z 139 │ }; 2026-10-24T22:24:36.9855929Z ╰──── 2026-10-24T22:24:36.9856267Z  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-24T22:24:36.9856924Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9857283Z 2026-10-24T22:24:36.9857447Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9857782Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T22:24:36.9858076Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T22:24:36.9858325Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T22:24:36.9858547Z ·  ──────┬───── 2026-10-24T22:24:36.9858786Z · ╰── `capsuleWidth` originates here 2026-10-24T22:24:36.9859050Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T22:24:36.9859307Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T22:24:36.9859560Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T22:24:36.9859785Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T22:24:36.9859968Z 134 │ return; 2026-10-24T22:24:36.9860101Z 135 │ } 2026-10-24T22:24:36.9860282Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T22:24:36.9860508Z 137 │ measuredWidthRef.current = width; 2026-10-24T22:24:36.9860778Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T22:24:36.9861008Z 139 │ }; 2026-10-24T22:24:36.9861174Z 140 │ const hasStatus = props.status !== null; 2026-10-24T22:24:36.9861445Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T22:24:36.9861675Z 142 │ useEffect(() => { 2026-10-24T22:24:36.9861841Z 143 │ if (!hasStatus) { 2026-10-24T22:24:36.9862031Z 144 │ measuredWidthRef.current = null; 2026-10-24T22:24:36.9862227Z 145 │ capsuleWidth.value = null; 2026-10-24T22:24:36.9862420Z ·  ──────┬───── 2026-10-24T22:24:36.9862671Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T22:24:36.9862887Z 146 │ } 2026-10-24T22:24:36.9863010Z ╰──── 2026-10-24T22:24:36.9863362Z  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-24T22:24:36.9863977Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9864343Z 2026-10-24T22:24:36.9864571Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T22:24:36.9864967Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T22:24:36.9865300Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T22:24:36.9865535Z 142 │ useEffect(() => { 2026-10-24T22:24:36.9865709Z ·  ───┬─── 2026-10-24T22:24:36.9866052Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T22:24:36.9866353Z 143 │ if (!hasStatus) { 2026-10-24T22:24:36.9866539Z 144 │ measuredWidthRef.current = null; 2026-10-24T22:24:36.9866736Z 145 │ capsuleWidth.value = null; 2026-10-24T22:24:36.9866926Z ·  ──────┬───── 2026-10-24T22:24:36.9867232Z · ╰── This modifies `capsuleWidth` 2026-10-24T22:24:36.9867500Z 146 │ } 2026-10-24T22:24:36.9867622Z ╰──── 2026-10-24T22:24:36.9868059Z  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-24T22:24:36.9868744Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9869070Z 2026-10-24T22:24:36.9869289Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T22:24:36.9869684Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T22:24:36.9869990Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T22:24:36.9870260Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T22:24:36.9870549Z ·  ───────────────┬─────────────── 2026-10-24T22:24:36.9870958Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T22:24:36.9871331Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T22:24:36.9871572Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T22:24:36.9871768Z 134 │ return; 2026-10-24T22:24:36.9871908Z 135 │ } 2026-10-24T22:24:36.9872098Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T22:24:36.9872327Z 137 │ measuredWidthRef.current = width; 2026-10-24T22:24:36.9872603Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T22:24:36.9872871Z ·  ──────┬───── 2026-10-24T22:24:36.9873120Z · ╰── This modifies `capsuleWidth` 2026-10-24T22:24:36.9873335Z 139 │ }; 2026-10-24T22:24:36.9873457Z ╰──── 2026-10-24T22:24:36.9873904Z  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-24T22:24:36.9874652Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9874986Z 2026-10-24T22:24:36.9875280Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9875742Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T22:24:36.9876067Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T22:24:36.9876291Z 278 │ useEffect(() => { 2026-10-24T22:24:36.9876465Z ·  ────┬──── 2026-10-24T22:24:36.9876706Z · ╰── This is the containing effect 2026-10-24T22:24:36.9876953Z 279 │ setNow(new Date().toISOString()); 2026-10-24T22:24:36.9877144Z ·  ───┬── 2026-10-24T22:24:36.9877426Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9877762Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T22:24:36.9877982Z ╰──── 2026-10-24T22:24:36.9878780Z  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-24T22:24:36.9879782Z  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-24T22:24:36.9880123Z 2026-10-24T22:24:36.9880380Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T22:24:36.9880809Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T22:24:36.9881073Z 12 │ threadSearchMatchKey, 2026-10-24T22:24:36.9881279Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T22:24:36.9881516Z ·  ──────────────┬───────────── 2026-10-24T22:24:36.9881845Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T22:24:36.9882161Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T22:24:36.9882353Z ╰──── 2026-10-24T22:24:36.9882526Z  help: Consider removing this import. 2026-10-24T22:24:36.9882656Z 2026-10-24T22:24:36.9882882Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9883290Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T22:24:36.9883628Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T22:24:36.9883896Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T22:24:36.9884159Z ·  ───────┬────── 2026-10-24T22:24:36.9884473Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T22:24:36.9884783Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T22:24:36.9884981Z ╰──── 2026-10-24T22:24:36.9885378Z  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-24T22:24:36.9886044Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9886382Z 2026-10-24T22:24:36.9886570Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:36.9886941Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T22:24:36.9887224Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T22:24:36.9887520Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T22:24:36.9887841Z ·  ─────┬──── 2026-10-24T22:24:36.9888169Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9888434Z 351 │ const id = setTimeout(() => { 2026-10-24T22:24:36.9888602Z ╰──── 2026-10-24T22:24:36.9888985Z  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-24T22:24:36.9889623Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9889945Z 2026-10-24T22:24:36.9890288Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:36.9890807Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T22:24:36.9891040Z 150 │ 2026-10-24T22:24:36.9891179Z 151 │ useEffect(() => { 2026-10-24T22:24:36.9891351Z ·  ────┬──── 2026-10-24T22:24:36.9891588Z · ╰── This is the containing effect 2026-10-24T22:24:36.9891828Z 152 │ if (!controlledSelectedPath) { 2026-10-24T22:24:36.9892012Z 153 │ return; 2026-10-24T22:24:36.9892150Z 154 │ } 2026-10-24T22:24:36.9892313Z 155 │ setExpandedPaths((current) => { 2026-10-24T22:24:36.9892512Z ·  ────────┬─────── 2026-10-24T22:24:36.9892807Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:36.9893135Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T22:24:36.9893344Z ╰──── 2026-10-24T22:24:36.9894067Z  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-24T22:24:36.9895045Z  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-24T22:24:36.9895383Z 2026-10-24T22:24:36.9895671Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9896108Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T22:24:36.9896335Z 3754 │ 2026-10-24T22:24:36.9896620Z 3755 │ const layer: Layer.Layer = 2026-10-24T22:24:36.9896924Z ·  ──┬── 2026-10-24T22:24:36.9897160Z · ╰── 'layer' is declared here 2026-10-24T22:24:36.9897377Z 3756 │ Layer.effect( 2026-10-24T22:24:36.9897520Z ╰──── 2026-10-24T22:24:36.9897698Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9897829Z 2026-10-24T22:24:36.9898017Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T22:24:36.9898414Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T22:24:36.9898761Z 52 │ 2026-10-24T22:24:36.9898939Z 53 │ for (const {} of [ 2026-10-24T22:24:36.9899108Z ·  ── 2026-10-24T22:24:36.9899276Z 54 │ { healthy: true }, 2026-10-24T22:24:36.9899424Z ╰──── 2026-10-24T22:24:36.9899737Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T22:24:36.9899987Z 2026-10-24T22:24:36.9900273Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9900682Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T22:24:36.9900890Z 3404 │ 2026-10-24T22:24:36.9901162Z 3405 │ const layer: Layer.Layer = 2026-10-24T22:24:36.9901451Z ·  ──┬── 2026-10-24T22:24:36.9901685Z · ╰── 'layer' is declared here 2026-10-24T22:24:36.9901903Z 3406 │ Layer.effect( 2026-10-24T22:24:36.9902048Z ╰──── 2026-10-24T22:24:36.9902221Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9902351Z 2026-10-24T22:24:36.9902522Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9902869Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T22:24:36.9903105Z 35 │ 2026-10-24T22:24:36.9903317Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T22:24:36.9903575Z ·  ────────┬──────── 2026-10-24T22:24:36.9903843Z · ╰── `inspectorProgress` originates here 2026-10-24T22:24:36.9904123Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T22:24:36.9904422Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T22:24:36.9904641Z 39 │ 2026-10-24T22:24:36.9904795Z 40 │ const onClosed = props.onClosed; 2026-10-24T22:24:36.9904978Z 41 │ useEffect(() => { 2026-10-24T22:24:36.9905167Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T22:24:36.9905375Z ·  ────────┬──────── 2026-10-24T22:24:36.9905639Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T22:24:36.9905888Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T22:24:36.9906053Z ╰──── 2026-10-24T22:24:36.9906405Z  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-24T22:24:36.9907031Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9907361Z 2026-10-24T22:24:36.9907531Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9907879Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T22:24:36.9908162Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T22:24:36.9908430Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T22:24:36.9908684Z ·  ──────────┬───────── 2026-10-24T22:24:36.9908960Z · ╰── `renderedContentWidth` originates here 2026-10-24T22:24:36.9909181Z 39 │ 2026-10-24T22:24:36.9909331Z 40 │ const onClosed = props.onClosed; 2026-10-24T22:24:36.9909509Z 41 │ useEffect(() => { 2026-10-24T22:24:36.9909753Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T22:24:36.9909986Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T22:24:36.9910168Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T22:24:36.9910335Z 45 │ (finished) => { 2026-10-24T22:24:36.9910577Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T22:24:36.9910819Z 47 │ runOnJS(onClosed)(); 2026-10-24T22:24:36.9910981Z 48 │ } 2026-10-24T22:24:36.9911112Z 49 │ }, 2026-10-24T22:24:36.9911240Z 50 │ ); 2026-10-24T22:24:36.9911457Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T22:24:36.9911701Z 52 │ renderedInspectorWidth.set( 2026-10-24T22:24:36.9911970Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T22:24:36.9912196Z 54 │ ); 2026-10-24T22:24:36.9912328Z 55 │ }, [ 2026-10-24T22:24:36.9912470Z 56 │ inspectorProgress, 2026-10-24T22:24:36.9912636Z 57 │ inspectorVisible, 2026-10-24T22:24:36.9912798Z 58 │ inspectorWidth, 2026-10-24T22:24:36.9912950Z 59 │ onClosed, 2026-10-24T22:24:36.9913105Z 60 │ renderedInspectorWidth, 2026-10-24T22:24:36.9913266Z 61 │ resizing, 2026-10-24T22:24:36.9913401Z 62 │ ]); 2026-10-24T22:24:36.9913523Z 63 │ 2026-10-24T22:24:36.9913654Z 64 │ useEffect(() => { 2026-10-24T22:24:36.9913846Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T22:24:36.9914058Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T22:24:36.9914313Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T22:24:36.9914534Z ·  ──────────┬───────── 2026-10-24T22:24:36.9914821Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T22:24:36.9915058Z 68 │ return; 2026-10-24T22:24:36.9915190Z ╰──── 2026-10-24T22:24:36.9915543Z  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-24T22:24:36.9916163Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9916488Z 2026-10-24T22:24:36.9916719Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T22:24:36.9917074Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T22:24:36.9917331Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T22:24:36.9917641Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T22:24:36.9917960Z 159 │ │ constructor(data: Record) { 2026-10-24T22:24:36.9918245Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T22:24:36.9918469Z 161 │ │ } 2026-10-24T22:24:36.9918709Z 162 │ ╰─▶ }, 2026-10-24T22:24:36.9918780Z 163 │ clipboard: { 2026-10-24T22:24:36.9918837Z ╰──── 2026-10-24T22:24:36.9919023Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T22:24:36.9919026Z 2026-10-24T22:24:36.9919248Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9919425Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7] 2026-10-24T22:24:36.9919542Z 154 │ } 2026-10-24T22:24:36.9919655Z 155 │ }, [wrappedRender]); 2026-10-24T22:24:36.9919742Z ·  ──────┬────── 2026-10-24T22:24:36.9919912Z · ╰── Unnecessary dependency `wrappedRender` 2026-10-24T22:24:36.9919972Z 156 │ 2026-10-24T22:24:36.9920028Z ╰──── 2026-10-24T22:24:36.9920350Z  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-24T22:24:36.9920693Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9920696Z 2026-10-24T22:24:36.9920967Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T22:24:36.9921147Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42] 2026-10-24T22:24:36.9921207Z 799 │ > 2026-10-24T22:24:36.9921346Z 800 │ 2026-10-24T22:24:36.9921481Z ·  ──────────────────── 2026-10-24T22:24:36.9921590Z 801 │ 2026-10-24T22:24:36.9921646Z ╰──── 2026-10-24T22:24:36.9921888Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T22:24:36.9922040Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T22:24:36.9922042Z 2026-10-24T22:24:36.9922565Z ⚠ 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-24T22:24:36.9922715Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T22:24:36.9922781Z 130 │ ) { 2026-10-24T22:24:36.9923010Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T22:24:36.9923147Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T22:24:36.9923245Z 133 │ │ return; 2026-10-24T22:24:36.9923333Z 134 │ │ } 2026-10-24T22:24:36.9923449Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9923603Z 136 │ ╰─▶ } 2026-10-24T22:24:36.9923784Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T22:24:36.9923840Z ╰──── 2026-10-24T22:24:36.9923842Z 2026-10-24T22:24:36.9924392Z ⚠ 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-24T22:24:36.9924539Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T22:24:36.9924716Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T22:24:36.9924990Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T22:24:36.9925153Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9925325Z 254 │ ╰─▶ } 2026-10-24T22:24:36.9925462Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T22:24:36.9925517Z ╰──── 2026-10-24T22:24:36.9925520Z 2026-10-24T22:24:36.9926019Z ⚠ 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-24T22:24:36.9926162Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T22:24:36.9926222Z 257 │ 2026-10-24T22:24:36.9926499Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T22:24:36.9926617Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9926761Z 260 │ ╰─▶ } 2026-10-24T22:24:36.9926875Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T22:24:36.9926933Z ╰──── 2026-10-24T22:24:36.9926936Z 2026-10-24T22:24:36.9927434Z ⚠ 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-24T22:24:36.9927576Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T22:24:36.9927640Z 321 │ ); 2026-10-24T22:24:36.9927922Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T22:24:36.9928039Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9928179Z 324 │ ╰─▶ } 2026-10-24T22:24:36.9928238Z 325 │ 2026-10-24T22:24:36.9928293Z ╰──── 2026-10-24T22:24:36.9928295Z 2026-10-24T22:24:36.9928792Z ⚠ 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-24T22:24:36.9928935Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T22:24:36.9929111Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T22:24:36.9929383Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T22:24:36.9929498Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9929639Z 332 │ ╰─▶ } 2026-10-24T22:24:36.9929751Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T22:24:36.9929804Z ╰──── 2026-10-24T22:24:36.9929807Z 2026-10-24T22:24:36.9930304Z ⚠ 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-24T22:24:36.9930451Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T22:24:36.9930565Z 225 │ ) { 2026-10-24T22:24:36.9930872Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T22:24:36.9930995Z 227 │ │ const socket = sockets[index]; 2026-10-24T22:24:36.9931091Z 228 │ │ if (socket) { 2026-10-24T22:24:36.9931193Z 229 │ │ return socket; 2026-10-24T22:24:36.9931272Z 230 │ │ } 2026-10-24T22:24:36.9931384Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9931519Z 232 │ ╰─▶ } 2026-10-24T22:24:36.9931710Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T22:24:36.9931765Z ╰──── 2026-10-24T22:24:36.9931767Z 2026-10-24T22:24:36.9932268Z ⚠ 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-24T22:24:36.9932419Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T22:24:36.9932480Z 239 │ ) { 2026-10-24T22:24:36.9932697Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T22:24:36.9932929Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T22:24:36.9933028Z 242 │ │ if (request) { 2026-10-24T22:24:36.9933131Z 243 │ │ return request; 2026-10-24T22:24:36.9933210Z 244 │ │ } 2026-10-24T22:24:36.9933324Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:36.9933461Z 246 │ ╰─▶ } 2026-10-24T22:24:36.9933642Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T22:24:36.9933697Z ╰──── 2026-10-24T22:24:36.9933700Z 2026-10-24T22:24:36.9933855Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9934022Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T22:24:36.9934113Z 493 │ > 2026-10-24T22:24:36.9934199Z 494 │ {props.children(close)} 2026-10-24T22:24:36.9934298Z ·  ──┬── 2026-10-24T22:24:36.9934545Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9934673Z 495 │ 2026-10-24T22:24:36.9934728Z ╰──── 2026-10-24T22:24:36.9935235Z  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-24T22:24:36.9935555Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9935558Z 2026-10-24T22:24:36.9935807Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T22:24:36.9935947Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T22:24:36.9936029Z 14 │ threadSearchMatchKey, 2026-10-24T22:24:36.9936124Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T22:24:36.9936238Z ·  ──────────────┬───────────── 2026-10-24T22:24:36.9936428Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T22:24:36.9936544Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T22:24:36.9936598Z ╰──── 2026-10-24T22:24:36.9936705Z  help: Consider removing this import. 2026-10-24T22:24:36.9936708Z 2026-10-24T22:24:36.9936924Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9937067Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T22:24:36.9937207Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T22:24:36.9937313Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T22:24:36.9937431Z ·  ───────┬────── 2026-10-24T22:24:36.9937612Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T22:24:36.9937763Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T22:24:36.9937820Z ╰──── 2026-10-24T22:24:36.9938140Z  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-24T22:24:36.9938480Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9938483Z 2026-10-24T22:24:36.9938671Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:36.9938812Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T22:24:36.9938907Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T22:24:36.9939078Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T22:24:36.9939210Z ·  ─────┬──── 2026-10-24T22:24:36.9939387Z · ╰── Cannot call impure function 2026-10-24T22:24:36.9939473Z 519 │ const id = setTimeout(() => { 2026-10-24T22:24:36.9939530Z ╰──── 2026-10-24T22:24:36.9939839Z  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-24T22:24:36.9940209Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:36.9940242Z 2026-10-24T22:24:36.9940483Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T22:24:36.9940625Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T22:24:36.9940705Z 113 │ const declared = { 2026-10-24T22:24:36.9940805Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T22:24:36.9940927Z ·  ──────────────────────────────── 2026-10-24T22:24:36.9941043Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T22:24:36.9941099Z ╰──── 2026-10-24T22:24:36.9941397Z  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-24T22:24:36.9941403Z 2026-10-24T22:24:36.9941639Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T22:24:36.9941779Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T22:24:36.9941877Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T22:24:36.9941990Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T22:24:36.9942121Z ·  ──────────────────────────────────────── 2026-10-24T22:24:36.9942226Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T22:24:36.9942282Z ╰──── 2026-10-24T22:24:36.9942568Z  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-24T22:24:36.9942571Z 2026-10-24T22:24:36.9942811Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T22:24:36.9942953Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T22:24:36.9943064Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T22:24:36.9943169Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T22:24:36.9943293Z ·  ──────────────────────────────────── 2026-10-24T22:24:36.9943360Z 117 │ }; 2026-10-24T22:24:36.9943416Z ╰──── 2026-10-24T22:24:36.9943702Z  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-24T22:24:36.9943704Z 2026-10-24T22:24:36.9943874Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9944066Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T22:24:36.9944141Z 90 │ }) { 2026-10-24T22:24:36.9944291Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T22:24:36.9944374Z ·  ────┬─── 2026-10-24T22:24:36.9944517Z · ╰── `rotation` originates here 2026-10-24T22:24:36.9944595Z 92 │ useLayoutEffect(() => { 2026-10-24T22:24:36.9944749Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T22:24:36.9944828Z ·  ────┬─── 2026-10-24T22:24:36.9944971Z · ╰── `rotation` cannot be modified 2026-10-24T22:24:36.9945056Z 94 │ }, [props.hidden, rotation]); 2026-10-24T22:24:36.9945112Z ╰──── 2026-10-24T22:24:36.9945446Z  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-24T22:24:36.9945811Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9945814Z 2026-10-24T22:24:36.9945985Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9946174Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T22:24:36.9946278Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T22:24:36.9946423Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T22:24:36.9946519Z ·  ────────┬──────── 2026-10-24T22:24:36.9946682Z · ╰── `loadingVisibility` originates here 2026-10-24T22:24:36.9946764Z 268 │ useLayoutEffect(() => { 2026-10-24T22:24:36.9946938Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T22:24:36.9947028Z ·  ────────┬──────── 2026-10-24T22:24:36.9947189Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T22:24:36.9947289Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T22:24:36.9947343Z ╰──── 2026-10-24T22:24:36.9947630Z  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-24T22:24:36.9947965Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9947968Z 2026-10-24T22:24:36.9948142Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:36.9948327Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T22:24:36.9948386Z 325 │ }) { 2026-10-24T22:24:36.9948561Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T22:24:36.9948658Z ·  ─────────┬───────── 2026-10-24T22:24:36.9948823Z · ╰── `recordingVisibility` originates here 2026-10-24T22:24:36.9948904Z 327 │ useLayoutEffect(() => { 2026-10-24T22:24:36.9949110Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T22:24:36.9949205Z ·  ─────────┬───────── 2026-10-24T22:24:36.9949378Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T22:24:36.9949479Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T22:24:36.9949537Z ╰──── 2026-10-24T22:24:36.9949822Z  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-24T22:24:36.9950155Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:36.9950158Z 2026-10-24T22:24:36.9950315Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9950496Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T22:24:36.9950585Z 26 │ const latestInput = useRef(input); 2026-10-24T22:24:36.9950669Z 27 │ latestInput.current = input; 2026-10-24T22:24:36.9950838Z ·  ─────┬─────────┬─── 2026-10-24T22:24:36.9951073Z · │ ╰── Cannot update ref value during render 2026-10-24T22:24:36.9951199Z · ╰── This value is a ref 2026-10-24T22:24:36.9951282Z 28 │ const mounted = useRef(true); 2026-10-24T22:24:36.9951336Z ╰──── 2026-10-24T22:24:36.9951849Z  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-24T22:24:36.9952167Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9952170Z 2026-10-24T22:24:36.9952399Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T22:24:36.9952580Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T22:24:36.9952674Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T22:24:36.9952802Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T22:24:36.9952891Z ·  ─────┬───── 2026-10-24T22:24:36.9953041Z · ╰── 'HostProcess' is imported here 2026-10-24T22:24:36.9953096Z 26 │ 2026-10-24T22:24:36.9953151Z ╰──── 2026-10-24T22:24:36.9953260Z  help: Consider removing this import. 2026-10-24T22:24:36.9953263Z 2026-10-24T22:24:36.9953563Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9953746Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T22:24:36.9953836Z 123 │ const path = yield* Path.Path; 2026-10-24T22:24:36.9953965Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T22:24:36.9954053Z ·  ──────┬───── 2026-10-24T22:24:36.9954243Z · ╰── 'serverConfig' is declared here 2026-10-24T22:24:36.9954400Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T22:24:36.9954455Z ╰──── 2026-10-24T22:24:36.9954570Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9954573Z 2026-10-24T22:24:36.9954880Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:36.9955061Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T22:24:36.9955191Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T22:24:36.9955345Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T22:24:36.9955438Z ·  ───────┬────── 2026-10-24T22:24:36.9955592Z · ╰── 'serverSettings' is declared here 2026-10-24T22:24:36.9955741Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T22:24:36.9955798Z ╰──── 2026-10-24T22:24:36.9955909Z  help: Consider removing this declaration. 2026-10-24T22:24:36.9955912Z 2026-10-24T22:24:36.9956179Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:36.9956365Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T22:24:36.9956453Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T22:24:36.9956523Z 1321 │ retryTick, 2026-10-24T22:24:36.9956603Z ·  ────┬──── 2026-10-24T22:24:36.9956754Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T22:24:36.9956834Z 1322 │ restoreQueuedMessage, 2026-10-24T22:24:36.9956891Z ╰──── 2026-10-24T22:24:36.9957212Z  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-24T22:24:36.9957552Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:36.9957561Z 2026-10-24T22:24:36.9957720Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9957894Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T22:24:36.9958067Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T22:24:36.9958201Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T22:24:36.9958333Z ·  ───────────┬────────── 2026-10-24T22:24:36.9958521Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9958651Z 123 │ const sessionRef = useRef(null); 2026-10-24T22:24:36.9958705Z ╰──── 2026-10-24T22:24:36.9959223Z  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-24T22:24:36.9959543Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9959545Z 2026-10-24T22:24:36.9959704Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9959875Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T22:24:36.9959932Z 125 │ 2026-10-24T22:24:36.9960054Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T22:24:36.9960149Z ·  ─────────┬──────── 2026-10-24T22:24:36.9960358Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9960496Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T22:24:36.9960553Z ╰──── 2026-10-24T22:24:36.9961060Z  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-24T22:24:36.9961380Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9961382Z 2026-10-24T22:24:36.9961536Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9961708Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T22:24:36.9961773Z 125 │ 2026-10-24T22:24:36.9961896Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T22:24:36.9961989Z ·  ─────────┬───────── 2026-10-24T22:24:36.9962153Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9962265Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T22:24:36.9962324Z ╰──── 2026-10-24T22:24:36.9962829Z  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-24T22:24:36.9963146Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9963149Z 2026-10-24T22:24:36.9963311Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9963489Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T22:24:36.9963549Z 125 │ 2026-10-24T22:24:36.9963666Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T22:24:36.9963795Z ·  ─────────┬───────── 2026-10-24T22:24:36.9963981Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9964104Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T22:24:36.9964160Z ╰──── 2026-10-24T22:24:36.9964701Z  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-24T22:24:36.9965024Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9965027Z 2026-10-24T22:24:36.9965183Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9965355Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T22:24:36.9965411Z 125 │ 2026-10-24T22:24:36.9965531Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T22:24:36.9965657Z ·  ──────────┬───────── 2026-10-24T22:24:36.9965838Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9965996Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T22:24:36.9966090Z ╰──── 2026-10-24T22:24:36.9966596Z  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-24T22:24:36.9966911Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9966914Z 2026-10-24T22:24:36.9967071Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9967243Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T22:24:36.9967368Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T22:24:36.9967585Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T22:24:36.9967780Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T22:24:36.9967917Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T22:24:36.9968087Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T22:24:36.9968221Z 131 │ │ isFinished: status.isFinished, 2026-10-24T22:24:36.9968418Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T22:24:36.9968530Z 133 │ │ error: status.error, 2026-10-24T22:24:36.9968640Z 134 │ │ url: status.url, 2026-10-24T22:24:36.9968742Z 135 │ │ }); 2026-10-24T22:24:36.9968835Z 136 │ │ }, 2026-10-24T22:24:36.9969047Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T22:24:36.9969168Z 138 │ │ selectInput: (inputs) => { 2026-10-24T22:24:36.9969361Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T22:24:36.9969548Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T22:24:36.9969744Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T22:24:36.9969983Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T22:24:36.9970132Z 143 │ │ if (order !== known) { 2026-10-24T22:24:36.9970321Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T22:24:36.9970468Z 145 │ │ transform: (current) => ({ 2026-10-24T22:24:36.9970786Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T22:24:36.9970924Z 147 │ │ }), 2026-10-24T22:24:36.9971047Z 148 │ │ }); 2026-10-24T22:24:36.9971222Z 149 │ │ } 2026-10-24T22:24:36.9971382Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T22:24:36.9971519Z 151 │ │ }, 2026-10-24T22:24:36.9971698Z 152 │ ├─▶ }); 2026-10-24T22:24:36.9972060Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T22:24:36.9972211Z 153 │ recorderRef.current = recorder; 2026-10-24T22:24:36.9972308Z ╰──── 2026-10-24T22:24:36.9972863Z  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-24T22:24:36.9973213Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9973215Z 2026-10-24T22:24:36.9973409Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9973593Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T22:24:36.9973713Z 152 │ }); 2026-10-24T22:24:36.9973833Z 153 │ recorderRef.current = recorder; 2026-10-24T22:24:36.9973989Z ·  ─────┬─────────┬─── 2026-10-24T22:24:36.9974240Z · │ ╰── Cannot update ref value during render 2026-10-24T22:24:36.9974403Z · ╰── This value is a ref 2026-10-24T22:24:36.9974560Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T22:24:36.9974694Z ╰──── 2026-10-24T22:24:36.9975225Z  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-24T22:24:36.9975573Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9975578Z 2026-10-24T22:24:36.9975786Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9975990Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T22:24:36.9976121Z 153 │ recorderRef.current = recorder; 2026-10-24T22:24:36.9976347Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T22:24:36.9976477Z 155 │ │ recorder, 2026-10-24T22:24:36.9976661Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T22:24:36.9976831Z 157 │ │ requestPermission: async () => { 2026-10-24T22:24:36.9977029Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T22:24:36.9977264Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T22:24:36.9977401Z 160 │ │ }, 2026-10-24T22:24:36.9977586Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T22:24:36.9977772Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T22:24:36.9977935Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T22:24:36.9978097Z 164 │ │ onStateChange: (nextState) => 2026-10-24T22:24:36.9978236Z 165 │ │ setState({ 2026-10-24T22:24:36.9978493Z 166 │ │ state: nextState, 2026-10-24T22:24:36.9978692Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T22:24:36.9978859Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T22:24:36.9979006Z 169 │ │ }), 2026-10-24T22:24:36.9979181Z 170 │ ├─▶ }); 2026-10-24T22:24:36.9979414Z · ╰──── Cannot access ref value during render 2026-10-24T22:24:36.9979514Z 171 │ } 2026-10-24T22:24:36.9979611Z ╰──── 2026-10-24T22:24:36.9980167Z  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-24T22:24:36.9980518Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9980521Z 2026-10-24T22:24:36.9980695Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9980892Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T22:24:36.9981042Z 153 │ recorderRef.current = recorder; 2026-10-24T22:24:36.9981191Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T22:24:36.9981327Z ·  ─────┬────────┬─── 2026-10-24T22:24:36.9981558Z · │ ╰── Cannot update ref value during render 2026-10-24T22:24:36.9981731Z · ╰── This value is a ref 2026-10-24T22:24:36.9981896Z 155 │ recorder, 2026-10-24T22:24:36.9981966Z ╰──── 2026-10-24T22:24:36.9982499Z  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-24T22:24:36.9982839Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9982842Z 2026-10-24T22:24:36.9983046Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9983246Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T22:24:36.9983357Z 184 │ return () => subscription.remove(); 2026-10-24T22:24:36.9983473Z 185 │ }, [controller]); 2026-10-24T22:24:36.9983590Z ·  ─────┬──── 2026-10-24T22:24:36.9983786Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9983859Z 186 │ 2026-10-24T22:24:36.9983947Z ╰──── 2026-10-24T22:24:36.9984506Z  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-24T22:24:36.9984864Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9984867Z 2026-10-24T22:24:36.9985110Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9985329Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T22:24:36.9985508Z 184 │ return () => subscription.remove(); 2026-10-24T22:24:36.9985612Z 185 │ }, [controller]); 2026-10-24T22:24:36.9985735Z ·  ──────┬───── 2026-10-24T22:24:36.9985909Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9985998Z 186 │ 2026-10-24T22:24:36.9986078Z ╰──── 2026-10-24T22:24:36.9986624Z  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-24T22:24:36.9986976Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9986982Z 2026-10-24T22:24:36.9987148Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9987350Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T22:24:36.9987454Z 191 │ }, 2026-10-24T22:24:36.9987579Z 192 │ [controller, recorder], 2026-10-24T22:24:36.9987675Z ·  ─────┬──── 2026-10-24T22:24:36.9987861Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9987951Z 193 │ ); 2026-10-24T22:24:36.9988059Z ╰──── 2026-10-24T22:24:36.9988573Z  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-24T22:24:36.9988920Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9988923Z 2026-10-24T22:24:36.9989153Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9989355Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T22:24:36.9989497Z 174 │ const controller = session.controller; 2026-10-24T22:24:36.9989605Z 175 │ const recorder = recorderRef.current; 2026-10-24T22:24:36.9989749Z ·  ─────────┬───────── 2026-10-24T22:24:36.9989945Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9990107Z 176 │ 2026-10-24T22:24:36.9990214Z ╰──── 2026-10-24T22:24:36.9990742Z  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-24T22:24:36.9991093Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9991097Z 2026-10-24T22:24:36.9991287Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9991497Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T22:24:36.9991569Z 191 │ }, 2026-10-24T22:24:36.9991682Z 192 │ [controller, recorder], 2026-10-24T22:24:36.9991805Z ·  ───────────┬────────── 2026-10-24T22:24:36.9992020Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9992092Z 193 │ ); 2026-10-24T22:24:36.9992226Z ╰──── 2026-10-24T22:24:36.9992753Z  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-24T22:24:36.9993098Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9993101Z 2026-10-24T22:24:36.9993291Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9993476Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T22:24:36.9993614Z 245 │ return () => clearInterval(intervalId); 2026-10-24T22:24:36.9993756Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T22:24:36.9993899Z ·  ─────┬──── 2026-10-24T22:24:36.9994106Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9994199Z 247 │ 2026-10-24T22:24:36.9994285Z ╰──── 2026-10-24T22:24:36.9994813Z  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-24T22:24:36.9995166Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9995172Z 2026-10-24T22:24:36.9995341Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9995953Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T22:24:36.9996073Z 245 │ return () => clearInterval(intervalId); 2026-10-24T22:24:36.9996237Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T22:24:36.9996399Z ·  ────────────────────────┬─────────────────────── 2026-10-24T22:24:36.9996598Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9996684Z 247 │ 2026-10-24T22:24:36.9996772Z ╰──── 2026-10-24T22:24:36.9997365Z  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-24T22:24:36.9997724Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9997726Z 2026-10-24T22:24:36.9997909Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:36.9998098Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T22:24:36.9998226Z 260 │ setOwnerFocused, 2026-10-24T22:24:36.9998306Z 261 │ session, 2026-10-24T22:24:36.9998414Z ·  ───┬─── 2026-10-24T22:24:36.9998593Z · ╰── Cannot access ref value during render 2026-10-24T22:24:36.9998699Z 262 │ stop, 2026-10-24T22:24:36.9998835Z ╰──── 2026-10-24T22:24:36.9999358Z  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-24T22:24:36.9999699Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:36.9999702Z 2026-10-24T22:24:36.9999881Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0000098Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T22:24:37.0000171Z 250 │ 2026-10-24T22:24:37.0000360Z 251 │ ╭─▶ return { 2026-10-24T22:24:37.0000626Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T22:24:37.0000745Z 253 │ │ state, 2026-10-24T22:24:37.0000861Z 254 │ │ audioLevels, 2026-10-24T22:24:37.0000992Z 255 │ │ elapsedSeconds, 2026-10-24T22:24:37.0001167Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T22:24:37.0001276Z 257 │ │ ownerKey, 2026-10-24T22:24:37.0001409Z 258 │ │ label, 2026-10-24T22:24:37.0001526Z 259 │ │ focusedOwners, 2026-10-24T22:24:37.0001659Z 260 │ │ setOwnerFocused, 2026-10-24T22:24:37.0001780Z 261 │ │ session, 2026-10-24T22:24:37.0001951Z 262 │ │ stop, 2026-10-24T22:24:37.0002060Z 263 │ │ cancel, 2026-10-24T22:24:37.0002226Z 264 │ ├─▶ }; 2026-10-24T22:24:37.0002473Z · ╰──── Cannot access ref value during render 2026-10-24T22:24:37.0002555Z 265 │ } 2026-10-24T22:24:37.0002632Z ╰──── 2026-10-24T22:24:37.0003162Z  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-24T22:24:37.0003502Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0003562Z 2026-10-24T22:24:37.0003794Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:37.0003996Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T22:24:37.0004222Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T22:24:37.0004385Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T22:24:37.0004501Z ·  ─────┬───── 2026-10-24T22:24:37.0004667Z · ╰── `audioLevels` originates here 2026-10-24T22:24:37.0004822Z 123 │ const sessionRef = useRef(null); 2026-10-24T22:24:37.0005024Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T22:24:37.0005112Z 125 │ 2026-10-24T22:24:37.0005321Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T22:24:37.0005437Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T22:24:37.0005642Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T22:24:37.0005776Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T22:24:37.0005936Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T22:24:37.0006041Z 131 │ isFinished: status.isFinished, 2026-10-24T22:24:37.0006238Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T22:24:37.0006356Z 133 │ error: status.error, 2026-10-24T22:24:37.0006463Z 134 │ url: status.url, 2026-10-24T22:24:37.0006540Z 135 │ }); 2026-10-24T22:24:37.0006624Z 136 │ }, 2026-10-24T22:24:37.0006858Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T22:24:37.0006978Z 138 │ selectInput: (inputs) => { 2026-10-24T22:24:37.0007126Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T22:24:37.0007278Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T22:24:37.0007457Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T22:24:37.0007610Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T22:24:37.0007703Z 143 │ if (order !== known) { 2026-10-24T22:24:37.0007903Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T22:24:37.0008021Z 145 │ transform: (current) => ({ 2026-10-24T22:24:37.0008257Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T22:24:37.0008336Z 147 │ }), 2026-10-24T22:24:37.0008440Z 148 │ }); 2026-10-24T22:24:37.0008539Z 149 │ } 2026-10-24T22:24:37.0008687Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T22:24:37.0008770Z 151 │ }, 2026-10-24T22:24:37.0008861Z 152 │ }); 2026-10-24T22:24:37.0008982Z 153 │ recorderRef.current = recorder; 2026-10-24T22:24:37.0009112Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T22:24:37.0009202Z 155 │ recorder, 2026-10-24T22:24:37.0009347Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T22:24:37.0009470Z 157 │ requestPermission: async () => { 2026-10-24T22:24:37.0009646Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T22:24:37.0009820Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T22:24:37.0009929Z 160 │ }, 2026-10-24T22:24:37.0010216Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T22:24:37.0010398Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T22:24:37.0010522Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T22:24:37.0010644Z 164 │ onStateChange: (nextState) => 2026-10-24T22:24:37.0010820Z 165 │ setState({ 2026-10-24T22:24:37.0010926Z 166 │ state: nextState, 2026-10-24T22:24:37.0011054Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T22:24:37.0011181Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T22:24:37.0011302Z 169 │ }), 2026-10-24T22:24:37.0011390Z 170 │ }); 2026-10-24T22:24:37.0011460Z 171 │ } 2026-10-24T22:24:37.0011544Z 172 │ 2026-10-24T22:24:37.0011670Z 173 │ const session = sessionRef.current; 2026-10-24T22:24:37.0011812Z 174 │ const controller = session.controller; 2026-10-24T22:24:37.0011920Z 175 │ const recorder = recorderRef.current; 2026-10-24T22:24:37.0012010Z 176 │ 2026-10-24T22:24:37.0012105Z 177 │ useEffect(() => { 2026-10-24T22:24:37.0012333Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T22:24:37.0012567Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T22:24:37.0012749Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T22:24:37.0012893Z 181 │ // calls and route interruptions during capture. 2026-10-24T22:24:37.0016600Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T22:24:37.0016680Z 183 │ }); 2026-10-24T22:24:37.0016776Z 184 │ return () => subscription.remove(); 2026-10-24T22:24:37.0016845Z 185 │ }, [controller]); 2026-10-24T22:24:37.0016909Z 186 │ 2026-10-24T22:24:37.0016983Z 187 │ useEffect( 2026-10-24T22:24:37.0017053Z 188 │ () => () => { 2026-10-24T22:24:37.0017131Z 189 │ controller.dispose(); 2026-10-24T22:24:37.0017207Z 190 │ recorder.release(); 2026-10-24T22:24:37.0017269Z 191 │ }, 2026-10-24T22:24:37.0017341Z 192 │ [controller, recorder], 2026-10-24T22:24:37.0017401Z 193 │ ); 2026-10-24T22:24:37.0017458Z 194 │ 2026-10-24T22:24:37.0017528Z 195 │ useEffect(() => { 2026-10-24T22:24:37.0017628Z 196 │ if (state.phase !== "recording") return; 2026-10-24T22:24:37.0017685Z 197 │ 2026-10-24T22:24:37.0017848Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T22:24:37.0017963Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T22:24:37.0018048Z 200 │ void activation.catch(() => {}); 2026-10-24T22:24:37.0018123Z 201 │ return () => { 2026-10-24T22:24:37.0018289Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T22:24:37.0018437Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T22:24:37.0018495Z 204 │ }; 2026-10-24T22:24:37.0018581Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T22:24:37.0018638Z 206 │ 2026-10-24T22:24:37.0018707Z 207 │ useEffect(() => { 2026-10-24T22:24:37.0018847Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T22:24:37.0018903Z 209 │ 2026-10-24T22:24:37.0019035Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T22:24:37.0019199Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T22:24:37.0019309Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T22:24:37.0019500Z ·  ─────┬───── 2026-10-24T22:24:37.0019699Z · ╰── `audioLevels` cannot be modified 2026-10-24T22:24:37.0019759Z 213 │ } 2026-10-24T22:24:37.0019814Z ╰──── 2026-10-24T22:24:37.0020101Z  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-24T22:24:37.0020433Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:37.0020437Z 2026-10-24T22:24:37.0020656Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T22:24:37.0020826Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T22:24:37.0020889Z 206 │ 2026-10-24T22:24:37.0020961Z 207 │ useEffect(() => { 2026-10-24T22:24:37.0021047Z ·  ───┬─── 2026-10-24T22:24:37.0021282Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T22:24:37.0021434Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T22:24:37.0021491Z 209 │ 2026-10-24T22:24:37.0021624Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T22:24:37.0021785Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T22:24:37.0021895Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T22:24:37.0021977Z ·  ─────┬───── 2026-10-24T22:24:37.0022124Z · ╰── This modifies `audioLevels` 2026-10-24T22:24:37.0022183Z 213 │ } 2026-10-24T22:24:37.0022240Z ╰──── 2026-10-24T22:24:37.0022600Z  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-24T22:24:37.0022920Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:37.0022923Z 2026-10-24T22:24:37.0023093Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:37.0023271Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T22:24:37.0023381Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T22:24:37.0023471Z 66 │ const progress = useSharedValue(0); 2026-10-24T22:24:37.0023556Z ·  ────┬─── 2026-10-24T22:24:37.0023698Z · ╰── `progress` originates here 2026-10-24T22:24:37.0023769Z 67 │ useEffect(() => { 2026-10-24T22:24:37.0023902Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T22:24:37.0023981Z ·  ────┬─── 2026-10-24T22:24:37.0024155Z · ╰── `progress` cannot be modified 2026-10-24T22:24:37.0024233Z 69 │ }, [expanded, progress]); 2026-10-24T22:24:37.0024288Z ╰──── 2026-10-24T22:24:37.0024567Z  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-24T22:24:37.0024934Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:37.0024969Z 2026-10-24T22:24:37.0025184Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:37.0025306Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T22:24:37.0025384Z 28 │ getPendingThreadOrder(); 2026-10-24T22:24:37.0025472Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T22:24:37.0025607Z ·  ────┬──── ───────┬────── 2026-10-24T22:24:37.0025811Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T22:24:37.0025957Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T22:24:37.0026024Z 30 │ return pending; 2026-10-24T22:24:37.0026080Z ╰──── 2026-10-24T22:24:37.0026397Z  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-24T22:24:37.0026728Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0026731Z 2026-10-24T22:24:37.0026966Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T22:24:37.0027112Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T22:24:37.0027182Z 20 │ [instanceId]: { 2026-10-24T22:24:37.0027268Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T22:24:37.0027378Z ·  ──────────────────────────── 2026-10-24T22:24:37.0027448Z 22 │ [model]: options, 2026-10-24T22:24:37.0027510Z ╰──── 2026-10-24T22:24:37.0027792Z  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-24T22:24:37.0027795Z 2026-10-24T22:24:37.0028067Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0028202Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T22:24:37.0028319Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T22:24:37.0028390Z 84 │ useEffect(() => { 2026-10-24T22:24:37.0028468Z ·  ────┬──── 2026-10-24T22:24:37.0028603Z · ╰── This is the containing effect 2026-10-24T22:24:37.0028697Z 85 │ if (!actionState.isRunning) return; 2026-10-24T22:24:37.0028824Z 86 │ setNowMs(Date.now()); 2026-10-24T22:24:37.0028930Z ·  ────┬─── 2026-10-24T22:24:37.0029104Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0029238Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T22:24:37.0029293Z ╰──── 2026-10-24T22:24:37.0029925Z  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-24T22:24:37.0030271Z  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-24T22:24:37.0030275Z 2026-10-24T22:24:37.0030549Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0030738Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T22:24:37.0030794Z 118 │ 2026-10-24T22:24:37.0030863Z 119 │ useEffect(() => { 2026-10-24T22:24:37.0030937Z ·  ────┬──── 2026-10-24T22:24:37.0031078Z · ╰── This is the containing effect 2026-10-24T22:24:37.0031168Z 120 │ if (orientationSettled) return; 2026-10-24T22:24:37.0031288Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T22:24:37.0031367Z 122 │ if (orientation === null) { 2026-10-24T22:24:37.0031456Z 123 │ setOrientationSettled(true); 2026-10-24T22:24:37.0031559Z ·  ──────────┬────────── 2026-10-24T22:24:37.0031747Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0031811Z 124 │ return; 2026-10-24T22:24:37.0031867Z ╰──── 2026-10-24T22:24:37.0032495Z  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-24T22:24:37.0032834Z  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-24T22:24:37.0032837Z 2026-10-24T22:24:37.0033112Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0033292Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T22:24:37.0033351Z 292 │ 2026-10-24T22:24:37.0033421Z 293 │ useEffect(() => { 2026-10-24T22:24:37.0033499Z ·  ────┬──── 2026-10-24T22:24:37.0033636Z · ╰── This is the containing effect 2026-10-24T22:24:37.0033700Z 294 │ if ( 2026-10-24T22:24:37.0033772Z 295 │ scene === null || 2026-10-24T22:24:37.0033856Z 296 │ requestedScene === null || 2026-10-24T22:24:37.0033938Z 297 │ scene !== requestedScene || 2026-10-24T22:24:37.0034009Z 298 │ !hasFixture || 2026-10-24T22:24:37.0034118Z 299 │ !orientationSettled || 2026-10-24T22:24:37.0034192Z 300 │ !themeApplied || 2026-10-24T22:24:37.0034368Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T22:24:37.0034544Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T22:24:37.0034606Z 303 │ ) { 2026-10-24T22:24:37.0034678Z 304 │ setReadyScene(null); 2026-10-24T22:24:37.0034764Z ·  ──────┬────── 2026-10-24T22:24:37.0034944Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0035010Z 305 │ return; 2026-10-24T22:24:37.0035065Z ╰──── 2026-10-24T22:24:37.0035693Z  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-24T22:24:37.0036034Z  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-24T22:24:37.0036038Z 2026-10-24T22:24:37.0036324Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0036506Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T22:24:37.0036582Z 127 │ let cancelled = false; 2026-10-24T22:24:37.0036677Z 128 │ let lastOutcome: string | null = null; 2026-10-24T22:24:37.0036763Z ·  ─────┬───── 2026-10-24T22:24:37.0036906Z · ╰── 'lastOutcome' is declared here 2026-10-24T22:24:37.0037103Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T22:24:37.0037159Z ╰──── 2026-10-24T22:24:37.0037273Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0037276Z 2026-10-24T22:24:37.0037503Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T22:24:37.0037614Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T22:24:37.0037681Z 1078 │ } 2026-10-24T22:24:37.0037972Z ·  ───────────────────────────────────────────── 2026-10-24T22:24:37.0038063Z 1080 │ screenOptions={({ route }) => 2026-10-24T22:24:37.0038116Z ╰──── 2026-10-24T22:24:37.0038510Z  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-24T22:24:37.0038515Z 2026-10-24T22:24:37.0038812Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T22:24:37.0038980Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T22:24:37.0039039Z 162 │ keys, 2026-10-24T22:24:37.0039116Z 163 │ overridingProjects = [], 2026-10-24T22:24:37.0039209Z ·  ── 2026-10-24T22:24:37.0039281Z 164 │ onClearOverrides, 2026-10-24T22:24:37.0039334Z ╰──── 2026-10-24T22:24:37.0039674Z  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-24T22:24:37.0039735Z 2026-10-24T22:24:37.0039958Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T22:24:37.0040154Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T22:24:37.0040228Z 115 │ return [...commands]; 2026-10-24T22:24:37.0040366Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T22:24:37.0040490Z ·  ─────────┬───────── 2026-10-24T22:24:37.0040690Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T22:24:37.0040747Z 117 │ 2026-10-24T22:24:37.0040801Z ╰──── 2026-10-24T22:24:37.0041144Z  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-24T22:24:37.0041483Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0041486Z 2026-10-24T22:24:37.0041665Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T22:24:37.0041870Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T22:24:37.0042022Z 219 │ 2026-10-24T22:24:37.0042172Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T22:24:37.0042289Z ·  ──┬─ 2026-10-24T22:24:37.0042469Z · ╰── 'U+001B' is a control character. 2026-10-24T22:24:37.0042543Z 221 │ 2026-10-24T22:24:37.0042597Z ╰──── 2026-10-24T22:24:37.0042843Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T22:24:37.0042845Z 2026-10-24T22:24:37.0043131Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0043278Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T22:24:37.0043335Z 913 │ 2026-10-24T22:24:37.0043538Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T22:24:37.0043622Z ·  ─────┬───── 2026-10-24T22:24:37.0043774Z · ╰── 'layerDaemon' is declared here 2026-10-24T22:24:37.0043871Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T22:24:37.0043926Z ╰──── 2026-10-24T22:24:37.0044038Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0044040Z 2026-10-24T22:24:37.0044273Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:37.0044458Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T22:24:37.0044548Z 554 │ assert.deepStrictEqual( 2026-10-24T22:24:37.0044726Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T22:24:37.0044853Z ·  ┬ 2026-10-24T22:24:37.0045078Z · ╰── '_' is declared here 2026-10-24T22:24:37.0045178Z 556 │ [ 2026-10-24T22:24:37.0045233Z ╰──── 2026-10-24T22:24:37.0045343Z  help: Consider removing this parameter. 2026-10-24T22:24:37.0045346Z 2026-10-24T22:24:37.0045544Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:37.0045733Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T22:24:37.0045825Z 1154 │ assert.deepStrictEqual( 2026-10-24T22:24:37.0046000Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T22:24:37.0046132Z ·  ┬ 2026-10-24T22:24:37.0046315Z · ╰── '_' is declared here 2026-10-24T22:24:37.0046388Z 1156 │ [ 2026-10-24T22:24:37.0046446Z ╰──── 2026-10-24T22:24:37.0046554Z  help: Consider removing this parameter. 2026-10-24T22:24:37.0046557Z 2026-10-24T22:24:37.0046747Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T22:24:37.0046878Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T22:24:37.0047015Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T22:24:37.0047113Z 194 │ const codes = new Array(count); 2026-10-24T22:24:37.0047230Z ·  ──────────────────────── 2026-10-24T22:24:37.0047342Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T22:24:37.0047399Z ╰──── 2026-10-24T22:24:37.0047857Z  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-24T22:24:37.0047862Z 2026-10-24T22:24:37.0048066Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T22:24:37.0048192Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T22:24:37.0048254Z 7 │ () => 2026-10-24T22:24:37.0048323Z 8 │ Gesture.Hover() 2026-10-24T22:24:37.0048407Z ·  ──┬── 2026-10-24T22:24:37.0048555Z · ╰── `Hover` may be a component 2026-10-24T22:24:37.0048637Z 9 │ .manualActivation(true) 2026-10-24T22:24:37.0048692Z ╰──── 2026-10-24T22:24:37.0049002Z  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-24T22:24:37.0049482Z  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-24T22:24:37.0049485Z 2026-10-24T22:24:37.0049887Z ⚠ 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-24T22:24:37.0050013Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T22:24:37.0050175Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T22:24:37.0050427Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T22:24:37.0050575Z ·  ────────────────────────── 2026-10-24T22:24:37.0050789Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T22:24:37.0050846Z ╰──── 2026-10-24T22:24:37.0050849Z 2026-10-24T22:24:37.0051080Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T22:24:37.0051219Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T22:24:37.0051293Z 37 │ get isConnected() { 2026-10-24T22:24:37.0051392Z 38 │ let current: FakeElement | null = this; 2026-10-24T22:24:37.0051475Z ·  ─────── 2026-10-24T22:24:37.0051556Z 39 │ while (current?.parent) { 2026-10-24T22:24:37.0051612Z ╰──── 2026-10-24T22:24:37.0051917Z  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-24T22:24:37.0051925Z 2026-10-24T22:24:37.0052136Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:37.0052310Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T22:24:37.0052385Z 71 │ ({ key: input.targetKey, location: candidate })); 2026-10-24T22:24:37.0053581Z 113 │ useEffect(() => { 2026-10-24T22:24:37.0053658Z ·  ────┬──── 2026-10-24T22:24:37.0053804Z · ╰── This is the containing effect 2026-10-24T22:24:37.0053983Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T22:24:37.0054053Z 115 │ return; 2026-10-24T22:24:37.0054153Z 116 │ } 2026-10-24T22:24:37.0054284Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T22:24:37.0054371Z ·  ────┬─── 2026-10-24T22:24:37.0054557Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0054688Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T22:24:37.0054745Z ╰──── 2026-10-24T22:24:37.0055399Z  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-24T22:24:37.0055751Z  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-24T22:24:37.0055753Z 2026-10-24T22:24:37.0056019Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T22:24:37.0056236Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T22:24:37.0056349Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T22:24:37.0056548Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T22:24:37.0056708Z ·  ─────┬───── 2026-10-24T22:24:37.0056929Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T22:24:37.0057020Z 101 │ const readEditor = useCallback( 2026-10-24T22:24:37.0057078Z ╰──── 2026-10-24T22:24:37.0057426Z  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-24T22:24:37.0057764Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0057770Z 2026-10-24T22:24:37.0057967Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T22:24:37.0058141Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T22:24:37.0058211Z 120 │ setEditor, 2026-10-24T22:24:37.0058284Z 121 │ startEditor, 2026-10-24T22:24:37.0058368Z ·  ─────┬───── 2026-10-24T22:24:37.0058526Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T22:24:37.0058596Z 122 │ hasChanges, 2026-10-24T22:24:37.0058658Z ╰──── 2026-10-24T22:24:37.0059001Z  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-24T22:24:37.0059341Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0059344Z 2026-10-24T22:24:37.0059625Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0059828Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T22:24:37.0059885Z 117 │ 2026-10-24T22:24:37.0059956Z 118 │ useEffect(() => { 2026-10-24T22:24:37.0060033Z ·  ────┬──── 2026-10-24T22:24:37.0060225Z · ╰── This is the containing effect 2026-10-24T22:24:37.0060339Z 119 │ void refreshNotifications(); 2026-10-24T22:24:37.0060439Z ·  ──────────┬───────── 2026-10-24T22:24:37.0060629Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0060785Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T22:24:37.0060839Z ╰──── 2026-10-24T22:24:37.0061490Z  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-24T22:24:37.0061844Z  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-24T22:24:37.0061850Z 2026-10-24T22:24:37.0062130Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0062338Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T22:24:37.0062395Z 125 │ 2026-10-24T22:24:37.0062465Z 126 │ useEffect(() => { 2026-10-24T22:24:37.0062543Z ·  ────┬──── 2026-10-24T22:24:37.0062684Z · ╰── This is the containing effect 2026-10-24T22:24:37.0062754Z 127 │ if (!isLoaded) { 2026-10-24T22:24:37.0062856Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T22:24:37.0062961Z ·  ──────────┬────────── 2026-10-24T22:24:37.0063151Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0063216Z 129 │ return; 2026-10-24T22:24:37.0063272Z ╰──── 2026-10-24T22:24:37.0063925Z  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-24T22:24:37.0064311Z  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-24T22:24:37.0064314Z 2026-10-24T22:24:37.0064549Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T22:24:37.0064663Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T22:24:37.0064818Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T22:24:37.0064947Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T22:24:37.0065040Z ·  ──────┬────── 2026-10-24T22:24:37.0065194Z · ╰── 'HookForwarder' is imported here 2026-10-24T22:24:37.0065308Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T22:24:37.0065363Z ╰──── 2026-10-24T22:24:37.0065470Z  help: Consider removing this import. 2026-10-24T22:24:37.0065473Z 2026-10-24T22:24:37.0065710Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T22:24:37.0065913Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T22:24:37.0066020Z 1021 │ instanceId, 2026-10-24T22:24:37.0066179Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T22:24:37.0066329Z ·  ────────────────────────────────────────────────── 2026-10-24T22:24:37.0066398Z 1023 │ ]), 2026-10-24T22:24:37.0066456Z ╰──── 2026-10-24T22:24:37.0066749Z  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-24T22:24:37.0066752Z 2026-10-24T22:24:37.0067032Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0067223Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T22:24:37.0067284Z 76 │ 2026-10-24T22:24:37.0067356Z 77 │ useEffect(() => { 2026-10-24T22:24:37.0067434Z ·  ────┬──── 2026-10-24T22:24:37.0067574Z · ╰── This is the containing effect 2026-10-24T22:24:37.0067712Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T22:24:37.0067786Z 79 │ setHostInput(host); 2026-10-24T22:24:37.0067869Z ·  ──────┬───── 2026-10-24T22:24:37.0068048Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0068121Z 80 │ setCodeInput(code); 2026-10-24T22:24:37.0068176Z ╰──── 2026-10-24T22:24:37.0068837Z  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-24T22:24:37.0069190Z  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-24T22:24:37.0069195Z 2026-10-24T22:24:37.0069476Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0069662Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T22:24:37.0069719Z 82 │ 2026-10-24T22:24:37.0069789Z 83 │ useEffect(() => { 2026-10-24T22:24:37.0069862Z ·  ────┬──── 2026-10-24T22:24:37.0070008Z · ╰── This is the containing effect 2026-10-24T22:24:37.0070108Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T22:24:37.0070175Z 85 │ return; 2026-10-24T22:24:37.0070233Z 86 │ } 2026-10-24T22:24:37.0070289Z 87 │ 2026-10-24T22:24:37.0070415Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T22:24:37.0070486Z 89 │ setHostInput(host); 2026-10-24T22:24:37.0070568Z ·  ──────┬───── 2026-10-24T22:24:37.0070748Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0070821Z 90 │ setCodeInput(code); 2026-10-24T22:24:37.0070876Z ╰──── 2026-10-24T22:24:37.0071587Z  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-24T22:24:37.0071968Z  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-24T22:24:37.0071971Z 2026-10-24T22:24:37.0072252Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0072436Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T22:24:37.0072492Z 92 │ 2026-10-24T22:24:37.0072561Z 93 │ useEffect(() => { 2026-10-24T22:24:37.0072637Z ·  ────┬──── 2026-10-24T22:24:37.0072778Z · ╰── This is the containing effect 2026-10-24T22:24:37.0072873Z 94 │ if (pairingConnectionError) { 2026-10-24T22:24:37.0072955Z 95 │ setIsSubmitting(false); 2026-10-24T22:24:37.0073044Z ·  ───────┬─────── 2026-10-24T22:24:37.0073230Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0073287Z 96 │ } 2026-10-24T22:24:37.0073344Z ╰──── 2026-10-24T22:24:37.0073998Z  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-24T22:24:37.0074394Z  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-24T22:24:37.0074399Z 2026-10-24T22:24:37.0074679Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0074862Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T22:24:37.0074919Z 638 │ 2026-10-24T22:24:37.0074991Z 639 │ useEffect(() => { 2026-10-24T22:24:37.0075069Z ·  ────┬──── 2026-10-24T22:24:37.0075209Z · ╰── This is the containing effect 2026-10-24T22:24:37.0075333Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T22:24:37.0075401Z 641 │ return; 2026-10-24T22:24:37.0075460Z 642 │ } 2026-10-24T22:24:37.0075540Z 643 │ setPendingLaunchEntry({ 2026-10-24T22:24:37.0075636Z ·  ──────────┬────────── 2026-10-24T22:24:37.0075830Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0075911Z 644 │ key: launchTargetKey, 2026-10-24T22:24:37.0075967Z ╰──── 2026-10-24T22:24:37.0076623Z  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-24T22:24:37.0076977Z  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-24T22:24:37.0076980Z 2026-10-24T22:24:37.0077314Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0077535Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T22:24:37.0077591Z 648 │ 2026-10-24T22:24:37.0077661Z 649 │ useEffect(() => { 2026-10-24T22:24:37.0077739Z ·  ────┬──── 2026-10-24T22:24:37.0077879Z · ╰── This is the containing effect 2026-10-24T22:24:37.0078006Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T22:24:37.0078073Z 651 │ return; 2026-10-24T22:24:37.0078132Z 652 │ } 2026-10-24T22:24:37.0078218Z 653 │ setInitialAttachGridEntry({ 2026-10-24T22:24:37.0078319Z ·  ────────────┬──────────── 2026-10-24T22:24:37.0078507Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0078592Z 654 │ key: launchTargetKey, 2026-10-24T22:24:37.0078650Z ╰──── 2026-10-24T22:24:37.0079299Z  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-24T22:24:37.0079649Z  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-24T22:24:37.0079652Z 2026-10-24T22:24:37.0079931Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0080118Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T22:24:37.0080178Z 743 │ 2026-10-24T22:24:37.0080247Z 744 │ useEffect(() => { 2026-10-24T22:24:37.0080324Z ·  ────┬──── 2026-10-24T22:24:37.0080465Z · ╰── This is the containing effect 2026-10-24T22:24:37.0080575Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T22:24:37.0080651Z 746 │ setLastGridSize({ 2026-10-24T22:24:37.0080741Z ·  ───────┬─────── 2026-10-24T22:24:37.0080927Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0081016Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T22:24:37.0081071Z ╰──── 2026-10-24T22:24:37.0081778Z  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-24T22:24:37.0082159Z  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-24T22:24:37.0082162Z 2026-10-24T22:24:37.0082383Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:37.0082569Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T22:24:37.0082632Z 537 │ }); 2026-10-24T22:24:37.0082774Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T22:24:37.0082895Z ·  ───────────┬────────── 2026-10-24T22:24:37.0083169Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T22:24:37.0083351Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T22:24:37.0083407Z ╰──── 2026-10-24T22:24:37.0083731Z  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-24T22:24:37.0084086Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0084089Z 2026-10-24T22:24:37.0084335Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:37.0084524Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T22:24:37.0084633Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T22:24:37.0084706Z 709 │ }, [terminalKey]); 2026-10-24T22:24:37.0084790Z ·  ─────┬───── 2026-10-24T22:24:37.0084947Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T22:24:37.0085006Z 710 │ 2026-10-24T22:24:37.0085061Z ╰──── 2026-10-24T22:24:37.0085379Z  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-24T22:24:37.0085723Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0085726Z 2026-10-24T22:24:37.0085951Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:37.0086140Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T22:24:37.0086201Z 799 │ }; 2026-10-24T22:24:37.0086398Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T22:24:37.0086595Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T22:24:37.0086850Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T22:24:37.0087081Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T22:24:37.0087265Z 801 │ 2026-10-24T22:24:37.0087352Z ╰──── 2026-10-24T22:24:37.0087673Z  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-24T22:24:37.0088016Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0088018Z 2026-10-24T22:24:37.0088178Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0088362Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T22:24:37.0088422Z 792 │ } 2026-10-24T22:24:37.0088539Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T22:24:37.0088668Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0088847Z · ╰── Cannot access ref value during render 2026-10-24T22:24:37.0088905Z 794 │ 2026-10-24T22:24:37.0088960Z ╰──── 2026-10-24T22:24:37.0089478Z  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-24T22:24:37.0089799Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0089804Z 2026-10-24T22:24:37.0090005Z ⚠ react(static-components): Cannot create components during render 2026-10-24T22:24:37.0090187Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T22:24:37.0090285Z 196 │ const { onInput, onResize } = props; 2026-10-24T22:24:37.0090448Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T22:24:37.0090591Z ·  ────────────────┬─────────────── 2026-10-24T22:24:37.0090930Z · ╰── The component is created during render here 2026-10-24T22:24:37.0091072Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T22:24:37.0091129Z 199 │ 2026-10-24T22:24:37.0091200Z 200 │ useEffect(() => { 2026-10-24T22:24:37.0091297Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T22:24:37.0091392Z 202 │ terminalKey: props.terminalKey, 2026-10-24T22:24:37.0091485Z 203 │ native: hasNativeSurface, 2026-10-24T22:24:37.0091634Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T22:24:37.0091729Z 205 │ bufferLen: props.buffer.length, 2026-10-24T22:24:37.0091815Z 206 │ isRunning: props.isRunning, 2026-10-24T22:24:37.0091877Z 207 │ }); 2026-10-24T22:24:37.0092050Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T22:24:37.0092147Z 209 │ const handleNativeInput = useCallback( 2026-10-24T22:24:37.0092274Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T22:24:37.0092382Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T22:24:37.0092450Z 212 │ return; 2026-10-24T22:24:37.0092510Z 213 │ } 2026-10-24T22:24:37.0092610Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T22:24:37.0092844Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T22:24:37.0092948Z 216 │ }); 2026-10-24T22:24:37.0093043Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T22:24:37.0093104Z 218 │ }, 2026-10-24T22:24:37.0093211Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T22:24:37.0093270Z 220 │ ); 2026-10-24T22:24:37.0093372Z 221 │ const handleNativeResize = useCallback( 2026-10-24T22:24:37.0093498Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T22:24:37.0093570Z 223 │ onResize({ 2026-10-24T22:24:37.0093664Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T22:24:37.0093754Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T22:24:37.0093816Z 226 │ }); 2026-10-24T22:24:37.0093876Z 227 │ }, 2026-10-24T22:24:37.0093942Z 228 │ [onResize], 2026-10-24T22:24:37.0094001Z 229 │ ); 2026-10-24T22:24:37.0094064Z 230 │ 2026-10-24T22:24:37.0094189Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T22:24:37.0094254Z 232 │ return ( 2026-10-24T22:24:37.0094340Z 233 │ 2026-10-24T22:24:37.0094427Z 234 │ { 2026-10-24T22:24:37.0096519Z 57 │ if (pulse) { 2026-10-24T22:24:37.0096614Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T22:24:37.0096706Z ·  ──────┬────── 2026-10-24T22:24:37.0096865Z · ╰── `pulseProgress` cannot be modified 2026-10-24T22:24:37.0096943Z 59 │ withTiming(1, { 2026-10-24T22:24:37.0097000Z ╰──── 2026-10-24T22:24:37.0097294Z  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-24T22:24:37.0097632Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:37.0097635Z 2026-10-24T22:24:37.0098150Z ⚠ 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-24T22:24:37.0098401Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T22:24:37.0098549Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T22:24:37.0098766Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T22:24:37.0098878Z 567 │ │ const nextEvent = { 2026-10-24T22:24:37.0099051Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T22:24:37.0099200Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T22:24:37.0099299Z 570 │ │ threadId, 2026-10-24T22:24:37.0099414Z 571 │ │ providerInstanceId, 2026-10-24T22:24:37.0099523Z 572 │ │ occurredAt: now, 2026-10-24T22:24:37.0099692Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T22:24:37.0099836Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T22:24:37.0099963Z 575 │ │ const reader = yield* eventSink 2026-10-24T22:24:37.0100099Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T22:24:37.0100244Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T22:24:37.0100357Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0100537Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T22:24:37.0100679Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T22:24:37.0100814Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T22:24:37.0101036Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T22:24:37.0101128Z 583 │ │ } 2026-10-24T22:24:37.0101305Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T22:24:37.0101464Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T22:24:37.0101603Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T22:24:37.0101748Z 587 │ ╰─▶ } 2026-10-24T22:24:37.0101814Z 588 │ }), 2026-10-24T22:24:37.0101870Z ╰──── 2026-10-24T22:24:37.0101872Z 2026-10-24T22:24:37.0102388Z ⚠ 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-24T22:24:37.0102581Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T22:24:37.0102669Z 2326 │ let settled = false; 2026-10-24T22:24:37.0102846Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T22:24:37.0103022Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T22:24:37.0103167Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T22:24:37.0103259Z 2330 │ │ ); 2026-10-24T22:24:37.0103457Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T22:24:37.0103640Z 2332 │ ╰─▶ } 2026-10-24T22:24:37.0103769Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T22:24:37.0103828Z ╰──── 2026-10-24T22:24:37.0103830Z 2026-10-24T22:24:37.0104154Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0104370Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12395:7] 2026-10-24T22:24:37.0104429Z 12394 │ 2026-10-24T22:24:37.0104584Z 12395 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T22:24:37.0104679Z ·  ────────┬─────── 2026-10-24T22:24:37.0104851Z · ╰── 'layerUnavailable' is declared here 2026-10-24T22:24:37.0104929Z 12396 │ OrchestratorV2, 2026-10-24T22:24:37.0104985Z ╰──── 2026-10-24T22:24:37.0105102Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0105105Z 2026-10-24T22:24:37.0105392Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0105570Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T22:24:37.0105691Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T22:24:37.0105774Z 38 │ useLayoutEffect(() => { 2026-10-24T22:24:37.0105861Z ·  ───────┬─────── 2026-10-24T22:24:37.0106006Z · ╰── This is the containing effect 2026-10-24T22:24:37.0106070Z 39 │ reset(); 2026-10-24T22:24:37.0106155Z 40 │ setInitialized(true); 2026-10-24T22:24:37.0106243Z ·  ───────┬────── 2026-10-24T22:24:37.0106430Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0106497Z 41 │ }, [reset]); 2026-10-24T22:24:37.0106555Z ╰──── 2026-10-24T22:24:37.0107217Z  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-24T22:24:37.0107576Z  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-24T22:24:37.0107578Z 2026-10-24T22:24:37.0107868Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0108045Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T22:24:37.0108104Z 88 │ 2026-10-24T22:24:37.0108176Z 89 │ useEffect(() => { 2026-10-24T22:24:37.0108253Z ·  ────┬──── 2026-10-24T22:24:37.0108394Z · ╰── This is the containing effect 2026-10-24T22:24:37.0108571Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T22:24:37.0108683Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T22:24:37.0108754Z 92 │ let active = true; 2026-10-24T22:24:37.0108860Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T22:24:37.0109012Z ·  ─────────┬───────── 2026-10-24T22:24:37.0109232Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0109402Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T22:24:37.0109457Z ╰──── 2026-10-24T22:24:37.0110115Z  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-24T22:24:37.0110467Z  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-24T22:24:37.0110470Z 2026-10-24T22:24:37.0110703Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T22:24:37.0110868Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T22:24:37.0110925Z 236 │ 2026-10-24T22:24:37.0111057Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T22:24:37.0111150Z ·  ───────┬────── 2026-10-24T22:24:37.0111308Z · ╰── 'nonEmptyString' is declared here 2026-10-24T22:24:37.0111474Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T22:24:37.0111531Z ╰──── 2026-10-24T22:24:37.0111646Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0111649Z 2026-10-24T22:24:37.0111938Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0112105Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T22:24:37.0112163Z 404 │ 2026-10-24T22:24:37.0112236Z 405 │ useEffect(() => { 2026-10-24T22:24:37.0112315Z ·  ────┬──── 2026-10-24T22:24:37.0112456Z · ╰── This is the containing effect 2026-10-24T22:24:37.0112556Z 406 │ setInspectorSelection((current) => { 2026-10-24T22:24:37.0112654Z ·  ──────────┬────────── 2026-10-24T22:24:37.0112841Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0112952Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T22:24:37.0113010Z ╰──── 2026-10-24T22:24:37.0113713Z  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-24T22:24:37.0114105Z  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-24T22:24:37.0114108Z 2026-10-24T22:24:37.0114377Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T22:24:37.0114544Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T22:24:37.0114718Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T22:24:37.0114908Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T22:24:37.0115017Z 535 │ │ 2026-10-24T22:24:37.0115685Z 540 │ ╰─▶ ); 2026-10-24T22:24:37.0115775Z 541 │ const FilesInspector = () => 2026-10-24T22:24:37.0115830Z ╰──── 2026-10-24T22:24:37.0116071Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T22:24:37.0116074Z 2026-10-24T22:24:37.0116309Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T22:24:37.0116480Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T22:24:37.0116547Z 540 │ ); 2026-10-24T22:24:37.0116731Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T22:24:37.0116893Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T22:24:37.0117011Z 543 │ │ 2026-10-24T22:24:37.0118068Z 551 │ ╰─▶ ) : null; 2026-10-24T22:24:37.0118235Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T22:24:37.0118291Z ╰──── 2026-10-24T22:24:37.0118525Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T22:24:37.0118528Z 2026-10-24T22:24:37.0118869Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0119087Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T22:24:37.0119147Z 328 │ }; 2026-10-24T22:24:37.0119218Z 329 │ useEffect(() => { 2026-10-24T22:24:37.0119297Z ·  ────┬──── 2026-10-24T22:24:37.0119442Z · ╰── This is the containing effect 2026-10-24T22:24:37.0119550Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T22:24:37.0119653Z 331 │ requestedSection.current = "overview"; 2026-10-24T22:24:37.0119834Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T22:24:37.0119914Z 333 │ setSection("overview"); 2026-10-24T22:24:37.0119998Z ·  ─────┬──── 2026-10-24T22:24:37.0120191Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0120252Z 334 │ } 2026-10-24T22:24:37.0120308Z ╰──── 2026-10-24T22:24:37.0120971Z  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-24T22:24:37.0121322Z  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-24T22:24:37.0121324Z 2026-10-24T22:24:37.0121549Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T22:24:37.0121738Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T22:24:37.0121846Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T22:24:37.0121949Z 331 │ requestedSection.current = "overview"; 2026-10-24T22:24:37.0122039Z ·  ────────┬─────── 2026-10-24T22:24:37.0122523Z · ╰── 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-24T22:24:37.0122704Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T22:24:37.0122871Z ·  ─────────┬───────── ──────┬────── 2026-10-24T22:24:37.0123428Z · │ ╰── 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-24T22:24:37.0123918Z · ╰── 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-24T22:24:37.0123998Z 333 │ setSection("overview"); 2026-10-24T22:24:37.0124060Z 334 │ } 2026-10-24T22:24:37.0124193Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T22:24:37.0124316Z ·  ──────────────────┬───────────────── 2026-10-24T22:24:37.0124576Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0124704Z 336 │ const tabContent = activityContent; 2026-10-24T22:24:37.0124760Z ╰──── 2026-10-24T22:24:37.0124942Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T22:24:37.0125284Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0125288Z 2026-10-24T22:24:37.0125508Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T22:24:37.0125695Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T22:24:37.0125757Z 860 │ if ( 2026-10-24T22:24:37.0125883Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T22:24:37.0125974Z ·  ──────┬────── 2026-10-24T22:24:37.0126448Z · ╰── 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-24T22:24:37.0126587Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T22:24:37.0126646Z 863 │ ) 2026-10-24T22:24:37.0126713Z 864 │ return; 2026-10-24T22:24:37.0126907Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T22:24:37.0127056Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T22:24:37.0127150Z 867 │ setJumpPath(route.params.path); 2026-10-24T22:24:37.0127229Z 868 │ setSelectedRowId(null); 2026-10-24T22:24:37.0127322Z 869 │ jumpStarted.current = false; 2026-10-24T22:24:37.0127484Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T22:24:37.0127586Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T22:24:37.0127681Z ·  ─────┬──── 2026-10-24T22:24:37.0128155Z · ╰── 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-24T22:24:37.0128293Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T22:24:37.0128382Z 873 │ jumpStarted.current = true; 2026-10-24T22:24:37.0128530Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T22:24:37.0128619Z 875 │ jumpStarted.current = false; 2026-10-24T22:24:37.0128685Z 876 │ }); 2026-10-24T22:24:37.0128900Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T22:24:37.0129121Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T22:24:37.0129359Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0129481Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T22:24:37.0129537Z ╰──── 2026-10-24T22:24:37.0129719Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T22:24:37.0130058Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0130115Z 2026-10-24T22:24:37.0130329Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:37.0130463Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T22:24:37.0130576Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T22:24:37.0130863Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T22:24:37.0130998Z ·  ─────┬──── 2026-10-24T22:24:37.0131178Z · ╰── Cannot call impure function 2026-10-24T22:24:37.0131266Z 822 │ return AsyncResult.failure( 2026-10-24T22:24:37.0131321Z ╰──── 2026-10-24T22:24:37.0131632Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T22:24:37.0131955Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:37.0131959Z 2026-10-24T22:24:37.0132139Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:37.0132269Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T22:24:37.0132346Z 708 │ const wokeAt = resolved 2026-10-24T22:24:37.0132496Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T22:24:37.0132618Z ·  ─────┬──── 2026-10-24T22:24:37.0132797Z · ╰── Cannot call impure function 2026-10-24T22:24:37.0132865Z 710 │ : null; 2026-10-24T22:24:37.0132921Z ╰──── 2026-10-24T22:24:37.0133221Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T22:24:37.0133539Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:37.0133542Z 2026-10-24T22:24:37.0133770Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T22:24:37.0133928Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7] 2026-10-24T22:24:37.0134038Z 772 │ if (settingsSheetPresentation.isActive) { 2026-10-24T22:24:37.0134279Z 773 │ settingsRoutePresentation.present(settingsRouteSession); 2026-10-24T22:24:37.0134431Z ·  ────────────┬──────────── 2026-10-24T22:24:37.0134616Z · ╰── Missing dependency `settingsRoutePresentation` 2026-10-24T22:24:37.0134675Z 774 │ } 2026-10-24T22:24:37.0134897Z 775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]); 2026-10-24T22:24:37.0135016Z ·  ────────────────┬──────────────── 2026-10-24T22:24:37.0135322Z · ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead 2026-10-24T22:24:37.0135380Z 776 │ 2026-10-24T22:24:37.0135435Z ╰──── 2026-10-24T22:24:37.0135903Z  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-24T22:24:37.0136244Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0136246Z 2026-10-24T22:24:37.0136416Z ⚠ react(immutability): This value cannot be modified 2026-10-24T22:24:37.0136574Z ╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5] 2026-10-24T22:24:37.0136751Z 387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0; 2026-10-24T22:24:37.0136898Z 388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius); 2026-10-24T22:24:37.0136996Z ·  ──────────┬───────── 2026-10-24T22:24:37.0137171Z · ╰── `animatedBorderRadius` originates here 2026-10-24T22:24:37.0137346Z 389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android"; 2026-10-24T22:24:37.0137423Z 390 │ useLayoutEffect(() => { 2026-10-24T22:24:37.0137532Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T22:24:37.0137628Z ·  ──────────┬───────── 2026-10-24T22:24:37.0137798Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T22:24:37.0137894Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T22:24:37.0137949Z ╰──── 2026-10-24T22:24:37.0138241Z  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-24T22:24:37.0138582Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T22:24:37.0138588Z 2026-10-24T22:24:37.0138804Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T22:24:37.0138985Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T22:24:37.0139059Z 1782 │ assert.equal( 2026-10-24T22:24:37.0139222Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T22:24:37.0139332Z ·  ────────────────────────── 2026-10-24T22:24:37.0139418Z 1784 │ stored.attachments[0]?.id, 2026-10-24T22:24:37.0139475Z ╰──── 2026-10-24T22:24:37.0139661Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T22:24:37.0139664Z 2026-10-24T22:24:37.0139953Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T22:24:37.0140171Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T22:24:37.0140256Z 248 │ mountedRef.current = false; 2026-10-24T22:24:37.0140339Z 249 │ flow.setBranchQuery(""); 2026-10-24T22:24:37.0140415Z ·  ──┬─ 2026-10-24T22:24:37.0140551Z · ╰── Missing dependency `flow` 2026-10-24T22:24:37.0140614Z 250 │ }; 2026-10-24T22:24:37.0140695Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T22:24:37.0140791Z ·  ─────────┬───────── 2026-10-24T22:24:37.0141010Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T22:24:37.0141068Z 252 │ 2026-10-24T22:24:37.0141124Z ╰──── 2026-10-24T22:24:37.0141589Z  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-24T22:24:37.0141931Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0141934Z 2026-10-24T22:24:37.0142152Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T22:24:37.0142299Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T22:24:37.0142380Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T22:24:37.0142456Z 3 │ type AuthSessionState, 2026-10-24T22:24:37.0142544Z ·  ────────┬─────── 2026-10-24T22:24:37.0142716Z · ╰── 'AuthSessionState' is imported here 2026-10-24T22:24:37.0142794Z 4 │ sessionGrantsScope, 2026-10-24T22:24:37.0142849Z ╰──── 2026-10-24T22:24:37.0142955Z  help: Consider removing this import. 2026-10-24T22:24:37.0142958Z 2026-10-24T22:24:37.0143288Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0143465Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T22:24:37.0143522Z 345 │ 2026-10-24T22:24:37.0143632Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T22:24:37.0143736Z ·  ────────────┬─────────── 2026-10-24T22:24:37.0143921Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T22:24:37.0144009Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T22:24:37.0144063Z ╰──── 2026-10-24T22:24:37.0144219Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0144222Z 2026-10-24T22:24:37.0144466Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T22:24:37.0144624Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T22:24:37.0144689Z 237 │ ): string { 2026-10-24T22:24:37.0144858Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T22:24:37.0144979Z ·  ────── 2026-10-24T22:24:37.0145122Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T22:24:37.0145176Z ╰──── 2026-10-24T22:24:37.0145419Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T22:24:37.0145459Z 2026-10-24T22:24:37.0145663Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T22:24:37.0145778Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T22:24:37.0145849Z 457 │ ): Array { 2026-10-24T22:24:37.0145965Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T22:24:37.0146076Z ·  ┬ 2026-10-24T22:24:37.0146233Z · ╰── '_' is declared here 2026-10-24T22:24:37.0146311Z 459 │ for (const b of data) { 2026-10-24T22:24:37.0146365Z ╰──── 2026-10-24T22:24:37.0146479Z  help: Consider removing this parameter. 2026-10-24T22:24:37.0146487Z 2026-10-24T22:24:37.0146749Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T22:24:37.0146918Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T22:24:37.0146983Z 289 │ return ( 2026-10-24T22:24:37.0147129Z 290 │ 2026-10-24T22:24:37.0147257Z ·  ───────────── 2026-10-24T22:24:37.0147332Z 291 │ {props.children} 2026-10-24T22:24:37.0147386Z ╰──── 2026-10-24T22:24:37.0147630Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T22:24:37.0147782Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T22:24:37.0147790Z 2026-10-24T22:24:37.0148051Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T22:24:37.0148218Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T22:24:37.0148283Z 653 │ return ( 2026-10-24T22:24:37.0148414Z 654 │ 2026-10-24T22:24:37.0148538Z ·  ───────────── 2026-10-24T22:24:37.0148609Z 655 │ {props.children} 2026-10-24T22:24:37.0148666Z ╰──── 2026-10-24T22:24:37.0148907Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T22:24:37.0149054Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T22:24:37.0149061Z 2026-10-24T22:24:37.0149321Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T22:24:37.0149494Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T22:24:37.0149561Z 1461 │ return ( 2026-10-24T22:24:37.0149737Z 1462 │ 2026-10-24T22:24:37.0149879Z ·  ──────────────────── 2026-10-24T22:24:37.0149985Z 1463 │ event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T22:24:37.0161020Z ·  ────── 2026-10-24T22:24:37.0161145Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T22:24:37.0161201Z ╰──── 2026-10-24T22:24:37.0161392Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T22:24:37.0161397Z 2026-10-24T22:24:37.0161911Z ⚠ 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-24T22:24:37.0162087Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T22:24:37.0162147Z 27 │ ) { 2026-10-24T22:24:37.0162369Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T22:24:37.0162528Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T22:24:37.0162671Z 30 │ │ if (predicate(available)) return available; 2026-10-24T22:24:37.0162782Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0162917Z 32 │ ╰─▶ } 2026-10-24T22:24:37.0163113Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T22:24:37.0163168Z ╰──── 2026-10-24T22:24:37.0163171Z 2026-10-24T22:24:37.0163399Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T22:24:37.0163536Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T22:24:37.0163594Z 78 │ 2026-10-24T22:24:37.0163744Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T22:24:37.0163838Z ·  ────────┬─────── 2026-10-24T22:24:37.0164007Z · ╰── 'describeSchedule' is declared here 2026-10-24T22:24:37.0164159Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T22:24:37.0164215Z ╰──── 2026-10-24T22:24:37.0164328Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0164333Z 2026-10-24T22:24:37.0164538Z ⚠ eslint(require-yield): This generator function does not have `yield` 2026-10-24T22:24:37.0164702Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78] 2026-10-24T22:24:37.0164764Z  80 │ 2026-10-24T22:24:37.0165059Z  81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* ( 2026-10-24T22:24:37.0165189Z  82 │ │ options: AcpMcpOverAcpBridgeOptions, 2026-10-24T22:24:37.0165378Z  83 │ │ ): Effect.fn.Return { 2026-10-24T22:24:37.0165664Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T22:24:37.0165814Z  85 │ │ const connections = new Map(); 2026-10-24T22:24:37.0165889Z  86 │ │ 2026-10-24T22:24:37.0166126Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T22:24:37.0166236Z  88 │ │ Effect.suspend(() => { 2026-10-24T22:24:37.0166387Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T22:24:37.0166508Z  90 │ │ return connection === undefined 2026-10-24T22:24:37.0166749Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T22:24:37.0166873Z  92 │ │ : Effect.succeed(connection); 2026-10-24T22:24:37.0166957Z  93 │ │ }); 2026-10-24T22:24:37.0167031Z  94 │ │ 2026-10-24T22:24:37.0167127Z  95 │ │ const send = ( 2026-10-24T22:24:37.0167235Z  96 │ │ connection: Connection, 2026-10-24T22:24:37.0167337Z  97 │ │ message: unknown, 2026-10-24T22:24:37.0167526Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T22:24:37.0167653Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T22:24:37.0167769Z 100 │ │ Effect.gen(function* () { 2026-10-24T22:24:37.0167912Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T22:24:37.0168068Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T22:24:37.0168303Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T22:24:37.0168390Z 104 │ │ } 2026-10-24T22:24:37.0168537Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T22:24:37.0168645Z 106 │ │ try: (signal) => 2026-10-24T22:24:37.0168789Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T22:24:37.0168901Z 108 │ │ method: "POST", 2026-10-24T22:24:37.0169002Z 109 │ │ signal, 2026-10-24T22:24:37.0169113Z 110 │ │ headers: { 2026-10-24T22:24:37.0169255Z 111 │ │ "content-type": "application/json", 2026-10-24T22:24:37.0169412Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T22:24:37.0169557Z 113 │ │ authorization: options.authorization, 2026-10-24T22:24:37.0169694Z 114 │ │ ...(connection.sessionId === null 2026-10-24T22:24:37.0169794Z 115 │ │ ? {} 2026-10-24T22:24:37.0169951Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T22:24:37.0170098Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T22:24:37.0170198Z 118 │ │ ? {} 2026-10-24T22:24:37.0170426Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T22:24:37.0170551Z 120 │ │ }, 2026-10-24T22:24:37.0170652Z 121 │ │ body, 2026-10-24T22:24:37.0170790Z 122 │ │ }), 2026-10-24T22:24:37.0170900Z 123 │ │ catch: bridgeError, 2026-10-24T22:24:37.0170990Z 124 │ │ }); 2026-10-24T22:24:37.0171223Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T22:24:37.0171333Z 126 │ │ if (!response.ok) { 2026-10-24T22:24:37.0171449Z 127 │ │ yield* Effect.promise( 2026-10-24T22:24:37.0171659Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T22:24:37.0171753Z 129 │ │ ); 2026-10-24T22:24:37.0171876Z 130 │ │ return yield* Effect.fail( 2026-10-24T22:24:37.0172105Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T22:24:37.0172195Z 132 │ │ ); 2026-10-24T22:24:37.0172281Z 133 │ │ } 2026-10-24T22:24:37.0172513Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T22:24:37.0172644Z 135 │ │ for (const payload of payloads) { 2026-10-24T22:24:37.0172885Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T22:24:37.0172976Z 137 │ │ } 2026-10-24T22:24:37.0173089Z 138 │ │ return payloads; 2026-10-24T22:24:37.0173224Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T22:24:37.0173305Z 140 │ │ ); 2026-10-24T22:24:37.0173382Z 141 │ │ 2026-10-24T22:24:37.0173575Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T22:24:37.0173717Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T22:24:37.0173920Z 144 │ │ ): Effect.fn.Return { 2026-10-24T22:24:37.0174109Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T22:24:37.0174285Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T22:24:37.0174423Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T22:24:37.0174532Z 148 │ │ if (sessionId !== null) { 2026-10-24T22:24:37.0174677Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T22:24:37.0174784Z 150 │ │ try: (signal) => 2026-10-24T22:24:37.0174928Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T22:24:37.0175036Z 152 │ │ method: "DELETE", 2026-10-24T22:24:37.0175136Z 153 │ │ signal, 2026-10-24T22:24:37.0175239Z 154 │ │ headers: { 2026-10-24T22:24:37.0175384Z 155 │ │ authorization: options.authorization, 2026-10-24T22:24:37.0175586Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T22:24:37.0175774Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T22:24:37.0175876Z 158 │ │ ? {} 2026-10-24T22:24:37.0176058Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T22:24:37.0176148Z 160 │ │ }, 2026-10-24T22:24:37.0176240Z 161 │ │ }), 2026-10-24T22:24:37.0176352Z 162 │ │ catch: bridgeError, 2026-10-24T22:24:37.0176438Z 163 │ │ }); 2026-10-24T22:24:37.0176583Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T22:24:37.0176705Z 165 │ │ return yield* Effect.fail( 2026-10-24T22:24:37.0176831Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T22:24:37.0177038Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T22:24:37.0177126Z 168 │ │ ), 2026-10-24T22:24:37.0177212Z 169 │ │ ); 2026-10-24T22:24:37.0177295Z 170 │ │ } 2026-10-24T22:24:37.0177412Z 171 │ │ yield* Effect.promise( 2026-10-24T22:24:37.0177609Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T22:24:37.0177694Z 173 │ │ ); 2026-10-24T22:24:37.0177777Z 174 │ │ } 2026-10-24T22:24:37.0177868Z 175 │ │ return {}; 2026-10-24T22:24:37.0177953Z 176 │ │ }); 2026-10-24T22:24:37.0178031Z 177 │ │ 2026-10-24T22:24:37.0178117Z 178 │ │ return { 2026-10-24T22:24:37.0178306Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T22:24:37.0178438Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T22:24:37.0178557Z 181 │ │ return yield* Effect.fail( 2026-10-24T22:24:37.0178764Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T22:24:37.0178849Z 183 │ │ ); 2026-10-24T22:24:37.0178930Z 184 │ │ } 2026-10-24T22:24:37.0179070Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T22:24:37.0179308Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T22:24:37.0179394Z 187 │ │ } 2026-10-24T22:24:37.0179564Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T22:24:37.0179692Z 189 │ │ connections.set(connectionId, { 2026-10-24T22:24:37.0179822Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T22:24:37.0179931Z 191 │ │ sessionId: null, 2026-10-24T22:24:37.0180045Z 192 │ │ protocolVersion: null, 2026-10-24T22:24:37.0180155Z 193 │ │ nextRequestId: 0, 2026-10-24T22:24:37.0180241Z 194 │ │ }); 2026-10-24T22:24:37.0180410Z 195 │ │ return { connectionId }; 2026-10-24T22:24:37.0180520Z 196 │ │ }), 2026-10-24T22:24:37.0180709Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T22:24:37.0180888Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T22:24:37.0181024Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T22:24:37.0181161Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T22:24:37.0181267Z 201 │ │ jsonrpc: "2.0", 2026-10-24T22:24:37.0181356Z 202 │ │ id, 2026-10-24T22:24:37.0181471Z 203 │ │ method: request.method, 2026-10-24T22:24:37.0181649Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T22:24:37.0181741Z 205 │ │ }); 2026-10-24T22:24:37.0181949Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T22:24:37.0182083Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T22:24:37.0182195Z 208 │ │ if (envelope === null) { 2026-10-24T22:24:37.0182312Z 209 │ │ return yield* Effect.fail( 2026-10-24T22:24:37.0182515Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T22:24:37.0182601Z 211 │ │ ); 2026-10-24T22:24:37.0182682Z 212 │ │ } 2026-10-24T22:24:37.0182809Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T22:24:37.0183029Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T22:24:37.0183114Z 215 │ │ } 2026-10-24T22:24:37.0183304Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T22:24:37.0183383Z 217 │ │ }), 2026-10-24T22:24:37.0183595Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T22:24:37.0183772Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T22:24:37.0183887Z 220 │ │ yield* send(connection, { 2026-10-24T22:24:37.0183991Z 221 │ │ jsonrpc: "2.0", 2026-10-24T22:24:37.0184133Z 222 │ │ method: request.method, 2026-10-24T22:24:37.0184310Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T22:24:37.0184397Z 224 │ │ }); 2026-10-24T22:24:37.0184477Z 225 │ │ }), 2026-10-24T22:24:37.0184572Z 226 │ │ disconnect, 2026-10-24T22:24:37.0184692Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T22:24:37.0184797Z 228 │ │ Effect.forEach( 2026-10-24T22:24:37.0184910Z 229 │ │ [...connections.keys()], 2026-10-24T22:24:37.0185098Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T22:24:37.0185207Z 231 │ │ { discard: true }, 2026-10-24T22:24:37.0185292Z 232 │ │ ), 2026-10-24T22:24:37.0185428Z 233 │ │ ), 2026-10-24T22:24:37.0185540Z 234 │ │ }; 2026-10-24T22:24:37.0185679Z 235 │ ╰─▶ }); 2026-10-24T22:24:37.0185737Z ╰──── 2026-10-24T22:24:37.0186012Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T22:24:37.0186015Z 2026-10-24T22:24:37.0186240Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T22:24:37.0186392Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T22:24:37.0186572Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T22:24:37.0186668Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0186777Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0187293Z · ╰── 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-24T22:24:37.0187373Z 229 │ mostRecentEventCount, 2026-10-24T22:24:37.0187435Z 230 │ ); 2026-10-24T22:24:37.0187567Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T22:24:37.0187716Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T22:24:37.0187935Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0188026Z 232 │ const assumedValue = props.value; 2026-10-24T22:24:37.0188082Z ╰──── 2026-10-24T22:24:37.0188275Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T22:24:37.0188625Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0188629Z 2026-10-24T22:24:37.0188864Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T22:24:37.0189011Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T22:24:37.0189167Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T22:24:37.0189267Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0189367Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0189924Z · ╰── 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-24T22:24:37.0190035Z 240 │ controlledEventCount, 2026-10-24T22:24:37.0190108Z 241 │ assumedValue, 2026-10-24T22:24:37.0190168Z 242 │ ); 2026-10-24T22:24:37.0190341Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T22:24:37.0190490Z ·  ───────────┬────────── 2026-10-24T22:24:37.0190719Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T22:24:37.0190817Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T22:24:37.0190872Z ╰──── 2026-10-24T22:24:37.0191340Z  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-24T22:24:37.0191689Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0191692Z 2026-10-24T22:24:37.0191850Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0192000Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T22:24:37.0192135Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T22:24:37.0192255Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T22:24:37.0192388Z ·  ─────────────┬──────────── 2026-10-24T22:24:37.0192570Z · ╰── Cannot access ref value during render 2026-10-24T22:24:37.0192632Z 165 │ }); 2026-10-24T22:24:37.0192686Z ╰──── 2026-10-24T22:24:37.0193192Z  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-24T22:24:37.0193512Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0193515Z 2026-10-24T22:24:37.0193670Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0193823Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T22:24:37.0193956Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T22:24:37.0194088Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T22:24:37.0194240Z ·  ─────────────┬──────────── 2026-10-24T22:24:37.0194464Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:37.0194523Z 165 │ }); 2026-10-24T22:24:37.0194579Z ╰──── 2026-10-24T22:24:37.0195084Z  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-24T22:24:37.0195460Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0195493Z 2026-10-24T22:24:37.0195646Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0195794Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T22:24:37.0197254Z 165 │ }); 2026-10-24T22:24:37.0197363Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T22:24:37.0197497Z ·  ─────────┬────────────┬─── 2026-10-24T22:24:37.0197704Z · │ ╰── Cannot update ref value during render 2026-10-24T22:24:37.0197831Z · ╰── This value is a ref 2026-10-24T22:24:37.0197914Z 167 │ return JSON.stringify( 2026-10-24T22:24:37.0197975Z ╰──── 2026-10-24T22:24:37.0198487Z  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-24T22:24:37.0198802Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0198805Z 2026-10-24T22:24:37.0198964Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0199112Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T22:24:37.0199188Z 207 │ mostRecentEventCount, 2026-10-24T22:24:37.0199283Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0199400Z ·  ───────────────┬─────────────── 2026-10-24T22:24:37.0199606Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:37.0199664Z 209 │ ); 2026-10-24T22:24:37.0199721Z ╰──── 2026-10-24T22:24:37.0200223Z  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-24T22:24:37.0200538Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0200541Z 2026-10-24T22:24:37.0200695Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0200846Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T22:24:37.0200925Z 213 │ mostRecentEventCount, 2026-10-24T22:24:37.0201019Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0201131Z ·  ───────────────┬─────────────── 2026-10-24T22:24:37.0201332Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:37.0201391Z 215 │ ); 2026-10-24T22:24:37.0201445Z ╰──── 2026-10-24T22:24:37.0201952Z  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-24T22:24:37.0202342Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0202382Z 2026-10-24T22:24:37.0202583Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T22:24:37.0202729Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T22:24:37.0202861Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T22:24:37.0202981Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T22:24:37.0203097Z ·  ─────────┬──────── 2026-10-24T22:24:37.0203604Z · ╰── 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-24T22:24:37.0203671Z 165 │ }); 2026-10-24T22:24:37.0203771Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T22:24:37.0203845Z 167 │ return JSON.stringify( 2026-10-24T22:24:37.0204024Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T22:24:37.0204132Z 169 │ const record = 2026-10-24T22:24:37.0204218Z 170 │ token.type === "context" 2026-10-24T22:24:37.0204396Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T22:24:37.0204467Z 172 │ : undefined; 2026-10-24T22:24:37.0204585Z 173 │ const presentation = contextChipPresentation( 2026-10-24T22:24:37.0204706Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T22:24:37.0204773Z 175 │ record, 2026-10-24T22:24:37.0204841Z 176 │ ); 2026-10-24T22:24:37.0204939Z 177 │ const icon = contextChipIcon( 2026-10-24T22:24:37.0205016Z 178 │ presentation, 2026-10-24T22:24:37.0205168Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T22:24:37.0205231Z 180 │ ); 2026-10-24T22:24:37.0205298Z 181 │ return { 2026-10-24T22:24:37.0205374Z 182 │ type: token.type, 2026-10-24T22:24:37.0205454Z 183 │ source: token.source, 2026-10-24T22:24:37.0205530Z 184 │ start: token.start, 2026-10-24T22:24:37.0205603Z 185 │ end: token.end, 2026-10-24T22:24:37.0205763Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T22:24:37.0205829Z 187 │ label: 2026-10-24T22:24:37.0205914Z 188 │ token.type === "skill" 2026-10-24T22:24:37.0206032Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T22:24:37.0206126Z 190 │ : token.type === "context" 2026-10-24T22:24:37.0206384Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T22:24:37.0206474Z 192 │ : basename(token.value), 2026-10-24T22:24:37.0206630Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T22:24:37.0206731Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T22:24:37.0206825Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T22:24:37.0206888Z 196 │ }; 2026-10-24T22:24:37.0206950Z 197 │ }), 2026-10-24T22:24:37.0207008Z 198 │ ); 2026-10-24T22:24:37.0207153Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T22:24:37.0207372Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T22:24:37.0207628Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0207781Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T22:24:37.0207835Z ╰──── 2026-10-24T22:24:37.0208061Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T22:24:37.0208404Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0208407Z 2026-10-24T22:24:37.0208611Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T22:24:37.0208761Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T22:24:37.0208906Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T22:24:37.0209020Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T22:24:37.0209119Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0209617Z · ╰── 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-24T22:24:37.0209716Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T22:24:37.0209787Z 256 │ value, 2026-10-24T22:24:37.0209874Z 257 │ selection: nextSelection, 2026-10-24T22:24:37.0209934Z 258 │ }); 2026-10-24T22:24:37.0210025Z 259 │ return acknowledgedEventCount; 2026-10-24T22:24:37.0210084Z 260 │ }, 2026-10-24T22:24:37.0210150Z 261 │ [], 2026-10-24T22:24:37.0210225Z ·  ─┬ 2026-10-24T22:24:37.0210421Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0210481Z 262 │ ); 2026-10-24T22:24:37.0210535Z ╰──── 2026-10-24T22:24:37.0211028Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T22:24:37.0211371Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0211374Z 2026-10-24T22:24:37.0211584Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T22:24:37.0211740Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T22:24:37.0211960Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T22:24:37.0212131Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T22:24:37.0212210Z ·  ──┬── 2026-10-24T22:24:37.0212348Z · ╰── 'Image' is imported here 2026-10-24T22:24:37.0212405Z 18 │ 2026-10-24T22:24:37.0212459Z ╰──── 2026-10-24T22:24:37.0212571Z  help: Consider removing this import. 2026-10-24T22:24:37.0212574Z 2026-10-24T22:24:37.0212798Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T22:24:37.0212952Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T22:24:37.0213129Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T22:24:37.0213232Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0213333Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0213830Z · ╰── 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-24T22:24:37.0213907Z 227 │ mostRecentEventCount, 2026-10-24T22:24:37.0213966Z 228 │ ); 2026-10-24T22:24:37.0214129Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T22:24:37.0214274Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T22:24:37.0214488Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0214586Z 230 │ const assumedValue = props.value; 2026-10-24T22:24:37.0214645Z ╰──── 2026-10-24T22:24:37.0214829Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T22:24:37.0215170Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0215174Z 2026-10-24T22:24:37.0215404Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T22:24:37.0215560Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T22:24:37.0215716Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T22:24:37.0215812Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0215914Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0216406Z · ╰── 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-24T22:24:37.0216484Z 238 │ controlledEventCount, 2026-10-24T22:24:37.0216555Z 239 │ assumedValue, 2026-10-24T22:24:37.0216614Z 240 │ ); 2026-10-24T22:24:37.0216784Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T22:24:37.0216935Z ·  ───────────┬────────── 2026-10-24T22:24:37.0217160Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T22:24:37.0217307Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T22:24:37.0217395Z ╰──── 2026-10-24T22:24:37.0217855Z  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-24T22:24:37.0218198Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0218200Z 2026-10-24T22:24:37.0218361Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0218520Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T22:24:37.0218653Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T22:24:37.0218778Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T22:24:37.0218907Z ·  ─────────────┬──────────── 2026-10-24T22:24:37.0219085Z · ╰── Cannot access ref value during render 2026-10-24T22:24:37.0219146Z 163 │ }); 2026-10-24T22:24:37.0219201Z ╰──── 2026-10-24T22:24:37.0219711Z  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-24T22:24:37.0220032Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0220036Z 2026-10-24T22:24:37.0220197Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0220359Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T22:24:37.0220492Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T22:24:37.0220613Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T22:24:37.0220737Z ·  ─────────────┬──────────── 2026-10-24T22:24:37.0220960Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:37.0221021Z 163 │ }); 2026-10-24T22:24:37.0221075Z ╰──── 2026-10-24T22:24:37.0221587Z  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-24T22:24:37.0221904Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0221906Z 2026-10-24T22:24:37.0222061Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0222215Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T22:24:37.0222275Z 163 │ }); 2026-10-24T22:24:37.0222371Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T22:24:37.0222504Z ·  ─────────┬────────────┬─── 2026-10-24T22:24:37.0222706Z · │ ╰── Cannot update ref value during render 2026-10-24T22:24:37.0222887Z · ╰── This value is a ref 2026-10-24T22:24:37.0222997Z 165 │ return JSON.stringify( 2026-10-24T22:24:37.0223052Z ╰──── 2026-10-24T22:24:37.0223554Z  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-24T22:24:37.0223868Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0223871Z 2026-10-24T22:24:37.0224026Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0224215Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T22:24:37.0224296Z 205 │ mostRecentEventCount, 2026-10-24T22:24:37.0224392Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0224504Z ·  ───────────────┬─────────────── 2026-10-24T22:24:37.0224706Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:37.0224765Z 207 │ ); 2026-10-24T22:24:37.0224819Z ╰──── 2026-10-24T22:24:37.0225319Z  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-24T22:24:37.0225631Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0225634Z 2026-10-24T22:24:37.0225793Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0225947Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T22:24:37.0226023Z 211 │ mostRecentEventCount, 2026-10-24T22:24:37.0226116Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T22:24:37.0226226Z ·  ───────────────┬─────────────── 2026-10-24T22:24:37.0226427Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T22:24:37.0226485Z 213 │ ); 2026-10-24T22:24:37.0226539Z ╰──── 2026-10-24T22:24:37.0227046Z  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-24T22:24:37.0227363Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0227365Z 2026-10-24T22:24:37.0227565Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T22:24:37.0227718Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T22:24:37.0227848Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T22:24:37.0227970Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T22:24:37.0228087Z ·  ─────────┬──────── 2026-10-24T22:24:37.0228637Z · ╰── 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-24T22:24:37.0228727Z 163 │ }); 2026-10-24T22:24:37.0228823Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T22:24:37.0228899Z 165 │ return JSON.stringify( 2026-10-24T22:24:37.0229076Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T22:24:37.0229148Z 167 │ const record = 2026-10-24T22:24:37.0229233Z 168 │ token.type === "context" 2026-10-24T22:24:37.0229411Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T22:24:37.0229483Z 170 │ : undefined; 2026-10-24T22:24:37.0229599Z 171 │ const presentation = contextChipPresentation( 2026-10-24T22:24:37.0229718Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T22:24:37.0229791Z 173 │ record, 2026-10-24T22:24:37.0229856Z 174 │ ); 2026-10-24T22:24:37.0229946Z 175 │ const icon = contextChipIcon( 2026-10-24T22:24:37.0230024Z 176 │ presentation, 2026-10-24T22:24:37.0230178Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T22:24:37.0230240Z 178 │ ); 2026-10-24T22:24:37.0230305Z 179 │ return { 2026-10-24T22:24:37.0230381Z 180 │ type: token.type, 2026-10-24T22:24:37.0230462Z 181 │ source: token.source, 2026-10-24T22:24:37.0230538Z 182 │ start: token.start, 2026-10-24T22:24:37.0230609Z 183 │ end: token.end, 2026-10-24T22:24:37.0230769Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T22:24:37.0230836Z 185 │ label: 2026-10-24T22:24:37.0230925Z 186 │ token.type === "skill" 2026-10-24T22:24:37.0231042Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T22:24:37.0231131Z 188 │ : token.type === "context" 2026-10-24T22:24:37.0231387Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T22:24:37.0231476Z 190 │ : basename(token.value), 2026-10-24T22:24:37.0231631Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T22:24:37.0231731Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T22:24:37.0231826Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T22:24:37.0231888Z 194 │ }; 2026-10-24T22:24:37.0231948Z 195 │ }), 2026-10-24T22:24:37.0232007Z 196 │ ); 2026-10-24T22:24:37.0232206Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T22:24:37.0232400Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T22:24:37.0232620Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0232771Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T22:24:37.0232826Z ╰──── 2026-10-24T22:24:37.0233053Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T22:24:37.0233393Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0233396Z 2026-10-24T22:24:37.0233603Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T22:24:37.0233759Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T22:24:37.0233900Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T22:24:37.0234009Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T22:24:37.0234118Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0234641Z · ╰── 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-24T22:24:37.0234740Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T22:24:37.0234807Z 254 │ value, 2026-10-24T22:24:37.0234890Z 255 │ selection: nextSelection, 2026-10-24T22:24:37.0234957Z 256 │ }); 2026-10-24T22:24:37.0235049Z 257 │ return acknowledgedEventCount; 2026-10-24T22:24:37.0235107Z 258 │ }, 2026-10-24T22:24:37.0235164Z 259 │ [], 2026-10-24T22:24:37.0235237Z ·  ─┬ 2026-10-24T22:24:37.0235436Z · ╰── This dependency list is missing values used by the callback 2026-10-24T22:24:37.0235498Z 260 │ ); 2026-10-24T22:24:37.0235554Z ╰──── 2026-10-24T22:24:37.0235776Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T22:24:37.0236115Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0236118Z 2026-10-24T22:24:37.0236630Z ⚠ 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-24T22:24:37.0236834Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T22:24:37.0236913Z 520 │ })).delivery; 2026-10-24T22:24:37.0237127Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T22:24:37.0237250Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0237407Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T22:24:37.0237517Z 524 │ │ id: task.id, 2026-10-24T22:24:37.0237695Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T22:24:37.0237839Z 526 │ │ })).delivery; 2026-10-24T22:24:37.0237988Z 527 │ ╰─▶ } 2026-10-24T22:24:37.0238113Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T22:24:37.0238169Z ╰──── 2026-10-24T22:24:37.0238171Z 2026-10-24T22:24:37.0238673Z ⚠ 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-24T22:24:37.0238819Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T22:24:37.0238877Z 93 │ ) { 2026-10-24T22:24:37.0239099Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T22:24:37.0239291Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T22:24:37.0239421Z 96 │ │ if (predicate(project)) return project; 2026-10-24T22:24:37.0239527Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0239661Z 98 │ ╰─▶ } 2026-10-24T22:24:37.0239828Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T22:24:37.0239884Z ╰──── 2026-10-24T22:24:37.0239887Z 2026-10-24T22:24:37.0240116Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T22:24:37.0240265Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T22:24:37.0240321Z 21 │ 2026-10-24T22:24:37.0240497Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T22:24:37.0240593Z ·  ────────┬─────── 2026-10-24T22:24:37.0240752Z · ╰── 'summarizePayload' is declared here 2026-10-24T22:24:37.0240866Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T22:24:37.0240921Z ╰──── 2026-10-24T22:24:37.0241035Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0241039Z 2026-10-24T22:24:37.0241255Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:37.0241397Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T22:24:37.0241455Z 81 │ }, 2026-10-24T22:24:37.0241523Z 82 │ [draftKey], 2026-10-24T22:24:37.0241606Z ·  ────┬─── 2026-10-24T22:24:37.0241760Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T22:24:37.0241818Z 83 │ ); 2026-10-24T22:24:37.0241872Z ╰──── 2026-10-24T22:24:37.0242193Z  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-24T22:24:37.0242533Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0242536Z 2026-10-24T22:24:37.0242820Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0242970Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T22:24:37.0243136Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T22:24:37.0243253Z 67 │ useEffect(() => { 2026-10-24T22:24:37.0243332Z ·  ────┬──── 2026-10-24T22:24:37.0243471Z · ╰── This is the containing effect 2026-10-24T22:24:37.0243538Z 68 │ setUri(null); 2026-10-24T22:24:37.0243613Z ·  ───┬── 2026-10-24T22:24:37.0243791Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0243860Z 69 │ setError(null); 2026-10-24T22:24:37.0243914Z ╰──── 2026-10-24T22:24:37.0244602Z  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-24T22:24:37.0244961Z  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-24T22:24:37.0244964Z 2026-10-24T22:24:37.0245185Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:37.0245332Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T22:24:37.0245390Z 90 │ }; 2026-10-24T22:24:37.0245472Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T22:24:37.0245600Z ·  ──────┬───── ───┬─── 2026-10-24T22:24:37.0245794Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T22:24:37.0245956Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T22:24:37.0246104Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T22:24:37.0246159Z ╰──── 2026-10-24T22:24:37.0246478Z  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-24T22:24:37.0246812Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0246817Z 2026-10-24T22:24:37.0247048Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T22:24:37.0247199Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T22:24:37.0247271Z 212 │ useEffect(() => { 2026-10-24T22:24:37.0247401Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T22:24:37.0247508Z ·  ──┬── 2026-10-24T22:24:37.0247671Z · ╰── Missing dependency `props` 2026-10-24T22:24:37.0247787Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T22:24:37.0247908Z ·  ──────────┬───────── 2026-10-24T22:24:37.0248154Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T22:24:37.0248234Z 215 │ const { source } = props; 2026-10-24T22:24:37.0248291Z ╰──── 2026-10-24T22:24:37.0248878Z  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-24T22:24:37.0249258Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0249262Z 2026-10-24T22:24:37.0249544Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0249705Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55] 2026-10-24T22:24:37.0249767Z 61 │ }, []); 2026-10-24T22:24:37.0249837Z 62 │ useEffect(() => { 2026-10-24T22:24:37.0249912Z ·  ────┬──── 2026-10-24T22:24:37.0250051Z · ╰── This is the containing effect 2026-10-24T22:24:37.0250220Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T22:24:37.0250358Z ·  ───────┬────── 2026-10-24T22:24:37.0250577Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0250718Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T22:24:37.0250774Z ╰──── 2026-10-24T22:24:37.0251432Z  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-24T22:24:37.0251792Z  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-24T22:24:37.0251796Z 2026-10-24T22:24:37.0251978Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:37.0252148Z ╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58] 2026-10-24T22:24:37.0252347Z 151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T22:24:37.0252493Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T22:24:37.0252625Z ·  ─────┬──── 2026-10-24T22:24:37.0252810Z · ╰── Cannot call impure function 2026-10-24T22:24:37.0252871Z 153 │ } 2026-10-24T22:24:37.0252935Z ╰──── 2026-10-24T22:24:37.0253251Z  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-24T22:24:37.0253574Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:37.0253576Z 2026-10-24T22:24:37.0253829Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T22:24:37.0253967Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T22:24:37.0254200Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T22:24:37.0254306Z 35 │ instanceId === configured ? true : false, 2026-10-24T22:24:37.0254504Z ·  ──────────────────────────────────────── 2026-10-24T22:24:37.0254602Z 36 │ ); 2026-10-24T22:24:37.0254657Z ╰──── 2026-10-24T22:24:37.0254759Z  help: Remove this ternary operator 2026-10-24T22:24:37.0254762Z 2026-10-24T22:24:37.0254993Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T22:24:37.0255145Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T22:24:37.0255283Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T22:24:37.0255400Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T22:24:37.0255520Z ·  ─────── 2026-10-24T22:24:37.0255642Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T22:24:37.0255697Z ╰──── 2026-10-24T22:24:37.0255988Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T22:24:37.0255993Z 2026-10-24T22:24:37.0256300Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T22:24:37.0256442Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T22:24:37.0256502Z 248 │ }, 2026-10-24T22:24:37.0256592Z 249 │ (effect, flow, stopSessions) => 2026-10-24T22:24:37.0256693Z ·  ──────┬───── 2026-10-24T22:24:37.0256853Z · ╰── 'stopSessions' is declared here 2026-10-24T22:24:37.0256926Z 250 │ effect.pipe( 2026-10-24T22:24:37.0256980Z ╰──── 2026-10-24T22:24:37.0257104Z  help: Consider removing this parameter. 2026-10-24T22:24:37.0257110Z 2026-10-24T22:24:37.0257515Z ⚠ 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-24T22:24:37.0257653Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17] 2026-10-24T22:24:37.0257802Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => { 2026-10-24T22:24:37.0257945Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T22:24:37.0258060Z ·  ──────────────────────── 2026-10-24T22:24:37.0258213Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T22:24:37.0258268Z ╰──── 2026-10-24T22:24:37.0258271Z 2026-10-24T22:24:37.0258722Z ⚠ 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-24T22:24:37.0258889Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T22:24:37.0258998Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T22:24:37.0259171Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T22:24:37.0259293Z ·  ──────────────────────── 2026-10-24T22:24:37.0259361Z 257 │ return [ 2026-10-24T22:24:37.0259418Z ╰──── 2026-10-24T22:24:37.0259420Z 2026-10-24T22:24:37.0259707Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0259852Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T22:24:37.0259918Z 57 │ 2026-10-24T22:24:37.0259990Z 58 │ useEffect(() => { 2026-10-24T22:24:37.0260068Z ·  ────┬──── 2026-10-24T22:24:37.0260207Z · ╰── This is the containing effect 2026-10-24T22:24:37.0260312Z 59 │ const controller = new AbortController(); 2026-10-24T22:24:37.0260391Z 60 │ setLoadState("pending"); 2026-10-24T22:24:37.0260474Z ·  ──────┬───── 2026-10-24T22:24:37.0260655Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0260830Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T22:24:37.0260886Z ╰──── 2026-10-24T22:24:37.0261549Z  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-24T22:24:37.0261909Z  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-24T22:24:37.0261912Z 2026-10-24T22:24:37.0262130Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T22:24:37.0262275Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T22:24:37.0262364Z 70 │ return () => controller.abort(); 2026-10-24T22:24:37.0262470Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T22:24:37.0262661Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T22:24:37.0262909Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T22:24:37.0263125Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T22:24:37.0263274Z · ╰── Unnecessary dependency `player_0` 2026-10-24T22:24:37.0263331Z 72 │ 2026-10-24T22:24:37.0263385Z ╰──── 2026-10-24T22:24:37.0263707Z  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-24T22:24:37.0264048Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0264117Z 2026-10-24T22:24:37.0264396Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T22:24:37.0264510Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T22:24:37.0264607Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T22:24:37.0264707Z 28 │ import { identity } from "effect/Function"; 2026-10-24T22:24:37.0264789Z ·  ────┬─── 2026-10-24T22:24:37.0264935Z · ╰── 'identity' is imported here 2026-10-24T22:24:37.0265029Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T22:24:37.0265084Z ╰──── 2026-10-24T22:24:37.0265192Z  help: Consider removing this import. 2026-10-24T22:24:37.0265195Z 2026-10-24T22:24:37.0265418Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T22:24:37.0265521Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T22:24:37.0265598Z 21 │ EnvironmentThreadShell, 2026-10-24T22:24:37.0265670Z 22 │ ThreadRunSummary, 2026-10-24T22:24:37.0265753Z ·  ────────┬─────── 2026-10-24T22:24:37.0265907Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T22:24:37.0265982Z 23 │ ThreadRuntimeSummary, 2026-10-24T22:24:37.0266037Z ╰──── 2026-10-24T22:24:37.0266142Z  help: Consider removing this import. 2026-10-24T22:24:37.0266145Z 2026-10-24T22:24:37.0266350Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T22:24:37.0266494Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T22:24:37.0266629Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T22:24:37.0266718Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T22:24:37.0266797Z ·  ─┬─ 2026-10-24T22:24:37.0266932Z · ╰── 'Arr' is imported here 2026-10-24T22:24:37.0267023Z 5 │ import * as Order from "effect/Order"; 2026-10-24T22:24:37.0267076Z ╰──── 2026-10-24T22:24:37.0267182Z  help: Consider removing this import. 2026-10-24T22:24:37.0267185Z 2026-10-24T22:24:37.0267392Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T22:24:37.0267534Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T22:24:37.0267620Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T22:24:37.0267708Z 5 │ import * as Order from "effect/Order"; 2026-10-24T22:24:37.0267797Z ·  ──┬── 2026-10-24T22:24:37.0267940Z · ╰── 'Order' is imported here 2026-10-24T22:24:37.0267995Z 6 │ 2026-10-24T22:24:37.0268051Z ╰──── 2026-10-24T22:24:37.0268155Z  help: Consider removing this import. 2026-10-24T22:24:37.0268158Z 2026-10-24T22:24:37.0268673Z ⚠ 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-24T22:24:37.0268833Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T22:24:37.0268900Z 168 │ }); 2026-10-24T22:24:37.0269119Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T22:24:37.0269385Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T22:24:37.0269534Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0269677Z 172 │ ╰─▶ } 2026-10-24T22:24:37.0269737Z 173 │ 2026-10-24T22:24:37.0269794Z ╰──── 2026-10-24T22:24:37.0269796Z 2026-10-24T22:24:37.0270301Z ⚠ 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-24T22:24:37.0270464Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T22:24:37.0270585Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T22:24:37.0270799Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T22:24:37.0270946Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T22:24:37.0271061Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0271202Z 181 │ ╰─▶ } 2026-10-24T22:24:37.0271262Z 182 │ 2026-10-24T22:24:37.0271320Z ╰──── 2026-10-24T22:24:37.0271322Z 2026-10-24T22:24:37.0271824Z ⚠ 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-24T22:24:37.0271987Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T22:24:37.0272128Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T22:24:37.0272333Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T22:24:37.0272466Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T22:24:37.0272675Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T22:24:37.0272771Z 310 │ │ break; 2026-10-24T22:24:37.0272855Z 311 │ │ } 2026-10-24T22:24:37.0272968Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0273107Z 313 │ ╰─▶ } 2026-10-24T22:24:37.0273166Z 314 │ 2026-10-24T22:24:37.0273227Z ╰──── 2026-10-24T22:24:37.0273232Z 2026-10-24T22:24:37.0273596Z ⚠ 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-24T22:24:37.0273752Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T22:24:37.0273927Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T22:24:37.0274122Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T22:24:37.0274241Z ·  ───────── 2026-10-24T22:24:37.0274437Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T22:24:37.0274491Z ╰──── 2026-10-24T22:24:37.0274493Z 2026-10-24T22:24:37.0274907Z ⚠ 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-24T22:24:37.0275093Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T22:24:37.0275275Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T22:24:37.0275465Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T22:24:37.0275556Z ·  ───────── 2026-10-24T22:24:37.0275614Z 52 │ } 2026-10-24T22:24:37.0275670Z ╰──── 2026-10-24T22:24:37.0275673Z 2026-10-24T22:24:37.0276030Z ⚠ 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-24T22:24:37.0276188Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T22:24:37.0276260Z 54 │ assert.equal( 2026-10-24T22:24:37.0276448Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T22:24:37.0276526Z ·  ───────── 2026-10-24T22:24:37.0276587Z 56 │ true, 2026-10-24T22:24:37.0276642Z ╰──── 2026-10-24T22:24:37.0276645Z 2026-10-24T22:24:37.0277004Z ⚠ 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-24T22:24:37.0277155Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T22:24:37.0277222Z 58 │ assert.equal( 2026-10-24T22:24:37.0277425Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T22:24:37.0277505Z ·  ───────── 2026-10-24T22:24:37.0277568Z 60 │ true, 2026-10-24T22:24:37.0277621Z ╰──── 2026-10-24T22:24:37.0277624Z 2026-10-24T22:24:37.0277980Z ⚠ 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-24T22:24:37.0278140Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T22:24:37.0278199Z 102 │ 2026-10-24T22:24:37.0278381Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T22:24:37.0278471Z ·  ───────── 2026-10-24T22:24:37.0278531Z 104 │ }); 2026-10-24T22:24:37.0278587Z ╰──── 2026-10-24T22:24:37.0278590Z 2026-10-24T22:24:37.0278812Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T22:24:37.0278959Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T22:24:37.0279037Z 2 │ AuthFilesystemReadScope, 2026-10-24T22:24:37.0279111Z 3 │ type AuthSessionState, 2026-10-24T22:24:37.0279200Z ·  ────────┬─────── 2026-10-24T22:24:37.0279359Z · ╰── 'AuthSessionState' is imported here 2026-10-24T22:24:37.0279439Z 4 │ type FilesystemBrowseEntry, 2026-10-24T22:24:37.0279497Z ╰──── 2026-10-24T22:24:37.0279604Z  help: Consider removing this import. 2026-10-24T22:24:37.0279607Z 2026-10-24T22:24:37.0280167Z ⚠ 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-24T22:24:37.0280368Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T22:24:37.0280469Z 1679 │ yield* harness.replaceSession; 2026-10-24T22:24:37.0280696Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T22:24:37.0280860Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T22:24:37.0280956Z 1682 │ │ break; 2026-10-24T22:24:37.0281042Z 1683 │ │ } 2026-10-24T22:24:37.0281159Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0281304Z 1685 │ ╰─▶ } 2026-10-24T22:24:37.0281392Z 1686 │ yield* Queue.offer( 2026-10-24T22:24:37.0281452Z ╰──── 2026-10-24T22:24:37.0281454Z 2026-10-24T22:24:37.0281955Z ⚠ 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-24T22:24:37.0282121Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T22:24:37.0282220Z 1788 │ yield* harness.replaceSession; 2026-10-24T22:24:37.0282442Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T22:24:37.0282616Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T22:24:37.0282735Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0282881Z 1792 │ ╰─▶ } 2026-10-24T22:24:37.0283023Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T22:24:37.0283079Z ╰──── 2026-10-24T22:24:37.0283082Z 2026-10-24T22:24:37.0283288Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T22:24:37.0283426Z ╭─[packages/client-runtime/src/state/shell.ts:189:5] 2026-10-24T22:24:37.0283545Z 186 │ let waiting = yield* Ref.get(awaitingCompletion); 2026-10-24T22:24:37.0283619Z 187 │ let next = initial; 2026-10-24T22:24:37.0283696Z ·  ──┬─ 2026-10-24T22:24:37.0283825Z · ╰── From this accumulator 2026-10-24T22:24:37.0283913Z 188 │ let receivedSnapshot = false; 2026-10-24T22:24:37.0284045Z 189 │ for (const item of items) { 2026-10-24T22:24:37.0284174Z ·  ─┬─ 2026-10-24T22:24:37.0284288Z · ╰── For this loop 2026-10-24T22:24:37.0284384Z 190 │ if (item.kind === "synchronized") { 2026-10-24T22:24:37.0284457Z 191 │ waiting = false; 2026-10-24T22:24:37.0284555Z 192 │ if (Option.isSome(next.snapshot)) { 2026-10-24T22:24:37.0284684Z 193 │ next = { ...next, status: "live", error: Option.none() }; 2026-10-24T22:24:37.0284777Z ·  ───┬─── 2026-10-24T22:24:37.0284915Z · ╰── From this spread 2026-10-24T22:24:37.0284978Z 194 │ } 2026-10-24T22:24:37.0285032Z ╰──── 2026-10-24T22:24:37.0285203Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T22:24:37.0285380Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T22:24:37.0285385Z 2026-10-24T22:24:37.0285595Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T22:24:37.0285695Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T22:24:37.0285790Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T22:24:37.0285883Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T22:24:37.0285963Z ·  ──┬── 2026-10-24T22:24:37.0286104Z · ╰── 'Fiber' is imported here 2026-10-24T22:24:37.0286214Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T22:24:37.0286269Z ╰──── 2026-10-24T22:24:37.0286373Z  help: Consider removing this import. 2026-10-24T22:24:37.0286377Z 2026-10-24T22:24:37.0286597Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T22:24:37.0286700Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T22:24:37.0286787Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T22:24:37.0286886Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T22:24:37.0286971Z ·  ────┬─── 2026-10-24T22:24:37.0287116Z · ╰── 'Schedule' is imported here 2026-10-24T22:24:37.0287210Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T22:24:37.0287266Z ╰──── 2026-10-24T22:24:37.0287371Z  help: Consider removing this import. 2026-10-24T22:24:37.0287374Z 2026-10-24T22:24:37.0287707Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0287819Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T22:24:37.0287987Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T22:24:37.0288202Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T22:24:37.0288319Z ·  ────────────┬─────────── 2026-10-24T22:24:37.0288505Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T22:24:37.0288691Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T22:24:37.0288746Z ╰──── 2026-10-24T22:24:37.0288859Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0288862Z 2026-10-24T22:24:37.0289324Z ⚠ 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-24T22:24:37.0289506Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T22:24:37.0289670Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T22:24:37.0289838Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T22:24:37.0289973Z ·  ────────────────────────── 2026-10-24T22:24:37.0290098Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T22:24:37.0290154Z ╰──── 2026-10-24T22:24:37.0290157Z 2026-10-24T22:24:37.0290648Z ⚠ 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-24T22:24:37.0290849Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T22:24:37.0291005Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T22:24:37.0291213Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T22:24:37.0291335Z ·  ─────────────────── 2026-10-24T22:24:37.0291439Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T22:24:37.0291496Z ╰──── 2026-10-24T22:24:37.0291498Z 2026-10-24T22:24:37.0291786Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0291920Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T22:24:37.0291979Z 168 │ 2026-10-24T22:24:37.0292065Z 169 │ const layerTest = Layer.succeed( 2026-10-24T22:24:37.0292146Z ·  ────┬──── 2026-10-24T22:24:37.0292288Z · ╰── 'layerTest' is declared here 2026-10-24T22:24:37.0292359Z 170 │ UsageService, 2026-10-24T22:24:37.0292414Z ╰──── 2026-10-24T22:24:37.0292527Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0292530Z 2026-10-24T22:24:37.0292751Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T22:24:37.0292935Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T22:24:37.0293016Z 14 │ } from "@t3tools/contracts"; 2026-10-24T22:24:37.0293116Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T22:24:37.0293196Z ·  ── 2026-10-24T22:24:37.0293257Z 16 │ 2026-10-24T22:24:37.0293312Z ╰──── 2026-10-24T22:24:37.0293402Z  help: Remove empty braces 2026-10-24T22:24:37.0293406Z 2026-10-24T22:24:37.0293633Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T22:24:37.0293768Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T22:24:37.0293824Z 40 │ 2026-10-24T22:24:37.0293942Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T22:24:37.0294058Z ·  ─────── 2026-10-24T22:24:37.0294195Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T22:24:37.0294250Z ╰──── 2026-10-24T22:24:37.0294610Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T22:24:37.0294654Z 2026-10-24T22:24:37.0294913Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T22:24:37.0295045Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T22:24:37.0295154Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T22:24:37.0295305Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T22:24:37.0295397Z ·  ─────────────── 2026-10-24T22:24:37.0295456Z 518 │ ) 2026-10-24T22:24:37.0295512Z ╰──── 2026-10-24T22:24:37.0295680Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T22:24:37.0295683Z 2026-10-24T22:24:37.0295917Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T22:24:37.0296061Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T22:24:37.0296142Z 89 │ let cursor = prompt.length; 2026-10-24T22:24:37.0296257Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T22:24:37.0296370Z ·  ─────── 2026-10-24T22:24:37.0296455Z 91 │ let { start, end } = occurrence; 2026-10-24T22:24:37.0296510Z ╰──── 2026-10-24T22:24:37.0296791Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T22:24:37.0296793Z 2026-10-24T22:24:37.0297092Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0297258Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T22:24:37.0297319Z 60 │ ) { 2026-10-24T22:24:37.0297503Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T22:24:37.0297590Z ·  ──────┬────── 2026-10-24T22:24:37.0297740Z · ╰── 'useDragRegion' is declared here 2026-10-24T22:24:37.0297840Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T22:24:37.0297895Z ╰──── 2026-10-24T22:24:37.0298009Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0298011Z 2026-10-24T22:24:37.0298291Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0298434Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T22:24:37.0298494Z 727 │ 2026-10-24T22:24:37.0298583Z 728 │ const layer = layerWithOptions(); 2026-10-24T22:24:37.0298659Z ·  ──┬── 2026-10-24T22:24:37.0298794Z · ╰── 'layer' is declared here 2026-10-24T22:24:37.0298849Z ╰──── 2026-10-24T22:24:37.0298961Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0298963Z 2026-10-24T22:24:37.0299350Z ⚠ 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-24T22:24:37.0299496Z ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34] 2026-10-24T22:24:37.0299643Z 1785 │ const stat = branch.files!.find((file) => file.path === path)!; 2026-10-24T22:24:37.0299858Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T22:24:37.0300014Z ·  ─────────────────── 2026-10-24T22:24:37.0300083Z 1787 │ cwd, 2026-10-24T22:24:37.0300140Z ╰──── 2026-10-24T22:24:37.0300143Z 2026-10-24T22:24:37.0300652Z ⚠ 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-24T22:24:37.0300792Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T22:24:37.0300896Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T22:24:37.0301153Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T22:24:37.0301289Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T22:24:37.0301453Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T22:24:37.0301596Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T22:24:37.0301703Z 2619 │ │ flush: () => { 2026-10-24T22:24:37.0301838Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T22:24:37.0301999Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T22:24:37.0302089Z 2622 │ │ }, 2026-10-24T22:24:37.0302177Z 2623 │ │ }; 2026-10-24T22:24:37.0302255Z 2624 │ │ 2026-10-24T22:24:37.0302435Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T22:24:37.0302553Z 2626 │ │ let requestChecks = 0; 2026-10-24T22:24:37.0302694Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T22:24:37.0302814Z 2628 │ │ executionMode: "async", 2026-10-24T22:24:37.0302948Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T22:24:37.0303073Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T22:24:37.0303218Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T22:24:37.0303335Z 2632 │ │ requestChecks += 1; 2026-10-24T22:24:37.0303492Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T22:24:37.0303624Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T22:24:37.0303731Z 2635 │ │ return true; 2026-10-24T22:24:37.0303822Z 2636 │ │ }, 2026-10-24T22:24:37.0303910Z 2637 │ │ }; 2026-10-24T22:24:37.0303986Z 2638 │ │ 2026-10-24T22:24:37.0304150Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T22:24:37.0304254Z 2640 │ │ ...WINDOW, 2026-10-24T22:24:37.0304394Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T22:24:37.0304605Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T22:24:37.0304692Z 2643 │ │ }; 2026-10-24T22:24:37.0304866Z 2644 │ │ const first = yield* service 2026-10-24T22:24:37.0305013Z 2645 │ │ .readSummary(input) 2026-10-24T22:24:37.0305110Z 2646 │ │ .pipe( 2026-10-24T22:24:37.0305214Z 2647 │ │ Effect.exit, 2026-10-24T22:24:37.0305387Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T22:24:37.0305500Z 2649 │ │ Effect.forkChild, 2026-10-24T22:24:37.0305589Z 2650 │ │ ); 2026-10-24T22:24:37.0305699Z 2651 │ │ requestFiber = first; 2026-10-24T22:24:37.0305815Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0305929Z 2653 │ │ dispatcher.flush(); 2026-10-24T22:24:37.0306012Z 2654 │ │ 2026-10-24T22:24:37.0306178Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T22:24:37.0306285Z 2656 │ │ Effect.match({ 2026-10-24T22:24:37.0306420Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T22:24:37.0306555Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T22:24:37.0306644Z 2659 │ │ }), 2026-10-24T22:24:37.0306814Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T22:24:37.0306925Z 2661 │ │ Effect.forkChild, 2026-10-24T22:24:37.0307013Z 2662 │ │ ); 2026-10-24T22:24:37.0307128Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T22:24:37.0307247Z 2664 │ │ dispatcher.flush(); 2026-10-24T22:24:37.0307389Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T22:24:37.0307517Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T22:24:37.0307641Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T22:24:37.0307768Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T22:24:37.0307864Z 2669 │ │ break; 2026-10-24T22:24:37.0307951Z 2670 │ │ } 2026-10-24T22:24:37.0308081Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T22:24:37.0308253Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T22:24:37.0308397Z 2673 │ │ } 2026-10-24T22:24:37.0308593Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T22:24:37.0308740Z 2675 │ ╰─▶ } 2026-10-24T22:24:37.0308798Z 2676 │ 2026-10-24T22:24:37.0308855Z ╰──── 2026-10-24T22:24:37.0308858Z 2026-10-24T22:24:37.0309015Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0309179Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T22:24:37.0309375Z 151 │ 2026-10-24T22:24:37.0309462Z 152 │ {props.children(open)} 2026-10-24T22:24:37.0309561Z ·  ──┬─ 2026-10-24T22:24:37.0309742Z · ╰── Cannot access ref value during render 2026-10-24T22:24:37.0309811Z 153 │ 2026-10-24T22:24:37.0309867Z ╰──── 2026-10-24T22:24:37.0310377Z  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-24T22:24:37.0310702Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0310705Z 2026-10-24T22:24:37.0310918Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T22:24:37.0311080Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T22:24:37.0311172Z 139 │ if (action.id !== undefined) { 2026-10-24T22:24:37.0311260Z 140 │ props.onPressAction?.({ 2026-10-24T22:24:37.0311338Z ·  ──┬── 2026-10-24T22:24:37.0311479Z · ╰── Missing dependency `props` 2026-10-24T22:24:37.0311579Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T22:24:37.0311739Z 142 │ } as Parameters>[0]); 2026-10-24T22:24:37.0311800Z 143 │ } 2026-10-24T22:24:37.0311859Z 144 │ }, 2026-10-24T22:24:37.0311950Z 145 │ [close, props.onPressAction], 2026-10-24T22:24:37.0312054Z ·  ─────────┬───────── 2026-10-24T22:24:37.0312286Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T22:24:37.0312352Z 146 │ ); 2026-10-24T22:24:37.0312412Z ╰──── 2026-10-24T22:24:37.0312937Z  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-24T22:24:37.0313282Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T22:24:37.0313285Z 2026-10-24T22:24:37.0313573Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0313717Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T22:24:37.0313776Z 339 │ 2026-10-24T22:24:37.0313938Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T22:24:37.0314051Z ·  ────┬──── 2026-10-24T22:24:37.0314237Z · ╰── 'layerTest' is declared here 2026-10-24T22:24:37.0314293Z ╰──── 2026-10-24T22:24:37.0314408Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0314411Z 2026-10-24T22:24:37.0314566Z ⚠ react(refs): Cannot access refs during render 2026-10-24T22:24:37.0314695Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T22:24:37.0314890Z 53 │ const child = children as ReactElement>; 2026-10-24T22:24:37.0315078Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T22:24:37.0315190Z 55 │ │ onTouchStart: (event) => { 2026-10-24T22:24:37.0315368Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T22:24:37.0315542Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T22:24:37.0315680Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T22:24:37.0315861Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T22:24:37.0315982Z 60 │ │ pendingPress.current = null; 2026-10-24T22:24:37.0316119Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T22:24:37.0316203Z 62 │ │ }, 2026-10-24T22:24:37.0316312Z 63 │ │ onPress: (event) => { 2026-10-24T22:24:37.0316501Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T22:24:37.0316652Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T22:24:37.0316832Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T22:24:37.0317040Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T22:24:37.0317134Z 68 │ │ return; 2026-10-24T22:24:37.0317220Z 69 │ │ } 2026-10-24T22:24:37.0317372Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T22:24:37.0317556Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T22:24:37.0317743Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T22:24:37.0317854Z 73 │ │ event.persist(); 2026-10-24T22:24:37.0318028Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T22:24:37.0318121Z 75 │ │ return; 2026-10-24T22:24:37.0318204Z 76 │ │ } 2026-10-24T22:24:37.0318328Z 77 │ │ child.props.onPress?.(event); 2026-10-24T22:24:37.0318410Z 78 │ │ }, 2026-10-24T22:24:37.0318552Z 79 │ ├─▶ }); 2026-10-24T22:24:37.0318808Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T22:24:37.0318978Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T22:24:37.0319066Z ╰──── 2026-10-24T22:24:37.0319579Z  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-24T22:24:37.0319897Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T22:24:37.0319900Z 2026-10-24T22:24:37.0320078Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T22:24:37.0320250Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T22:24:37.0320309Z 1436 │ 2026-10-24T22:24:37.0320382Z 1437 │ for (const [] of [ 2026-10-24T22:24:37.0320465Z ·  ── 2026-10-24T22:24:37.0320545Z 1438 │ ["github", "github.com"], 2026-10-24T22:24:37.0320602Z ╰──── 2026-10-24T22:24:37.0320905Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T22:24:37.0320908Z 2026-10-24T22:24:37.0321173Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T22:24:37.0321298Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T22:24:37.0321355Z 55 │ 2026-10-24T22:24:37.0321464Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T22:24:37.0321584Z ·  ────────────────┬──────────────── 2026-10-24T22:24:37.0321799Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T22:24:37.0321898Z 57 │ selection: TerminalContextSelection, 2026-10-24T22:24:37.0321953Z ╰──── 2026-10-24T22:24:37.0322064Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0322069Z 2026-10-24T22:24:37.0322318Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T22:24:37.0322447Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T22:24:37.0322503Z 11 │ 2026-10-24T22:24:37.0322607Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T22:24:37.0322715Z ·  ────────────┬──────────── 2026-10-24T22:24:37.0322901Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T22:24:37.0322972Z 13 │ readonly thread: { 2026-10-24T22:24:37.0323026Z ╰──── 2026-10-24T22:24:37.0323144Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0323149Z 2026-10-24T22:24:37.0323428Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T22:24:37.0323573Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T22:24:37.0323780Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T22:24:37.0323854Z 168 │ useLayoutEffect(() => { 2026-10-24T22:24:37.0323939Z ·  ───────┬─────── 2026-10-24T22:24:37.0324112Z · ╰── This is the containing effect 2026-10-24T22:24:37.0324207Z 169 │ if (faviconRequest === null) return; 2026-10-24T22:24:37.0324262Z 170 │ 2026-10-24T22:24:37.0324460Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T22:24:37.0324594Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T22:24:37.0324691Z ·  ───────────┬─────────── 2026-10-24T22:24:37.0324881Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T22:24:37.0324957Z 173 │ return endRequest; 2026-10-24T22:24:37.0325013Z ╰──── 2026-10-24T22:24:37.0325663Z  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-24T22:24:37.0326020Z  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-24T22:24:37.0326026Z 2026-10-24T22:24:37.0326508Z ⚠ 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-24T22:24:37.0326645Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T22:24:37.0326831Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T22:24:37.0327030Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T22:24:37.0327150Z ·  ─────────────────── 2026-10-24T22:24:37.0327269Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T22:24:37.0327325Z ╰──── 2026-10-24T22:24:37.0327333Z 2026-10-24T22:24:37.0327815Z ⚠ 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-24T22:24:37.0327946Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T22:24:37.0328143Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T22:24:37.0328260Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T22:24:37.0328382Z ·  ─────────────────── 2026-10-24T22:24:37.0328509Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T22:24:37.0328563Z ╰──── 2026-10-24T22:24:37.0328566Z 2026-10-24T22:24:37.0328782Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:37.0328946Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T22:24:37.0329061Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T22:24:37.0329240Z 272 │ 2026-10-24T22:24:37.0329407Z ·  ─────────────────────────────────────────────────────── 2026-10-24T22:24:37.0329491Z 273 │ approval.requestId, 2026-10-24T22:24:37.0334477Z 987 │ ╰─▶ ); 2026-10-24T22:24:37.0334631Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T22:24:37.0334687Z ╰──── 2026-10-24T22:24:37.0334773Z  help: Switch to `Set` 2026-10-24T22:24:37.0334776Z 2026-10-24T22:24:37.0334983Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:37.0335166Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T22:24:37.0335237Z 817 │
new Promise((resolve) => setImmediate(resolve))); 2026-10-24T22:24:37.0339051Z 143 │ ╰─▶ } 2026-10-24T22:24:37.0339147Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T22:24:37.0339202Z ╰──── 2026-10-24T22:24:37.0339204Z 2026-10-24T22:24:37.0339425Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T22:24:37.0339580Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T22:24:37.0339796Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T22:24:37.0339928Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T22:24:37.0340017Z ·  ────┬─── 2026-10-24T22:24:37.0340166Z · ╰── 'Duration' is imported here 2026-10-24T22:24:37.0340263Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T22:24:37.0340317Z ╰──── 2026-10-24T22:24:37.0340426Z  help: Consider removing this import. 2026-10-24T22:24:37.0340428Z 2026-10-24T22:24:37.0340609Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T22:24:37.0340752Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T22:24:37.0340880Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T22:24:37.0340989Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T22:24:37.0341091Z ·  ─────┬──── 2026-10-24T22:24:37.0341245Z · ╰── Cannot call impure function 2026-10-24T22:24:37.0341360Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T22:24:37.0341418Z ╰──── 2026-10-24T22:24:37.0341725Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T22:24:37.0342049Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T22:24:37.0342052Z 2026-10-24T22:24:37.0342335Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T22:24:37.0342481Z ╭─[packages/provider-grok/src/server/adapter.ts:408:7] 2026-10-24T22:24:37.0342543Z 407 │ 2026-10-24T22:24:37.0342621Z 408 │ const layer: Layer.Layer< 2026-10-24T22:24:37.0342698Z ·  ──┬── 2026-10-24T22:24:37.0342832Z · ╰── 'layer' is declared here 2026-10-24T22:24:37.0342933Z 409 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T22:24:37.0342991Z ╰──── 2026-10-24T22:24:37.0343104Z  help: Consider removing this declaration. 2026-10-24T22:24:37.0343107Z 2026-10-24T22:24:37.0343412Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T22:24:37.0343599Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T22:24:37.0343675Z 472 │ onFilters, 2026-10-24T22:24:37.0343753Z 473 │ authorOptions = [], 2026-10-24T22:24:37.0343836Z ·  ── 2026-10-24T22:24:37.0343911Z 474 │ labelOptions = [], 2026-10-24T22:24:37.0343967Z ╰──── 2026-10-24T22:24:37.0344370Z  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-24T22:24:37.0344373Z 2026-10-24T22:24:37.0344678Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T22:24:37.0344860Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T22:24:37.0344936Z 473 │ authorOptions = [], 2026-10-24T22:24:37.0345009Z 474 │ labelOptions = [], 2026-10-24T22:24:37.0345141Z ·  ── 2026-10-24T22:24:37.0345249Z 475 │ optionScope, 2026-10-24T22:24:37.0345305Z ╰──── 2026-10-24T22:24:37.0345651Z  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-24T22:24:37.0345654Z 2026-10-24T22:24:37.0345867Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T22:24:37.0346019Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T22:24:37.0346089Z 1 │ import type { 2026-10-24T22:24:37.0346158Z 2 │ EnvironmentId, 2026-10-24T22:24:37.0346239Z ·  ──────┬────── 2026-10-24T22:24:37.0346389Z · ╰── 'EnvironmentId' is imported here 2026-10-24T22:24:37.0346488Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T22:24:37.0346547Z ╰──── 2026-10-24T22:24:37.0346653Z  help: Consider removing this import. 2026-10-24T22:24:37.0346656Z 2026-10-24T22:24:37.0346866Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T22:24:37.0347052Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T22:24:37.0347120Z 87 │