2026-10-24T20:31:15.4995961Z Current runner version: '2.338.1' 2026-10-24T20:31:15.4999424Z Runner name: 'blacksmith-8vcpu-ubuntu-2404-qujg6l5ncarhdcdu' 2026-10-24T20:31:15.5000150Z Runner group name: 'blacksmith scale sets - blacksmith-8vcpu-ubuntu-2404' 2026-10-24T20:31:15.5001073Z Machine name: 'ip-172-31-73-130' 2026-10-24T20:31:15.5002966Z ##[group]GITHUB_TOKEN Permissions 2026-10-24T20:31:15.5004320Z Contents: read 2026-10-24T20:31:15.5004719Z Metadata: read 2026-10-24T20:31:15.5005131Z ##[endgroup] 2026-10-24T20:31:15.5006593Z Secret source: Actions 2026-10-24T20:31:15.5007271Z Cache mode: write 2026-10-24T20:31:15.5007813Z Prepare workflow directory 2026-10-24T20:31:15.5197871Z Prepare all required actions 2026-10-24T20:31:15.5226542Z Getting action download info 2026-10-24T20:31:15.6408969Z Download action repository 'actions/checkout@v6' (SHA:d23441a48e516b6c34aea4fa41551a30e30af803) 2026-10-24T20:31:15.6804327Z Download action repository 'actions/cache@v6' (SHA:55cc8345863c7cc4c66a329aec7e433d2d1c52a9) 2026-10-24T20:31:15.7878081Z Setting BLACKSMITH_ACTIONS_RESULTS_URL to https://results-receiver.actions.githubusercontent.com/ 2026-10-24T20:31:15.7914504Z Complete job name: Lint 2026-10-24T20:31:15.8285640Z A job started hook has been configured by the self-hosted runner administrator 2026-10-24T20:31:15.8347109Z ##[group]Run '/setup.sh' 2026-10-24T20:31:15.8356125Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:31:15.8356527Z env: 2026-10-24T20:31:15.8356747Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:15.8357035Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:15.8357314Z BLACKSMITH_CHECK_RUN_ID: 120979910217 2026-10-24T20:31:15.8357587Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T20:31:15.8357857Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T20:31:15.8358110Z ##[endgroup] 2026-10-24T20:31:15.8575413Z Logging daemon started (blacksmithd for logs) 2026-10-24T20:31:15.8656221Z Results daemon started (blacksmithd for results) 2026-10-24T20:31:15.8777854Z Background adoption and SSH setup started (PID: 3036) 2026-10-24T20:31:15.8780046Z 2026-10-24T20:31:15.8780245Z ---------------------------------------- 2026-10-24T20:31:15.8780994Z View this job: https://app.blacksmith.sh/pingdotgg/runs/40130140018/jobs/120979910217 2026-10-24T20:31:15.8781718Z SSH Access (using your GitHub SSH key): 2026-10-24T20:31:15.8782412Z ssh -p 64000 runner@blacksmith-8vcpu-ubuntu-2404-qujg6l5ncarhdcdu.vm.blacksmith.sh 2026-10-24T20:31:15.8782928Z 2026-10-24T20:31:15.8783099Z No GitHub SSH key? Add one at: 2026-10-24T20:31:15.8783914Z https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 2026-10-24T20:31:15.8784587Z 2026-10-24T20:31:15.8784747Z ---------------------------------------- 2026-10-24T20:31:15.8785045Z 2026-10-24T20:31:15.8785270Z VM ID: blacksmith-8vcpu-ubuntu-2404-qujg6l5ncarhdcdu 2026-10-24T20:31:15.8785800Z Host: production-152.236.40.56-x8664 2026-10-24T20:31:15.8786247Z Host Agent PID: 3762254 2026-10-24T20:31:15.8786639Z Host Agent Git SHA: 1637818df 2026-10-24T20:31:15.8787083Z Host CPU Manufacturer: AuthenticAMD 2026-10-24T20:31:15.8787547Z Blacksmith Host Generation: gen 2 2026-10-24T20:31:15.8788019Z Petname: production-sharp-tortoise-18ea4548 2026-10-24T20:31:15.8788497Z Region: us-east 2026-10-24T20:31:15.8788874Z Rootfs Version: ubuntu24-full-x64-081926 2026-10-24T20:31:15.8791686Z OS Version: Ubuntu 24.04.4 LTS 2026-10-24T20:31:15.8792096Z 2026-10-24T20:31:15.8792282Z Enabling Blacksmith transparent cache 2026-10-24T20:31:15.9068057Z ##[group]Run actions/checkout@v6 2026-10-24T20:31:15.9068361Z with: 2026-10-24T20:31:15.9068695Z sparse-checkout: /* !/.repos/ !/apps/mobile/modules/t3-terminal/Vendor/**/*.a 2026-10-24T20:31:15.9069094Z sparse-checkout-cone-mode: false 2026-10-24T20:31:15.9069372Z repository: pingdotgg/t3code 2026-10-24T20:31:15.9071778Z token: *** 2026-10-24T20:31:15.9072081Z ssh-strict: true 2026-10-24T20:31:15.9072309Z ssh-user: git 2026-10-24T20:31:15.9072544Z persist-credentials: true 2026-10-24T20:31:15.9073147Z clean: true 2026-10-24T20:31:15.9073365Z fetch-depth: 1 2026-10-24T20:31:15.9073584Z fetch-tags: false 2026-10-24T20:31:15.9073809Z show-progress: true 2026-10-24T20:31:15.9074040Z lfs: false 2026-10-24T20:31:15.9074247Z submodules: false 2026-10-24T20:31:15.9074479Z set-safe-directory: true 2026-10-24T20:31:15.9074736Z allow-unsafe-pr-checkout: false 2026-10-24T20:31:15.9074994Z env: 2026-10-24T20:31:15.9075234Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:15.9075525Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:15.9075810Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:15.9076073Z ##[endgroup] 2026-10-24T20:31:16.0325764Z Syncing repository: pingdotgg/t3code 2026-10-24T20:31:16.0326672Z ##[group]Getting Git version info 2026-10-24T20:31:16.0327004Z Working directory is '/home/runner/_work/t3code/t3code' 2026-10-24T20:31:16.0327505Z [command]/usr/local/bin/git version 2026-10-24T20:31:16.0387982Z git version 2.55.0 2026-10-24T20:31:16.0399395Z ##[endgroup] 2026-10-24T20:31:16.0406165Z Temporarily overriding HOME='/home/runner/_work/_temp/1b3f318d-8515-4dfe-ae10-efd28a8b136d' before making global git config changes 2026-10-24T20:31:16.0406817Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T20:31:16.0409243Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T20:31:16.0437965Z Deleting the contents of '/home/runner/_work/t3code/t3code' 2026-10-24T20:31:16.0439544Z ##[group]Determining repository object format 2026-10-24T20:31:16.0440686Z ##[endgroup] 2026-10-24T20:31:16.0441040Z ##[group]Initializing the repository 2026-10-24T20:31:16.0443004Z [command]/usr/local/bin/git init /home/runner/_work/t3code/t3code 2026-10-24T20:31:16.0473794Z hint: Using 'master' as the name for the initial branch. This default branch name 2026-10-24T20:31:16.0474322Z hint: will change to "main" in Git 3.0. To configure the initial branch name 2026-10-24T20:31:16.0474803Z hint: to use in all of your new repositories, which will suppress this warning, 2026-10-24T20:31:16.0475162Z hint: call: 2026-10-24T20:31:16.0475369Z hint: 2026-10-24T20:31:16.0475636Z hint: git config --global init.defaultBranch 2026-10-24T20:31:16.0475943Z hint: 2026-10-24T20:31:16.0476229Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and 2026-10-24T20:31:16.0476683Z hint: 'development'. The just-created branch can be renamed via this command: 2026-10-24T20:31:16.0477043Z hint: 2026-10-24T20:31:16.0477252Z hint: git branch -m 2026-10-24T20:31:16.0477489Z hint: 2026-10-24T20:31:16.0477795Z hint: Disable this message with "git config set advice.defaultBranchName false" 2026-10-24T20:31:16.0478266Z Initialized empty Git repository in /home/runner/_work/t3code/t3code/.git/ 2026-10-24T20:31:16.0479210Z [command]/usr/local/bin/git remote add origin https://github.com/pingdotgg/t3code 2026-10-24T20:31:16.0501580Z ##[endgroup] 2026-10-24T20:31:16.0501946Z ##[group]Disabling automatic garbage collection 2026-10-24T20:31:16.0504077Z [command]/usr/local/bin/git config --local gc.auto 0 2026-10-24T20:31:16.0524148Z ##[endgroup] 2026-10-24T20:31:16.0524487Z ##[group]Setting up auth 2026-10-24T20:31:16.0524746Z Removing SSH command configuration 2026-10-24T20:31:16.0528231Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T20:31:16.0549049Z [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-24T20:31:16.0671837Z Removing HTTP extra header 2026-10-24T20:31:16.0674842Z [command]/usr/local/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader 2026-10-24T20:31:16.0696747Z [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-24T20:31:16.0785537Z Removing includeIf entries pointing to credentials config files 2026-10-24T20:31:16.0788842Z [command]/usr/local/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: 2026-10-24T20:31:16.0808326Z [command]/usr/local/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url 2026-10-24T20:31:16.0899440Z [command]/usr/local/bin/git config --file /home/runner/_work/_temp/git-credentials-8e9e14a1-dedb-4f32-8910-81da81eb8d6b.config http.https://github.com/.extraheader AUTHORIZATION: basic *** 2026-10-24T20:31:16.0956127Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git.path /home/runner/_work/_temp/git-credentials-8e9e14a1-dedb-4f32-8910-81da81eb8d6b.config 2026-10-24T20:31:16.0973894Z [command]/usr/local/bin/git config --local includeIf.gitdir:/home/runner/_work/t3code/t3code/.git/worktrees/*.path /home/runner/_work/_temp/git-credentials-8e9e14a1-dedb-4f32-8910-81da81eb8d6b.config 2026-10-24T20:31:16.0996484Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-8e9e14a1-dedb-4f32-8910-81da81eb8d6b.config 2026-10-24T20:31:16.1014218Z [command]/usr/local/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-8e9e14a1-dedb-4f32-8910-81da81eb8d6b.config 2026-10-24T20:31:16.1030343Z ##[endgroup] 2026-10-24T20:31:16.1030699Z ##[group]Fetching the repository 2026-10-24T20:31:16.1034782Z [command]/usr/local/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --filter=blob:none --depth=1 origin +c3d47be7d6c48400db4bcd4953d5b30660df749b:refs/remotes/pull/24537/merge 2026-10-24T20:31:16.3651851Z From https://github.com/pingdotgg/t3code 2026-10-24T20:31:16.3652432Z * [new ref] c3d47be7d6c48400db4bcd4953d5b30660df749b -> pull/24537/merge 2026-10-24T20:31:16.3672436Z ##[endgroup] 2026-10-24T20:31:16.3672887Z ##[group]Determining the checkout info 2026-10-24T20:31:16.3673330Z ##[endgroup] 2026-10-24T20:31:16.3673703Z ##[group]Setting up sparse checkout 2026-10-24T20:31:16.3676554Z [command]/usr/local/bin/git config core.sparseCheckout true 2026-10-24T20:31:16.3698417Z [command]/usr/local/bin/git rev-parse --git-path info/sparse-checkout 2026-10-24T20:31:16.3713531Z .git/info/sparse-checkout 2026-10-24T20:31:16.3717477Z ##[endgroup] 2026-10-24T20:31:16.3717876Z ##[group]Checking out the ref 2026-10-24T20:31:16.3720148Z [command]/usr/local/bin/git checkout --progress --force refs/remotes/pull/24537/merge 2026-10-24T20:31:22.9492848Z Updating files: 0% (1/6400) 2026-10-24T20:31:22.9520796Z Updating files: 1% (64/6400) 2026-10-24T20:31:22.9538873Z Updating files: 2% (128/6400) 2026-10-24T20:31:22.9559682Z Updating files: 3% (192/6400) 2026-10-24T20:31:22.9580539Z Updating files: 4% (256/6400) 2026-10-24T20:31:22.9611217Z Updating files: 5% (320/6400) 2026-10-24T20:31:22.9633000Z Updating files: 6% (384/6400) 2026-10-24T20:31:22.9685737Z Updating files: 7% (448/6400) 2026-10-24T20:31:22.9714204Z Updating files: 8% (512/6400) 2026-10-24T20:31:22.9738001Z Updating files: 9% (576/6400) 2026-10-24T20:31:23.0015275Z Updating files: 10% (640/6400) 2026-10-24T20:31:23.0030718Z Updating files: 11% (704/6400) 2026-10-24T20:31:23.0041266Z Updating files: 12% (768/6400) 2026-10-24T20:31:23.0056585Z Updating files: 13% (832/6400) 2026-10-24T20:31:23.0072345Z Updating files: 14% (896/6400) 2026-10-24T20:31:23.0090408Z Updating files: 15% (960/6400) 2026-10-24T20:31:23.0108669Z Updating files: 16% (1024/6400) 2026-10-24T20:31:23.0123320Z Updating files: 17% (1088/6400) 2026-10-24T20:31:23.0141299Z Updating files: 18% (1152/6400) 2026-10-24T20:31:23.0157270Z Updating files: 19% (1216/6400) 2026-10-24T20:31:23.0180253Z Updating files: 20% (1280/6400) 2026-10-24T20:31:23.0197208Z Updating files: 21% (1344/6400) 2026-10-24T20:31:23.0215877Z Updating files: 22% (1408/6400) 2026-10-24T20:31:23.0229358Z Updating files: 23% (1472/6400) 2026-10-24T20:31:23.0242231Z Updating files: 24% (1536/6400) 2026-10-24T20:31:23.0257558Z Updating files: 25% (1600/6400) 2026-10-24T20:31:23.0271358Z Updating files: 26% (1664/6400) 2026-10-24T20:31:23.0284825Z Updating files: 27% (1728/6400) 2026-10-24T20:31:23.0304063Z Updating files: 28% (1792/6400) 2026-10-24T20:31:23.0337437Z Updating files: 29% (1856/6400) 2026-10-24T20:31:23.0358755Z Updating files: 30% (1920/6400) 2026-10-24T20:31:23.0382659Z Updating files: 31% (1984/6400) 2026-10-24T20:31:23.0411565Z Updating files: 32% (2048/6400) 2026-10-24T20:31:23.0440446Z Updating files: 33% (2112/6400) 2026-10-24T20:31:23.0507758Z Updating files: 34% (2176/6400) 2026-10-24T20:31:23.0565748Z Updating files: 35% (2240/6400) 2026-10-24T20:31:23.0601202Z Updating files: 36% (2304/6400) 2026-10-24T20:31:23.0632599Z Updating files: 37% (2368/6400) 2026-10-24T20:31:23.0676351Z Updating files: 38% (2432/6400) 2026-10-24T20:31:23.0704602Z Updating files: 39% (2496/6400) 2026-10-24T20:31:23.0734296Z Updating files: 40% (2560/6400) 2026-10-24T20:31:23.0762137Z Updating files: 41% (2624/6400) 2026-10-24T20:31:23.0777191Z Updating files: 42% (2688/6400) 2026-10-24T20:31:23.0787088Z Updating files: 43% (2752/6400) 2026-10-24T20:31:23.0816325Z Updating files: 44% (2816/6400) 2026-10-24T20:31:23.0844276Z Updating files: 45% (2880/6400) 2026-10-24T20:31:23.0871676Z Updating files: 46% (2944/6400) 2026-10-24T20:31:23.0896383Z Updating files: 47% (3008/6400) 2026-10-24T20:31:23.0923880Z Updating files: 48% (3072/6400) 2026-10-24T20:31:23.0961855Z Updating files: 49% (3136/6400) 2026-10-24T20:31:23.0989151Z Updating files: 50% (3200/6400) 2026-10-24T20:31:23.1005162Z Updating files: 51% (3264/6400) 2026-10-24T20:31:23.1041022Z Updating files: 52% (3328/6400) 2026-10-24T20:31:23.1068894Z Updating files: 53% (3392/6400) 2026-10-24T20:31:23.1088012Z Updating files: 54% (3456/6400) 2026-10-24T20:31:23.1110646Z Updating files: 55% (3520/6400) 2026-10-24T20:31:23.1125475Z Updating files: 56% (3584/6400) 2026-10-24T20:31:23.1145357Z Updating files: 57% (3648/6400) 2026-10-24T20:31:23.1162770Z Updating files: 58% (3712/6400) 2026-10-24T20:31:23.1526227Z Updating files: 59% (3776/6400) 2026-10-24T20:31:23.1540748Z Updating files: 60% (3840/6400) 2026-10-24T20:31:23.1559943Z Updating files: 61% (3904/6400) 2026-10-24T20:31:23.1578580Z Updating files: 62% (3968/6400) 2026-10-24T20:31:23.1600192Z Updating files: 63% (4032/6400) 2026-10-24T20:31:23.1626770Z Updating files: 64% (4096/6400) 2026-10-24T20:31:23.1646751Z Updating files: 65% (4160/6400) 2026-10-24T20:31:23.1663586Z Updating files: 66% (4224/6400) 2026-10-24T20:31:23.1686285Z Updating files: 67% (4288/6400) 2026-10-24T20:31:23.1700679Z Updating files: 68% (4352/6400) 2026-10-24T20:31:23.1718129Z Updating files: 69% (4416/6400) 2026-10-24T20:31:23.1730679Z Updating files: 70% (4480/6400) 2026-10-24T20:31:23.1749146Z Updating files: 71% (4544/6400) 2026-10-24T20:31:23.1761548Z Updating files: 72% (4608/6400) 2026-10-24T20:31:23.1808899Z Updating files: 73% (4672/6400) 2026-10-24T20:31:23.2209397Z Updating files: 74% (4736/6400) 2026-10-24T20:31:23.2232013Z Updating files: 75% (4800/6400) 2026-10-24T20:31:23.2253876Z Updating files: 76% (4864/6400) 2026-10-24T20:31:23.2277743Z Updating files: 77% (4928/6400) 2026-10-24T20:31:23.2298884Z Updating files: 78% (4992/6400) 2026-10-24T20:31:23.2315834Z Updating files: 79% (5056/6400) 2026-10-24T20:31:23.2337570Z Updating files: 80% (5120/6400) 2026-10-24T20:31:23.2353224Z Updating files: 81% (5184/6400) 2026-10-24T20:31:23.2370737Z Updating files: 82% (5248/6400) 2026-10-24T20:31:23.2393107Z Updating files: 83% (5312/6400) 2026-10-24T20:31:23.2417924Z Updating files: 84% (5376/6400) 2026-10-24T20:31:23.2434418Z Updating files: 85% (5440/6400) 2026-10-24T20:31:23.2459308Z Updating files: 86% (5504/6400) 2026-10-24T20:31:23.2529959Z Updating files: 87% (5568/6400) 2026-10-24T20:31:23.2559060Z Updating files: 88% (5632/6400) 2026-10-24T20:31:23.2578538Z Updating files: 89% (5696/6400) 2026-10-24T20:31:23.2606464Z Updating files: 90% (5760/6400) 2026-10-24T20:31:23.2633741Z Updating files: 91% (5824/6400) 2026-10-24T20:31:23.2648336Z Updating files: 92% (5888/6400) 2026-10-24T20:31:23.2671383Z Updating files: 93% (5952/6400) 2026-10-24T20:31:23.2691566Z Updating files: 94% (6016/6400) 2026-10-24T20:31:23.2714806Z Updating files: 95% (6080/6400) 2026-10-24T20:31:23.2772937Z Updating files: 96% (6144/6400) 2026-10-24T20:31:23.2795238Z Updating files: 97% (6208/6400) 2026-10-24T20:31:23.2841559Z Updating files: 98% (6272/6400) 2026-10-24T20:31:23.2860860Z Updating files: 99% (6336/6400) 2026-10-24T20:31:23.2861072Z Updating files: 100% (6400/6400) 2026-10-24T20:31:23.2861271Z Updating files: 100% (6400/6400), done. 2026-10-24T20:31:23.3010199Z Note: switching to 'refs/remotes/pull/24537/merge'. 2026-10-24T20:31:23.3010351Z 2026-10-24T20:31:23.3010477Z You are in 'detached HEAD' state. You can look around, make experimental 2026-10-24T20:31:23.3010766Z changes and commit them, and you can discard any commits you make in this 2026-10-24T20:31:23.3011074Z state without impacting any branches by switching back to a branch. 2026-10-24T20:31:23.3011259Z 2026-10-24T20:31:23.3011373Z If you want to create a new branch to retain commits you create, you may 2026-10-24T20:31:23.3011656Z do so (now or later) by using -c with the switch command. Example: 2026-10-24T20:31:23.3011816Z 2026-10-24T20:31:23.3011892Z git switch -c 2026-10-24T20:31:23.3012000Z 2026-10-24T20:31:23.3012072Z Or undo this operation with: 2026-10-24T20:31:23.3012175Z 2026-10-24T20:31:23.3012231Z git switch - 2026-10-24T20:31:23.3012323Z 2026-10-24T20:31:23.3012468Z Turn off this advice by setting config variable advice.detachedHead to false 2026-10-24T20:31:23.3012655Z 2026-10-24T20:31:23.3012857Z HEAD is now at c3d47be Merge df41a3727c9e76846a5c56e3529290c08601a162 into 8176b589310fac6f59f1878ede4f7287c6c36d8f 2026-10-24T20:31:23.3022946Z ##[endgroup] 2026-10-24T20:31:23.3054987Z [command]/usr/local/bin/git log -1 --format=%H 2026-10-24T20:31:23.3072851Z c3d47be7d6c48400db4bcd4953d5b30660df749b 2026-10-24T20:31:23.3146466Z ##[group]Run files="$(git ls-files .github/pr-assets)" 2026-10-24T20:31:23.3146695Z files="$(git ls-files .github/pr-assets)" 2026-10-24T20:31:23.3146869Z if test -n "$files"; then 2026-10-24T20:31:23.3147083Z  printf 'PR evidence must be uploaded to GitHub, not committed:\n%s\n' "$files" >&2 2026-10-24T20:31:23.3147293Z  exit 1 2026-10-24T20:31:23.3147396Z fi 2026-10-24T20:31:23.3157110Z shell: /usr/bin/bash -e {0} 2026-10-24T20:31:23.3157234Z env: 2026-10-24T20:31:23.3157348Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:23.3157503Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:23.3157646Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:23.3157778Z ##[endgroup] 2026-10-24T20:31:23.3296281Z Prepare all required actions 2026-10-24T20:31:23.3296618Z Getting action download info 2026-10-24T20:31:23.4085206Z Download action repository 'voidzero-dev/setup-vp@v1' (SHA:250f29ce396baf5e8f24498e17c0dfdebabc26eb) 2026-10-24T20:31:23.5096246Z ##[group]Run ./.github/actions/setup-ci-deps 2026-10-24T20:31:23.5096409Z env: 2026-10-24T20:31:23.5096529Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:23.5096679Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:23.5096826Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:23.5096964Z ##[endgroup] 2026-10-24T20:31:23.5188082Z ##[start-action display=Resolve Vite+ version;id=__self.vp] 2026-10-24T20:31:23.5703217Z ##[group]Run echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T20:31:23.5703687Z echo "version=$(sed -nE 's/^ vite-plus: ([0-9][^ ]*)$/\1/p' pnpm-workspace.yaml)" >> "$GITHUB_OUTPUT" 2026-10-24T20:31:23.5703986Z echo "node=$(jq -r '.engines.node' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T20:31:23.5704222Z echo "pnpm=$(jq -r '.packageManager' package.json)" >> "$GITHUB_OUTPUT" 2026-10-24T20:31:23.5714165Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:31:23.5714338Z env: 2026-10-24T20:31:23.5714450Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:23.5714593Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:23.5714733Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:23.5714869Z ##[endgroup] 2026-10-24T20:31:23.5779547Z ##[end-action id=__self.vp;outcome=success;conclusion=success;duration_ms=59] 2026-10-24T20:31:23.5780942Z ##[start-action display=Cache Vite+;id=__self.vp_cache] 2026-10-24T20:31:23.5849315Z ##[group]Run actions/cache@v6 2026-10-24T20:31:23.5849458Z with: 2026-10-24T20:31:23.5849559Z path: ~/.vite-plus 2026-10-24T20:31:23.5849719Z key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:31:23.5849912Z enableCrossOsArchive: false 2026-10-24T20:31:23.5850043Z fail-on-cache-miss: false 2026-10-24T20:31:23.5850172Z lookup-only: false 2026-10-24T20:31:23.5850277Z save-always: false 2026-10-24T20:31:23.5850381Z env: 2026-10-24T20:31:23.5850486Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:23.5850630Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:23.5850770Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:23.5850899Z ##[endgroup] 2026-10-24T20:31:23.7668005Z Cache hit for: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:31:24.1644436Z Received 170349591 of 170349591 (100.0%), 429.8 MBs/sec 2026-10-24T20:31:24.1645312Z Cache Size: ~162 MB (170349591 B) 2026-10-24T20:31:24.1668152Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/dfc0895b-9472-4ebe-8e9f-75d094cc2a1f/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:31:24.7982238Z Cache restored successfully 2026-10-24T20:31:24.8118648Z Cache restored from key: vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0 2026-10-24T20:31:24.8193838Z ##[end-action id=__self.vp_cache;outcome=success;conclusion=success;duration_ms=1241] 2026-10-24T20:31:24.8196118Z ##[start-action display=Use cached Vite+;id=__self.__run] 2026-10-24T20:31:24.8216434Z ##[group]Run echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T20:31:24.8216652Z echo "$HOME/.vite-plus/bin" >> "$GITHUB_PATH" 2026-10-24T20:31:24.8216826Z "$HOME/.vite-plus/bin/vp" env use "26.12.1" 2026-10-24T20:31:24.8227212Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:31:24.8227375Z env: 2026-10-24T20:31:24.8227492Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:24.8227638Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:24.8227780Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:24.8227918Z ##[endgroup] 2026-10-24T20:31:24.8263459Z Using Node.js v26.12.1 (resolved from 26.12.1) 2026-10-24T20:31:24.8270142Z ##[end-action id=__self.__run;outcome=success;conclusion=success;duration_ms=7] 2026-10-24T20:31:24.8271418Z ##[start-action display=Setup Vite+;id=__self.__voidzero-dev_setup-vp] 2026-10-24T20:31:24.8274958Z ##[end-action id=__self.__voidzero-dev_setup-vp;outcome=skipped;conclusion=skipped;duration_ms=0] 2026-10-24T20:31:24.8276049Z ##[start-action display=Resolve pnpm store path;id=__self.pnpm_store] 2026-10-24T20:31:24.8299999Z ##[group]Run store_path="$(vp pm cache dir)" 2026-10-24T20:31:24.8300209Z store_path="$(vp pm cache dir)" 2026-10-24T20:31:24.8300367Z echo "path=$store_path" >> "$GITHUB_OUTPUT" 2026-10-24T20:31:24.8310355Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:31:24.8310606Z env: 2026-10-24T20:31:24.8310757Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:24.8310899Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:24.8311239Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:24.8311377Z ##[endgroup] 2026-10-24T20:31:24.8435307Z ##[end-action id=__self.pnpm_store;outcome=success;conclusion=success;duration_ms=15] 2026-10-24T20:31:24.8436498Z ##[start-action display=Cache full pnpm store;id=__self.__actions_cache] 2026-10-24T20:31:24.8752688Z ##[group]Run actions/cache@v6 2026-10-24T20:31:24.8752819Z with: 2026-10-24T20:31:24.8752982Z path: /home/runner/.local/share/pnpm/store/v11 2026-10-24T20:31:24.8753242Z key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T20:31:24.8753491Z restore-keys: pnpm-full-v1-Linux-X64- 2026-10-24T20:31:24.8753636Z enableCrossOsArchive: false 2026-10-24T20:31:24.8753784Z fail-on-cache-miss: false 2026-10-24T20:31:24.8753903Z lookup-only: false 2026-10-24T20:31:24.8754016Z save-always: false 2026-10-24T20:31:24.8754122Z env: 2026-10-24T20:31:24.8754231Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:24.8754385Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:24.8754523Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:24.8754654Z ##[endgroup] 2026-10-24T20:31:25.1068692Z Cache hit for: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T20:31:26.1516551Z Received 536870912 of 994208090 (54.0%), 497.1 MBs/sec 2026-10-24T20:31:26.9398747Z Received 994208090 of 994208090 (100.0%), 521.5 MBs/sec 2026-10-24T20:31:26.9399730Z Cache Size: ~948 MB (994208090 B) 2026-10-24T20:31:26.9436700Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/6330292b-d548-4faf-9e59-b8af87f5b87c/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:31:32.0913667Z Cache restored successfully 2026-10-24T20:31:32.1366911Z Cache restored from key: pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074 2026-10-24T20:31:32.1430523Z ##[end-action id=__self.__actions_cache;outcome=success;conclusion=success;duration_ms=7299] 2026-10-24T20:31:32.1432493Z ##[start-action display=Install dependencies;id=__self.__run_2] 2026-10-24T20:31:32.1442654Z ##[group]Run vp install 2026-10-24T20:31:32.1442793Z vp install 2026-10-24T20:31:32.1452489Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:31:32.1452652Z env: 2026-10-24T20:31:32.1452764Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:32.1452909Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:32.1453050Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:32.1453186Z ##[endgroup] 2026-10-24T20:31:32.1770680Z Scope: all 34 workspace projects 2026-10-24T20:31:32.2790873Z ? Verifying lockfile against supply-chain policies (2088 entries)... 2026-10-24T20:31:32.5336094Z Packages are hard linked from the content-addressable store to the virtual store. 2026-10-24T20:31:32.5336630Z Content-addressable store is at: /home/runner/.local/share/pnpm/store/v11 2026-10-24T20:31:32.5336849Z Virtual store is at: node_modules/.pnpm 2026-10-24T20:31:34.7456444Z ✓ Lockfile passes supply-chain policies (2088 entries in 2.5s) 2026-10-24T20:31:34.7456767Z Lockfile is up to date, resolution step is skipped 2026-10-24T20:31:34.7615370Z Packages: +1721 2026-10-24T20:31:34.7615570Z ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2026-10-24T20:31:34.7923590Z Progress: resolved 1721, reused 1718, downloaded 0, added 1721, done 2026-10-24T20:31:35.6517562Z . prepare$ vp config --no-agent 2026-10-24T20:31:35.7405965Z . prepare: Done 2026-10-24T20:31:35.7418198Z 2026-10-24T20:31:35.7418323Z devDependencies: 2026-10-24T20:31:35.7418539Z + @coderabbitai/config 1.1.0 2026-10-24T20:31:35.7418748Z + @shadcn/lint 0.1.5 2026-10-24T20:31:35.7418955Z + @types/node 24.12.4 2026-10-24T20:31:35.7419140Z + knip 6.34.0 2026-10-24T20:31:35.7419342Z + typescript <- @tsc-rs/typescript 0.8.0 2026-10-24T20:31:35.7419569Z + vite-plus 1.3.0 2026-10-24T20:31:35.7419670Z 2026-10-24T20:31:35.7434156Z Done in 3.6s using pnpm v12.14.0 2026-10-24T20:31:35.7577325Z ##[end-action id=__self.__run_2;outcome=success;conclusion=success;duration_ms=3614] 2026-10-24T20:31:35.8030192Z ##[group]Run actions/cache@v6 2026-10-24T20:31:35.8030375Z with: 2026-10-24T20:31:35.8030503Z path: ~/.cache/electron 2026-10-24T20:31:35.8030732Z key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:31:35.8030966Z enableCrossOsArchive: false 2026-10-24T20:31:35.8031100Z fail-on-cache-miss: false 2026-10-24T20:31:35.8031220Z lookup-only: false 2026-10-24T20:31:35.8031370Z save-always: false 2026-10-24T20:31:35.8031475Z env: 2026-10-24T20:31:35.8031584Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:35.8031733Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:35.8031887Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:35.8032019Z ##[endgroup] 2026-10-24T20:31:35.9896666Z Cache hit for: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:31:36.1452410Z Received 122906203 of 122906203 (100.0%), 825.4 MBs/sec 2026-10-24T20:31:36.1453242Z Cache Size: ~117 MB (122906203 B) 2026-10-24T20:31:36.1475415Z [command]/usr/bin/tar -xf /home/runner/_work/_temp/3e165291-e207-4d02-b319-5c25fa896545/cache.tzst -P -C /home/runner/_work/t3code/t3code --use-compress-program unzstd 2026-10-24T20:31:36.2128361Z Cache restored successfully 2026-10-24T20:31:36.2274399Z Cache restored from key: electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309 2026-10-24T20:31:36.2380380Z ##[group]Run vp run --filter @t3tools/desktop ensure:electron 2026-10-24T20:31:36.2380689Z vp run --filter @t3tools/desktop ensure:electron 2026-10-24T20:31:36.2391061Z shell: /usr/bin/bash -e {0} 2026-10-24T20:31:36.2391192Z env: 2026-10-24T20:31:36.2391551Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:36.2391704Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:36.2391848Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:36.2391987Z ##[endgroup] 2026-10-24T20:31:36.4040081Z ~/apps/desktop$ node scripts/ensure-electron-runtime.mjs ⊘ cache disabled 2026-10-24T20:31:36.9597289Z /home/runner/_work/t3code/t3code/node_modules/.pnpm/electron@44.9.3_supports-color@8.1.1/node_modules/electron/dist/electron 2026-10-24T20:31:36.9643667Z 2026-10-24T20:31:36.9721708Z ##[group]Run vp run knip:check 2026-10-24T20:31:36.9721944Z vp run knip:check 2026-10-24T20:31:36.9743562Z shell: /usr/bin/bash -e {0} 2026-10-24T20:31:36.9743699Z env: 2026-10-24T20:31:36.9743815Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:36.9743962Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:36.9744104Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:36.9744281Z ##[endgroup] 2026-10-24T20:31:37.1223453Z $ knip --include files,dependencies --no-config-hints ⊘ cache disabled 2026-10-24T20:31:40.7642467Z 2026-10-24T20:31:40.7645310Z $ 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-24T20:31:48.7857896Z 2026-10-24T20:31:48.7865452Z --- 2026-10-24T20:31:48.7865730Z vp run: 2/2 successful. (Run `vp run --last-details` for full details) 2026-10-24T20:31:48.7967536Z ##[group]Run vp run --filter @t3tools/source-control-github generate --check 2026-10-24T20:31:48.7967821Z vp run --filter @t3tools/source-control-github generate --check 2026-10-24T20:31:48.7977823Z shell: /usr/bin/bash -e {0} 2026-10-24T20:31:48.7977950Z env: 2026-10-24T20:31:48.7978064Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:48.7978212Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:48.7978353Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:48.7978491Z ##[endgroup] 2026-10-24T20:31:48.9432109Z ~/packages/source-control-github$ graphqlgen --check ⊘ cache disabled 2026-10-24T20:31:49.1262758Z 2026-10-24T20:31:49.1327327Z ##[group]Run vp run --filter t3 generate --check 2026-10-24T20:31:49.1327539Z vp run --filter t3 generate --check 2026-10-24T20:31:49.1338284Z shell: /usr/bin/bash -e {0} 2026-10-24T20:31:49.1338420Z env: 2026-10-24T20:31:49.1338550Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:49.1338701Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:49.1338845Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:49.1338982Z ##[endgroup] 2026-10-24T20:31:49.2782851Z ~/apps/server$ graphqlgen --check ⊘ cache disabled 2026-10-24T20:31:49.4276009Z 2026-10-24T20:31:49.4342763Z ##[group]Run vp check 2026-10-24T20:31:49.4342958Z vp check 2026-10-24T20:31:49.4352657Z shell: /usr/bin/bash -e {0} 2026-10-24T20:31:49.4352781Z env: 2026-10-24T20:31:49.4352894Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:49.4353045Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:49.4353185Z GITHUB_REPO_NAME: pingdotgg/t3code 2026-10-24T20:31:49.4353323Z ##[endgroup] 2026-10-24T20:31:49.9810434Z pass: All 5749 files are correctly formatted (400ms, 8 threads) 2026-10-24T20:31:55.7944866Z warn: Lint warnings found 2026-10-24T20:31:55.7946116Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used. 2026-10-24T20:31:55.7946485Z ╭─[apps/server/src/auth/http.ts:28:10] 2026-10-24T20:31:55.7946736Z 27 │ import * as Schema from "effect/Schema"; 2026-10-24T20:31:55.7946981Z 28 │ import { identity } from "effect/Function"; 2026-10-24T20:31:55.7947204Z ·  ────┬─── 2026-10-24T20:31:55.7947621Z · ╰── 'identity' is imported here 2026-10-24T20:31:55.7947861Z 29 │ import * as Layer from "effect/Layer"; 2026-10-24T20:31:55.7948038Z ╰──── 2026-10-24T20:31:55.7948202Z  help: Consider removing this import. 2026-10-24T20:31:55.7948339Z 2026-10-24T20:31:55.7948552Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:31:55.7948899Z ╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15] 2026-10-24T20:31:55.7949116Z 7 │ () => 2026-10-24T20:31:55.7949272Z 8 │ Gesture.Hover() 2026-10-24T20:31:55.7949452Z ·  ──┬── 2026-10-24T20:31:55.7949712Z · ╰── `Hover` may be a component 2026-10-24T20:31:55.7949940Z 9 │ .manualActivation(true) 2026-10-24T20:31:55.7950099Z ╰──── 2026-10-24T20:31:55.7950497Z  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-24T20:31:55.7951311Z  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-24T20:31:55.7951798Z 2026-10-24T20:31:55.7952053Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:31:55.7952488Z ╭─[packages/client-runtime/src/operations/projects.ts:238:51] 2026-10-24T20:31:55.7952730Z 237 │ ): string { 2026-10-24T20:31:55.7953001Z 238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? ""; 2026-10-24T20:31:55.7953315Z ·  ────── 2026-10-24T20:31:55.7953598Z 239 │ return target.owner ? `${target.owner}/${folderName}` : folderName; 2026-10-24T20:31:55.7953813Z ╰──── 2026-10-24T20:31:55.7954069Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:31:55.7954265Z 2026-10-24T20:31:55.7954550Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.7954988Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2195:5] 2026-10-24T20:31:55.7955207Z 2193 │ ); 2026-10-24T20:31:55.7955359Z 2194 │ useEffect(() => { 2026-10-24T20:31:55.7955536Z ·  ────┬──── 2026-10-24T20:31:55.7955777Z · ╰── This is the containing effect 2026-10-24T20:31:55.7956020Z 2195 │ setExpandedVideo(null); 2026-10-24T20:31:55.7956215Z ·  ────────┬─────── 2026-10-24T20:31:55.7956503Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.7956764Z 2196 │ setExpandedFile(null); 2026-10-24T20:31:55.7956920Z ╰──── 2026-10-24T20:31:55.7957784Z  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-24T20:31:55.7958793Z  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-24T20:31:55.7959126Z 2026-10-24T20:31:55.7959406Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.7959813Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2700:9] 2026-10-24T20:31:55.7960115Z 2691 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false)); 2026-10-24T20:31:55.7960350Z 2692 │ useEffect(() => { 2026-10-24T20:31:55.7960519Z ·  ────┬──── 2026-10-24T20:31:55.7960746Z · ╰── This is the containing effect 2026-10-24T20:31:55.7961027Z 2693 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return; 2026-10-24T20:31:55.7961279Z 2694 │ const index = presentedFeed.findIndex( 2026-10-24T20:31:55.7961536Z 2695 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId, 2026-10-24T20:31:55.7961749Z 2696 │ ); 2026-10-24T20:31:55.7961892Z 2697 │ if (index === -1) { 2026-10-24T20:31:55.7962124Z 2698 │ const runId = messageFoldRunId(props.feed, jumpToMessageId); 2026-10-24T20:31:55.7962382Z 2699 │ if (runId && !expandedTurnIds.has(runId)) { 2026-10-24T20:31:55.7962649Z 2700 │ setInteractionState((current) => ({ 2026-10-24T20:31:55.7962870Z ·  ─────────┬───────── 2026-10-24T20:31:55.7963173Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.7963424Z 2701 │ ...current, 2026-10-24T20:31:55.7963567Z ╰──── 2026-10-24T20:31:55.7964264Z  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-24T20:31:55.7965188Z  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-24T20:31:55.7965516Z 2026-10-24T20:31:55.7965765Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used. 2026-10-24T20:31:55.7966151Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:70:10] 2026-10-24T20:31:55.7966450Z 69 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets"; 2026-10-24T20:31:55.7966756Z 70 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks"; 2026-10-24T20:31:55.7967020Z ·  ───────────┬─────────── 2026-10-24T20:31:55.7967310Z · ╰── 'isMarkdownFileLinkLabel' is imported here 2026-10-24T20:31:55.7967646Z 71 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments"; 2026-10-24T20:31:55.7967879Z ╰──── 2026-10-24T20:31:55.7968038Z  help: Consider removing this import. 2026-10-24T20:31:55.7968161Z 2026-10-24T20:31:55.7968456Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used. 2026-10-24T20:31:55.7968843Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:96:3] 2026-10-24T20:31:55.7969056Z 95 │ import { 2026-10-24T20:31:55.7969196Z 96 │ createContext, 2026-10-24T20:31:55.7969361Z ·  ──────┬────── 2026-10-24T20:31:55.7969604Z · ╰── 'createContext' is imported here 2026-10-24T20:31:55.7969810Z 97 │ memo, 2026-10-24T20:31:55.7969938Z ╰──── 2026-10-24T20:31:55.7970098Z  help: Consider removing this import. 2026-10-24T20:31:55.7970221Z 2026-10-24T20:31:55.7970450Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T20:31:55.7970812Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3] 2026-10-24T20:31:55.7971035Z 111 │ import { 2026-10-24T20:31:55.7971182Z 112 │ ActivityIndicator, 2026-10-24T20:31:55.7971360Z ·  ────────┬──────── 2026-10-24T20:31:55.7971613Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T20:31:55.7971829Z 113 │ Image, 2026-10-24T20:31:55.7971954Z ╰──── 2026-10-24T20:31:55.7972113Z  help: Consider removing this import. 2026-10-24T20:31:55.7972235Z 2026-10-24T20:31:55.7972482Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used. 2026-10-24T20:31:55.7972828Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3] 2026-10-24T20:31:55.7973046Z 118 │ Pressable, 2026-10-24T20:31:55.7973191Z 119 │ ScrollView, 2026-10-24T20:31:55.7973349Z ·  ─────┬──── 2026-10-24T20:31:55.7973586Z · ╰── 'ScrollView' is imported here 2026-10-24T20:31:55.7973799Z 120 │ StyleSheet, 2026-10-24T20:31:55.7973933Z ╰──── 2026-10-24T20:31:55.7974091Z  help: Consider removing this import. 2026-10-24T20:31:55.7974211Z 2026-10-24T20:31:55.7974424Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used. 2026-10-24T20:31:55.7974768Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11] 2026-10-24T20:31:55.7974989Z 120 │ StyleSheet, 2026-10-24T20:31:55.7975136Z 121 │ Text as NativeText, 2026-10-24T20:31:55.7975425Z ·  ─────┬──── 2026-10-24T20:31:55.7975670Z · ╰── 'NativeText' is imported here 2026-10-24T20:31:55.7975891Z 122 │ type ColorValue, 2026-10-24T20:31:55.7976032Z ╰──── 2026-10-24T20:31:55.7976199Z  help: Consider removing this import. 2026-10-24T20:31:55.7976320Z 2026-10-24T20:31:55.7976549Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used. 2026-10-24T20:31:55.7976915Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:144:10] 2026-10-24T20:31:55.7977214Z 143 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic"; 2026-10-24T20:31:55.7977504Z 144 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl"; 2026-10-24T20:31:55.7977748Z ·  ─────────┬──────── 2026-10-24T20:31:55.7978019Z · ╰── 'tryOpenExternalUrl' is imported here 2026-10-24T20:31:55.7978336Z 145 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload"; 2026-10-24T20:31:55.7978560Z ╰──── 2026-10-24T20:31:55.7978851Z  help: Consider removing this import. 2026-10-24T20:31:55.7979030Z 2026-10-24T20:31:55.7979256Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used. 2026-10-24T20:31:55.7979626Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:147:10] 2026-10-24T20:31:55.7979923Z 146 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks"; 2026-10-24T20:31:55.7980220Z 147 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon"; 2026-10-24T20:31:55.7980460Z ·  ─────────┬───────── 2026-10-24T20:31:55.7980729Z · ╰── 'faviconUrlForOrigin' is imported here 2026-10-24T20:31:55.7980951Z 148 │ import { 2026-10-24T20:31:55.7981083Z ╰──── 2026-10-24T20:31:55.7981247Z  help: Consider removing this import. 2026-10-24T20:31:55.7981370Z 2026-10-24T20:31:55.7981603Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used. 2026-10-24T20:31:55.7981969Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10] 2026-10-24T20:31:55.7982285Z 160 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile"; 2026-10-24T20:31:55.7982644Z 161 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer"; 2026-10-24T20:31:55.7982901Z ·  ────────┬─────── 2026-10-24T20:31:55.7983314Z · ╰── 'MediaVideoPlayer' is imported here 2026-10-24T20:31:55.7983625Z 162 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia"; 2026-10-24T20:31:55.7983850Z ╰──── 2026-10-24T20:31:55.7984012Z  help: Consider removing this import. 2026-10-24T20:31:55.7984136Z 2026-10-24T20:31:55.7984378Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used. 2026-10-24T20:31:55.7984770Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:3] 2026-10-24T20:31:55.7985012Z 164 │ attachmentVideoPreviewSource, 2026-10-24T20:31:55.7985202Z 165 │ mediaVideoPreviewUri, 2026-10-24T20:31:55.7985390Z ·  ──────────┬───────── 2026-10-24T20:31:55.7985656Z · ╰── 'mediaVideoPreviewUri' is imported here 2026-10-24T20:31:55.7985894Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:31:55.7986050Z ╰──── 2026-10-24T20:31:55.7986210Z  help: Consider removing this import. 2026-10-24T20:31:55.7986332Z 2026-10-24T20:31:55.7986572Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used. 2026-10-24T20:31:55.7986950Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3] 2026-10-24T20:31:55.7987184Z 165 │ mediaVideoPreviewUri, 2026-10-24T20:31:55.7987356Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:31:55.7987545Z ·  ───────────┬────────── 2026-10-24T20:31:55.7987817Z · ╰── 'mediaVideoThumbnailKey' is imported here 2026-10-24T20:31:55.7988066Z 167 │ type MediaVideoPreviewSource, 2026-10-24T20:31:55.7988230Z ╰──── 2026-10-24T20:31:55.7988392Z  help: Consider removing this import. 2026-10-24T20:31:55.7988516Z 2026-10-24T20:31:55.7988746Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used. 2026-10-24T20:31:55.7989106Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:167:8] 2026-10-24T20:31:55.7989421Z 166 │ mediaVideoThumbnailKey, 2026-10-24T20:31:55.7989637Z 167 │ type MediaVideoPreviewSource, 2026-10-24T20:31:55.7989848Z ·  ───────────┬─────────── 2026-10-24T20:31:55.7990128Z · ╰── 'MediaVideoPreviewSource' is imported here 2026-10-24T20:31:55.7990396Z 168 │ } from "../../lib/videoPreviewSource"; 2026-10-24T20:31:55.7990564Z ╰──── 2026-10-24T20:31:55.7990726Z  help: Consider removing this import. 2026-10-24T20:31:55.7990846Z 2026-10-24T20:31:55.7991059Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used. 2026-10-24T20:31:55.7991412Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:175:15] 2026-10-24T20:31:55.7991757Z 174 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection"; 2026-10-24T20:31:55.7992105Z 175 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter"; 2026-10-24T20:31:55.7992373Z ·  ───────┬─────── 2026-10-24T20:31:55.7992675Z · ╰── 'ReviewDiffTheme' is imported here 2026-10-24T20:31:55.7992898Z 176 │ import { 2026-10-24T20:31:55.7993029Z ╰──── 2026-10-24T20:31:55.7993194Z  help: Consider removing this import. 2026-10-24T20:31:55.7993319Z 2026-10-24T20:31:55.7993561Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used. 2026-10-24T20:31:55.7993939Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3] 2026-10-24T20:31:55.7994154Z 189 │ import { 2026-10-24T20:31:55.7994309Z 190 │ resolveMarkdownFontSizes, 2026-10-24T20:31:55.7994512Z ·  ────────────┬─────────── 2026-10-24T20:31:55.7994792Z · ╰── 'resolveMarkdownFontSizes' is imported here 2026-10-24T20:31:55.7995053Z 191 │ resolveNativeMarkdownTypography, 2026-10-24T20:31:55.7995222Z ╰──── 2026-10-24T20:31:55.7995413Z  help: Consider removing this import. 2026-10-24T20:31:55.7995538Z 2026-10-24T20:31:55.7995814Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used. 2026-10-24T20:31:55.7996226Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:197:3] 2026-10-24T20:31:55.7996466Z 196 │ normalizeNativeMarkdownUrl, 2026-10-24T20:31:55.7996683Z 197 │ resolveMarkdownInlineCodePresentation, 2026-10-24T20:31:55.7996921Z ·  ──────────────────┬────────────────── 2026-10-24T20:31:55.7997339Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here 2026-10-24T20:31:55.7997663Z 198 │ resolveMarkdownLinkPresentation, 2026-10-24T20:31:55.7997838Z ╰──── 2026-10-24T20:31:55.7998003Z  help: Consider removing this import. 2026-10-24T20:31:55.7998131Z 2026-10-24T20:31:55.7998377Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used. 2026-10-24T20:31:55.7998757Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:242:10] 2026-10-24T20:31:55.7999032Z 241 │ import { ThreadMcpApp } from "./McpAppWebView"; 2026-10-24T20:31:55.7999317Z 242 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState"; 2026-10-24T20:31:55.7999603Z ·  ────────────┬─────────── 2026-10-24T20:31:55.7999901Z · ╰── 'useMarkdownCodeHighlight' is imported here 2026-10-24T20:31:55.8000144Z 243 │ import { 2026-10-24T20:31:55.8000275Z ╰──── 2026-10-24T20:31:55.8000438Z  help: Consider removing this import. 2026-10-24T20:31:55.8000562Z 2026-10-24T20:31:55.8000788Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used. 2026-10-24T20:31:55.8020026Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:246:3] 2026-10-24T20:31:55.8020290Z 245 │ useAssetUrl, 2026-10-24T20:31:55.8020464Z 246 │ useAssetUrlState, 2026-10-24T20:31:55.8020659Z ·  ────────┬─────── 2026-10-24T20:31:55.8020930Z · ╰── 'useAssetUrlState' is imported here 2026-10-24T20:31:55.8021170Z 247 │ useRefreshAssetUrl, 2026-10-24T20:31:55.8021323Z ╰──── 2026-10-24T20:31:55.8021520Z  help: Consider removing this import. 2026-10-24T20:31:55.8021653Z 2026-10-24T20:31:55.8021873Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8022244Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2197:7] 2026-10-24T20:31:55.8022521Z 2196 │ setExpandedFile(null); 2026-10-24T20:31:55.8022799Z 2197 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]); 2026-10-24T20:31:55.8023220Z ·  ─────────┬───────── ───────┬────── ───────────────┬────────────── 2026-10-24T20:31:55.8023743Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind` 2026-10-24T20:31:55.8024231Z · │ ╰── Unnecessary dependency `props.threadId` 2026-10-24T20:31:55.8024615Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T20:31:55.8024943Z 2198 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16; 2026-10-24T20:31:55.8025168Z ╰──── 2026-10-24T20:31:55.8025548Z  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-24T20:31:55.8026193Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8026514Z 2026-10-24T20:31:55.8026907Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8027337Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2669:7] 2026-10-24T20:31:55.8027602Z 2668 │ reportHeaderMaterialVisibility(false); 2026-10-24T20:31:55.8027852Z 2669 │ }, [feedThreadKey, reportHeaderMaterialVisibility]); 2026-10-24T20:31:55.8028077Z ·  ──────┬────── 2026-10-24T20:31:55.8028341Z · ╰── Unnecessary dependency `feedThreadKey` 2026-10-24T20:31:55.8028560Z 2670 │ 2026-10-24T20:31:55.8028686Z ╰──── 2026-10-24T20:31:55.8029057Z  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-24T20:31:55.8029695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8030017Z 2026-10-24T20:31:55.8030232Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8030590Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2685:7] 2026-10-24T20:31:55.8030807Z 2684 │ } 2026-10-24T20:31:55.8031026Z 2685 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]); 2026-10-24T20:31:55.8031262Z ·  ──────┬───── 2026-10-24T20:31:55.8031517Z · ╰── Unnecessary dependency `listMountKey` 2026-10-24T20:31:55.8031836Z 2686 │ // Opening at a message: its run unfolds, the list stops following the end 2026-10-24T20:31:55.8032048Z ╰──── 2026-10-24T20:31:55.8032460Z  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-24T20:31:55.8033089Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8033402Z 2026-10-24T20:31:55.8033612Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8033958Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2881:7] 2026-10-24T20:31:55.8034166Z 2880 │ } 2026-10-24T20:31:55.8034425Z 2881 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]); 2026-10-24T20:31:55.8034829Z ·  ───────┬─────── ─────────┬──────── ────────┬─────── 2026-10-24T20:31:55.8035283Z · │ │ ╰── Unnecessary dependency `expandedWorkRows` 2026-10-24T20:31:55.8035732Z · │ ╰── Unnecessary dependency `expandedWorkGroups` 2026-10-24T20:31:55.8036093Z · ╰── Unnecessary dependency `expandedTurnIds` 2026-10-24T20:31:55.8036316Z 2882 │ 2026-10-24T20:31:55.8036431Z ╰──── 2026-10-24T20:31:55.8036798Z  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-24T20:31:55.8037419Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8037734Z 2026-10-24T20:31:55.8038104Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:31:55.8038501Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:627:9] 2026-10-24T20:31:55.8038719Z 626 │ }; 2026-10-24T20:31:55.8038916Z 627 │ }, [props.environmentId, attachment.id, httpBaseUrl]), 2026-10-24T20:31:55.8039271Z ·  ─────────┬───────── ──────┬────── ─────┬───── 2026-10-24T20:31:55.8039721Z · │ │ ╰── Unnecessary dependency `httpBaseUrl` 2026-10-24T20:31:55.8040166Z · │ ╰── Unnecessary dependency `attachment.id` 2026-10-24T20:31:55.8040548Z · ╰── Unnecessary dependency `props.environmentId` 2026-10-24T20:31:55.8040790Z 628 │ ); 2026-10-24T20:31:55.8040915Z ╰──── 2026-10-24T20:31:55.8041361Z  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-24T20:31:55.8042068Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8042393Z 2026-10-24T20:31:55.8042650Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8043043Z ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17] 2026-10-24T20:31:55.8043304Z 817 │
{ 2026-10-24T20:31:55.8053096Z ·  ────┬──── 2026-10-24T20:31:55.8053331Z · ╰── This is the containing effect 2026-10-24T20:31:55.8053667Z 215 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null; 2026-10-24T20:31:55.8053928Z 216 │ if (inserted) { 2026-10-24T20:31:55.8054107Z 217 │ setSelection((current) => 2026-10-24T20:31:55.8054296Z ·  ──────┬───── 2026-10-24T20:31:55.8054587Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8054948Z 218 │ current.start === inserted.start && current.end === inserted.end ? current : inserted, 2026-10-24T20:31:55.8055274Z ╰──── 2026-10-24T20:31:55.8055985Z  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-24T20:31:55.8057021Z  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-24T20:31:55.8057418Z 2026-10-24T20:31:55.8057697Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8058137Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:298:7] 2026-10-24T20:31:55.8058402Z 286 │ }, [hasWorkspaceSnapshot]); 2026-10-24T20:31:55.8058574Z 287 │ useEffect(() => { 2026-10-24T20:31:55.8058740Z ·  ────┬──── 2026-10-24T20:31:55.8058974Z · ╰── This is the containing effect 2026-10-24T20:31:55.8059274Z 288 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return; 2026-10-24T20:31:55.8059600Z 289 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`; 2026-10-24T20:31:55.8059849Z 290 │ const now = Date.now(); 2026-10-24T20:31:55.8060074Z 291 │ const lastRequest = workspaceRefreshKeyRef.current; 2026-10-24T20:31:55.8060276Z 292 │ if ( 2026-10-24T20:31:55.8060435Z 293 │ lastRequest?.key === key && 2026-10-24T20:31:55.8060692Z 294 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS 2026-10-24T20:31:55.8060917Z 295 │ ) 2026-10-24T20:31:55.8061054Z 296 │ return; 2026-10-24T20:31:55.8061321Z 297 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) { 2026-10-24T20:31:55.8061611Z 298 │ setWorkspaceRefreshRetry(null); 2026-10-24T20:31:55.8061827Z ·  ────────────┬─────────── 2026-10-24T20:31:55.8062128Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8062374Z 299 │ return; 2026-10-24T20:31:55.8062539Z ╰──── 2026-10-24T20:31:55.8063240Z  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-24T20:31:55.8064164Z  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-24T20:31:55.8064496Z 2026-10-24T20:31:55.8064711Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8065104Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:328:5] 2026-10-24T20:31:55.8065347Z 327 │ }, [ 2026-10-24T20:31:55.8065496Z 328 │ draftMessage, 2026-10-24T20:31:55.8065671Z ·  ──────┬───── 2026-10-24T20:31:55.8065932Z · ╰── Unnecessary dependency `draftMessage` 2026-10-24T20:31:55.8066163Z 329 │ environmentId, 2026-10-24T20:31:55.8066314Z ╰──── 2026-10-24T20:31:55.8066688Z  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-24T20:31:55.8067323Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8067641Z 2026-10-24T20:31:55.8067862Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T20:31:55.8068278Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9] 2026-10-24T20:31:55.8068530Z 37 │ get isConnected() { 2026-10-24T20:31:55.8068725Z 38 │ let current: FakeElement | null = this; 2026-10-24T20:31:55.8068919Z ·  ─────── 2026-10-24T20:31:55.8069094Z 39 │ while (current?.parent) { 2026-10-24T20:31:55.8069247Z ╰──── 2026-10-24T20:31:55.8069597Z  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-24T20:31:55.8069876Z 2026-10-24T20:31:55.8070094Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:31:55.8070444Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8] 2026-10-24T20:31:55.8070677Z 2 │ AuthFilesystemReadScope, 2026-10-24T20:31:55.8070850Z 3 │ type AuthSessionState, 2026-10-24T20:31:55.8071042Z ·  ────────┬─────── 2026-10-24T20:31:55.8071304Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:31:55.8071544Z 4 │ type FilesystemBrowseEntry, 2026-10-24T20:31:55.8071699Z ╰──── 2026-10-24T20:31:55.8071870Z  help: Consider removing this import. 2026-10-24T20:31:55.8071992Z 2026-10-24T20:31:55.8072194Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:31:55.8072607Z ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27] 2026-10-24T20:31:55.8072965Z 601 │ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success)); 2026-10-24T20:31:55.8073239Z 602 │ const gesture = Gesture.Pan() 2026-10-24T20:31:55.8073438Z ·  ─┬─ 2026-10-24T20:31:55.8073704Z · ╰── `Pan` may be a component 2026-10-24T20:31:55.8073938Z 603 │ .enabled(!props.disabled) 2026-10-24T20:31:55.8074094Z ╰──── 2026-10-24T20:31:55.8074449Z  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-24T20:31:55.8075206Z  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-24T20:31:55.8075644Z 2026-10-24T20:31:55.8075859Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining 2026-10-24T20:31:55.8076252Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8] 2026-10-24T20:31:55.8076510Z 1782 │ assert.equal( 2026-10-24T20:31:55.8076757Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId, 2026-10-24T20:31:55.8077037Z ·  ────────────────────────── 2026-10-24T20:31:55.8077247Z 1784 │ stored.attachments[0]?.id, 2026-10-24T20:31:55.8077414Z ╰──── 2026-10-24T20:31:55.8077659Z  help: If this short-circuits with 'undefined' the evaluation will throw TypeError 2026-10-24T20:31:55.8077849Z 2026-10-24T20:31:55.8078076Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used. 2026-10-24T20:31:55.8078399Z ╭─[infra/relay/src/http/Api.ts:69:13] 2026-10-24T20:31:55.8078677Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts"; 2026-10-24T20:31:55.8079048Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts"; 2026-10-24T20:31:55.8079379Z ·  ──────┬────── 2026-10-24T20:31:55.8079642Z · ╰── 'HookForwarder' is imported here 2026-10-24T20:31:55.8079908Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts"; 2026-10-24T20:31:55.8080088Z ╰──── 2026-10-24T20:31:55.8080252Z  help: Consider removing this import. 2026-10-24T20:31:55.8080373Z 2026-10-24T20:31:55.8080594Z ⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used. 2026-10-24T20:31:55.8080981Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13] 2026-10-24T20:31:55.8081255Z 24 │ import * as Schema from "effect/Schema"; 2026-10-24T20:31:55.8081493Z 25 │ import * as HostProcess from "@t3tools/shared/HostProcess"; 2026-10-24T20:31:55.8081725Z ·  ─────┬───── 2026-10-24T20:31:55.8081983Z · ╰── 'HostProcess' is imported here 2026-10-24T20:31:55.8082192Z 26 │ 2026-10-24T20:31:55.8082309Z ╰──── 2026-10-24T20:31:55.8082483Z  help: Consider removing this import. 2026-10-24T20:31:55.8082631Z 2026-10-24T20:31:55.8082922Z ⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8083431Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11] 2026-10-24T20:31:55.8083788Z 123 │ const path = yield* Path.Path; 2026-10-24T20:31:55.8084091Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T20:31:55.8084329Z ·  ──────┬───── 2026-10-24T20:31:55.8084593Z · ╰── 'serverConfig' is declared here 2026-10-24T20:31:55.8084902Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T20:31:55.8085125Z ╰──── 2026-10-24T20:31:55.8085297Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8085427Z 2026-10-24T20:31:55.8085729Z ⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8086190Z ╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11] 2026-10-24T20:31:55.8086494Z 124 │ const serverConfig = yield* ServerConfig.ServerConfig; 2026-10-24T20:31:55.8086782Z 125 │ const serverSettings = yield* ServerSettings.ServerSettingsService; 2026-10-24T20:31:55.8087041Z ·  ───────┬────── 2026-10-24T20:31:55.8087304Z · ╰── 'serverSettings' is declared here 2026-10-24T20:31:55.8087610Z 126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService; 2026-10-24T20:31:55.8087824Z ╰──── 2026-10-24T20:31:55.8087997Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8088123Z 2026-10-24T20:31:55.8088629Z ⚠ 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-24T20:31:55.8089256Z ╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3] 2026-10-24T20:31:55.8089546Z 134 │ let lastState = yield* SubscriptionRef.get(state); 2026-10-24T20:31:55.8089993Z 135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) { 2026-10-24T20:31:55.8090388Z 136 │ │ lastState = yield* SubscriptionRef.get(state); 2026-10-24T20:31:55.8090662Z 137 │ │ if (predicate(lastState)) { 2026-10-24T20:31:55.8090896Z 138 │ │ return lastState; 2026-10-24T20:31:55.8091098Z 139 │ │ } 2026-10-24T20:31:55.8091306Z 140 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8091566Z 141 │ ╰─▶ } 2026-10-24T20:31:55.8091790Z 142 │ return yield* Effect.die( 2026-10-24T20:31:55.8091948Z ╰──── 2026-10-24T20:31:55.8092007Z 2026-10-24T20:31:55.8092312Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:31:55.8092821Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19] 2026-10-24T20:31:55.8093074Z 472 │ onFilters, 2026-10-24T20:31:55.8093230Z 473 │ authorOptions = [], 2026-10-24T20:31:55.8093403Z ·  ── 2026-10-24T20:31:55.8093576Z 474 │ labelOptions = [], 2026-10-24T20:31:55.8093724Z ╰──── 2026-10-24T20:31:55.8094128Z  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-24T20:31:55.8094452Z 2026-10-24T20:31:55.8094753Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:31:55.8095269Z ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18] 2026-10-24T20:31:55.8095535Z 473 │ authorOptions = [], 2026-10-24T20:31:55.8095696Z 474 │ labelOptions = [], 2026-10-24T20:31:55.8095868Z ·  ── 2026-10-24T20:31:55.8096035Z 475 │ optionScope, 2026-10-24T20:31:55.8096175Z ╰──── 2026-10-24T20:31:55.8096570Z  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-24T20:31:55.8096891Z 2026-10-24T20:31:55.8097167Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8097601Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5] 2026-10-24T20:31:55.8097913Z 277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0); 2026-10-24T20:31:55.8098135Z 278 │ useEffect(() => { 2026-10-24T20:31:55.8098305Z ·  ────┬──── 2026-10-24T20:31:55.8098537Z · ╰── This is the containing effect 2026-10-24T20:31:55.8098778Z 279 │ setNow(new Date().toISOString()); 2026-10-24T20:31:55.8098962Z ·  ───┬── 2026-10-24T20:31:55.8099229Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8099555Z 280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000); 2026-10-24T20:31:55.8099766Z ╰──── 2026-10-24T20:31:55.8100573Z  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-24T20:31:55.8101540Z  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-24T20:31:55.8101868Z 2026-10-24T20:31:55.8102115Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T20:31:55.8102555Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8] 2026-10-24T20:31:55.8102809Z 12 │ threadSearchMatchKey, 2026-10-24T20:31:55.8102996Z 13 │ type EnvironmentThreadSearchMatch, 2026-10-24T20:31:55.8103222Z ·  ──────────────┬───────────── 2026-10-24T20:31:55.8103529Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T20:31:55.8103835Z 14 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T20:31:55.8104022Z ╰──── 2026-10-24T20:31:55.8104186Z  help: Consider removing this import. 2026-10-24T20:31:55.8104309Z 2026-10-24T20:31:55.8104520Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8104917Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25] 2026-10-24T20:31:55.8105239Z 358 │ // range) the boundary string is identical and the chain would die. 2026-10-24T20:31:55.8105497Z 359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T20:31:55.8105724Z ·  ───────┬────── 2026-10-24T20:31:55.8106028Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:31:55.8106324Z 360 │ const listItems = ((): readonly SidebarListItem[] => { 2026-10-24T20:31:55.8106522Z ╰──── 2026-10-24T20:31:55.8106900Z  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-24T20:31:55.8107541Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8107863Z 2026-10-24T20:31:55.8108047Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8108409Z ╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53] 2026-10-24T20:31:55.8108681Z 349 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T20:31:55.8108961Z 350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T20:31:55.8109340Z ·  ─────┬──── 2026-10-24T20:31:55.8109695Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8109954Z 351 │ const id = setTimeout(() => { 2026-10-24T20:31:55.8110123Z ╰──── 2026-10-24T20:31:55.8110484Z  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-24T20:31:55.8111094Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8111397Z 2026-10-24T20:31:55.8111627Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:31:55.8111987Z ╭─[apps/mobile/src/lib/markdownDocument.ts:259:28] 2026-10-24T20:31:55.8112243Z 258 │ visit(parser.parse(markdown), false, false); 2026-10-24T20:31:55.8112496Z 259 │ for (const edit of edits.reverse()) 2026-10-24T20:31:55.8112712Z ·  ─────── 2026-10-24T20:31:55.8113001Z 260 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T20:31:55.8113235Z ╰──── 2026-10-24T20:31:55.8113572Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:31:55.8113841Z 2026-10-24T20:31:55.8114067Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:31:55.8114415Z ╭─[apps/mobile/src/lib/markdownDocument.ts:290:28] 2026-10-24T20:31:55.8114652Z 289 │ visit(parser.parse(markdown)); 2026-10-24T20:31:55.8114846Z 290 │ for (const edit of edits.reverse()) 2026-10-24T20:31:55.8115056Z ·  ─────── 2026-10-24T20:31:55.8115342Z 291 │ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end); 2026-10-24T20:31:55.8115579Z ╰──── 2026-10-24T20:31:55.8115914Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:31:55.8116184Z 2026-10-24T20:31:55.8116406Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:31:55.8116752Z ╭─[apps/mobile/src/lib/markdownDocument.ts:344:38] 2026-10-24T20:31:55.8116984Z 343 │ visit(parser.parse(markdown)); 2026-10-24T20:31:55.8117203Z 344 │ for (const lineStart of lineStarts.reverse()) { 2026-10-24T20:31:55.8117446Z ·  ─────── 2026-10-24T20:31:55.8117745Z 345 │ // The header row may be a lazy line without its container markers (`>` or list indent), 2026-10-24T20:31:55.8117979Z ╰──── 2026-10-24T20:31:55.8118312Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:31:55.8118582Z 2026-10-24T20:31:55.8118858Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8119284Z ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40] 2026-10-24T20:31:55.8119633Z 28 │ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live); 2026-10-24T20:31:55.8119955Z 29 │ useEffect(() => { 2026-10-24T20:31:55.8120164Z ·  ────┬──── 2026-10-24T20:31:55.8120395Z · ╰── This is the containing effect 2026-10-24T20:31:55.8120672Z 30 │ if (snapshot && snapshot !== live) setHeld({ key, snapshot }); 2026-10-24T20:31:55.8120929Z ·  ───┬─── 2026-10-24T20:31:55.8121257Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8121532Z 31 │ }, [key, live, snapshot]); 2026-10-24T20:31:55.8121684Z ╰──── 2026-10-24T20:31:55.8122397Z  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-24T20:31:55.8123370Z  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-24T20:31:55.8123709Z 2026-10-24T20:31:55.8123937Z ⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used. 2026-10-24T20:31:55.8124319Z ╭─[packages/client-runtime/src/work-log/presentation.ts:237:10] 2026-10-24T20:31:55.8124543Z 236 │ 2026-10-24T20:31:55.8124732Z 237 │ function nonEmptyString(value: unknown): string | null { 2026-10-24T20:31:55.8124968Z ·  ───────┬────── 2026-10-24T20:31:55.8125226Z · ╰── 'nonEmptyString' is declared here 2026-10-24T20:31:55.8125547Z 238 │ return typeof value === "string" && value.trim().length > 0 ? value : null; 2026-10-24T20:31:55.8125769Z ╰──── 2026-10-24T20:31:55.8125945Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8126076Z 2026-10-24T20:31:55.8126314Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result. 2026-10-24T20:31:55.8126738Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15] 2026-10-24T20:31:55.8126995Z 1997 │ assert.equal( 2026-10-24T20:31:55.8127257Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text, 2026-10-24T20:31:55.8127509Z ·  ────── 2026-10-24T20:31:55.8127696Z 1999 │ "authoritative answer", 2026-10-24T20:31:55.8127854Z ╰──── 2026-10-24T20:31:55.8128106Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:31:55.8128295Z 2026-10-24T20:31:55.8128800Z ⚠ 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-24T20:31:55.8129434Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7] 2026-10-24T20:31:55.8129818Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped); 2026-10-24T20:31:55.8130242Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) { 2026-10-24T20:31:55.8130569Z 3952 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8130923Z 3953 │ ╰─▶ } 2026-10-24T20:31:55.8131245Z 3954 │ const responseExit = yield* Fiber.join(responseFiber); 2026-10-24T20:31:55.8131448Z ╰──── 2026-10-24T20:31:55.8131509Z 2026-10-24T20:31:55.8132011Z ⚠ 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-24T20:31:55.8132675Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9] 2026-10-24T20:31:55.8132956Z 6061 │ .pipe(Effect.forkScoped); 2026-10-24T20:31:55.8133277Z 6062 │ ╭─▶ while (promptGates.length < 1) { 2026-10-24T20:31:55.8133590Z 6063 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8133879Z 6064 │ ╰─▶ } 2026-10-24T20:31:55.8134212Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired"); 2026-10-24T20:31:55.8134457Z ╰──── 2026-10-24T20:31:55.8134517Z 2026-10-24T20:31:55.8135014Z ⚠ 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-24T20:31:55.8135753Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9] 2026-10-24T20:31:55.8136031Z 6196 │ .pipe(Effect.forkScoped); 2026-10-24T20:31:55.8136345Z 6197 │ ╭─▶ while (promptGates.length < 2) { 2026-10-24T20:31:55.8136659Z 6198 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8136942Z 6199 │ ╰─▶ } 2026-10-24T20:31:55.8137272Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) { 2026-10-24T20:31:55.8137512Z ╰──── 2026-10-24T20:31:55.8137580Z 2026-10-24T20:31:55.8137859Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8138305Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7] 2026-10-24T20:31:55.8138548Z 10601 │ 2026-10-24T20:31:55.8138694Z 10602 │ const layer: Layer.Layer< 2026-10-24T20:31:55.8138876Z ·  ──┬── 2026-10-24T20:31:55.8139112Z · ╰── 'layer' is declared here 2026-10-24T20:31:55.8139365Z 10603 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T20:31:55.8139541Z ╰──── 2026-10-24T20:31:55.8139720Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8139848Z 2026-10-24T20:31:55.8140070Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:31:55.8140429Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8] 2026-10-24T20:31:55.8140661Z 2 │ AuthDiagnosticsReadScope, 2026-10-24T20:31:55.8140840Z 3 │ type AuthSessionState, 2026-10-24T20:31:55.8141025Z ·  ────────┬─────── 2026-10-24T20:31:55.8141284Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:31:55.8141519Z 4 │ sessionGrantsScope, 2026-10-24T20:31:55.8141664Z ╰──── 2026-10-24T20:31:55.8141927Z  help: Consider removing this import. 2026-10-24T20:31:55.8142101Z 2026-10-24T20:31:55.8142255Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8142579Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9] 2026-10-24T20:31:55.8142794Z 184 │ "options", 2026-10-24T20:31:55.8142988Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T20:31:55.8143226Z ·  ────────────────┬─────────────── 2026-10-24T20:31:55.8143563Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8143867Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T20:31:55.8144044Z ╰──── 2026-10-24T20:31:55.8144616Z  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-24T20:31:55.8145397Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8145700Z 2026-10-24T20:31:55.8145858Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8146148Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9] 2026-10-24T20:31:55.8146385Z 185 │ latestOptionFunctionsRef.current, 2026-10-24T20:31:55.8146607Z 186 │ optionFunctionWrappersRef.current, 2026-10-24T20:31:55.8146843Z ·  ────────────────┬──────────────── 2026-10-24T20:31:55.8147182Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8147484Z 187 │ ) as NativeStackNavigationOptions) 2026-10-24T20:31:55.8147655Z ╰──── 2026-10-24T20:31:55.8148221Z  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-24T20:31:55.8148994Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8149298Z 2026-10-24T20:31:55.8149804Z ⚠ 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-24T20:31:55.8150420Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7] 2026-10-24T20:31:55.8150653Z 168 │ }); 2026-10-24T20:31:55.8150949Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:31:55.8151359Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break; 2026-10-24T20:31:55.8151680Z 171 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8151952Z 172 │ ╰─▶ } 2026-10-24T20:31:55.8152160Z 173 │ 2026-10-24T20:31:55.8152281Z ╰──── 2026-10-24T20:31:55.8152342Z 2026-10-24T20:31:55.8152961Z ⚠ 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-24T20:31:55.8153608Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7] 2026-10-24T20:31:55.8153896Z 177 │ yield* Deferred.succeed(releaseSave, undefined); 2026-10-24T20:31:55.8154238Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:31:55.8154579Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break; 2026-10-24T20:31:55.8154840Z 180 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8155111Z 181 │ ╰─▶ } 2026-10-24T20:31:55.8155315Z 182 │ 2026-10-24T20:31:55.8155439Z ╰──── 2026-10-24T20:31:55.8155501Z 2026-10-24T20:31:55.8156005Z ⚠ 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-24T20:31:55.8156615Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7] 2026-10-24T20:31:55.8156917Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined); 2026-10-24T20:31:55.8157270Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) { 2026-10-24T20:31:55.8157599Z 308 │ │ const values = yield* Ref.get(saved); 2026-10-24T20:31:55.8157950Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) { 2026-10-24T20:31:55.8158253Z 310 │ │ break; 2026-10-24T20:31:55.8158450Z 311 │ │ } 2026-10-24T20:31:55.8158665Z 312 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8158930Z 313 │ ╰─▶ } 2026-10-24T20:31:55.8159140Z 314 │ 2026-10-24T20:31:55.8159261Z ╰──── 2026-10-24T20:31:55.8159326Z 2026-10-24T20:31:55.8159557Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:31:55.8159891Z ╭─[apps/mobile/src/Stack.tsx:1079:21] 2026-10-24T20:31:55.8160087Z 1078 │ } 2026-10-24T20:31:55.8160624Z ·  ───────────────────────────────────────────── 2026-10-24T20:31:55.8160932Z 1080 │ screenOptions={({ route }) => 2026-10-24T20:31:55.8161139Z ╰──── 2026-10-24T20:31:55.8161594Z  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-24T20:31:55.8161963Z 2026-10-24T20:31:55.8162193Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:31:55.8162590Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40] 2026-10-24T20:31:55.8162829Z 89 │ let cursor = prompt.length; 2026-10-24T20:31:55.8163046Z 90 │ for (const occurrence of occurrences.reverse()) { 2026-10-24T20:31:55.8163287Z ·  ─────── 2026-10-24T20:31:55.8163508Z 91 │ let { start, end } = occurrence; 2026-10-24T20:31:55.8163675Z ╰──── 2026-10-24T20:31:55.8164021Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:31:55.8164293Z 2026-10-24T20:31:55.8164792Z ⚠ 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-24T20:31:55.8165395Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3] 2026-10-24T20:31:55.8165611Z 225 │ ) { 2026-10-24T20:31:55.8165909Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:31:55.8166231Z 227 │ │ const socket = sockets[index]; 2026-10-24T20:31:55.8166469Z 228 │ │ if (socket) { 2026-10-24T20:31:55.8166685Z 229 │ │ return socket; 2026-10-24T20:31:55.8166887Z 230 │ │ } 2026-10-24T20:31:55.8167100Z 231 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8167365Z 232 │ ╰─▶ } 2026-10-24T20:31:55.8167693Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket.")); 2026-10-24T20:31:55.8167940Z ╰──── 2026-10-24T20:31:55.8168001Z 2026-10-24T20:31:55.8168500Z ⚠ 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-24T20:31:55.8169100Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3] 2026-10-24T20:31:55.8169318Z 239 │ ) { 2026-10-24T20:31:55.8169607Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:31:55.8170042Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index]; 2026-10-24T20:31:55.8170367Z 242 │ │ if (request) { 2026-10-24T20:31:55.8170586Z 243 │ │ return request; 2026-10-24T20:31:55.8170785Z 244 │ │ } 2026-10-24T20:31:55.8170998Z 245 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8171259Z 246 │ ╰─▶ } 2026-10-24T20:31:55.8171653Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request.")); 2026-10-24T20:31:55.8171928Z ╰──── 2026-10-24T20:31:55.8171992Z 2026-10-24T20:31:55.8172221Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:31:55.8172610Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6] 2026-10-24T20:31:55.8172945Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T20:31:55.8173231Z 228 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8173451Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8174065Z · ╰── 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-24T20:31:55.8174602Z 229 │ mostRecentEventCount, 2026-10-24T20:31:55.8174766Z 230 │ ); 2026-10-24T20:31:55.8174977Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T20:31:55.8175360Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T20:31:55.8175727Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8176023Z 232 │ const assumedValue = props.value; 2026-10-24T20:31:55.8176192Z ╰──── 2026-10-24T20:31:55.8176435Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:31:55.8176964Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8177289Z 2026-10-24T20:31:55.8177528Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:31:55.8177907Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7] 2026-10-24T20:31:55.8178223Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T20:31:55.8178488Z 239 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8178703Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8179309Z · ╰── 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-24T20:31:55.8179835Z 240 │ controlledEventCount, 2026-10-24T20:31:55.8180006Z 241 │ assumedValue, 2026-10-24T20:31:55.8180161Z 242 │ ); 2026-10-24T20:31:55.8180406Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T20:31:55.8180734Z ·  ───────────┬────────── 2026-10-24T20:31:55.8181098Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T20:31:55.8181409Z 244 │ const acceptNativeEvent = useCallback( 2026-10-24T20:31:55.8181577Z ╰──── 2026-10-24T20:31:55.8182096Z  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-24T20:31:55.8182979Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8183347Z 2026-10-24T20:31:55.8183507Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8183819Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T20:31:55.8184114Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:31:55.8184380Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:31:55.8184650Z ·  ─────────────┬──────────── 2026-10-24T20:31:55.8184966Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8185205Z 165 │ }); 2026-10-24T20:31:55.8185334Z ╰──── 2026-10-24T20:31:55.8185904Z  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-24T20:31:55.8186677Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8186980Z 2026-10-24T20:31:55.8187138Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8187448Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29] 2026-10-24T20:31:55.8187748Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:31:55.8188015Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:31:55.8188285Z ·  ─────────────┬──────────── 2026-10-24T20:31:55.8188640Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8188911Z 165 │ }); 2026-10-24T20:31:55.8189038Z ╰──── 2026-10-24T20:31:55.8189600Z  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-24T20:31:55.8190367Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8190673Z 2026-10-24T20:31:55.8190829Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8191142Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23] 2026-10-24T20:31:55.8191365Z 165 │ }); 2026-10-24T20:31:55.8191533Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T20:31:55.8191784Z ·  ─────────┬────────────┬─── 2026-10-24T20:31:55.8192118Z · │ ╰── Cannot update ref value during render 2026-10-24T20:31:55.8192464Z · ╰── This value is a ref 2026-10-24T20:31:55.8192680Z 167 │ return JSON.stringify( 2026-10-24T20:31:55.8192836Z ╰──── 2026-10-24T20:31:55.8193394Z  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-24T20:31:55.8194241Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8194579Z 2026-10-24T20:31:55.8194731Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8195043Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5] 2026-10-24T20:31:55.8195275Z 207 │ mostRecentEventCount, 2026-10-24T20:31:55.8195471Z 208 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8195700Z ·  ───────────────┬─────────────── 2026-10-24T20:31:55.8196026Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8196281Z 209 │ ); 2026-10-24T20:31:55.8196411Z ╰──── 2026-10-24T20:31:55.8196972Z  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-24T20:31:55.8197744Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8198044Z 2026-10-24T20:31:55.8198201Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8198512Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5] 2026-10-24T20:31:55.8198746Z 213 │ mostRecentEventCount, 2026-10-24T20:31:55.8198939Z 214 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8199166Z ·  ───────────────┬─────────────── 2026-10-24T20:31:55.8199496Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8199752Z 215 │ ); 2026-10-24T20:31:55.8199874Z ╰──── 2026-10-24T20:31:55.8200441Z  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-24T20:31:55.8201205Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8201516Z 2026-10-24T20:31:55.8201717Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:31:55.8202226Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6] 2026-10-24T20:31:55.8202882Z 163 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:31:55.8203289Z 164 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:31:55.8203576Z ·  ─────────┬──────── 2026-10-24T20:31:55.8204235Z · ╰── 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-24T20:31:55.8204758Z 165 │ }); 2026-10-24T20:31:55.8204934Z 166 │ confirmedTokensRef.current = tokens; 2026-10-24T20:31:55.8205137Z 167 │ return JSON.stringify( 2026-10-24T20:31:55.8205415Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T20:31:55.8205701Z 169 │ const record = 2026-10-24T20:31:55.8205881Z 170 │ token.type === "context" 2026-10-24T20:31:55.8206164Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T20:31:55.8206411Z 172 │ : undefined; 2026-10-24T20:31:55.8206621Z 173 │ const presentation = contextChipPresentation( 2026-10-24T20:31:55.8206876Z 174 │ token.type === "context" ? token.kind : token.type, 2026-10-24T20:31:55.8207081Z 175 │ record, 2026-10-24T20:31:55.8207227Z 176 │ ); 2026-10-24T20:31:55.8207394Z 177 │ const icon = contextChipIcon( 2026-10-24T20:31:55.8207577Z 178 │ presentation, 2026-10-24T20:31:55.8207823Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T20:31:55.8208050Z 180 │ ); 2026-10-24T20:31:55.8215307Z 181 │ return { 2026-10-24T20:31:55.8215518Z 182 │ type: token.type, 2026-10-24T20:31:55.8215698Z 183 │ source: token.source, 2026-10-24T20:31:55.8215872Z 184 │ start: token.start, 2026-10-24T20:31:55.8216034Z 185 │ end: token.end, 2026-10-24T20:31:55.8216284Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T20:31:55.8216518Z 187 │ label: 2026-10-24T20:31:55.8216682Z 188 │ token.type === "skill" 2026-10-24T20:31:55.8216902Z 189 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T20:31:55.8217120Z 190 │ : token.type === "context" 2026-10-24T20:31:55.8217481Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T20:31:55.8217813Z 192 │ : basename(token.value), 2026-10-24T20:31:55.8218083Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T20:31:55.8218345Z 194 │ iconUri: contextChipIconUri(icon), 2026-10-24T20:31:55.8218555Z 195 │ tintsIcon: icon.kind === "chip", 2026-10-24T20:31:55.8218737Z 196 │ }; 2026-10-24T20:31:55.8218873Z 197 │ }), 2026-10-24T20:31:55.8219004Z 198 │ ); 2026-10-24T20:31:55.8219215Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T20:31:55.8219546Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T20:31:55.8219928Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8220285Z 200 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T20:31:55.8220708Z ╰──── 2026-10-24T20:31:55.8221052Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:31:55.8221613Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8221939Z 2026-10-24T20:31:55.8222145Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:31:55.8222529Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5] 2026-10-24T20:31:55.8222827Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T20:31:55.8223087Z 254 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T20:31:55.8223312Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8223925Z · ╰── 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-24T20:31:55.8224464Z 255 │ eventCount: acknowledgedEventCount, 2026-10-24T20:31:55.8224649Z 256 │ value, 2026-10-24T20:31:55.8224818Z 257 │ selection: nextSelection, 2026-10-24T20:31:55.8224985Z 258 │ }); 2026-10-24T20:31:55.8225151Z 259 │ return acknowledgedEventCount; 2026-10-24T20:31:55.8225319Z 260 │ }, 2026-10-24T20:31:55.8225445Z 261 │ [], 2026-10-24T20:31:55.8225588Z ·  ─┬ 2026-10-24T20:31:55.8225870Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8226122Z 262 │ ); 2026-10-24T20:31:55.8226245Z ╰──── 2026-10-24T20:31:55.8226530Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:31:55.8227080Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8227399Z 2026-10-24T20:31:55.8227902Z ⚠ 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-24T20:31:55.8228494Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9] 2026-10-24T20:31:55.8228718Z 130 │ ) { 2026-10-24T20:31:55.8229030Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:31:55.8229376Z 132 │ │ if (subscriptions.length >= count) { 2026-10-24T20:31:55.8229618Z 133 │ │ return; 2026-10-24T20:31:55.8229820Z 134 │ │ } 2026-10-24T20:31:55.8230040Z 135 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8230320Z 136 │ ╰─▶ } 2026-10-24T20:31:55.8230642Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`)); 2026-10-24T20:31:55.8230875Z ╰──── 2026-10-24T20:31:55.8230933Z 2026-10-24T20:31:55.8231499Z ⚠ 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-24T20:31:55.8232120Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7] 2026-10-24T20:31:55.8232480Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient))); 2026-10-24T20:31:55.8233559Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) { 2026-10-24T20:31:55.8233952Z 253 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8234226Z 254 │ ╰─▶ } 2026-10-24T20:31:55.8234496Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none()); 2026-10-24T20:31:55.8234695Z ╰──── 2026-10-24T20:31:55.8234760Z 2026-10-24T20:31:55.8235281Z ⚠ 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-24T20:31:55.8235881Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7] 2026-10-24T20:31:55.8236083Z 257 │ 2026-10-24T20:31:55.8236408Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T20:31:55.8236747Z 259 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8237003Z 260 │ ╰─▶ } 2026-10-24T20:31:55.8237250Z 261 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T20:31:55.8237431Z ╰──── 2026-10-24T20:31:55.8237487Z 2026-10-24T20:31:55.8237969Z ⚠ 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-24T20:31:55.8238529Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7] 2026-10-24T20:31:55.8238734Z 321 │ ); 2026-10-24T20:31:55.8239081Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) { 2026-10-24T20:31:55.8239423Z 323 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8239679Z 324 │ ╰─▶ } 2026-10-24T20:31:55.8239869Z 325 │ 2026-10-24T20:31:55.8239987Z ╰──── 2026-10-24T20:31:55.8240045Z 2026-10-24T20:31:55.8240511Z ⚠ 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-24T20:31:55.8241067Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7] 2026-10-24T20:31:55.8241373Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient))); 2026-10-24T20:31:55.8241798Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) { 2026-10-24T20:31:55.8242131Z 331 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8242381Z 332 │ ╰─▶ } 2026-10-24T20:31:55.8242953Z 333 │ yield* Fiber.interrupt(subscriptionFiber); 2026-10-24T20:31:55.8243436Z ╰──── 2026-10-24T20:31:55.8243578Z 2026-10-24T20:31:55.8243844Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used. 2026-10-24T20:31:55.8244247Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10] 2026-10-24T20:31:55.8244476Z 1397 │ 2026-10-24T20:31:55.8244633Z 1398 │ function assertUserMessagesExclude( 2026-10-24T20:31:55.8244869Z ·  ────────────┬──────────── 2026-10-24T20:31:55.8245163Z · ╰── 'assertUserMessagesExclude' is declared here 2026-10-24T20:31:55.8245448Z 1399 │ projection: OrchestrationV2ThreadProjection, 2026-10-24T20:31:55.8245627Z ╰──── 2026-10-24T20:31:55.8245793Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8245911Z 2026-10-24T20:31:55.8246121Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used. 2026-10-24T20:31:55.8246471Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10] 2026-10-24T20:31:55.8246762Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native"; 2026-10-24T20:31:55.8247029Z 17 │ import { Image, Platform, StyleSheet } from "react-native"; 2026-10-24T20:31:55.8247232Z ·  ──┬── 2026-10-24T20:31:55.8247453Z · ╰── 'Image' is imported here 2026-10-24T20:31:55.8247638Z 18 │ 2026-10-24T20:31:55.8247749Z ╰──── 2026-10-24T20:31:55.8247906Z  help: Consider removing this import. 2026-10-24T20:31:55.8248022Z 2026-10-24T20:31:55.8248226Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:31:55.8248578Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6] 2026-10-24T20:31:55.8248893Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents( 2026-10-24T20:31:55.8249162Z 226 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8249364Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8249938Z · ╰── 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-24T20:31:55.8250429Z 227 │ mostRecentEventCount, 2026-10-24T20:31:55.8250581Z 228 │ ); 2026-10-24T20:31:55.8250770Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]); 2026-10-24T20:31:55.8251056Z ·  ──────────────────────────┬────────────────────────── 2026-10-24T20:31:55.8251395Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8251673Z 230 │ const assumedValue = props.value; 2026-10-24T20:31:55.8251827Z ╰──── 2026-10-24T20:31:55.8252054Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:31:55.8252601Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8252987Z 2026-10-24T20:31:55.8253204Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:31:55.8253557Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7] 2026-10-24T20:31:55.8253930Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState( 2026-10-24T20:31:55.8254213Z 237 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8254416Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8254975Z · ╰── 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-24T20:31:55.8255686Z 238 │ controlledEventCount, 2026-10-24T20:31:55.8255847Z 239 │ assumedValue, 2026-10-24T20:31:55.8255990Z 240 │ ); 2026-10-24T20:31:55.8256211Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]); 2026-10-24T20:31:55.8256521Z ·  ───────────┬────────── 2026-10-24T20:31:55.8256871Z · ╰── Unnecessary dependency `controlledDocumentJson` 2026-10-24T20:31:55.8257151Z 242 │ const acceptNativeEvent = useCallback( 2026-10-24T20:31:55.8257312Z ╰──── 2026-10-24T20:31:55.8257786Z  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-24T20:31:55.8258486Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8258790Z 2026-10-24T20:31:55.8258937Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8259239Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T20:31:55.8259519Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:31:55.8259769Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:31:55.8260017Z ·  ─────────────┬──────────── 2026-10-24T20:31:55.8260309Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8260524Z 163 │ }); 2026-10-24T20:31:55.8260647Z ╰──── 2026-10-24T20:31:55.8261177Z  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-24T20:31:55.8262002Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8262330Z 2026-10-24T20:31:55.8262510Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8262811Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29] 2026-10-24T20:31:55.8263083Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:31:55.8263335Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:31:55.8263582Z ·  ─────────────┬──────────── 2026-10-24T20:31:55.8263914Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8264165Z 163 │ }); 2026-10-24T20:31:55.8264292Z ╰──── 2026-10-24T20:31:55.8264814Z  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-24T20:31:55.8265522Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8265800Z 2026-10-24T20:31:55.8265944Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8266239Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23] 2026-10-24T20:31:55.8266445Z 163 │ }); 2026-10-24T20:31:55.8266604Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T20:31:55.8266842Z ·  ─────────┬────────────┬─── 2026-10-24T20:31:55.8267160Z · │ ╰── Cannot update ref value during render 2026-10-24T20:31:55.8267455Z · ╰── This value is a ref 2026-10-24T20:31:55.8267656Z 165 │ return JSON.stringify( 2026-10-24T20:31:55.8267800Z ╰──── 2026-10-24T20:31:55.8268315Z  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-24T20:31:55.8269017Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8269298Z 2026-10-24T20:31:55.8269449Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8269745Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5] 2026-10-24T20:31:55.8269970Z 205 │ mostRecentEventCount, 2026-10-24T20:31:55.8270149Z 206 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8270361Z ·  ───────────────┬─────────────── 2026-10-24T20:31:55.8270661Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8270894Z 207 │ ); 2026-10-24T20:31:55.8271012Z ╰──── 2026-10-24T20:31:55.8271525Z  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-24T20:31:55.8272292Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8272642Z 2026-10-24T20:31:55.8272789Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8273079Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5] 2026-10-24T20:31:55.8273302Z 211 │ mostRecentEventCount, 2026-10-24T20:31:55.8273481Z 212 │ nativeEventSnapshotsRef.current, 2026-10-24T20:31:55.8273687Z ·  ───────────────┬─────────────── 2026-10-24T20:31:55.8273993Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8274229Z 213 │ ); 2026-10-24T20:31:55.8274349Z ╰──── 2026-10-24T20:31:55.8274868Z  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-24T20:31:55.8275578Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8275857Z 2026-10-24T20:31:55.8276043Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:31:55.8276371Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6] 2026-10-24T20:31:55.8276646Z 161 │ const tokens = collectComposerInlineTokens(props.value, { 2026-10-24T20:31:55.8276902Z 162 │ preserveTrailingFrom: confirmedTokensRef.current, 2026-10-24T20:31:55.8277146Z ·  ─────────┬──────── 2026-10-24T20:31:55.8277728Z · ╰── 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-24T20:31:55.8278199Z 163 │ }); 2026-10-24T20:31:55.8278361Z 164 │ confirmedTokensRef.current = tokens; 2026-10-24T20:31:55.8278543Z 165 │ return JSON.stringify( 2026-10-24T20:31:55.8278802Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => { 2026-10-24T20:31:55.8279042Z 167 │ const record = 2026-10-24T20:31:55.8279210Z 168 │ token.type === "context" 2026-10-24T20:31:55.8279473Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId) 2026-10-24T20:31:55.8279714Z 170 │ : undefined; 2026-10-24T20:31:55.8279912Z 171 │ const presentation = contextChipPresentation( 2026-10-24T20:31:55.8280148Z 172 │ token.type === "context" ? token.kind : token.type, 2026-10-24T20:31:55.8280338Z 173 │ record, 2026-10-24T20:31:55.8280476Z 174 │ ); 2026-10-24T20:31:55.8280635Z 175 │ const icon = contextChipIcon( 2026-10-24T20:31:55.8280804Z 176 │ presentation, 2026-10-24T20:31:55.8281038Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record), 2026-10-24T20:31:55.8281247Z 178 │ ); 2026-10-24T20:31:55.8281383Z 179 │ return { 2026-10-24T20:31:55.8281530Z 180 │ type: token.type, 2026-10-24T20:31:55.8281697Z 181 │ source: token.source, 2026-10-24T20:31:55.8281863Z 182 │ start: token.start, 2026-10-24T20:31:55.8282086Z 183 │ end: token.end, 2026-10-24T20:31:55.8282364Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor), 2026-10-24T20:31:55.8282608Z 185 │ label: 2026-10-24T20:31:55.8282767Z 186 │ token.type === "skill" 2026-10-24T20:31:55.8282973Z 187 │ ? (skillLabels.get(token.value) ?? token.value) 2026-10-24T20:31:55.8283187Z 188 │ : token.type === "context" 2026-10-24T20:31:55.8283524Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}` 2026-10-24T20:31:55.8283838Z 190 │ : basename(token.value), 2026-10-24T20:31:55.8284082Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "", 2026-10-24T20:31:55.8284332Z 192 │ iconUri: contextChipIconUri(icon), 2026-10-24T20:31:55.8284538Z 193 │ tintsIcon: icon.kind === "chip", 2026-10-24T20:31:55.8284708Z 194 │ }; 2026-10-24T20:31:55.8284836Z 195 │ }), 2026-10-24T20:31:55.8284960Z 196 │ ); 2026-10-24T20:31:55.8285162Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]); 2026-10-24T20:31:55.8285465Z ·  ───────────────────────────────┬─────────────────────────────── 2026-10-24T20:31:55.8285824Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8286157Z 198 │ // Every render resolves against the snapshot history, so a render whose 2026-10-24T20:31:55.8286365Z ╰──── 2026-10-24T20:31:55.8286623Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:31:55.8287147Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8287449Z 2026-10-24T20:31:55.8287635Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:31:55.8287963Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5] 2026-10-24T20:31:55.8288243Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount; 2026-10-24T20:31:55.8288489Z 252 │ nativeEventSnapshotsRef.current.push({ 2026-10-24T20:31:55.8288698Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8289262Z · ╰── 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-24T20:31:55.8289768Z 253 │ eventCount: acknowledgedEventCount, 2026-10-24T20:31:55.8289947Z 254 │ value, 2026-10-24T20:31:55.8290102Z 255 │ selection: nextSelection, 2026-10-24T20:31:55.8290260Z 256 │ }); 2026-10-24T20:31:55.8290412Z 257 │ return acknowledgedEventCount; 2026-10-24T20:31:55.8290573Z 258 │ }, 2026-10-24T20:31:55.8290699Z 259 │ [], 2026-10-24T20:31:55.8290838Z ·  ─┬ 2026-10-24T20:31:55.8291024Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8291082Z 260 │ ); 2026-10-24T20:31:55.8291136Z ╰──── 2026-10-24T20:31:55.8291344Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:31:55.8291726Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8291765Z 2026-10-24T20:31:55.8291967Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used. 2026-10-24T20:31:55.8292111Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3] 2026-10-24T20:31:55.8292176Z 1 │ import type { 2026-10-24T20:31:55.8292242Z 2 │ EnvironmentId, 2026-10-24T20:31:55.8292322Z ·  ──────┬────── 2026-10-24T20:31:55.8292493Z · ╰── 'EnvironmentId' is imported here 2026-10-24T20:31:55.8292582Z 3 │ ExecutionEnvironmentCapabilities, 2026-10-24T20:31:55.8292639Z ╰──── 2026-10-24T20:31:55.8292742Z  help: Consider removing this import. 2026-10-24T20:31:55.8292745Z 2026-10-24T20:31:55.8292946Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used. 2026-10-24T20:31:55.8293077Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13] 2026-10-24T20:31:55.8293198Z 3 │ import type { EnvironmentThreadShell } from "./models.ts"; 2026-10-24T20:31:55.8293283Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T20:31:55.8293359Z ·  ─┬─ 2026-10-24T20:31:55.8293480Z · ╰── 'Arr' is imported here 2026-10-24T20:31:55.8293567Z 5 │ import * as Order from "effect/Order"; 2026-10-24T20:31:55.8293622Z ╰──── 2026-10-24T20:31:55.8293721Z  help: Consider removing this import. 2026-10-24T20:31:55.8293724Z 2026-10-24T20:31:55.8293916Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used. 2026-10-24T20:31:55.8294053Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13] 2026-10-24T20:31:55.8294140Z 4 │ import * as Arr from "effect/Array"; 2026-10-24T20:31:55.8294224Z 5 │ import * as Order from "effect/Order"; 2026-10-24T20:31:55.8294297Z ·  ──┬── 2026-10-24T20:31:55.8294427Z · ╰── 'Order' is imported here 2026-10-24T20:31:55.8294484Z 6 │ 2026-10-24T20:31:55.8294538Z ╰──── 2026-10-24T20:31:55.8294632Z  help: Consider removing this import. 2026-10-24T20:31:55.8294634Z 2026-10-24T20:31:55.8294881Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used. 2026-10-24T20:31:55.8294998Z ╭─[apps/web/src/lib/terminalContext.ts:56:10] 2026-10-24T20:31:55.8295054Z 55 │ 2026-10-24T20:31:55.8295154Z 56 │ function normalizeTerminalContextSelection( 2026-10-24T20:31:55.8295363Z ·  ────────────────┬──────────────── 2026-10-24T20:31:55.8295581Z · ╰── 'normalizeTerminalContextSelection' is declared here 2026-10-24T20:31:55.8295673Z 57 │ selection: TerminalContextSelection, 2026-10-24T20:31:55.8295724Z ╰──── 2026-10-24T20:31:55.8295833Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8295835Z 2026-10-24T20:31:55.8296030Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8296204Z ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15] 2026-10-24T20:31:55.8296269Z 87 │
  • { 2026-10-24T20:31:55.8298041Z  84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch; 2026-10-24T20:31:55.8298177Z  85 │ │ const connections = new Map(); 2026-10-24T20:31:55.8298250Z  86 │ │ 2026-10-24T20:31:55.8298467Z  87 │ │ const connectionFor = (connectionId: string): Effect.Effect => 2026-10-24T20:31:55.8298570Z  88 │ │ Effect.suspend(() => { 2026-10-24T20:31:55.8298706Z  89 │ │ const connection = connections.get(connectionId); 2026-10-24T20:31:55.8298821Z  90 │ │ return connection === undefined 2026-10-24T20:31:55.8299040Z  91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`)) 2026-10-24T20:31:55.8299155Z  92 │ │ : Effect.succeed(connection); 2026-10-24T20:31:55.8299232Z  93 │ │ }); 2026-10-24T20:31:55.8299300Z  94 │ │ 2026-10-24T20:31:55.8299388Z  95 │ │ const send = ( 2026-10-24T20:31:55.8299489Z  96 │ │ connection: Connection, 2026-10-24T20:31:55.8299580Z  97 │ │ message: unknown, 2026-10-24T20:31:55.8299750Z  98 │ │ ): Effect.Effect, AcpMcpOverAcpError> => 2026-10-24T20:31:55.8299876Z  99 │ │ connection.mutex.withPermits(1)( 2026-10-24T20:31:55.8299986Z 100 │ │ Effect.gen(function* () { 2026-10-24T20:31:55.8300169Z 101 │ │ const body = JSON.stringify(message); 2026-10-24T20:31:55.8300349Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) { 2026-10-24T20:31:55.8300568Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB.")); 2026-10-24T20:31:55.8300648Z 104 │ │ } 2026-10-24T20:31:55.8300784Z 105 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T20:31:55.8300884Z 106 │ │ try: (signal) => 2026-10-24T20:31:55.8301018Z 107 │ │ fetchImplementation(options.endpoint, { 2026-10-24T20:31:55.8301121Z 108 │ │ method: "POST", 2026-10-24T20:31:55.8301216Z 109 │ │ signal, 2026-10-24T20:31:55.8301314Z 110 │ │ headers: { 2026-10-24T20:31:55.8301449Z 111 │ │ "content-type": "application/json", 2026-10-24T20:31:55.8301601Z 112 │ │ accept: "application/json, text/event-stream", 2026-10-24T20:31:55.8301734Z 113 │ │ authorization: options.authorization, 2026-10-24T20:31:55.8301865Z 114 │ │ ...(connection.sessionId === null 2026-10-24T20:31:55.8301964Z 115 │ │ ? {} 2026-10-24T20:31:55.8302112Z 116 │ │ : { "mcp-session-id": connection.sessionId }), 2026-10-24T20:31:55.8302248Z 117 │ │ ...(connection.protocolVersion === null 2026-10-24T20:31:55.8302339Z 118 │ │ ? {} 2026-10-24T20:31:55.8302566Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T20:31:55.8302657Z 120 │ │ }, 2026-10-24T20:31:55.8302751Z 121 │ │ body, 2026-10-24T20:31:55.8302835Z 122 │ │ }), 2026-10-24T20:31:55.8302940Z 123 │ │ catch: bridgeError, 2026-10-24T20:31:55.8303024Z 124 │ │ }); 2026-10-24T20:31:55.8303281Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId; 2026-10-24T20:31:55.8303382Z 126 │ │ if (!response.ok) { 2026-10-24T20:31:55.8303492Z 127 │ │ yield* Effect.promise( 2026-10-24T20:31:55.8303678Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T20:31:55.8303769Z 129 │ │ ); 2026-10-24T20:31:55.8303884Z 130 │ │ return yield* Effect.fail( 2026-10-24T20:31:55.8304100Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`), 2026-10-24T20:31:55.8304184Z 132 │ │ ); 2026-10-24T20:31:55.8304266Z 133 │ │ } 2026-10-24T20:31:55.8304478Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))]; 2026-10-24T20:31:55.8304599Z 135 │ │ for (const payload of payloads) { 2026-10-24T20:31:55.8304819Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion; 2026-10-24T20:31:55.8305186Z 137 │ │ } 2026-10-24T20:31:55.8305423Z 138 │ │ return payloads; 2026-10-24T20:31:55.8305666Z 139 │ │ }).pipe(Effect.mapError(bridgeError)), 2026-10-24T20:31:55.8305883Z 140 │ │ ); 2026-10-24T20:31:55.8306048Z 141 │ │ 2026-10-24T20:31:55.8306316Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* ( 2026-10-24T20:31:55.8306626Z 143 │ │ request: AcpSchema.DisconnectMcpRequest, 2026-10-24T20:31:55.8306962Z 144 │ │ ): Effect.fn.Return { 2026-10-24T20:31:55.8307312Z 145 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:31:55.8307616Z 146 │ │ connections.delete(request.connectionId); 2026-10-24T20:31:55.8307882Z 147 │ │ const sessionId = connection.sessionId; 2026-10-24T20:31:55.8308128Z 148 │ │ if (sessionId !== null) { 2026-10-24T20:31:55.8308384Z 149 │ │ const response = yield* Effect.tryPromise({ 2026-10-24T20:31:55.8308629Z 150 │ │ try: (signal) => 2026-10-24T20:31:55.8308875Z 151 │ │ fetchImplementation(options.endpoint, { 2026-10-24T20:31:55.8309122Z 152 │ │ method: "DELETE", 2026-10-24T20:31:55.8309338Z 153 │ │ signal, 2026-10-24T20:31:55.8309546Z 154 │ │ headers: { 2026-10-24T20:31:55.8309794Z 155 │ │ authorization: options.authorization, 2026-10-24T20:31:55.8310063Z 156 │ │ "mcp-session-id": sessionId, 2026-10-24T20:31:55.8310331Z 157 │ │ ...(connection.protocolVersion === null 2026-10-24T20:31:55.8310565Z 158 │ │ ? {} 2026-10-24T20:31:55.8310839Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }), 2026-10-24T20:31:55.8311095Z 160 │ │ }, 2026-10-24T20:31:55.8311283Z 161 │ │ }), 2026-10-24T20:31:55.8311485Z 162 │ │ catch: bridgeError, 2026-10-24T20:31:55.8311682Z 163 │ │ }); 2026-10-24T20:31:55.8311915Z 164 │ │ if (!response.ok && response.status !== 404) { 2026-10-24T20:31:55.8312174Z 165 │ │ return yield* Effect.fail( 2026-10-24T20:31:55.8312418Z 166 │ │ new AcpMcpOverAcpError( 2026-10-24T20:31:55.8312786Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`, 2026-10-24T20:31:55.8313056Z 168 │ │ ), 2026-10-24T20:31:55.8313240Z 169 │ │ ); 2026-10-24T20:31:55.8313416Z 170 │ │ } 2026-10-24T20:31:55.8313623Z 171 │ │ yield* Effect.promise( 2026-10-24T20:31:55.8313925Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(), 2026-10-24T20:31:55.8314180Z 173 │ │ ); 2026-10-24T20:31:55.8314356Z 174 │ │ } 2026-10-24T20:31:55.8314535Z 175 │ │ return {}; 2026-10-24T20:31:55.8314772Z 176 │ │ }); 2026-10-24T20:31:55.8314973Z 177 │ │ 2026-10-24T20:31:55.8315144Z 178 │ │ return { 2026-10-24T20:31:55.8315421Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) { 2026-10-24T20:31:55.8315728Z 180 │ │ if (request.serverId !== "t3-code") { 2026-10-24T20:31:55.8315975Z 181 │ │ return yield* Effect.fail( 2026-10-24T20:31:55.8316295Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`), 2026-10-24T20:31:55.8316564Z 183 │ │ ); 2026-10-24T20:31:55.8316743Z 184 │ │ } 2026-10-24T20:31:55.8316969Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) { 2026-10-24T20:31:55.8317334Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections.")); 2026-10-24T20:31:55.8317624Z 187 │ │ } 2026-10-24T20:31:55.8317881Z 188 │ │ const connectionId = yield* options.allocateConnectionId; 2026-10-24T20:31:55.8318160Z 189 │ │ connections.set(connectionId, { 2026-10-24T20:31:55.8318412Z 190 │ │ mutex: yield* Semaphore.make(1), 2026-10-24T20:31:55.8318648Z 191 │ │ sessionId: null, 2026-10-24T20:31:55.8318871Z 192 │ │ protocolVersion: null, 2026-10-24T20:31:55.8319100Z 193 │ │ nextRequestId: 0, 2026-10-24T20:31:55.8319295Z 194 │ │ }); 2026-10-24T20:31:55.8319503Z 195 │ │ return { connectionId }; 2026-10-24T20:31:55.8319706Z 196 │ │ }), 2026-10-24T20:31:55.8319979Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) { 2026-10-24T20:31:55.8320323Z 198 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:31:55.8320618Z 199 │ │ const id = ++connection.nextRequestId; 2026-10-24T20:31:55.8320883Z 200 │ │ const payloads = yield* send(connection, { 2026-10-24T20:31:55.8321127Z 201 │ │ jsonrpc: "2.0", 2026-10-24T20:31:55.8321322Z 202 │ │ id, 2026-10-24T20:31:55.8321530Z 203 │ │ method: request.method, 2026-10-24T20:31:55.8321818Z 204 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T20:31:55.8322069Z 205 │ │ }); 2026-10-24T20:31:55.8322363Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id); 2026-10-24T20:31:55.8322717Z 207 │ │ const envelope = asEnvelope(response); 2026-10-24T20:31:55.8322962Z 208 │ │ if (envelope === null) { 2026-10-24T20:31:55.8323193Z 209 │ │ return yield* Effect.fail( 2026-10-24T20:31:55.8323510Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."), 2026-10-24T20:31:55.8323778Z 211 │ │ ); 2026-10-24T20:31:55.8323955Z 212 │ │ } 2026-10-24T20:31:55.8324172Z 213 │ │ if (envelope.error !== undefined) { 2026-10-24T20:31:55.8324573Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error))); 2026-10-24T20:31:55.8324877Z 215 │ │ } 2026-10-24T20:31:55.8325149Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse; 2026-10-24T20:31:55.8325399Z 217 │ │ }), 2026-10-24T20:31:55.8325693Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) { 2026-10-24T20:31:55.8326054Z 219 │ │ const connection = yield* connectionFor(request.connectionId); 2026-10-24T20:31:55.8326332Z 220 │ │ yield* send(connection, { 2026-10-24T20:31:55.8326554Z 221 │ │ jsonrpc: "2.0", 2026-10-24T20:31:55.8326771Z 222 │ │ method: request.method, 2026-10-24T20:31:55.8327063Z 223 │ │ ...(request.params == null ? {} : { params: request.params }), 2026-10-24T20:31:55.8327310Z 224 │ │ }); 2026-10-24T20:31:55.8327488Z 225 │ │ }), 2026-10-24T20:31:55.8327672Z 226 │ │ disconnect, 2026-10-24T20:31:55.8327893Z 227 │ │ dispose: Effect.suspend(() => 2026-10-24T20:31:55.8328120Z 228 │ │ Effect.forEach( 2026-10-24T20:31:55.8328344Z 229 │ │ [...connections.keys()], 2026-10-24T20:31:55.8328642Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore), 2026-10-24T20:31:55.8328924Z 231 │ │ { discard: true }, 2026-10-24T20:31:55.8329122Z 232 │ │ ), 2026-10-24T20:31:55.8329312Z 233 │ │ ), 2026-10-24T20:31:55.8329487Z 234 │ │ }; 2026-10-24T20:31:55.8329712Z 235 │ ╰─▶ }); 2026-10-24T20:31:55.8329906Z ╰──── 2026-10-24T20:31:55.8330219Z  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed. 2026-10-24T20:31:55.8330468Z 2026-10-24T20:31:55.8330688Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used. 2026-10-24T20:31:55.8331039Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10] 2026-10-24T20:31:55.8331251Z 21 │ 2026-10-24T20:31:55.8331474Z 22 │ function summarizePayload(payload: unknown): Readonly> { 2026-10-24T20:31:55.8331743Z ·  ────────┬─────── 2026-10-24T20:31:55.8332001Z · ╰── 'summarizePayload' is declared here 2026-10-24T20:31:55.8332263Z 23 │ if (payload === null) return { valueType: "null" }; 2026-10-24T20:31:55.8332467Z ╰──── 2026-10-24T20:31:55.8332633Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8332753Z 2026-10-24T20:31:55.8332996Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T20:31:55.8333394Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9] 2026-10-24T20:31:55.8333632Z 261 │ ): boolean { 2026-10-24T20:31:55.8333865Z 262 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase()); 2026-10-24T20:31:55.8334197Z ·  ───────────────────────────────────────────────────────────────────── 2026-10-24T20:31:55.8334579Z 263 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase()); 2026-10-24T20:31:55.8334831Z ╰──── 2026-10-24T20:31:55.8334964Z  help: Switch to `Set` 2026-10-24T20:31:55.8335068Z 2026-10-24T20:31:55.8335369Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:31:55.8335708Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46] 2026-10-24T20:31:55.8335902Z 40 │ 2026-10-24T20:31:55.8336079Z 41 │ expect(regionTexts()).toEqual([...first].reverse()); 2026-10-24T20:31:55.8336324Z ·  ─────── 2026-10-24T20:31:55.8336550Z 42 │ expect(regionTexts()).toContain("Claude"); 2026-10-24T20:31:55.8336720Z ╰──── 2026-10-24T20:31:55.8337057Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:31:55.8337323Z 2026-10-24T20:31:55.8337668Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8338160Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7] 2026-10-24T20:31:55.8338742Z 1443 │ 2026-10-24T20:31:55.8338929Z 1444 │ const layerCodexAppServerClientFactoryCommand = ( 2026-10-24T20:31:55.8339184Z ·  ───────────────────┬─────────────────── 2026-10-24T20:31:55.8339518Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here 2026-10-24T20:31:55.8339840Z 1445 │ options: CodexClient.CodexAppServerClientOptions & { 2026-10-24T20:31:55.8340036Z ╰──── 2026-10-24T20:31:55.8340205Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8340331Z 2026-10-24T20:31:55.8340597Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8341008Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7] 2026-10-24T20:31:55.8341235Z 1679 │ 2026-10-24T20:31:55.8341370Z 1680 │ const layer: Layer.Layer< 2026-10-24T20:31:55.8341541Z ·  ──┬── 2026-10-24T20:31:55.8341756Z · ╰── 'layer' is declared here 2026-10-24T20:31:55.8341989Z 1681 │ ProviderAdapter.ProviderAdapterV2, 2026-10-24T20:31:55.8342160Z ╰──── 2026-10-24T20:31:55.8342322Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8342459Z 2026-10-24T20:31:55.8343054Z ⚠ 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-24T20:31:55.8343706Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7] 2026-10-24T20:31:55.8343970Z 1679 │ yield* harness.replaceSession; 2026-10-24T20:31:55.8344301Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:31:55.8344662Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) { 2026-10-24T20:31:55.8344908Z 1682 │ │ break; 2026-10-24T20:31:55.8345102Z 1683 │ │ } 2026-10-24T20:31:55.8345319Z 1684 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8345583Z 1685 │ ╰─▶ } 2026-10-24T20:31:55.8345802Z 1686 │ yield* Queue.offer( 2026-10-24T20:31:55.8345955Z ╰──── 2026-10-24T20:31:55.8346012Z 2026-10-24T20:31:55.8346492Z ⚠ 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-24T20:31:55.8347078Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7] 2026-10-24T20:31:55.8347335Z 1788 │ yield* harness.replaceSession; 2026-10-24T20:31:55.8347660Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:31:55.8348025Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break; 2026-10-24T20:31:55.8348306Z 1791 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8348565Z 1792 │ ╰─▶ } 2026-10-24T20:31:55.8348849Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2); 2026-10-24T20:31:55.8349051Z ╰──── 2026-10-24T20:31:55.8349111Z 2026-10-24T20:31:55.8349351Z ⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression 2026-10-24T20:31:55.8349705Z ╭─[packages/shared/src/serverSettings.test.ts:35:7] 2026-10-24T20:31:55.8350034Z 34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) => 2026-10-24T20:31:55.8350329Z 35 │ instanceId === configured ? true : false, 2026-10-24T20:31:55.8350565Z ·  ──────────────────────────────────────── 2026-10-24T20:31:55.8350743Z 36 │ ); 2026-10-24T20:31:55.8350864Z ╰──── 2026-10-24T20:31:55.8351018Z  help: Remove this ternary operator 2026-10-24T20:31:55.8351137Z 2026-10-24T20:31:55.8351395Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used. 2026-10-24T20:31:55.8351827Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10] 2026-10-24T20:31:55.8352066Z 959 │ 2026-10-24T20:31:55.8352243Z 960 │ function layerClaudeAgentSdkReplayQueryRunner( 2026-10-24T20:31:55.8352519Z ·  ──────────────────┬───────────────── 2026-10-24T20:31:55.8352913Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here 2026-10-24T20:31:55.8353243Z 961 │ transcript: ClaudeAgentSdkReplayTranscript, 2026-10-24T20:31:55.8353424Z ╰──── 2026-10-24T20:31:55.8353589Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8353712Z 2026-10-24T20:31:55.8354189Z ⚠ 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-24T20:31:55.8354789Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7] 2026-10-24T20:31:55.8355071Z 565 │ let afterSequence = created[0]!.sequence; 2026-10-24T20:31:55.8355389Z 566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) { 2026-10-24T20:31:55.8355689Z 567 │ │ const nextEvent = { 2026-10-24T20:31:55.8355971Z 568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`), 2026-10-24T20:31:55.8356276Z 569 │ │ type: "thread.metadata-updated" as const, 2026-10-24T20:31:55.8356520Z 570 │ │ threadId, 2026-10-24T20:31:55.8356742Z 571 │ │ providerInstanceId, 2026-10-24T20:31:55.8356965Z 572 │ │ occurredAt: now, 2026-10-24T20:31:55.8357239Z 573 │ │ payload: { ...thread, title: `Race update ${index}` }, 2026-10-24T20:31:55.8357523Z 574 │ │ } satisfies OrchestrationV2DomainEvent; 2026-10-24T20:31:55.8357784Z 575 │ │ const reader = yield* eventSink 2026-10-24T20:31:55.8358046Z 576 │ │ .stream({ threadId, afterSequence }) 2026-10-24T20:31:55.8358323Z 577 │ │ .pipe(Stream.runHead, Effect.forkChild); 2026-10-24T20:31:55.8358581Z 578 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8358872Z 579 │ │ const written = yield* eventSink.write({ events: [nextEvent] }); 2026-10-24T20:31:55.8359181Z 580 │ │ const received = yield* Fiber.join(reader); 2026-10-24T20:31:55.8359443Z 581 │ │ if (Option.isNone(received)) { 2026-10-24T20:31:55.8359780Z 582 │ │ return yield* Effect.die("The event stream ended before delivering the live event."); 2026-10-24T20:31:55.8360061Z 583 │ │ } 2026-10-24T20:31:55.8360339Z 584 │ │ assert.equal(received.value.sequence, written[0]?.sequence); 2026-10-24T20:31:55.8360658Z 585 │ │ assert.equal(received.value.event.id, nextEvent.id); 2026-10-24T20:31:55.8360948Z 586 │ │ afterSequence = received.value.sequence; 2026-10-24T20:31:55.8361226Z 587 │ ╰─▶ } 2026-10-24T20:31:55.8361433Z 588 │ }), 2026-10-24T20:31:55.8361562Z ╰──── 2026-10-24T20:31:55.8361623Z 2026-10-24T20:31:55.8362103Z ⚠ 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-24T20:31:55.8362752Z ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9] 2026-10-24T20:31:55.8363076Z 2326 │ let settled = false; 2026-10-24T20:31:55.8363376Z 2327 │ ╭─▶ while (!settled) { 2026-10-24T20:31:55.8363705Z 2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every( 2026-10-24T20:31:55.8364011Z 2329 │ │ (effect) => effect.status === "succeeded", 2026-10-24T20:31:55.8364245Z 2330 │ │ ); 2026-10-24T20:31:55.8364478Z 2331 │ │ if (!settled) yield* Effect.yieldNow; 2026-10-24T20:31:55.8364760Z 2332 │ ╰─▶ } 2026-10-24T20:31:55.8365026Z 2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped); 2026-10-24T20:31:55.8365215Z ╰──── 2026-10-24T20:31:55.8365277Z 2026-10-24T20:31:55.8365551Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8365974Z ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7] 2026-10-24T20:31:55.8366203Z 409 │ 2026-10-24T20:31:55.8366398Z 410 │ const layer = Layer.effect(ThreadPullRequestServiceV2, make); 2026-10-24T20:31:55.8366624Z ·  ──┬── 2026-10-24T20:31:55.8366843Z · ╰── 'layer' is declared here 2026-10-24T20:31:55.8367036Z ╰──── 2026-10-24T20:31:55.8367203Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8367328Z 2026-10-24T20:31:55.8367515Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:31:55.8367898Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34] 2026-10-24T20:31:55.8368169Z 115 │ return [...commands]; 2026-10-24T20:31:55.8368398Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]); 2026-10-24T20:31:55.8368668Z ·  ─────────┬───────── 2026-10-24T20:31:55.8368981Z · ╰── Unnecessary dependency `registrationVersion` 2026-10-24T20:31:55.8369220Z 117 │ 2026-10-24T20:31:55.8369337Z ╰──── 2026-10-24T20:31:55.8369720Z  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-24T20:31:55.8370358Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8370679Z 2026-10-24T20:31:55.8370834Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8371156Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38] 2026-10-24T20:31:55.8371497Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T20:31:55.8371799Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T20:31:55.8372069Z ·  ───────────┬────────── 2026-10-24T20:31:55.8372374Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8372703Z 123 │ const sessionRef = useRef(null); 2026-10-24T20:31:55.8372894Z ╰──── 2026-10-24T20:31:55.8373501Z  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-24T20:31:55.8374267Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8374558Z 2026-10-24T20:31:55.8374708Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8375028Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8] 2026-10-24T20:31:55.8375324Z 125 │ 2026-10-24T20:31:55.8375499Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:31:55.8375715Z ·  ─────────┬──────── 2026-10-24T20:31:55.8375985Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8376245Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:31:55.8376424Z ╰──── 2026-10-24T20:31:55.8376959Z  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-24T20:31:55.8377695Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8377985Z 2026-10-24T20:31:55.8378132Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8378453Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7] 2026-10-24T20:31:55.8378682Z 125 │ 2026-10-24T20:31:55.8378861Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:31:55.8379074Z ·  ─────────┬───────── 2026-10-24T20:31:55.8379332Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8379594Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:31:55.8379773Z ╰──── 2026-10-24T20:31:55.8419213Z  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-24T20:31:55.8419994Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8420277Z 2026-10-24T20:31:55.8420452Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8420790Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31] 2026-10-24T20:31:55.8421011Z 125 │ 2026-10-24T20:31:55.8421188Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:31:55.8421435Z ·  ─────────┬───────── 2026-10-24T20:31:55.8421724Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8421991Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:31:55.8422164Z ╰──── 2026-10-24T20:31:55.8422857Z  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-24T20:31:55.8423617Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8423898Z 2026-10-24T20:31:55.8424047Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8424357Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30] 2026-10-24T20:31:55.8424571Z 125 │ 2026-10-24T20:31:55.8424742Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:31:55.8424972Z ·  ──────────┬───────── 2026-10-24T20:31:55.8425256Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8425522Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:31:55.8425695Z ╰──── 2026-10-24T20:31:55.8426211Z  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-24T20:31:55.8426927Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8427204Z 2026-10-24T20:31:55.8427347Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8427656Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46] 2026-10-24T20:31:55.8427931Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:31:55.8428252Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:31:55.8428607Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T20:31:55.8428905Z 129 │ │ onStatus: (status: RecordingStatus) => { 2026-10-24T20:31:55.8429193Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T20:31:55.8429470Z 131 │ │ isFinished: status.isFinished, 2026-10-24T20:31:55.8429771Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T20:31:55.8430048Z 133 │ │ error: status.error, 2026-10-24T20:31:55.8430257Z 134 │ │ url: status.url, 2026-10-24T20:31:55.8430503Z 135 │ │ }); 2026-10-24T20:31:55.8430706Z 136 │ │ }, 2026-10-24T20:31:55.8430994Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T20:31:55.8431294Z 138 │ │ selectInput: (inputs) => { 2026-10-24T20:31:55.8431567Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T20:31:55.8431868Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T20:31:55.8432179Z 141 │ │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T20:31:55.8432493Z 142 │ │ const order = rememberMicrophones(known, inputs); 2026-10-24T20:31:55.8432777Z 143 │ │ if (order !== known) { 2026-10-24T20:31:55.8433030Z 144 │ │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T20:31:55.8433286Z 145 │ │ transform: (current) => ({ 2026-10-24T20:31:55.8433610Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T20:31:55.8433895Z 147 │ │ }), 2026-10-24T20:31:55.8434076Z 148 │ │ }); 2026-10-24T20:31:55.8434249Z 149 │ │ } 2026-10-24T20:31:55.8434483Z 150 │ │ return preferredMicrophoneInput(inputs, order); 2026-10-24T20:31:55.8434703Z 151 │ │ }, 2026-10-24T20:31:55.8434930Z 152 │ ├─▶ }); 2026-10-24T20:31:55.8435303Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8435612Z 153 │ recorderRef.current = recorder; 2026-10-24T20:31:55.8435765Z ╰──── 2026-10-24T20:31:55.8436278Z  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-24T20:31:55.8436985Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8437264Z 2026-10-24T20:31:55.8437408Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8437719Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16] 2026-10-24T20:31:55.8437944Z 152 │ }); 2026-10-24T20:31:55.8438089Z 153 │ recorderRef.current = recorder; 2026-10-24T20:31:55.8438305Z ·  ─────┬─────────┬─── 2026-10-24T20:31:55.8438599Z · │ ╰── Cannot update ref value during render 2026-10-24T20:31:55.8438889Z · ╰── This value is a ref 2026-10-24T20:31:55.8439116Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:31:55.8439283Z ╰──── 2026-10-24T20:31:55.8439798Z  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-24T20:31:55.8440559Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8440868Z 2026-10-24T20:31:55.8441012Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8441314Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48] 2026-10-24T20:31:55.8441563Z 153 │ recorderRef.current = recorder; 2026-10-24T20:31:55.8441856Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:31:55.8442127Z 155 │ │ recorder, 2026-10-24T20:31:55.8442351Z 156 │ │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T20:31:55.8442651Z 157 │ │ requestPermission: async () => { 2026-10-24T20:31:55.8442941Z 158 │ │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T20:31:55.8443296Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T20:31:55.8443559Z 160 │ │ }, 2026-10-24T20:31:55.8443798Z 161 │ │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T20:31:55.8444078Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T20:31:55.8444356Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T20:31:55.8444603Z 164 │ │ onStateChange: (nextState) => 2026-10-24T20:31:55.8444816Z 165 │ │ setState({ 2026-10-24T20:31:55.8445028Z 166 │ │ state: nextState, 2026-10-24T20:31:55.8445282Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T20:31:55.8445549Z 168 │ │ label: sessionRef.current?.label ?? null, 2026-10-24T20:31:55.8445764Z 169 │ │ }), 2026-10-24T20:31:55.8445988Z 170 │ ├─▶ }); 2026-10-24T20:31:55.8446316Z · ╰──── Cannot access ref value during render 2026-10-24T20:31:55.8446559Z 171 │ } 2026-10-24T20:31:55.8446674Z ╰──── 2026-10-24T20:31:55.8447193Z  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-24T20:31:55.8447900Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8448176Z 2026-10-24T20:31:55.8448321Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8448626Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15] 2026-10-24T20:31:55.8448870Z 153 │ recorderRef.current = recorder; 2026-10-24T20:31:55.8449077Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:31:55.8449302Z ·  ─────┬────────┬─── 2026-10-24T20:31:55.8449594Z · │ ╰── Cannot update ref value during render 2026-10-24T20:31:55.8449941Z · ╰── This value is a ref 2026-10-24T20:31:55.8450158Z 155 │ recorder, 2026-10-24T20:31:55.8450288Z ╰──── 2026-10-24T20:31:55.8450800Z  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-24T20:31:55.8451510Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8451793Z 2026-10-24T20:31:55.8451940Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8452249Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7] 2026-10-24T20:31:55.8452536Z 184 │ return () => subscription.remove(); 2026-10-24T20:31:55.8452714Z 185 │ }, [controller]); 2026-10-24T20:31:55.8452876Z ·  ─────┬──── 2026-10-24T20:31:55.8453113Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8453308Z 186 │ 2026-10-24T20:31:55.8453422Z ╰──── 2026-10-24T20:31:55.8453943Z  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-24T20:31:55.8454657Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8454937Z 2026-10-24T20:31:55.8455085Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8455460Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6] 2026-10-24T20:31:55.8455708Z 184 │ return () => subscription.remove(); 2026-10-24T20:31:55.8455878Z 185 │ }, [controller]); 2026-10-24T20:31:55.8456040Z ·  ──────┬───── 2026-10-24T20:31:55.8456276Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8456476Z 186 │ 2026-10-24T20:31:55.8456586Z ╰──── 2026-10-24T20:31:55.8457103Z  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-24T20:31:55.8457823Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8458105Z 2026-10-24T20:31:55.8458248Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8458556Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6] 2026-10-24T20:31:55.8458774Z 191 │ }, 2026-10-24T20:31:55.8458912Z 192 │ [controller, recorder], 2026-10-24T20:31:55.8459080Z ·  ─────┬──── 2026-10-24T20:31:55.8459311Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8459511Z 193 │ ); 2026-10-24T20:31:55.8459624Z ╰──── 2026-10-24T20:31:55.8460213Z  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-24T20:31:55.8460960Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8461242Z 2026-10-24T20:31:55.8461388Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8461701Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20] 2026-10-24T20:31:55.8461961Z 174 │ const controller = session.controller; 2026-10-24T20:31:55.8462163Z 175 │ const recorder = recorderRef.current; 2026-10-24T20:31:55.8462382Z ·  ─────────┬───────── 2026-10-24T20:31:55.8462697Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8462922Z 176 │ 2026-10-24T20:31:55.8463036Z ╰──── 2026-10-24T20:31:55.8463569Z  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-24T20:31:55.8464298Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8464586Z 2026-10-24T20:31:55.8464731Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8465044Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5] 2026-10-24T20:31:55.8465269Z 191 │ }, 2026-10-24T20:31:55.8465413Z 192 │ [controller, recorder], 2026-10-24T20:31:55.8465601Z ·  ───────────┬────────── 2026-10-24T20:31:55.8465855Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8466063Z 193 │ ); 2026-10-24T20:31:55.8466179Z ╰──── 2026-10-24T20:31:55.8466710Z  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-24T20:31:55.8467444Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8467730Z 2026-10-24T20:31:55.8467876Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8468193Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20] 2026-10-24T20:31:55.8468460Z 245 │ return () => clearInterval(intervalId); 2026-10-24T20:31:55.8468686Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T20:31:55.8468905Z ·  ─────┬──── 2026-10-24T20:31:55.8469167Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8469377Z 247 │ 2026-10-24T20:31:55.8469492Z ╰──── 2026-10-24T20:31:55.8470022Z  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-24T20:31:55.8470810Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8471128Z 2026-10-24T20:31:55.8471277Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8471593Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6] 2026-10-24T20:31:55.8471859Z 245 │ return () => clearInterval(intervalId); 2026-10-24T20:31:55.8472083Z 246 │ }, [audioLevels, controller, recorder, state.phase]); 2026-10-24T20:31:55.8472347Z ·  ────────────────────────┬─────────────────────── 2026-10-24T20:31:55.8472669Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8472884Z 247 │ 2026-10-24T20:31:55.8473001Z ╰──── 2026-10-24T20:31:55.8473542Z  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-24T20:31:55.8474285Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8474573Z 2026-10-24T20:31:55.8474721Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8475037Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5] 2026-10-24T20:31:55.8475277Z 260 │ setOwnerFocused, 2026-10-24T20:31:55.8475433Z 261 │ session, 2026-10-24T20:31:55.8475584Z ·  ───┬─── 2026-10-24T20:31:55.8475818Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8476030Z 262 │ stop, 2026-10-24T20:31:55.8476161Z ╰──── 2026-10-24T20:31:55.8476697Z  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-24T20:31:55.8477440Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8477731Z 2026-10-24T20:31:55.8477876Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8478191Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10] 2026-10-24T20:31:55.8478418Z 250 │ 2026-10-24T20:31:55.8478683Z 251 │ ╭─▶ return { 2026-10-24T20:31:55.8479069Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null, 2026-10-24T20:31:55.8479365Z 253 │ │ state, 2026-10-24T20:31:55.8479558Z 254 │ │ audioLevels, 2026-10-24T20:31:55.8479763Z 255 │ │ elapsedSeconds, 2026-10-24T20:31:55.8480007Z 256 │ │ isBusy: voiceInputBlocksSubmission(state), 2026-10-24T20:31:55.8480239Z 257 │ │ ownerKey, 2026-10-24T20:31:55.8480421Z 258 │ │ label, 2026-10-24T20:31:55.8480610Z 259 │ │ focusedOwners, 2026-10-24T20:31:55.8480819Z 260 │ │ setOwnerFocused, 2026-10-24T20:31:55.8481014Z 261 │ │ session, 2026-10-24T20:31:55.8481205Z 262 │ │ stop, 2026-10-24T20:31:55.8481389Z 263 │ │ cancel, 2026-10-24T20:31:55.8481622Z 264 │ ├─▶ }; 2026-10-24T20:31:55.8481966Z · ╰──── Cannot access ref value during render 2026-10-24T20:31:55.8482218Z 265 │ } 2026-10-24T20:31:55.8482337Z ╰──── 2026-10-24T20:31:55.8482905Z  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-24T20:31:55.8483639Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8483930Z 2026-10-24T20:31:55.8484097Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8484419Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T20:31:55.8484757Z 121 │ const audioLevelsRef = useRef(Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0)); 2026-10-24T20:31:55.8485053Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current); 2026-10-24T20:31:55.8485277Z ·  ─────┬───── 2026-10-24T20:31:55.8485513Z · ╰── `audioLevels` originates here 2026-10-24T20:31:55.8485783Z 123 │ const sessionRef = useRef(null); 2026-10-24T20:31:55.8486067Z 124 │ const recorderRef = useRef | null>(null); 2026-10-24T20:31:55.8486285Z 125 │ 2026-10-24T20:31:55.8486463Z 126 │ if (!sessionRef.current || !recorderRef.current) { 2026-10-24T20:31:55.8486690Z 127 │ const recorder = createLazyVoiceRecorder({ 2026-10-24T20:31:55.8486954Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS), 2026-10-24T20:31:55.8487203Z 129 │ onStatus: (status: RecordingStatus) => { 2026-10-24T20:31:55.8487444Z 130 │ sessionRef.current?.controller.handleRecorderStatus({ 2026-10-24T20:31:55.8487672Z 131 │ isFinished: status.isFinished, 2026-10-24T20:31:55.8487925Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true, 2026-10-24T20:31:55.8488159Z 133 │ error: status.error, 2026-10-24T20:31:55.8488331Z 134 │ url: status.url, 2026-10-24T20:31:55.8488483Z 135 │ }); 2026-10-24T20:31:55.8488617Z 136 │ }, 2026-10-24T20:31:55.8488915Z 137 │ // Read when recording starts so preference changes do not re-render every composer. 2026-10-24T20:31:55.8489199Z 138 │ selectInput: (inputs) => { 2026-10-24T20:31:55.8489424Z 139 │ const preferences = registry.get(mobilePreferencesAtom); 2026-10-24T20:31:55.8489681Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null; 2026-10-24T20:31:55.8489949Z 141 │ const known = microphoneOrder(preferences.value.microphones); 2026-10-24T20:31:55.8490206Z 142 │ const order = rememberMicrophones(known, inputs); 2026-10-24T20:31:55.8490409Z 143 │ if (order !== known) { 2026-10-24T20:31:55.8490613Z 144 │ registry.set(updateMobilePreferencesAtom, { 2026-10-24T20:31:55.8490821Z 145 │ transform: (current) => ({ 2026-10-24T20:31:55.8491100Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs), 2026-10-24T20:31:55.8491348Z 147 │ }), 2026-10-24T20:31:55.8491417Z 148 │ }); 2026-10-24T20:31:55.8491481Z 149 │ } 2026-10-24T20:31:55.8491595Z 150 │ return preferredMicrophoneInput(inputs, order); 2026-10-24T20:31:55.8491656Z 151 │ }, 2026-10-24T20:31:55.8491713Z 152 │ }); 2026-10-24T20:31:55.8491799Z 153 │ recorderRef.current = recorder; 2026-10-24T20:31:55.8491905Z 154 │ sessionRef.current = new VoiceInputSession({ 2026-10-24T20:31:55.8491970Z 155 │ recorder, 2026-10-24T20:31:55.8492072Z 156 │ getTranscriber: getLocalVoiceTranscriber, 2026-10-24T20:31:55.8492161Z 157 │ requestPermission: async () => { 2026-10-24T20:31:55.8492295Z 158 │ const permission = await requestRecordingPermissionsAsync(); 2026-10-24T20:31:55.8492482Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain }; 2026-10-24T20:31:55.8492538Z 160 │ }, 2026-10-24T20:31:55.8492658Z 161 │ configureRecording: configureVoiceRecordingAudio, 2026-10-24T20:31:55.8492769Z 162 │ releaseRecording: releaseVoiceRecordingAudio, 2026-10-24T20:31:55.8492872Z 163 │ deleteRecording: (uri) => new File(uri).delete(), 2026-10-24T20:31:55.8492953Z 164 │ onStateChange: (nextState) => 2026-10-24T20:31:55.8493019Z 165 │ setState({ 2026-10-24T20:31:55.8493092Z 166 │ state: nextState, 2026-10-24T20:31:55.8493201Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null, 2026-10-24T20:31:55.8493300Z 168 │ label: sessionRef.current?.label ?? null, 2026-10-24T20:31:55.8493362Z 169 │ }), 2026-10-24T20:31:55.8493419Z 170 │ }); 2026-10-24T20:31:55.8493474Z 171 │ } 2026-10-24T20:31:55.8493528Z 172 │ 2026-10-24T20:31:55.8493615Z 173 │ const session = sessionRef.current; 2026-10-24T20:31:55.8493714Z 174 │ const controller = session.controller; 2026-10-24T20:31:55.8493803Z 175 │ const recorder = recorderRef.current; 2026-10-24T20:31:55.8493857Z 176 │ 2026-10-24T20:31:55.8493924Z 177 │ useEffect(() => { 2026-10-24T20:31:55.8494076Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => { 2026-10-24T20:31:55.8494219Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the 2026-10-24T20:31:55.8494361Z 180 │ // real background state cancels preparation; recorder status handles 2026-10-24T20:31:55.8494469Z 181 │ // calls and route interruptions during capture. 2026-10-24T20:31:55.8494607Z 182 │ if (nextState === "background") controller.appMovedToBackground(); 2026-10-24T20:31:55.8494663Z 183 │ }); 2026-10-24T20:31:55.8494751Z 184 │ return () => subscription.remove(); 2026-10-24T20:31:55.8494817Z 185 │ }, [controller]); 2026-10-24T20:31:55.8494923Z 186 │ 2026-10-24T20:31:55.8495015Z 187 │ useEffect( 2026-10-24T20:31:55.8495081Z 188 │ () => () => { 2026-10-24T20:31:55.8495155Z 189 │ controller.dispose(); 2026-10-24T20:31:55.8495273Z 190 │ recorder.release(); 2026-10-24T20:31:55.8495328Z 191 │ }, 2026-10-24T20:31:55.8495401Z 192 │ [controller, recorder], 2026-10-24T20:31:55.8495457Z 193 │ ); 2026-10-24T20:31:55.8495508Z 194 │ 2026-10-24T20:31:55.8495573Z 195 │ useEffect(() => { 2026-10-24T20:31:55.8495668Z 196 │ if (state.phase !== "recording") return; 2026-10-24T20:31:55.8495723Z 197 │ 2026-10-24T20:31:55.8495871Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`; 2026-10-24T20:31:55.8495979Z 199 │ const activation = activateKeepAwakeAsync(tag); 2026-10-24T20:31:55.8496066Z 200 │ void activation.catch(() => {}); 2026-10-24T20:31:55.8496138Z 201 │ return () => { 2026-10-24T20:31:55.8496292Z 202 │ // Release after activation settles, even if the recording ends immediately. 2026-10-24T20:31:55.8496436Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {}); 2026-10-24T20:31:55.8496492Z 204 │ }; 2026-10-24T20:31:55.8496574Z 205 │ }, [keepAwakeId, state.phase]); 2026-10-24T20:31:55.8496626Z 206 │ 2026-10-24T20:31:55.8496691Z 207 │ useEffect(() => { 2026-10-24T20:31:55.8496826Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T20:31:55.8496879Z 209 │ 2026-10-24T20:31:55.8497001Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T20:31:55.8497158Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T20:31:55.8497266Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T20:31:55.8497351Z ·  ─────┬───── 2026-10-24T20:31:55.8497497Z · ╰── `audioLevels` cannot be modified 2026-10-24T20:31:55.8497555Z 213 │ } 2026-10-24T20:31:55.8497610Z ╰──── 2026-10-24T20:31:55.8497885Z  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-24T20:31:55.8498202Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8498206Z 2026-10-24T20:31:55.8498411Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:31:55.8498576Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7] 2026-10-24T20:31:55.8498636Z 206 │ 2026-10-24T20:31:55.8498703Z 207 │ useEffect(() => { 2026-10-24T20:31:55.8498782Z ·  ───┬─── 2026-10-24T20:31:55.8499008Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render 2026-10-24T20:31:55.8499148Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return; 2026-10-24T20:31:55.8499205Z 209 │ 2026-10-24T20:31:55.8499329Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) { 2026-10-24T20:31:55.8499486Z 211 │ audioLevelsRef.current = Array(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0); 2026-10-24T20:31:55.8499590Z 212 │ audioLevels.value = audioLevelsRef.current; 2026-10-24T20:31:55.8499667Z ·  ─────┬───── 2026-10-24T20:31:55.8499867Z · ╰── This modifies `audioLevels` 2026-10-24T20:31:55.8499965Z 213 │ } 2026-10-24T20:31:55.8500017Z ╰──── 2026-10-24T20:31:55.8500363Z  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-24T20:31:55.8500676Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8500679Z 2026-10-24T20:31:55.8500828Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8500998Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14] 2026-10-24T20:31:55.8501083Z 26 │ const latestInput = useRef(input); 2026-10-24T20:31:55.8501160Z 27 │ latestInput.current = input; 2026-10-24T20:31:55.8501277Z ·  ─────┬─────────┬─── 2026-10-24T20:31:55.8501465Z · │ ╰── Cannot update ref value during render 2026-10-24T20:31:55.8501583Z · ╰── This value is a ref 2026-10-24T20:31:55.8501659Z 28 │ const mounted = useRef(true); 2026-10-24T20:31:55.8501712Z ╰──── 2026-10-24T20:31:55.8502191Z  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-24T20:31:55.8502517Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8502520Z 2026-10-24T20:31:55.8502900Z ⚠ 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-24T20:31:55.8503016Z ╭─[packages/contracts/src/auth.test.ts:17:12] 2026-10-24T20:31:55.8503177Z 16 │ it("decodes legacy review credentials without offering them in new grants", () => { 2026-10-24T20:31:55.8503348Z 17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([ 2026-10-24T20:31:55.8503452Z ·  ──────────────────────── 2026-10-24T20:31:55.8503519Z 18 │ "review:write", 2026-10-24T20:31:55.8503572Z ╰──── 2026-10-24T20:31:55.8503575Z 2026-10-24T20:31:55.8503947Z ⚠ 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-24T20:31:55.8504063Z ╭─[packages/contracts/src/auth.test.ts:20:18] 2026-10-24T20:31:55.8504119Z 19 │ ]); 2026-10-24T20:31:55.8504284Z 20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow(); 2026-10-24T20:31:55.8504392Z ·  ──────────────────────── 2026-10-24T20:31:55.8504527Z 21 │ expect(AuthStandardClientScopes).not.toContain("review:write"); 2026-10-24T20:31:55.8504579Z ╰──── 2026-10-24T20:31:55.8504581Z 2026-10-24T20:31:55.8504949Z ⚠ 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-24T20:31:55.8505063Z ╭─[packages/contracts/src/auth.test.ts:58:21] 2026-10-24T20:31:55.8505288Z 57 │ it("ignores unknown response permissions without falling back to broader scopes", () => { 2026-10-24T20:31:55.8505444Z 58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({ 2026-10-24T20:31:55.8505552Z ·  ──────────────────────── 2026-10-24T20:31:55.8505624Z 59 │ authenticated: true, 2026-10-24T20:31:55.8505680Z ╰──── 2026-10-24T20:31:55.8505682Z 2026-10-24T20:31:55.8506147Z ⚠ 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-24T20:31:55.8506274Z ╭─[packages/contracts/src/baseSchemas.test.ts:39:9] 2026-10-24T20:31:55.8506343Z 38 │ JSON.stringify( 2026-10-24T20:31:55.8506473Z 39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([ 2026-10-24T20:31:55.8506587Z ·  ──────────────────────── 2026-10-24T20:31:55.8506695Z 40 │ { name: "a" }, 2026-10-24T20:31:55.8506776Z ╰──── 2026-10-24T20:31:55.8506779Z 2026-10-24T20:31:55.8507012Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8507181Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5] 2026-10-24T20:31:55.8507285Z 65 │ const [expanded, setExpanded] = useState(false); 2026-10-24T20:31:55.8507372Z 66 │ const progress = useSharedValue(0); 2026-10-24T20:31:55.8507449Z ·  ────┬─── 2026-10-24T20:31:55.8507585Z · ╰── `progress` originates here 2026-10-24T20:31:55.8507650Z 67 │ useEffect(() => { 2026-10-24T20:31:55.8507785Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING); 2026-10-24T20:31:55.8507861Z ·  ────┬─── 2026-10-24T20:31:55.8507998Z · ╰── `progress` cannot be modified 2026-10-24T20:31:55.8508069Z 69 │ }, [expanded, progress]); 2026-10-24T20:31:55.8508123Z ╰──── 2026-10-24T20:31:55.8508397Z  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-24T20:31:55.8508708Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8508711Z 2026-10-24T20:31:55.8508871Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8509040Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5] 2026-10-24T20:31:55.8509103Z 90 │ }) { 2026-10-24T20:31:55.8509222Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0); 2026-10-24T20:31:55.8509296Z ·  ────┬─── 2026-10-24T20:31:55.8509425Z · ╰── `rotation` originates here 2026-10-24T20:31:55.8509498Z 92 │ useLayoutEffect(() => { 2026-10-24T20:31:55.8509641Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING); 2026-10-24T20:31:55.8509715Z ·  ────┬─── 2026-10-24T20:31:55.8509846Z · ╰── `rotation` cannot be modified 2026-10-24T20:31:55.8509925Z 94 │ }, [props.hidden, rotation]); 2026-10-24T20:31:55.8509980Z ╰──── 2026-10-24T20:31:55.8510248Z  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-24T20:31:55.8510623Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8510654Z 2026-10-24T20:31:55.8510814Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8510987Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5] 2026-10-24T20:31:55.8511087Z 266 │ const variant = props.variant ?? "plain"; 2026-10-24T20:31:55.8511219Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0); 2026-10-24T20:31:55.8511310Z ·  ────────┬──────── 2026-10-24T20:31:55.8511462Z · ╰── `loadingVisibility` originates here 2026-10-24T20:31:55.8511532Z 268 │ useLayoutEffect(() => { 2026-10-24T20:31:55.8511697Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING); 2026-10-24T20:31:55.8511785Z ·  ────────┬──────── 2026-10-24T20:31:55.8511937Z · ╰── `loadingVisibility` cannot be modified 2026-10-24T20:31:55.8512031Z 270 │ }, [loadingVisibility, props.loading]); 2026-10-24T20:31:55.8512083Z ╰──── 2026-10-24T20:31:55.8512351Z  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-24T20:31:55.8512707Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8512710Z 2026-10-24T20:31:55.8512867Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8513045Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5] 2026-10-24T20:31:55.8513103Z 325 │ }) { 2026-10-24T20:31:55.8513267Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0); 2026-10-24T20:31:55.8513359Z ·  ─────────┬───────── 2026-10-24T20:31:55.8513516Z · ╰── `recordingVisibility` originates here 2026-10-24T20:31:55.8513584Z 327 │ useLayoutEffect(() => { 2026-10-24T20:31:55.8513776Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING); 2026-10-24T20:31:55.8513865Z ·  ─────────┬───────── 2026-10-24T20:31:55.8514023Z · ╰── `recordingVisibility` cannot be modified 2026-10-24T20:31:55.8514164Z 329 │ }, [props.phase, recordingVisibility]); 2026-10-24T20:31:55.8514268Z ╰──── 2026-10-24T20:31:55.8514536Z  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-24T20:31:55.8514847Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8514850Z 2026-10-24T20:31:55.8515152Z ⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8515320Z ╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7] 2026-10-24T20:31:55.8515374Z 345 │ 2026-10-24T20:31:55.8515480Z 346 │ const layerFromProviderAdapter: Layer.Layer< 2026-10-24T20:31:55.8515580Z ·  ────────────┬─────────── 2026-10-24T20:31:55.8515749Z · ╰── 'layerFromProviderAdapter' is declared here 2026-10-24T20:31:55.8515831Z 347 │ ProviderAdapterRegistryV2, 2026-10-24T20:31:55.8515885Z ╰──── 2026-10-24T20:31:55.8515990Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8515994Z 2026-10-24T20:31:55.8516162Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8516283Z ╭─[apps/web/src/components/Sidebar.tsx:1136:11] 2026-10-24T20:31:55.8516387Z 1135 │ foldSearchQuery(threadSearchQuery), 2026-10-24T20:31:55.8516456Z 1136 │ Date.now(), 2026-10-24T20:31:55.8516537Z ·  ─────┬──── 2026-10-24T20:31:55.8516671Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8516822Z 1137 │ // A list filter, as on mobile: a pick would move rows unexplained. 2026-10-24T20:31:55.8516881Z ╰──── 2026-10-24T20:31:55.8517172Z  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-24T20:31:55.8517474Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8517477Z 2026-10-24T20:31:55.8517739Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8517918Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7] 2026-10-24T20:31:55.8517972Z 118 │ 2026-10-24T20:31:55.8518045Z 119 │ useEffect(() => { 2026-10-24T20:31:55.8518121Z ·  ────┬──── 2026-10-24T20:31:55.8518252Z · ╰── This is the containing effect 2026-10-24T20:31:55.8518335Z 120 │ if (orientationSettled) return; 2026-10-24T20:31:55.8518453Z 121 │ const orientation = getNativeShowcaseOrientation(); 2026-10-24T20:31:55.8518532Z 122 │ if (orientation === null) { 2026-10-24T20:31:55.8518617Z 123 │ setOrientationSettled(true); 2026-10-24T20:31:55.8518707Z ·  ──────────┬────────── 2026-10-24T20:31:55.8518884Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8518950Z 124 │ return; 2026-10-24T20:31:55.8519003Z ╰──── 2026-10-24T20:31:55.8519664Z  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-24T20:31:55.8520021Z  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-24T20:31:55.8520024Z 2026-10-24T20:31:55.8520286Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8520460Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7] 2026-10-24T20:31:55.8520515Z 292 │ 2026-10-24T20:31:55.8520582Z 293 │ useEffect(() => { 2026-10-24T20:31:55.8520657Z ·  ────┬──── 2026-10-24T20:31:55.8520793Z · ╰── This is the containing effect 2026-10-24T20:31:55.8520854Z 294 │ if ( 2026-10-24T20:31:55.8520926Z 295 │ scene === null || 2026-10-24T20:31:55.8521007Z 296 │ requestedScene === null || 2026-10-24T20:31:55.8521088Z 297 │ scene !== requestedScene || 2026-10-24T20:31:55.8521153Z 298 │ !hasFixture || 2026-10-24T20:31:55.8521226Z 299 │ !orientationSettled || 2026-10-24T20:31:55.8521294Z 300 │ !themeApplied || 2026-10-24T20:31:55.8521412Z 301 │ (scene === "agent-activity" && !agentActivityStaged) || 2026-10-24T20:31:55.8521551Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal }) 2026-10-24T20:31:55.8521606Z 303 │ ) { 2026-10-24T20:31:55.8521679Z 304 │ setReadyScene(null); 2026-10-24T20:31:55.8521761Z ·  ──────┬────── 2026-10-24T20:31:55.8521942Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8522007Z 305 │ return; 2026-10-24T20:31:55.8522058Z ╰──── 2026-10-24T20:31:55.8522702Z  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-24T20:31:55.8523030Z  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-24T20:31:55.8523033Z 2026-10-24T20:31:55.8523311Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8523485Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9] 2026-10-24T20:31:55.8523557Z 127 │ let cancelled = false; 2026-10-24T20:31:55.8523650Z 128 │ let lastOutcome: string | null = null; 2026-10-24T20:31:55.8523731Z ·  ─────┬───── 2026-10-24T20:31:55.8523866Z · ╰── 'lastOutcome' is declared here 2026-10-24T20:31:55.8524050Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), { 2026-10-24T20:31:55.8524104Z ╰──── 2026-10-24T20:31:55.8524212Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8524215Z 2026-10-24T20:31:55.8524473Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8524695Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5] 2026-10-24T20:31:55.8524805Z 76 │ 2026-10-24T20:31:55.8524873Z 77 │ useEffect(() => { 2026-10-24T20:31:55.8524945Z ·  ────┬──── 2026-10-24T20:31:55.8525074Z · ╰── This is the containing effect 2026-10-24T20:31:55.8525205Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl); 2026-10-24T20:31:55.8525275Z 79 │ setHostInput(host); 2026-10-24T20:31:55.8525350Z ·  ──────┬───── 2026-10-24T20:31:55.8525523Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8525592Z 80 │ setCodeInput(code); 2026-10-24T20:31:55.8525646Z ╰──── 2026-10-24T20:31:55.8526257Z  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-24T20:31:55.8526588Z  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-24T20:31:55.8526590Z 2026-10-24T20:31:55.8526850Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8527022Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5] 2026-10-24T20:31:55.8527075Z 82 │ 2026-10-24T20:31:55.8527138Z 83 │ useEffect(() => { 2026-10-24T20:31:55.8527212Z ·  ────┬──── 2026-10-24T20:31:55.8527345Z · ╰── This is the containing effect 2026-10-24T20:31:55.8527440Z 84 │ if (routePairingUrl.length === 0) { 2026-10-24T20:31:55.8527502Z 85 │ return; 2026-10-24T20:31:55.8527559Z 86 │ } 2026-10-24T20:31:55.8527612Z 87 │ 2026-10-24T20:31:55.8527729Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl); 2026-10-24T20:31:55.8527798Z 89 │ setHostInput(host); 2026-10-24T20:31:55.8527876Z ·  ──────┬───── 2026-10-24T20:31:55.8528047Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8528112Z 90 │ setCodeInput(code); 2026-10-24T20:31:55.8528165Z ╰──── 2026-10-24T20:31:55.8528777Z  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-24T20:31:55.8529110Z  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-24T20:31:55.8529113Z 2026-10-24T20:31:55.8529372Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8529541Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7] 2026-10-24T20:31:55.8529595Z 92 │ 2026-10-24T20:31:55.8529661Z 93 │ useEffect(() => { 2026-10-24T20:31:55.8529733Z ·  ────┬──── 2026-10-24T20:31:55.8529908Z · ╰── This is the containing effect 2026-10-24T20:31:55.8530025Z 94 │ if (pairingConnectionError) { 2026-10-24T20:31:55.8530102Z 95 │ setIsSubmitting(false); 2026-10-24T20:31:55.8530185Z ·  ───────┬─────── 2026-10-24T20:31:55.8530358Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8530416Z 96 │ } 2026-10-24T20:31:55.8530469Z ╰──── 2026-10-24T20:31:55.8531078Z  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-24T20:31:55.8531410Z  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-24T20:31:55.8531415Z 2026-10-24T20:31:55.8531893Z ⚠ 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-24T20:31:55.8532021Z ╭─[packages/shared/src/atomicWrite.test.ts:139:5] 2026-10-24T20:31:55.8532099Z 138 │ Effect.gen(function* () { 2026-10-24T20:31:55.8532300Z 139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) { 2026-10-24T20:31:55.8532436Z 140 │ │ yield* TestClock.adjust("100 millis"); 2026-10-24T20:31:55.8532799Z 141 │ │ // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock 2026-10-24T20:31:55.8532993Z 142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve))); 2026-10-24T20:31:55.8533124Z 143 │ ╰─▶ } 2026-10-24T20:31:55.8533217Z 144 │ return yield* Fiber.join(fiber); 2026-10-24T20:31:55.8533269Z ╰──── 2026-10-24T20:31:55.8533272Z 2026-10-24T20:31:55.8533491Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`. 2026-10-24T20:31:55.8533633Z ╭─[packages/shared/src/composerContextLegacySend.ts:19:45] 2026-10-24T20:31:55.8533762Z 18 │ const occurrences = collectComposerContextReferences(text); 2026-10-24T20:31:55.8533869Z 19 │ for (const occurrence of [...occurrences].reverse()) { 2026-10-24T20:31:55.8533992Z ·  ─────── 2026-10-24T20:31:55.8534109Z 20 │ const record = recordsById.get(occurrence.contextId); 2026-10-24T20:31:55.8534161Z ╰──── 2026-10-24T20:31:55.8534424Z  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original. 2026-10-24T20:31:55.8534427Z 2026-10-24T20:31:55.8534893Z ⚠ 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-24T20:31:55.8535032Z ╭─[packages/contracts/src/composerContext.test.ts:181:18] 2026-10-24T20:31:55.8535170Z 180 │ it("sends a message without the records the wire cannot carry", () => { 2026-10-24T20:31:55.8535539Z 181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({ 2026-10-24T20:31:55.8535685Z ·  ──────────────────────── 2026-10-24T20:31:55.8535754Z 182 │ version: 1, 2026-10-24T20:31:55.8535810Z ╰──── 2026-10-24T20:31:55.8535812Z 2026-10-24T20:31:55.8536022Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T20:31:55.8536129Z ╭─[packages/contracts/src/rpc.ts:297:8] 2026-10-24T20:31:55.8536198Z 296 │ } from "./device.ts"; 2026-10-24T20:31:55.8536294Z 297 │ import {} from "./previewAutomation.ts"; 2026-10-24T20:31:55.8536366Z ·  ── 2026-10-24T20:31:55.8536424Z 298 │ import { 2026-10-24T20:31:55.8536478Z ╰──── 2026-10-24T20:31:55.8536563Z  help: Remove empty braces 2026-10-24T20:31:55.8536566Z 2026-10-24T20:31:55.8536740Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8536898Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47] 2026-10-24T20:31:55.8537034Z 371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props; 2026-10-24T20:31:55.8537194Z 372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : []; 2026-10-24T20:31:55.8537313Z ·  ─────┬──── 2026-10-24T20:31:55.8537477Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8537542Z 373 │ return ( 2026-10-24T20:31:55.8537595Z ╰──── 2026-10-24T20:31:55.8537885Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8538189Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8538193Z 2026-10-24T20:31:55.8538360Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8538509Z ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39] 2026-10-24T20:31:55.8538607Z 852 │ if (snoozeGateClock.thread !== thread) { 2026-10-24T20:31:55.8538739Z 853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() }); 2026-10-24T20:31:55.8538848Z ·  ─────┬──── 2026-10-24T20:31:55.8539008Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8539113Z 854 │ } 2026-10-24T20:31:55.8539197Z ╰──── 2026-10-24T20:31:55.8539475Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8539777Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8539780Z 2026-10-24T20:31:55.8540006Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:31:55.8540127Z ╭─[packages/shared/src/serverSettings.ts:346:9] 2026-10-24T20:31:55.8540230Z 345 │ const entry: ProjectSettingsOverrides = { 2026-10-24T20:31:55.8540365Z 346 │ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}), 2026-10-24T20:31:55.8540529Z ·  ────────────────────────────────────────────────────────────── 2026-10-24T20:31:55.8540592Z 347 │ }; 2026-10-24T20:31:55.8540644Z ╰──── 2026-10-24T20:31:55.8540914Z  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-24T20:31:55.8540917Z 2026-10-24T20:31:55.8541143Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce() 2026-10-24T20:31:55.8541263Z ╭─[packages/shared/src/serverSettings.ts:448:24] 2026-10-24T20:31:55.8541333Z 447 │ const favorites = 2026-10-24T20:31:55.8541442Z 448 │ setModelFavorites?.reduce((current, change) => { 2026-10-24T20:31:55.8541531Z ·  ───┬── 2026-10-24T20:31:55.8541666Z · ╰── For this reduce 2026-10-24T20:31:55.8541753Z 449 │ const exists = current.some( 2026-10-24T20:31:55.8541926Z 450 │ (favorite) => favorite.provider === change.provider && favorite.model === change.model, 2026-10-24T20:31:55.8541984Z 451 │ ); 2026-10-24T20:31:55.8542059Z 452 │ return change.favorite 2026-10-24T20:31:55.8542123Z 453 │ ? exists 2026-10-24T20:31:55.8542185Z 454 │ ? current 2026-10-24T20:31:55.8542323Z 455 │ : [...current, { provider: change.provider, model: change.model }] 2026-10-24T20:31:55.8542411Z ·  ─────┬──── 2026-10-24T20:31:55.8542576Z · ╰── From this spread 2026-10-24T20:31:55.8542647Z 456 │ : current.filter( 2026-10-24T20:31:55.8542700Z ╰──── 2026-10-24T20:31:55.8542914Z  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead. 2026-10-24T20:31:55.8543075Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:31:55.8543079Z 2026-10-24T20:31:55.8543267Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops 2026-10-24T20:31:55.8543386Z ╭─[packages/shared/src/serverSettings.ts:466:3] 2026-10-24T20:31:55.8543446Z 464 │ null; 2026-10-24T20:31:55.8543562Z 465 │ let nextModelPreferences = initialModelPreferences; 2026-10-24T20:31:55.8543651Z ·  ──────────┬───────── 2026-10-24T20:31:55.8543780Z · ╰── From this accumulator 2026-10-24T20:31:55.8543884Z 466 │ for (const change of setModelsHidden ?? []) { 2026-10-24T20:31:55.8543954Z ·  ─┬─ 2026-10-24T20:31:55.8544107Z · ╰── For this loop 2026-10-24T20:31:55.8544282Z 467 │ const preferences = nextModelPreferences?.[change.provider] ?? { 2026-10-24T20:31:55.8544352Z 468 │ hiddenModels: [], 2026-10-24T20:31:55.8544420Z 469 │ modelOrder: [], 2026-10-24T20:31:55.8544476Z 470 │ }; 2026-10-24T20:31:55.8544656Z 471 │ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model); 2026-10-24T20:31:55.8544768Z 472 │ if (change.hidden) hiddenModels.push(change.model); 2026-10-24T20:31:55.8544843Z 473 │ nextModelPreferences = { 2026-10-24T20:31:55.8544922Z 474 │ ...nextModelPreferences, 2026-10-24T20:31:55.8545019Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8545145Z · ╰── From this spread 2026-10-24T20:31:55.8545264Z 475 │ [change.provider]: { ...preferences, hiddenModels }, 2026-10-24T20:31:55.8545322Z ╰──── 2026-10-24T20:31:55.8545480Z  help: Consider using `Object.assign()` to mutate the accumulator instead. 2026-10-24T20:31:55.8545639Z  note: Using spreads within accumulators leads to `O(n^2)` time complexity. 2026-10-24T20:31:55.8545642Z 2026-10-24T20:31:55.8546121Z ⚠ 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-24T20:31:55.8546303Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5] 2026-10-24T20:31:55.8546378Z 222 │ let idlePasses = 0; 2026-10-24T20:31:55.8546524Z 223 │ ╭─▶ for (;;) { 2026-10-24T20:31:55.8546673Z 224 │ │ yield* Effect.promise(() => Promise.resolve()); 2026-10-24T20:31:55.8546819Z 225 │ │ const pending = backgroundRuntime.pending.shift(); 2026-10-24T20:31:55.8546917Z 226 │ │ if (!pending) { 2026-10-24T20:31:55.8547014Z 227 │ │ idlePasses++; 2026-10-24T20:31:55.8547121Z 228 │ │ if (idlePasses >= 3) { 2026-10-24T20:31:55.8547208Z 229 │ │ return; 2026-10-24T20:31:55.8547292Z 230 │ │ } 2026-10-24T20:31:55.8547386Z 231 │ │ continue; 2026-10-24T20:31:55.8547467Z 232 │ │ } 2026-10-24T20:31:55.8547564Z 233 │ │ idlePasses = 0; 2026-10-24T20:31:55.8547691Z 234 │ │ const exit = yield* Effect.exit( 2026-10-24T20:31:55.8547915Z 235 │ │ pending.operation as Effect.Effect, 2026-10-24T20:31:55.8547997Z 236 │ │ ); 2026-10-24T20:31:55.8548105Z 237 │ │ yield* Effect.sync(() => { 2026-10-24T20:31:55.8548215Z 238 │ │ pending.resolve(exit); 2026-10-24T20:31:55.8548300Z 239 │ │ }); 2026-10-24T20:31:55.8548437Z 240 │ ╰─▶ } 2026-10-24T20:31:55.8548495Z 241 │ }, 2026-10-24T20:31:55.8548552Z ╰──── 2026-10-24T20:31:55.8548555Z 2026-10-24T20:31:55.8548749Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8548910Z ╭─[packages/shared/src/qrCode.ts:458:44] 2026-10-24T20:31:55.8549007Z 457 │ ): Array { 2026-10-24T20:31:55.8549119Z 458 │ let result: Array = divisor.map((_) => 0); 2026-10-24T20:31:55.8549226Z ·  ┬ 2026-10-24T20:31:55.8549377Z · ╰── '_' is declared here 2026-10-24T20:31:55.8549448Z 459 │ for (const b of data) { 2026-10-24T20:31:55.8549507Z ╰──── 2026-10-24T20:31:55.8549617Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8549619Z 2026-10-24T20:31:55.8549825Z ⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used. 2026-10-24T20:31:55.8549965Z ╭─[packages/provider-pi/src/server/adapter.test.ts:24:13] 2026-10-24T20:31:55.8550067Z 23 │ import * as Deferred from "effect/Deferred"; 2026-10-24T20:31:55.8550166Z 24 │ import * as Duration from "effect/Duration"; 2026-10-24T20:31:55.8550250Z ·  ────┬─── 2026-10-24T20:31:55.8550390Z · ╰── 'Duration' is imported here 2026-10-24T20:31:55.8550479Z 25 │ import * as Effect from "effect/Effect"; 2026-10-24T20:31:55.8550533Z ╰──── 2026-10-24T20:31:55.8550638Z  help: Consider removing this import. 2026-10-24T20:31:55.8550641Z 2026-10-24T20:31:55.8550880Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence. 2026-10-24T20:31:55.8551020Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13] 2026-10-24T20:31:55.8551148Z 984 │ const changedBeforeDecline = draftChangedSinceSend(); 2026-10-24T20:31:55.8551401Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map( 2026-10-24T20:31:55.8551557Z 986 │ │ (approval) => approval.requestId, 2026-10-24T20:31:55.8551705Z 987 │ ╰─▶ ); 2026-10-24T20:31:55.8551876Z 988 │ const approvalResponding = approvalsToDecline.some((approval) => 2026-10-24T20:31:55.8551963Z ╰──── 2026-10-24T20:31:55.8552057Z  help: Switch to `Set` 2026-10-24T20:31:55.8552060Z 2026-10-24T20:31:55.8552388Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:31:55.8552613Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50] 2026-10-24T20:31:55.8552710Z 289 │ return ( 2026-10-24T20:31:55.8552876Z 290 │ 2026-10-24T20:31:55.8553025Z ·  ───────────── 2026-10-24T20:31:55.8553135Z 291 │ {props.children} 2026-10-24T20:31:55.8553224Z ╰──── 2026-10-24T20:31:55.8553488Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:31:55.8553639Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:31:55.8553642Z 2026-10-24T20:31:55.8553936Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:31:55.8554131Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44] 2026-10-24T20:31:55.8554226Z 653 │ return ( 2026-10-24T20:31:55.8554417Z 654 │ 2026-10-24T20:31:55.8554650Z ·  ───────────── 2026-10-24T20:31:55.8554762Z 655 │ {props.children} 2026-10-24T20:31:55.8554846Z ╰──── 2026-10-24T20:31:55.8555085Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:31:55.8555248Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:31:55.8555251Z 2026-10-24T20:31:55.8555542Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:31:55.8555735Z ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55] 2026-10-24T20:31:55.8555827Z 1461 │ return ( 2026-10-24T20:31:55.8556010Z 1462 │ 2026-10-24T20:31:55.8556184Z ·  ──────────────────── 2026-10-24T20:31:55.8556320Z 1463 │ 0 && !threadSearchQuery.startsWith(">") && !isOpen) { 2026-10-24T20:31:55.8557640Z 152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now()); 2026-10-24T20:31:55.8557801Z ·  ─────┬──── 2026-10-24T20:31:55.8558007Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8558097Z 153 │ } 2026-10-24T20:31:55.8558163Z ╰──── 2026-10-24T20:31:55.8558480Z  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-24T20:31:55.8558830Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8558833Z 2026-10-24T20:31:55.8559036Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8559229Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76] 2026-10-24T20:31:55.8559430Z 697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() })); 2026-10-24T20:31:55.8559634Z 698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() }); 2026-10-24T20:31:55.8559811Z ·  ─────┬──── 2026-10-24T20:31:55.8560027Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8560182Z 699 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString(); 2026-10-24T20:31:55.8560258Z ╰──── 2026-10-24T20:31:55.8560649Z  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-24T20:31:55.8561063Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8561066Z 2026-10-24T20:31:55.8561263Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8561437Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:71] 2026-10-24T20:31:55.8561552Z 718 │ const snoozePresets = useMemo( 2026-10-24T20:31:55.8561775Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T20:31:55.8561944Z ·  ─────┬──── 2026-10-24T20:31:55.8562141Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8562286Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T20:31:55.8562392Z ╰──── 2026-10-24T20:31:55.8562746Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8563075Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8563078Z 2026-10-24T20:31:55.8563275Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:31:55.8563469Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:720:6] 2026-10-24T20:31:55.8563691Z 719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)), 2026-10-24T20:31:55.8563836Z 720 │ [props.snoozePresetMinute, swipeActions.secondary], 2026-10-24T20:31:55.8563944Z ·  ────────────┬─────────── 2026-10-24T20:31:55.8564146Z · ╰── Unnecessary dependency `props.snoozePresetMinute` 2026-10-24T20:31:55.8564258Z 721 │ ); 2026-10-24T20:31:55.8564385Z ╰──── 2026-10-24T20:31:55.8564717Z  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-24T20:31:55.8565137Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8565177Z 2026-10-24T20:31:55.8565395Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:31:55.8565587Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:766:7] 2026-10-24T20:31:55.8565687Z 765 │ thread.pinnedAt, 2026-10-24T20:31:55.8565765Z 766 │ variant, 2026-10-24T20:31:55.8565868Z ·  ───┬─── 2026-10-24T20:31:55.8566053Z · ╰── Unnecessary dependency `variant` 2026-10-24T20:31:55.8566142Z 767 │ ], 2026-10-24T20:31:55.8566208Z ╰──── 2026-10-24T20:31:55.8566558Z  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-24T20:31:55.8566910Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8566916Z 2026-10-24T20:31:55.8567152Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8567344Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1216:21] 2026-10-24T20:31:55.8567494Z 1215 │ {providerDrivers.slice(0, -1).map((driver, index) => ( 2026-10-24T20:31:55.8567653Z 1216 │ 2026-10-24T20:31:55.8567861Z ·  ────────────────────────── 2026-10-24T20:31:55.8568005Z 1217 │ 2026-10-24T20:31:55.8568079Z ╰──── 2026-10-24T20:31:55.8568267Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:31:55.8568272Z 2026-10-24T20:31:55.8568565Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8568733Z ╭─[packages/provider-pi/src/server/adapter.ts:3405:7] 2026-10-24T20:31:55.8568823Z 3404 │ 2026-10-24T20:31:55.8569027Z 3405 │ const layer: Layer.Layer = 2026-10-24T20:31:55.8569121Z ·  ──┬── 2026-10-24T20:31:55.8569296Z · ╰── 'layer' is declared here 2026-10-24T20:31:55.8569401Z 3406 │ Layer.effect( 2026-10-24T20:31:55.8569469Z ╰──── 2026-10-24T20:31:55.8569611Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8569614Z 2026-10-24T20:31:55.8569871Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used. 2026-10-24T20:31:55.8570005Z ╭─[apps/web/src/types.ts:22:3] 2026-10-24T20:31:55.8570095Z 21 │ EnvironmentThreadShell, 2026-10-24T20:31:55.8570192Z 22 │ ThreadRunSummary, 2026-10-24T20:31:55.8570307Z ·  ────────┬─────── 2026-10-24T20:31:55.8570541Z · ╰── 'ThreadRunSummary' is imported here 2026-10-24T20:31:55.8570627Z 23 │ ThreadRuntimeSummary, 2026-10-24T20:31:55.8570710Z ╰──── 2026-10-24T20:31:55.8570843Z  help: Consider removing this import. 2026-10-24T20:31:55.8570845Z 2026-10-24T20:31:55.8571058Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`. 2026-10-24T20:31:55.8571264Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19] 2026-10-24T20:31:55.8571452Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start); 2026-10-24T20:31:55.8571573Z 194 │ const codes = new Array(count); 2026-10-24T20:31:55.8571704Z ·  ──────────────────────── 2026-10-24T20:31:55.8571839Z 195 │ for (let index = 0; index < count; index += 1) { 2026-10-24T20:31:55.8571932Z ╰──── 2026-10-24T20:31:55.8572391Z  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-24T20:31:55.8572394Z 2026-10-24T20:31:55.8572724Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8572916Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5] 2026-10-24T20:31:55.8572996Z 404 │ 2026-10-24T20:31:55.8573095Z 405 │ useEffect(() => { 2026-10-24T20:31:55.8573255Z ·  ────┬──── 2026-10-24T20:31:55.8573414Z · ╰── This is the containing effect 2026-10-24T20:31:55.8573532Z 406 │ setInspectorSelection((current) => { 2026-10-24T20:31:55.8573661Z ·  ──────────┬────────── 2026-10-24T20:31:55.8573866Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8574005Z 407 │ if (props.renderInspector === undefined) { 2026-10-24T20:31:55.8574064Z ╰──── 2026-10-24T20:31:55.8574728Z  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-24T20:31:55.8575085Z  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-24T20:31:55.8575088Z 2026-10-24T20:31:55.8575400Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:31:55.8575575Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24] 2026-10-24T20:31:55.8575761Z 533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top; 2026-10-24T20:31:55.8575971Z 534 │ ╭─▶ const GitInspector = () => ( 2026-10-24T20:31:55.8576101Z 535 │ │ 2026-10-24T20:31:55.8576937Z 540 │ ╰─▶ ); 2026-10-24T20:31:55.8577041Z 541 │ const FilesInspector = () => 2026-10-24T20:31:55.8577118Z ╰──── 2026-10-24T20:31:55.8577378Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T20:31:55.8577381Z 2026-10-24T20:31:55.8577698Z ⚠ react(no-unstable-nested-components): Do not define components during render. 2026-10-24T20:31:55.8577921Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26] 2026-10-24T20:31:55.8577986Z 540 │ ); 2026-10-24T20:31:55.8578204Z 541 │ ╭─▶ const FilesInspector = () => 2026-10-24T20:31:55.8578384Z 542 │ │ selectedThread !== null && selectedThreadCwd !== null ? ( 2026-10-24T20:31:55.8578521Z 543 │ │ 2026-10-24T20:31:55.8579798Z 551 │ ╰─▶ ) : null; 2026-10-24T20:31:55.8579979Z 552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset); 2026-10-24T20:31:55.8580044Z ╰──── 2026-10-24T20:31:55.8580298Z  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props. 2026-10-24T20:31:55.8580300Z 2026-10-24T20:31:55.8580773Z ⚠ 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-24T20:31:55.8580956Z ╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20] 2026-10-24T20:31:55.8581068Z 262 │ ...(update._meta !== undefined 2026-10-24T20:31:55.8581240Z 263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null } 2026-10-24T20:31:55.8581382Z ·  ───────── 2026-10-24T20:31:55.8581474Z 264 │ : {}), 2026-10-24T20:31:55.8581560Z ╰──── 2026-10-24T20:31:55.8581563Z 2026-10-24T20:31:55.8581791Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:31:55.8582001Z ╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7] 2026-10-24T20:31:55.8582124Z 248 │ mountedRef.current = false; 2026-10-24T20:31:55.8582233Z 249 │ flow.setBranchQuery(""); 2026-10-24T20:31:55.8582317Z ·  ──┬─ 2026-10-24T20:31:55.8582500Z · ╰── Missing dependency `flow` 2026-10-24T20:31:55.8582661Z 250 │ }; 2026-10-24T20:31:55.8582765Z 251 │ }, [flow.setBranchQuery]); 2026-10-24T20:31:55.8582865Z ·  ─────────┬───────── 2026-10-24T20:31:55.8583103Z · ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead 2026-10-24T20:31:55.8583191Z 252 │ 2026-10-24T20:31:55.8583279Z ╰──── 2026-10-24T20:31:55.8583766Z  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-24T20:31:55.8584140Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8584143Z 2026-10-24T20:31:55.8584318Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8584519Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7] 2026-10-24T20:31:55.8584648Z 53 │ function usePulseAnimation(pulse: boolean) { 2026-10-24T20:31:55.8584754Z 54 │ const pulseProgress = useSharedValue(0); 2026-10-24T20:31:55.8584865Z ·  ──────┬────── 2026-10-24T20:31:55.8585035Z · ╰── `pulseProgress` originates here 2026-10-24T20:31:55.8585133Z 55 │ 2026-10-24T20:31:55.8585211Z 56 │ useEffect(() => { 2026-10-24T20:31:55.8585311Z 57 │ if (pulse) { 2026-10-24T20:31:55.8585488Z 58 │ pulseProgress.value = withRepeat( 2026-10-24T20:31:55.8585613Z ·  ──────┬────── 2026-10-24T20:31:55.8585771Z · ╰── `pulseProgress` cannot be modified 2026-10-24T20:31:55.8585869Z 59 │ withTiming(1, { 2026-10-24T20:31:55.8585951Z ╰──── 2026-10-24T20:31:55.8586247Z  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-24T20:31:55.8586576Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8586596Z 2026-10-24T20:31:55.8586893Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T20:31:55.8587054Z ╭─[apps/server/src/provider/AntigravityAuth.ts:285:20] 2026-10-24T20:31:55.8587130Z 284 │ }, 2026-10-24T20:31:55.8587272Z 285 │ (effect, flow, stopSessions) => 2026-10-24T20:31:55.8587376Z ·  ──────┬───── 2026-10-24T20:31:55.8587554Z · ╰── 'stopSessions' is declared here 2026-10-24T20:31:55.8587647Z 286 │ effect.pipe( 2026-10-24T20:31:55.8587731Z ╰──── 2026-10-24T20:31:55.8587858Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8587861Z 2026-10-24T20:31:55.8588044Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8588217Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5] 2026-10-24T20:31:55.8588458Z 170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180; 2026-10-24T20:31:55.8588632Z 171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0); 2026-10-24T20:31:55.8588745Z ·  ────┬─── 2026-10-24T20:31:55.8588905Z · ╰── `rotation` originates here 2026-10-24T20:31:55.8588988Z 172 │ 2026-10-24T20:31:55.8589065Z 173 │ useLayoutEffect(() => { 2026-10-24T20:31:55.8589252Z 174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, { 2026-10-24T20:31:55.8589355Z ·  ────┬─── 2026-10-24T20:31:55.8589516Z · ╰── `rotation` cannot be modified 2026-10-24T20:31:55.8589629Z 175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS, 2026-10-24T20:31:55.8589718Z ╰──── 2026-10-24T20:31:55.8590077Z  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-24T20:31:55.8590448Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8590451Z 2026-10-24T20:31:55.8590675Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8590831Z ╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23] 2026-10-24T20:31:55.8590945Z 1245 │ { 2026-10-24T20:31:55.8600201Z 391 │ animatedBorderRadius.value = shouldAnimate 2026-10-24T20:31:55.8600299Z ·  ──────────┬───────── 2026-10-24T20:31:55.8600465Z · ╰── `animatedBorderRadius` cannot be modified 2026-10-24T20:31:55.8600554Z 392 │ ? withTiming(targetBorderRadius, { 2026-10-24T20:31:55.8600609Z ╰──── 2026-10-24T20:31:55.8600877Z  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-24T20:31:55.8601187Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8601191Z 2026-10-24T20:31:55.8601377Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used. 2026-10-24T20:31:55.8601515Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18] 2026-10-24T20:31:55.8601610Z 14 │ import * as Layer from "effect/Layer"; 2026-10-24T20:31:55.8601706Z 15 │ import type * as Scope from "effect/Scope"; 2026-10-24T20:31:55.8601790Z ·  ──┬── 2026-10-24T20:31:55.8601923Z · ╰── 'Scope' is imported here 2026-10-24T20:31:55.8602012Z 16 │ import * as Stream from "effect/Stream"; 2026-10-24T20:31:55.8602066Z ╰──── 2026-10-24T20:31:55.8602161Z  help: Consider removing this import. 2026-10-24T20:31:55.8602167Z 2026-10-24T20:31:55.8602320Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8602521Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:31:55.8602580Z 83 │ 2026-10-24T20:31:55.8602677Z 84 │ const cardCoverage = props.cardCoverage; 2026-10-24T20:31:55.8602766Z ·  ──────┬───── 2026-10-24T20:31:55.8602905Z · ╰── `cardCoverage` originates here 2026-10-24T20:31:55.8602988Z 85 │ const barHeightRef = useRef(0); 2026-10-24T20:31:55.8603068Z 86 │ const cardHeightRef = useRef(0); 2026-10-24T20:31:55.8603153Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:31:55.8603245Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:31:55.8603315Z 89 │ if (!cardCoverage) { 2026-10-24T20:31:55.8603375Z 90 │ return; 2026-10-24T20:31:55.8603431Z 91 │ } 2026-10-24T20:31:55.8603597Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:31:55.8603699Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:31:55.8603856Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:31:55.8604015Z ·  ──────┬───── 2026-10-24T20:31:55.8604188Z · ╰── `cardCoverage` cannot be modified 2026-10-24T20:31:55.8604256Z 95 │ }, [cardCoverage]); 2026-10-24T20:31:55.8604306Z ╰──── 2026-10-24T20:31:55.8604603Z  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-24T20:31:55.8604909Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8604912Z 2026-10-24T20:31:55.8605069Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8605226Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T20:31:55.8605312Z  86 │ const cardHeightRef = useRef(0); 2026-10-24T20:31:55.8605404Z  87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:31:55.8605486Z ·  ─────┬──── 2026-10-24T20:31:55.8605619Z · ╰── `cardHeight` originates here 2026-10-24T20:31:55.8605713Z  88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:31:55.8605784Z  89 │ if (!cardCoverage) { 2026-10-24T20:31:55.8605848Z  90 │ return; 2026-10-24T20:31:55.8605904Z  91 │ } 2026-10-24T20:31:55.8606068Z  92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:31:55.8606171Z  93 │ // feed inset and floating controls trailing it. 2026-10-24T20:31:55.8606330Z  94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:31:55.8606403Z  95 │ }, [cardCoverage]); 2026-10-24T20:31:55.8606490Z  96 │ const handleBarLayout = useCallback( 2026-10-24T20:31:55.8606573Z  97 │ (event: LayoutChangeEvent) => { 2026-10-24T20:31:55.8606701Z  98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:31:55.8606771Z  99 │ notifyCoverage(); 2026-10-24T20:31:55.8606825Z 100 │ }, 2026-10-24T20:31:55.8606894Z 101 │ [notifyCoverage], 2026-10-24T20:31:55.8606950Z 102 │ ); 2026-10-24T20:31:55.8607037Z 103 │ const handleCardLayout = useCallback( 2026-10-24T20:31:55.8607121Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T20:31:55.8607250Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:31:55.8607366Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T20:31:55.8607442Z ·  ─────┬──── 2026-10-24T20:31:55.8607586Z · ╰── `cardHeight` cannot be modified 2026-10-24T20:31:55.8607656Z 107 │ notifyCoverage(); 2026-10-24T20:31:55.8607710Z ╰──── 2026-10-24T20:31:55.8607973Z  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-24T20:31:55.8608278Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8608280Z 2026-10-24T20:31:55.8608482Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:31:55.8608638Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:31:55.8608726Z 87 │ const cardHeight = useSharedValue(0); 2026-10-24T20:31:55.8608863Z 88 │ const notifyCoverage = useCallback(() => { 2026-10-24T20:31:55.8609000Z ·  ───┬─── 2026-10-24T20:31:55.8609238Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T20:31:55.8609307Z 89 │ if (!cardCoverage) { 2026-10-24T20:31:55.8609367Z 90 │ return; 2026-10-24T20:31:55.8609423Z 91 │ } 2026-10-24T20:31:55.8609588Z 92 │ // The card resizes with the keyboard every frame, so easing each sample would leave the 2026-10-24T20:31:55.8609693Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:31:55.8609848Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:31:55.8609929Z ·  ──────┬───── 2026-10-24T20:31:55.8610072Z · ╰── This modifies `cardCoverage` 2026-10-24T20:31:55.8610147Z 95 │ }, [cardCoverage]); 2026-10-24T20:31:55.8610197Z ╰──── 2026-10-24T20:31:55.8610543Z  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-24T20:31:55.8610845Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8610848Z 2026-10-24T20:31:55.8611045Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:31:55.8611199Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5] 2026-10-24T20:31:55.8611301Z 93 │ // feed inset and floating controls trailing it. 2026-10-24T20:31:55.8611463Z 94 │ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current); 2026-10-24T20:31:55.8611542Z ·  ──────┬───── 2026-10-24T20:31:55.8611673Z · ╰── This modifies `cardCoverage` 2026-10-24T20:31:55.8611737Z 95 │ }, [cardCoverage]); 2026-10-24T20:31:55.8611825Z 96 │ const handleBarLayout = useCallback( 2026-10-24T20:31:55.8611909Z 97 │ (event: LayoutChangeEvent) => { 2026-10-24T20:31:55.8612015Z ·  ───────────────┬─────────────── 2026-10-24T20:31:55.8612236Z · ╰── This function may (indirectly) reassign or modify `cardCoverage` after render 2026-10-24T20:31:55.8612360Z 98 │ barHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:31:55.8612413Z ╰──── 2026-10-24T20:31:55.8612797Z  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-24T20:31:55.8613103Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8613106Z 2026-10-24T20:31:55.8613304Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:31:55.8613462Z ╭─[apps/mobile/src/features/threads/PendingUserInputCard.tsx:106:7] 2026-10-24T20:31:55.8613553Z 103 │ const handleCardLayout = useCallback( 2026-10-24T20:31:55.8613634Z 104 │ (event: LayoutChangeEvent) => { 2026-10-24T20:31:55.8613740Z ·  ───────────────┬─────────────── 2026-10-24T20:31:55.8614008Z · ╰── This function may (indirectly) reassign or modify `cardHeight` after render 2026-10-24T20:31:55.8614179Z 105 │ cardHeightRef.current = event.nativeEvent.layout.height; 2026-10-24T20:31:55.8614294Z 106 │ cardHeight.value = event.nativeEvent.layout.height; 2026-10-24T20:31:55.8614368Z ·  ─────┬──── 2026-10-24T20:31:55.8614501Z · ╰── This modifies `cardHeight` 2026-10-24T20:31:55.8614571Z 107 │ notifyCoverage(); 2026-10-24T20:31:55.8614622Z ╰──── 2026-10-24T20:31:55.8614955Z  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-24T20:31:55.8615340Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8615345Z 2026-10-24T20:31:55.8615514Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:31:55.8615662Z ╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14] 2026-10-24T20:31:55.8615714Z 465 │ 2026-10-24T20:31:55.8615823Z 466 │ for (const {} of ["direct", "wrapper"] as const) { 2026-10-24T20:31:55.8615897Z ·  ── 2026-10-24T20:31:55.8615953Z 467 │ } 2026-10-24T20:31:55.8616004Z ╰──── 2026-10-24T20:31:55.8616234Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:31:55.8616237Z 2026-10-24T20:31:55.8616615Z ⚠ 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-24T20:31:55.8616743Z ╭─[packages/shared/src/otelEnvironment.ts:146:14] 2026-10-24T20:31:55.8616801Z 145 │ name, 2026-10-24T20:31:55.8616945Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()), 2026-10-24T20:31:55.8617053Z ·  ────────────────────────── 2026-10-24T20:31:55.8617177Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`, 2026-10-24T20:31:55.8617227Z ╰──── 2026-10-24T20:31:55.8617231Z 2026-10-24T20:31:55.8617486Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8617648Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5] 2026-10-24T20:31:55.8617712Z 434 │ : null; 2026-10-24T20:31:55.8617785Z 435 │ useEffect(() => { 2026-10-24T20:31:55.8617859Z ·  ────┬──── 2026-10-24T20:31:55.8617992Z · ╰── This is the containing effect 2026-10-24T20:31:55.8618052Z 436 │ if ( 2026-10-24T20:31:55.8618128Z 437 │ props.active === false || 2026-10-24T20:31:55.8618207Z 438 │ activeDraftKey !== null || 2026-10-24T20:31:55.8618290Z 439 │ editingPendingTask !== null || 2026-10-24T20:31:55.8618368Z 440 │ selectedProject === null 2026-10-24T20:31:55.8618424Z 441 │ ) { 2026-10-24T20:31:55.8618486Z 442 │ return; 2026-10-24T20:31:55.8618541Z 443 │ } 2026-10-24T20:31:55.8618613Z 444 │ setActiveDraftKey( 2026-10-24T20:31:55.8618694Z ·  ────────┬──────── 2026-10-24T20:31:55.8618951Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8619064Z 445 │ createNewTaskDraft({ 2026-10-24T20:31:55.8619119Z ╰──── 2026-10-24T20:31:55.8619716Z  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-24T20:31:55.8620043Z  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-24T20:31:55.8620046Z 2026-10-24T20:31:55.8620290Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed. 2026-10-24T20:31:55.8620461Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36] 2026-10-24T20:31:55.8620573Z 1243 │ 2026-10-24T20:31:55.8620768Z 1244 │ {props.children} 2026-10-24T20:31:55.8620881Z ·  ───────────── 2026-10-24T20:31:55.8620957Z 1245 │ 2026-10-24T20:31:55.8621014Z ╰──── 2026-10-24T20:31:55.8621239Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:31:55.8621381Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:31:55.8621383Z 2026-10-24T20:31:55.8621580Z ⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used. 2026-10-24T20:31:55.8621682Z ╭─[apps/server/src/ws.ts:10:13] 2026-10-24T20:31:55.8621774Z  9 │ import * as Effect from "effect/Effect"; 2026-10-24T20:31:55.8621862Z 10 │ import * as Fiber from "effect/Fiber"; 2026-10-24T20:31:55.8621939Z ·  ──┬── 2026-10-24T20:31:55.8622071Z · ╰── 'Fiber' is imported here 2026-10-24T20:31:55.8622176Z 11 │ import * as FileSystem from "effect/FileSystem"; 2026-10-24T20:31:55.8622230Z ╰──── 2026-10-24T20:31:55.8622330Z  help: Consider removing this import. 2026-10-24T20:31:55.8622333Z 2026-10-24T20:31:55.8622563Z ⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used. 2026-10-24T20:31:55.8622663Z ╭─[apps/server/src/ws.ts:17:13] 2026-10-24T20:31:55.8622743Z 16 │ import * as Ref from "effect/Ref"; 2026-10-24T20:31:55.8622885Z 17 │ import * as Schedule from "effect/Schedule"; 2026-10-24T20:31:55.8622996Z ·  ────┬─── 2026-10-24T20:31:55.8623129Z · ╰── 'Schedule' is imported here 2026-10-24T20:31:55.8623217Z 18 │ import * as Schema from "effect/Schema"; 2026-10-24T20:31:55.8623272Z ╰──── 2026-10-24T20:31:55.8623372Z  help: Consider removing this import. 2026-10-24T20:31:55.8623374Z 2026-10-24T20:31:55.8623674Z ⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8623774Z ╭─[apps/server/src/ws.ts:1286:13] 2026-10-24T20:31:55.8623931Z 1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources; 2026-10-24T20:31:55.8624139Z 1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner; 2026-10-24T20:31:55.8624248Z ·  ────────────┬─────────── 2026-10-24T20:31:55.8624418Z · ╰── 'projectSetupScriptRunner' is declared here 2026-10-24T20:31:55.8624590Z 1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker; 2026-10-24T20:31:55.8624645Z ╰──── 2026-10-24T20:31:55.8624750Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8624753Z 2026-10-24T20:31:55.8624980Z ⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used. 2026-10-24T20:31:55.8625110Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:15:8] 2026-10-24T20:31:55.8625182Z 14 │ threadSearchMatchKey, 2026-10-24T20:31:55.8625278Z 15 │ type EnvironmentThreadSearchMatch, 2026-10-24T20:31:55.8625385Z ·  ──────────────┬───────────── 2026-10-24T20:31:55.8625564Z · ╰── 'EnvironmentThreadSearchMatch' is imported here 2026-10-24T20:31:55.8625675Z 16 │ } from "@t3tools/client-runtime/state/thread-search"; 2026-10-24T20:31:55.8625728Z ╰──── 2026-10-24T20:31:55.8625823Z  help: Consider removing this import. 2026-10-24T20:31:55.8625826Z 2026-10-24T20:31:55.8626028Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8626162Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:527:25] 2026-10-24T20:31:55.8626296Z 526 │ // range) the boundary string is identical and the chain would die. 2026-10-24T20:31:55.8626387Z 527 │ }, [nextSnoozeWakeAt, snoozeWakeTick]); 2026-10-24T20:31:55.8626495Z ·  ───────┬────── 2026-10-24T20:31:55.8626667Z · ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:31:55.8626807Z 528 │ const v2SearchQuery = props.searchQuery.trim().toLocaleLowerCase(); 2026-10-24T20:31:55.8626859Z ╰──── 2026-10-24T20:31:55.8627159Z  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-24T20:31:55.8627482Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8627484Z 2026-10-24T20:31:55.8627653Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8627837Z ╭─[apps/mobile/src/features/home/HomeScreen.tsx:518:53] 2026-10-24T20:31:55.8627951Z 517 │ if (Number.isNaN(wakeAtMs)) return; 2026-10-24T20:31:55.8628114Z 518 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647); 2026-10-24T20:31:55.8628239Z ·  ─────┬──── 2026-10-24T20:31:55.8628408Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8628487Z 519 │ const id = setTimeout(() => { 2026-10-24T20:31:55.8628541Z ╰──── 2026-10-24T20:31:55.8628830Z  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-24T20:31:55.8629132Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8629138Z 2026-10-24T20:31:55.8629400Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8629576Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5] 2026-10-24T20:31:55.8629632Z 58 │ 2026-10-24T20:31:55.8629701Z 59 │ useEffect(() => { 2026-10-24T20:31:55.8629775Z ·  ────┬──── 2026-10-24T20:31:55.8629904Z · ╰── This is the containing effect 2026-10-24T20:31:55.8629986Z 60 │ setMountedModes((current) => { 2026-10-24T20:31:55.8630068Z ·  ───────┬─────── 2026-10-24T20:31:55.8630238Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8630328Z 61 │ if (current.has(props.mode)) { 2026-10-24T20:31:55.8630385Z ╰──── 2026-10-24T20:31:55.8630988Z  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-24T20:31:55.8631316Z  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-24T20:31:55.8631319Z 2026-10-24T20:31:55.8631582Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8631710Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7] 2026-10-24T20:31:55.8631770Z 727 │ 2026-10-24T20:31:55.8631852Z 728 │ const layer = layerWithOptions(); 2026-10-24T20:31:55.8631925Z ·  ──┬── 2026-10-24T20:31:55.8632054Z · ╰── 'layer' is declared here 2026-10-24T20:31:55.8632110Z ╰──── 2026-10-24T20:31:55.8632217Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8632220Z 2026-10-24T20:31:55.8632491Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8632674Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:570:5] 2026-10-24T20:31:55.8632736Z 568 │ }, []); 2026-10-24T20:31:55.8632805Z 569 │ useEffect(() => { 2026-10-24T20:31:55.8632877Z ·  ────┬──── 2026-10-24T20:31:55.8633061Z · ╰── This is the containing effect 2026-10-24T20:31:55.8633183Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T20:31:55.8633276Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8633451Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8633553Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T20:31:55.8633607Z ╰──── 2026-10-24T20:31:55.8634213Z  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-24T20:31:55.8634544Z  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-24T20:31:55.8634549Z 2026-10-24T20:31:55.8634807Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8634960Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:966:7] 2026-10-24T20:31:55.8635120Z 963 │ const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0); 2026-10-24T20:31:55.8635188Z 964 │ useEffect(() => { 2026-10-24T20:31:55.8635261Z ·  ────┬──── 2026-10-24T20:31:55.8635390Z · ╰── This is the containing effect 2026-10-24T20:31:55.8635555Z 965 │ if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) { 2026-10-24T20:31:55.8635674Z 966 │ setLastKnownKeyboardHeight(liveKeyboardHeight); 2026-10-24T20:31:55.8635781Z ·  ─────────────┬──────────── 2026-10-24T20:31:55.8635958Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8636018Z 967 │ } 2026-10-24T20:31:55.8636072Z ╰──── 2026-10-24T20:31:55.8636679Z  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-24T20:31:55.8637006Z  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-24T20:31:55.8637008Z 2026-10-24T20:31:55.8637270Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8637432Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1222:5] 2026-10-24T20:31:55.8637489Z 1220 │ 2026-10-24T20:31:55.8637556Z 1221 │ useEffect(() => { 2026-10-24T20:31:55.8637628Z ·  ────┬──── 2026-10-24T20:31:55.8637761Z · ╰── This is the containing effect 2026-10-24T20:31:55.8637842Z 1222 │ setAnchorMessageId(null); 2026-10-24T20:31:55.8637930Z ·  ─────────┬──────── 2026-10-24T20:31:55.8638102Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8638185Z 1223 │ setSubmittedMessageId(null); 2026-10-24T20:31:55.8638297Z ╰──── 2026-10-24T20:31:55.8638935Z  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-24T20:31:55.8639258Z  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-24T20:31:55.8639263Z 2026-10-24T20:31:55.8639465Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8639620Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:571:7] 2026-10-24T20:31:55.8639709Z 570 │ setKeyboardStateSuspect(false); 2026-10-24T20:31:55.8639816Z 571 │ }, [isKeyboardVisible, liveKeyboardHeight]); 2026-10-24T20:31:55.8639961Z ·  ────────┬──────── ─────────┬──────── 2026-10-24T20:31:55.8640175Z · │ ╰── Unnecessary dependency `liveKeyboardHeight` 2026-10-24T20:31:55.8640337Z · ╰── Unnecessary dependency `isKeyboardVisible` 2026-10-24T20:31:55.8640468Z 572 │ const handleOwnedInputFocusChange = (focused: boolean) => { 2026-10-24T20:31:55.8640524Z ╰──── 2026-10-24T20:31:55.8640824Z  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-24T20:31:55.8641148Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8641154Z 2026-10-24T20:31:55.8641358Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8641516Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1170:7] 2026-10-24T20:31:55.8641603Z 1169 │ userInputInsetProgress.set(1); 2026-10-24T20:31:55.8641770Z 1170 │ }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]); 2026-10-24T20:31:55.8641870Z ·  ────────────┬─────────── 2026-10-24T20:31:55.8642056Z · ╰── Unnecessary dependency `activeUserInputRequestId` 2026-10-24T20:31:55.8642164Z 1171 │ const showContent = props.showContent ?? true; 2026-10-24T20:31:55.8642219Z ╰──── 2026-10-24T20:31:55.8642605Z  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-24T20:31:55.8643042Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8643044Z 2026-10-24T20:31:55.8643246Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8643405Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1228:15] 2026-10-24T20:31:55.8643478Z 1227 │ freeze.set(false); 2026-10-24T20:31:55.8643568Z 1228 │ }, [freeze, selectedThreadKey]); 2026-10-24T20:31:55.8643665Z ·  ────────┬──────── 2026-10-24T20:31:55.8643835Z · ╰── Unnecessary dependency `selectedThreadKey` 2026-10-24T20:31:55.8643895Z 1229 │ 2026-10-24T20:31:55.8643948Z ╰──── 2026-10-24T20:31:55.8644246Z  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-24T20:31:55.8644561Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8644564Z 2026-10-24T20:31:55.8644725Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8644880Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1058:5] 2026-10-24T20:31:55.8644994Z 1053 │ const composerPopoverHeight = useSharedValue(0); 2026-10-24T20:31:55.8645106Z 1054 │ const floatingControlCoverage = useSharedValue( 2026-10-24T20:31:55.8645207Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8645372Z · ╰── `floatingControlCoverage` originates here 2026-10-24T20:31:55.8645504Z 1055 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T20:31:55.8645560Z 1056 │ ); 2026-10-24T20:31:55.8645628Z 1057 │ useEffect(() => { 2026-10-24T20:31:55.8645734Z 1058 │ floatingControlCoverage.value = withTiming( 2026-10-24T20:31:55.8645829Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8645994Z · ╰── `floatingControlCoverage` cannot be modified 2026-10-24T20:31:55.8646126Z 1059 │ showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0, 2026-10-24T20:31:55.8646180Z ╰──── 2026-10-24T20:31:55.8646456Z  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-24T20:31:55.8646770Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8646774Z 2026-10-24T20:31:55.8646931Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8647089Z ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1076:7] 2026-10-24T20:31:55.8647281Z 1066 │ const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null; 2026-10-24T20:31:55.8647409Z 1067 │ const combinedContentInsetEndAdjustment = useSharedValue( 2026-10-24T20:31:55.8647522Z ·  ────────────────┬──────────────── 2026-10-24T20:31:55.8647764Z · ╰── `combinedContentInsetEndAdjustment` originates here 2026-10-24T20:31:55.8647929Z 1068 │ Math.max(0, estimatedOverlayHeight - nativeInsetOvercount), 2026-10-24T20:31:55.8647986Z 1069 │ ); 2026-10-24T20:31:55.8648056Z 1070 │ useAnimatedReaction( 2026-10-24T20:31:55.8648119Z 1071 │ () => 2026-10-24T20:31:55.8648215Z 1072 │ contentInsetEndAdjustment.value + 2026-10-24T20:31:55.8648306Z 1073 │ floatingControlCoverage.value + 2026-10-24T20:31:55.8648507Z 1074 │ (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0), 2026-10-24T20:31:55.8648574Z 1075 │ (value) => { 2026-10-24T20:31:55.8648692Z 1076 │ combinedContentInsetEndAdjustment.value = value; 2026-10-24T20:31:55.8648804Z ·  ────────────────┬──────────────── 2026-10-24T20:31:55.8649003Z · ╰── `combinedContentInsetEndAdjustment` cannot be modified 2026-10-24T20:31:55.8649066Z 1077 │ }, 2026-10-24T20:31:55.8649120Z ╰──── 2026-10-24T20:31:55.8649389Z  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-24T20:31:55.8649700Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8649702Z 2026-10-24T20:31:55.8649967Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8650131Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5] 2026-10-24T20:31:55.8650249Z 37 │ const [initialized, setInitialized] = useState(false); 2026-10-24T20:31:55.8650321Z 38 │ useLayoutEffect(() => { 2026-10-24T20:31:55.8650401Z ·  ───────┬─────── 2026-10-24T20:31:55.8650535Z · ╰── This is the containing effect 2026-10-24T20:31:55.8650598Z 39 │ reset(); 2026-10-24T20:31:55.8650666Z 40 │ setInitialized(true); 2026-10-24T20:31:55.8650746Z ·  ───────┬────── 2026-10-24T20:31:55.8650915Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8650979Z 41 │ }, [reset]); 2026-10-24T20:31:55.8651030Z ╰──── 2026-10-24T20:31:55.8651652Z  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-24T20:31:55.8651990Z  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-24T20:31:55.8651993Z 2026-10-24T20:31:55.8652255Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8652418Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5] 2026-10-24T20:31:55.8652501Z 88 │ 2026-10-24T20:31:55.8652570Z 89 │ useEffect(() => { 2026-10-24T20:31:55.8652642Z ·  ────┬──── 2026-10-24T20:31:55.8652776Z · ╰── This is the containing effect 2026-10-24T20:31:55.8652988Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return; 2026-10-24T20:31:55.8653131Z 91 │ const branchName = initialProjectRef.branch; 2026-10-24T20:31:55.8653200Z 92 │ let active = true; 2026-10-24T20:31:55.8653300Z 93 │ setPendingCheckouts((count) => count + 1); 2026-10-24T20:31:55.8653386Z ·  ─────────┬───────── 2026-10-24T20:31:55.8653565Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8653724Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation. 2026-10-24T20:31:55.8653778Z ╰──── 2026-10-24T20:31:55.8654399Z  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-24T20:31:55.8654733Z  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-24T20:31:55.8654735Z 2026-10-24T20:31:55.8654896Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8655066Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5] 2026-10-24T20:31:55.8655123Z 107 │ ); 2026-10-24T20:31:55.8655418Z 108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0); 2026-10-24T20:31:55.8655512Z ·  ─────────┬──────── 2026-10-24T20:31:55.8655668Z · ╰── `separationProgress` originates here 2026-10-24T20:31:55.8655724Z 109 │ 2026-10-24T20:31:55.8655795Z 110 │ useEffect(() => { 2026-10-24T20:31:55.8655976Z 111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING); 2026-10-24T20:31:55.8656064Z ·  ─────────┬──────── 2026-10-24T20:31:55.8656219Z · ╰── `separationProgress` cannot be modified 2026-10-24T20:31:55.8656331Z 112 │ }, [props.showScrollToEnd, separationProgress]); 2026-10-24T20:31:55.8656385Z ╰──── 2026-10-24T20:31:55.8656657Z  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-24T20:31:55.8656972Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8656975Z 2026-10-24T20:31:55.8657140Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8657310Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T20:31:55.8657431Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T20:31:55.8657552Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T20:31:55.8657635Z ·  ──────┬───── 2026-10-24T20:31:55.8657774Z · ╰── `capsuleWidth` originates here 2026-10-24T20:31:55.8657888Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:31:55.8658007Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:31:55.8658114Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:31:55.8658211Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:31:55.8658343Z 134 │ return; 2026-10-24T20:31:55.8658442Z 135 │ } 2026-10-24T20:31:55.8658551Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:31:55.8658637Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:31:55.8658782Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:31:55.8658861Z ·  ──────┬───── 2026-10-24T20:31:55.8659004Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T20:31:55.8659058Z 139 │ }; 2026-10-24T20:31:55.8659115Z ╰──── 2026-10-24T20:31:55.8659386Z  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-24T20:31:55.8659705Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8659711Z 2026-10-24T20:31:55.8659869Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8660035Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T20:31:55.8660150Z 128 │ // and repeatedly retargets the animation as it grows. 2026-10-24T20:31:55.8660270Z 129 │ const capsuleWidth = useSharedValue(null); 2026-10-24T20:31:55.8660350Z ·  ──────┬───── 2026-10-24T20:31:55.8660490Z · ╰── `capsuleWidth` originates here 2026-10-24T20:31:55.8660605Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:31:55.8660723Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:31:55.8660832Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:31:55.8660936Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:31:55.8660999Z 134 │ return; 2026-10-24T20:31:55.8661056Z 135 │ } 2026-10-24T20:31:55.8661163Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:31:55.8661252Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:31:55.8661398Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:31:55.8661452Z 139 │ }; 2026-10-24T20:31:55.8661545Z 140 │ const hasStatus = props.status !== null; 2026-10-24T20:31:55.8661683Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T20:31:55.8661750Z 142 │ useEffect(() => { 2026-10-24T20:31:55.8661818Z 143 │ if (!hasStatus) { 2026-10-24T20:31:55.8661906Z 144 │ measuredWidthRef.current = null; 2026-10-24T20:31:55.8661994Z 145 │ capsuleWidth.value = null; 2026-10-24T20:31:55.8662076Z ·  ──────┬───── 2026-10-24T20:31:55.8662218Z · ╰── `capsuleWidth` cannot be modified 2026-10-24T20:31:55.8662273Z 146 │ } 2026-10-24T20:31:55.8662327Z ╰──── 2026-10-24T20:31:55.8662633Z  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-24T20:31:55.8662949Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8662952Z 2026-10-24T20:31:55.8663155Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:31:55.8663380Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7] 2026-10-24T20:31:55.8663547Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview; 2026-10-24T20:31:55.8663617Z 142 │ useEffect(() => { 2026-10-24T20:31:55.8663696Z ·  ───┬─── 2026-10-24T20:31:55.8663922Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T20:31:55.8663991Z 143 │ if (!hasStatus) { 2026-10-24T20:31:55.8664083Z 144 │ measuredWidthRef.current = null; 2026-10-24T20:31:55.8664161Z 145 │ capsuleWidth.value = null; 2026-10-24T20:31:55.8664242Z ·  ──────┬───── 2026-10-24T20:31:55.8664382Z · ╰── This modifies `capsuleWidth` 2026-10-24T20:31:55.8664439Z 146 │ } 2026-10-24T20:31:55.8664490Z ╰──── 2026-10-24T20:31:55.8664845Z  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-24T20:31:55.8665159Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8665162Z 2026-10-24T20:31:55.8665366Z ⚠ react(immutability): Cannot modify local variables after render completes 2026-10-24T20:31:55.8665533Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5] 2026-10-24T20:31:55.8665647Z 130 │ const measuredWidthRef = useRef(null); 2026-10-24T20:31:55.8665765Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => { 2026-10-24T20:31:55.8665910Z ·  ───────────────┬─────────────── 2026-10-24T20:31:55.8666159Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render 2026-10-24T20:31:55.8666266Z 132 │ const width = event.nativeEvent.layout.width; 2026-10-24T20:31:55.8666365Z 133 │ if (width === measuredWidthRef.current) { 2026-10-24T20:31:55.8666428Z 134 │ return; 2026-10-24T20:31:55.8666485Z 135 │ } 2026-10-24T20:31:55.8666590Z 136 │ const first = measuredWidthRef.current === null; 2026-10-24T20:31:55.8666679Z 137 │ measuredWidthRef.current = width; 2026-10-24T20:31:55.8666824Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING); 2026-10-24T20:31:55.8666906Z ·  ──────┬───── 2026-10-24T20:31:55.8667091Z · ╰── This modifies `capsuleWidth` 2026-10-24T20:31:55.8667177Z 139 │ }; 2026-10-24T20:31:55.8667231Z ╰──── 2026-10-24T20:31:55.8667578Z  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-24T20:31:55.8667888Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8667891Z 2026-10-24T20:31:55.8668179Z ⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8668329Z ╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12395:7] 2026-10-24T20:31:55.8668386Z 12394 │ 2026-10-24T20:31:55.8668537Z 12395 │ const layerUnavailable: Layer.Layer = Layer.succeed( 2026-10-24T20:31:55.8668627Z ·  ────────┬─────── 2026-10-24T20:31:55.8668779Z · ╰── 'layerUnavailable' is declared here 2026-10-24T20:31:55.8668848Z 12396 │ OrchestratorV2, 2026-10-24T20:31:55.8668903Z ╰──── 2026-10-24T20:31:55.8669012Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8669015Z 2026-10-24T20:31:55.8669280Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8669444Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T20:31:55.8669511Z 259 │ .join("|"); 2026-10-24T20:31:55.8669575Z 260 │ useEffect(() => { 2026-10-24T20:31:55.8669650Z ·  ────┬──── 2026-10-24T20:31:55.8669786Z · ╰── This is the containing effect 2026-10-24T20:31:55.8669853Z 261 │ stop(); 2026-10-24T20:31:55.8669925Z ·  ──┬─ 2026-10-24T20:31:55.8670091Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8670158Z 262 │ }, [orderVersion]); 2026-10-24T20:31:55.8670212Z ╰──── 2026-10-24T20:31:55.8670821Z  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-24T20:31:55.8671154Z  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-24T20:31:55.8671159Z 2026-10-24T20:31:55.8671383Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:31:55.8671547Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5] 2026-10-24T20:31:55.8671612Z 260 │ useEffect(() => { 2026-10-24T20:31:55.8671672Z 261 │ stop(); 2026-10-24T20:31:55.8671743Z ·  ──┬─ 2026-10-24T20:31:55.8671869Z · ╰── Missing dependency `stop` 2026-10-24T20:31:55.8671935Z 262 │ }, [orderVersion]); 2026-10-24T20:31:55.8672016Z ·  ──────┬───── 2026-10-24T20:31:55.8672166Z · ╰── Unnecessary dependency `orderVersion` 2026-10-24T20:31:55.8672228Z 263 │ useEffect( 2026-10-24T20:31:55.8672336Z ╰──── 2026-10-24T20:31:55.8672843Z  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-24T20:31:55.8673161Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8673164Z 2026-10-24T20:31:55.8673312Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8673473Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9] 2026-10-24T20:31:55.8673552Z 95 │ const latest = useRef(props); 2026-10-24T20:31:55.8673621Z 96 │ latest.current = props; 2026-10-24T20:31:55.8673732Z ·  ───┬──────┬─── 2026-10-24T20:31:55.8673915Z · │ ╰── Cannot update ref value during render 2026-10-24T20:31:55.8674029Z · ╰── This value is a ref 2026-10-24T20:31:55.8674100Z 97 │ const gesture = useMemo( 2026-10-24T20:31:55.8674152Z ╰──── 2026-10-24T20:31:55.8674635Z  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-24T20:31:55.8674935Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8674939Z 2026-10-24T20:31:55.8675091Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8675257Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18] 2026-10-24T20:31:55.8675325Z 103 │ .runOnJS(true) 2026-10-24T20:31:55.8675429Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:31:55.8675546Z ·  ───────────────┬────────────── 2026-10-24T20:31:55.8675755Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8675892Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8675947Z ╰──── 2026-10-24T20:31:55.8676432Z  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-24T20:31:55.8676734Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8676736Z 2026-10-24T20:31:55.8676884Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8677046Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19] 2026-10-24T20:31:55.8677147Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:31:55.8677279Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8677423Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T20:31:55.8677685Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8677842Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8677894Z ╰──── 2026-10-24T20:31:55.8678367Z  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-24T20:31:55.8678663Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8678665Z 2026-10-24T20:31:55.8678811Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8678977Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16] 2026-10-24T20:31:55.8679111Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8679237Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8679382Z ·  ──────────────────────────┬───────────────────────── 2026-10-24T20:31:55.8679591Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8679717Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:31:55.8679770Z ╰──── 2026-10-24T20:31:55.8680252Z  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-24T20:31:55.8680550Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8680552Z 2026-10-24T20:31:55.8680697Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8680857Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21] 2026-10-24T20:31:55.8680981Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8681106Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:31:55.8681245Z ·  ───────────────────────┬────────────────────── 2026-10-24T20:31:55.8681458Z · ╰── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8681532Z 108 │ [props.disabled], 2026-10-24T20:31:55.8681587Z ╰──── 2026-10-24T20:31:55.8682065Z  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-24T20:31:55.8682362Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8682365Z 2026-10-24T20:31:55.8682518Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8682731Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9] 2026-10-24T20:31:55.8682846Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T20:31:55.8683003Z 249 │ latest.current = { rows, planners, moveThread }; 2026-10-24T20:31:55.8683137Z ·  ───┬──────┬─── 2026-10-24T20:31:55.8683319Z · │ ╰── Cannot update ref value during render 2026-10-24T20:31:55.8683440Z · ╰── This value is a ref 2026-10-24T20:31:55.8683496Z 250 │ 2026-10-24T20:31:55.8683547Z ╰──── 2026-10-24T20:31:55.8684018Z  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-24T20:31:55.8684319Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8684325Z 2026-10-24T20:31:55.8684471Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8684634Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22] 2026-10-24T20:31:55.8684754Z 246 │ const [preview, setPreview] = useState(null); 2026-10-24T20:31:55.8684872Z 247 │ const translateY = useRef(new Animated.Value(0)).current; 2026-10-24T20:31:55.8685001Z ·  ──────────────────┬────────────────── 2026-10-24T20:31:55.8685173Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8685284Z 248 │ const latest = useRef({ rows, planners, moveThread }); 2026-10-24T20:31:55.8685340Z ╰──── 2026-10-24T20:31:55.8685819Z  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-24T20:31:55.8686116Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8686118Z 2026-10-24T20:31:55.8686290Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8686450Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16] 2026-10-24T20:31:55.8686518Z 323 │ update(0); 2026-10-24T20:31:55.8686601Z 324 │ let last = performance.now(); 2026-10-24T20:31:55.8686702Z ·  ────────┬──────── 2026-10-24T20:31:55.8686890Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8686987Z 325 │ const tick = () => { 2026-10-24T20:31:55.8687039Z ╰──── 2026-10-24T20:31:55.8687347Z  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-24T20:31:55.8687648Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8687651Z 2026-10-24T20:31:55.8687842Z ⚠ react(capitalized-calls): Capitalized function called without JSX 2026-10-24T20:31:55.8688004Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15] 2026-10-24T20:31:55.8688065Z  98 │ () => 2026-10-24T20:31:55.8688137Z  99 │ Gesture.Pan() 2026-10-24T20:31:55.8688216Z ·  ─┬─ 2026-10-24T20:31:55.8688350Z · ╰── `Pan` may be a component 2026-10-24T20:31:55.8688435Z 100 │ .enabled(!props.disabled) 2026-10-24T20:31:55.8688485Z ╰──── 2026-10-24T20:31:55.8688766Z  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-24T20:31:55.8689223Z  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-24T20:31:55.8689225Z 2026-10-24T20:31:55.8689415Z ⚠ react(memo-dependencies): Found missing memoization dependencies 2026-10-24T20:31:55.8689580Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5] 2026-10-24T20:31:55.8689650Z 103 │ .runOnJS(true) 2026-10-24T20:31:55.8689753Z 104 │ .onStart(() => latest.current.onStart()) 2026-10-24T20:31:55.8689847Z ·  ───┬── 2026-10-24T20:31:55.8690291Z · ╰── 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-24T20:31:55.8690426Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8690552Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY)) 2026-10-24T20:31:55.8690679Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)), 2026-10-24T20:31:55.8690756Z 108 │ [props.disabled], 2026-10-24T20:31:55.8690841Z ·  ────────┬─────── 2026-10-24T20:31:55.8691031Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8691088Z 109 │ ); 2026-10-24T20:31:55.8691141Z ╰──── 2026-10-24T20:31:55.8691349Z  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI 2026-10-24T20:31:55.8691672Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8691675Z 2026-10-24T20:31:55.8691845Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8692026Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56] 2026-10-24T20:31:55.8692162Z 820 │ const resolved = resolveThreadTarget(target); 2026-10-24T20:31:55.8692321Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) { 2026-10-24T20:31:55.8692456Z ·  ─────┬──── 2026-10-24T20:31:55.8692654Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8692737Z 822 │ return AsyncResult.failure( 2026-10-24T20:31:55.8692789Z ╰──── 2026-10-24T20:31:55.8693073Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8693379Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8693385Z 2026-10-24T20:31:55.8693555Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8693682Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46] 2026-10-24T20:31:55.8693755Z 708 │ const wokeAt = resolved 2026-10-24T20:31:55.8693894Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() }) 2026-10-24T20:31:55.8694010Z ·  ─────┬──── 2026-10-24T20:31:55.8694173Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8694235Z 710 │ : null; 2026-10-24T20:31:55.8694290Z ╰──── 2026-10-24T20:31:55.8694576Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8694880Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8694882Z 2026-10-24T20:31:55.8695092Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used. 2026-10-24T20:31:55.8695268Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10] 2026-10-24T20:31:55.8695324Z 78 │ 2026-10-24T20:31:55.8695467Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string { 2026-10-24T20:31:55.8695555Z ·  ────────┬─────── 2026-10-24T20:31:55.8695706Z · ╰── 'describeSchedule' is declared here 2026-10-24T20:31:55.8695827Z 80 │ if (schedule.type === "webhook") return "On webhook"; 2026-10-24T20:31:55.8695885Z ╰──── 2026-10-24T20:31:55.8695990Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8695993Z 2026-10-24T20:31:55.8696470Z ⚠ 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-24T20:31:55.8696657Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13] 2026-10-24T20:31:55.8696732Z 520 │ })).delivery; 2026-10-24T20:31:55.8696935Z 521 │ ╭─▶ while (delivery.outcome === "accepted") { 2026-10-24T20:31:55.8697050Z 522 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8697267Z 523 │ │ delivery = (yield* service.getWebhookDelivery({ 2026-10-24T20:31:55.8697408Z 524 │ │ id: task.id, 2026-10-24T20:31:55.8697526Z 525 │ │ deliveryId: deliveryId!, 2026-10-24T20:31:55.8697625Z 526 │ │ })).delivery; 2026-10-24T20:31:55.8697769Z 527 │ ╰─▶ } 2026-10-24T20:31:55.8697892Z 528 │ assert.equal(delivery.outcome, "dispatch_failed"); 2026-10-24T20:31:55.8697946Z ╰──── 2026-10-24T20:31:55.8697948Z 2026-10-24T20:31:55.8698212Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8698369Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7] 2026-10-24T20:31:55.8698515Z 355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]); 2026-10-24T20:31:55.8698587Z 356 │ useEffect(() => { 2026-10-24T20:31:55.8698659Z ·  ────┬──── 2026-10-24T20:31:55.8698791Z · ╰── This is the containing effect 2026-10-24T20:31:55.8698884Z 357 │ if (!isReturningToProjectPicker) { 2026-10-24T20:31:55.8698946Z 358 │ return; 2026-10-24T20:31:55.8699001Z 359 │ } 2026-10-24T20:31:55.8699100Z 360 │ if (requestedInitialProjectAvailable) { 2026-10-24T20:31:55.8699200Z 361 │ setIsReturningToProjectPicker(false); 2026-10-24T20:31:55.8699307Z ·  ──────────────┬────────────── 2026-10-24T20:31:55.8699485Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8699548Z 362 │ return; 2026-10-24T20:31:55.8699607Z ╰──── 2026-10-24T20:31:55.8700224Z  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-24T20:31:55.8700556Z  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-24T20:31:55.8700558Z 2026-10-24T20:31:55.8700818Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8700973Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9] 2026-10-24T20:31:55.8701034Z 447 │ 2026-10-24T20:31:55.8701104Z 448 │ useEffect(() => { 2026-10-24T20:31:55.8701177Z ·  ────┬──── 2026-10-24T20:31:55.8701308Z · ╰── This is the containing effect 2026-10-24T20:31:55.8701415Z 449 │ if (props.pendingTaskId || props.draftId) { 2026-10-24T20:31:55.8701476Z 450 │ return; 2026-10-24T20:31:55.8701530Z 451 │ } 2026-10-24T20:31:55.8701675Z 452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) { 2026-10-24T20:31:55.8701811Z 453 │ lastInitialProjectRefRef.current = props.initialProjectRef; 2026-10-24T20:31:55.8701919Z 454 │ appliedInitialProjectKeyRef.current = null; 2026-10-24T20:31:55.8701974Z 455 │ } 2026-10-24T20:31:55.8702117Z 456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T20:31:55.8702301Z 457 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T20:31:55.8702448Z 458 │ if (initialEnvironmentId && initialProjectId) { 2026-10-24T20:31:55.8702521Z 459 │ const directProject = 2026-10-24T20:31:55.8702617Z 460 │ projects.find( 2026-10-24T20:31:55.8702684Z 461 │ (project) => 2026-10-24T20:31:55.8702862Z 462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId, 2026-10-24T20:31:55.8702924Z 463 │ ) ?? null; 2026-10-24T20:31:55.8702977Z 464 │ 2026-10-24T20:31:55.8703049Z 465 │ if (directProject) { 2026-10-24T20:31:55.8703192Z 466 │ // Apply the route's project once. Re-applying on every change would 2026-10-24T20:31:55.8703333Z 467 │ // instantly revert environment/project switches made in the picker. 2026-10-24T20:31:55.8703504Z 468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`; 2026-10-24T20:31:55.8703646Z 469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) { 2026-10-24T20:31:55.8703711Z 470 │ return; 2026-10-24T20:31:55.8703768Z 471 │ } 2026-10-24T20:31:55.8703867Z 472 │ if (props.initialProjectRef?.branch) { 2026-10-24T20:31:55.8703932Z 473 │ if ( 2026-10-24T20:31:55.8704081Z 474 │ selectedProject?.environmentId !== directProject.environmentId || 2026-10-24T20:31:55.8704181Z 475 │ selectedProject.id !== directProject.id 2026-10-24T20:31:55.8704241Z 476 │ ) { 2026-10-24T20:31:55.8704328Z 477 │ setProject(directProject); 2026-10-24T20:31:55.8704391Z 478 │ return; 2026-10-24T20:31:55.8704450Z 479 │ } 2026-10-24T20:31:55.8704535Z 480 │ if (!flow.draftKey) return; 2026-10-24T20:31:55.8704684Z 481 │ // The route completes checkout before mounting this composer. Local 2026-10-24T20:31:55.8704832Z 482 │ // mode reuses an existing worktree; worktree mode would create another. 2026-10-24T20:31:55.8704943Z 483 │ updateComposerDraftSettings(flow.draftKey, { 2026-10-24T20:31:55.8705026Z 484 │ workspaceSelection: { 2026-10-24T20:31:55.8705098Z 485 │ mode: "local", 2026-10-24T20:31:55.8705204Z 486 │ branch: props.initialProjectRef.branch, 2026-10-24T20:31:55.8705344Z 487 │ worktreePath: props.initialProjectRef.worktreePath ?? null, 2026-10-24T20:31:55.8705429Z 488 │ startFromOrigin: false, 2026-10-24T20:31:55.8705491Z 489 │ }, 2026-10-24T20:31:55.8705550Z 490 │ }); 2026-10-24T20:31:55.8705610Z 491 │ } 2026-10-24T20:31:55.8705740Z 492 │ appliedInitialProjectKeyRef.current = directProjectKey; 2026-10-24T20:31:55.8705805Z 493 │ if ( 2026-10-24T20:31:55.8705949Z 494 │ selectedProject?.environmentId === directProject.environmentId && 2026-10-24T20:31:55.8706053Z 495 │ selectedProject.id === directProject.id 2026-10-24T20:31:55.8706111Z 496 │ ) { 2026-10-24T20:31:55.8706176Z 497 │ return; 2026-10-24T20:31:55.8706231Z 498 │ } 2026-10-24T20:31:55.8706314Z 499 │ setProject(directProject); 2026-10-24T20:31:55.8706377Z 500 │ return; 2026-10-24T20:31:55.8706435Z 501 │ } 2026-10-24T20:31:55.8706487Z 502 │ 2026-10-24T20:31:55.8706567Z 503 │ if (projects.length > 0) { 2026-10-24T20:31:55.8706666Z 504 │ setIsReturningToProjectPicker(true); 2026-10-24T20:31:55.8706774Z ·  ──────────────┬────────────── 2026-10-24T20:31:55.8707013Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8707107Z 505 │ } 2026-10-24T20:31:55.8707161Z ╰──── 2026-10-24T20:31:55.8707774Z  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-24T20:31:55.8708102Z  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-24T20:31:55.8708105Z 2026-10-24T20:31:55.8708368Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8708527Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5] 2026-10-24T20:31:55.8708584Z 545 │ 2026-10-24T20:31:55.8708648Z 546 │ useEffect(() => { 2026-10-24T20:31:55.8708723Z ·  ────┬──── 2026-10-24T20:31:55.8708853Z · ╰── This is the containing effect 2026-10-24T20:31:55.8708951Z 547 │ const shareId = props.incomingShareId; 2026-10-24T20:31:55.8709033Z 548 │ const draftKey = flow.draftKey; 2026-10-24T20:31:55.8709135Z 549 │ const destinationProject = selectedProject; 2026-10-24T20:31:55.8709278Z 550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId; 2026-10-24T20:31:55.8709409Z 551 │ const initialProjectId = props.initialProjectRef?.projectId; 2026-10-24T20:31:55.8709499Z 552 │ const selectedProjectMatchesRoute = 2026-10-24T20:31:55.8709578Z 553 │ !initialEnvironmentId || 2026-10-24T20:31:55.8709656Z 554 │ !initialProjectId || 2026-10-24T20:31:55.8709793Z 555 │ (destinationProject?.environmentId === initialEnvironmentId && 2026-10-24T20:31:55.8709898Z 556 │ destinationProject.id === initialProjectId); 2026-10-24T20:31:55.8709957Z 557 │ if ( 2026-10-24T20:31:55.8710023Z 558 │ !shareId || 2026-10-24T20:31:55.8710089Z 559 │ !draftKey || 2026-10-24T20:31:55.8710162Z 560 │ !destinationProject || 2026-10-24T20:31:55.8710251Z 561 │ !selectedProjectMatchesRoute || 2026-10-24T20:31:55.8710343Z 562 │ cancelledIncomingShareId === shareId 2026-10-24T20:31:55.8710400Z 563 │ ) { 2026-10-24T20:31:55.8710460Z 564 │ return; 2026-10-24T20:31:55.8710516Z 565 │ } 2026-10-24T20:31:55.8710615Z 566 │ const importKey = `${shareId}:${draftKey}`; 2026-10-24T20:31:55.8710673Z 567 │ if ( 2026-10-24T20:31:55.8710790Z 568 │ startedShareImportKeyRef.current === importKey || 2026-10-24T20:31:55.8710906Z 569 │ cancellingShareImportKeyRef.current === importKey 2026-10-24T20:31:55.8710960Z 570 │ ) { 2026-10-24T20:31:55.8711020Z 571 │ return; 2026-10-24T20:31:55.8711075Z 572 │ } 2026-10-24T20:31:55.8711128Z 573 │ 2026-10-24T20:31:55.8711198Z 574 │ if (!incomingShare) { 2026-10-24T20:31:55.8711395Z 575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) { 2026-10-24T20:31:55.8711526Z 576 │ alertedUnavailableIncomingShareIdRef.current = shareId; 2026-10-24T20:31:55.8711592Z 577 │ Dialog.alert( 2026-10-24T20:31:55.8711680Z 578 │ "Shared content unavailable", 2026-10-24T20:31:55.8711857Z 579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.", 2026-10-24T20:31:55.8711973Z 580 │ ); 2026-10-24T20:31:55.8712063Z 581 │ } 2026-10-24T20:31:55.8712123Z 582 │ return; 2026-10-24T20:31:55.8712177Z 583 │ } 2026-10-24T20:31:55.8712232Z 584 │ 2026-10-24T20:31:55.8712289Z 585 │ if ( 2026-10-24T20:31:55.8712482Z 586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") && 2026-10-24T20:31:55.8712586Z 587 │ selectedEnvironmentServerConfig === null 2026-10-24T20:31:55.8712645Z 588 │ ) { 2026-10-24T20:31:55.8712705Z 589 │ return; 2026-10-24T20:31:55.8712762Z 590 │ } 2026-10-24T20:31:55.8712814Z 591 │ 2026-10-24T20:31:55.8712952Z 592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) { 2026-10-24T20:31:55.8713076Z 593 │ alertedUnavailableIncomingShareIdRef.current = null; 2026-10-24T20:31:55.8713130Z 594 │ } 2026-10-24T20:31:55.8713245Z 595 │ startedShareImportKeyRef.current = importKey; 2026-10-24T20:31:55.8713317Z 596 │ const draftBackup = 2026-10-24T20:31:55.8713508Z 597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey); 2026-10-24T20:31:55.8713647Z 598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup); 2026-10-24T20:31:55.8713739Z 599 │ const importToken = Symbol(importKey); 2026-10-24T20:31:55.8713820Z 600 │ let didReserveShare = false; 2026-10-24T20:31:55.8713897Z 601 │ let didConsumeShare = false; 2026-10-24T20:31:55.8713978Z 602 │ let needsDraftRestore = false; 2026-10-24T20:31:55.8714091Z 603 │ activeShareImportTokenRef.current = importToken; 2026-10-24T20:31:55.8714177Z 604 │ setImportingShareKey(importKey); 2026-10-24T20:31:55.8714266Z ·  ──────────┬───────── 2026-10-24T20:31:55.8714447Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8714521Z 605 │ void (async () => { 2026-10-24T20:31:55.8714576Z ╰──── 2026-10-24T20:31:55.8715188Z  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-24T20:31:55.8715519Z  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-24T20:31:55.8715521Z 2026-10-24T20:31:55.8715730Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8715936Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5] 2026-10-24T20:31:55.8716042Z 523 │ props.initialProjectRef, 2026-10-24T20:31:55.8716118Z 524 │ props.incomingShareId, 2026-10-24T20:31:55.8716207Z ·  ──────────┬────────── 2026-10-24T20:31:55.8716380Z · ╰── Unnecessary dependency `props.incomingShareId` 2026-10-24T20:31:55.8716453Z 525 │ props.pendingTaskId, 2026-10-24T20:31:55.8716509Z ╰──── 2026-10-24T20:31:55.8716807Z  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-24T20:31:55.8717125Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8717128Z 2026-10-24T20:31:55.8717351Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:31:55.8717513Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5] 2026-10-24T20:31:55.8717634Z 542 │ loadedBranchesProjectKeyRef.current = projectKey; 2026-10-24T20:31:55.8717702Z 543 │ flow.loadBranches(); 2026-10-24T20:31:55.8717774Z ·  ──┬─ 2026-10-24T20:31:55.8717901Z · ╰── Missing dependency `flow` 2026-10-24T20:31:55.8717996Z 544 │ }, [flow.loadBranches, selectedProject]); 2026-10-24T20:31:55.8718081Z ·  ────────┬──────── 2026-10-24T20:31:55.8718285Z · ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead 2026-10-24T20:31:55.8718341Z 545 │ 2026-10-24T20:31:55.8718400Z ╰──── 2026-10-24T20:31:55.8718833Z  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-24T20:31:55.8719150Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8719153Z 2026-10-24T20:31:55.8719356Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8719509Z ╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5] 2026-10-24T20:31:55.8719576Z 765 │ flow.draftKey, 2026-10-24T20:31:55.8719654Z 766 │ hasImportedIncomingShare, 2026-10-24T20:31:55.8719754Z ·  ────────────┬─────────── 2026-10-24T20:31:55.8719933Z · ╰── Unnecessary dependency `hasImportedIncomingShare` 2026-10-24T20:31:55.8720001Z 767 │ incomingShare, 2026-10-24T20:31:55.8720084Z 768 │ isIncomingShareInboxLoading, 2026-10-24T20:31:55.8720182Z ·  ─────────────┬───────────── 2026-10-24T20:31:55.8720366Z · ╰── Unnecessary dependency `isIncomingShareInboxLoading` 2026-10-24T20:31:55.8720446Z 769 │ isIncomingShareUnavailable, 2026-10-24T20:31:55.8720520Z 770 │ props.incomingShareId, 2026-10-24T20:31:55.8720617Z 771 │ props.initialProjectRef?.environmentId, 2026-10-24T20:31:55.8720710Z 772 │ props.initialProjectRef?.projectId, 2026-10-24T20:31:55.8720785Z 773 │ releaseShareReservation, 2026-10-24T20:31:55.8720851Z 774 │ reserveShare, 2026-10-24T20:31:55.8721056Z 775 │ selectedEnvironmentServerConfig, 2026-10-24T20:31:55.8721169Z 776 │ selectedProject, 2026-10-24T20:31:55.8721239Z 777 │ shareImportAttempt, 2026-10-24T20:31:55.8721328Z ·  ─────────┬──────── 2026-10-24T20:31:55.8721493Z · ╰── Unnecessary dependency `shareImportAttempt` 2026-10-24T20:31:55.8721550Z 778 │ ]); 2026-10-24T20:31:55.8721602Z ╰──── 2026-10-24T20:31:55.8721904Z  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-24T20:31:55.8722222Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8722224Z 2026-10-24T20:31:55.8722650Z ⚠ 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-24T20:31:55.8722786Z ╭─[apps/server/src/assets/AssetAccess.test.ts:975:35] 2026-10-24T20:31:55.8722938Z 974 │ // Every client and server release spells the resource this way on the wire. 2026-10-24T20:31:55.8723096Z 975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({ 2026-10-24T20:31:55.8723223Z ·  ────────────────────────── 2026-10-24T20:31:55.8723341Z 976 │ resource: { _tag: "github-media", cwd: "/repo", url }, 2026-10-24T20:31:55.8723392Z ╰──── 2026-10-24T20:31:55.8723395Z 2026-10-24T20:31:55.8723860Z ⚠ 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-24T20:31:55.8723996Z ╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32] 2026-10-24T20:31:55.8724136Z 1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError"); 2026-10-24T20:31:55.8724327Z 1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error); 2026-10-24T20:31:55.8724442Z ·  ─────────────────── 2026-10-24T20:31:55.8724540Z 1013 │ expect(encoded).not.toContain(url); 2026-10-24T20:31:55.8724595Z ╰──── 2026-10-24T20:31:55.8724597Z 2026-10-24T20:31:55.8724768Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8724921Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58] 2026-10-24T20:31:55.8725037Z 177 │ if (snoozeClockState.shell !== activeThreadShell) { 2026-10-24T20:31:55.8725203Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() }); 2026-10-24T20:31:55.8725328Z ·  ─────┬──── 2026-10-24T20:31:55.8725500Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8725557Z 179 │ } 2026-10-24T20:31:55.8725609Z ╰──── 2026-10-24T20:31:55.8725893Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8726244Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8726285Z 2026-10-24T20:31:55.8726559Z ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8726699Z ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7] 2026-10-24T20:31:55.8726754Z 913 │ 2026-10-24T20:31:55.8726949Z 914 │ const layerDaemon: Layer.Layer = Layer.effectDiscard( 2026-10-24T20:31:55.8727026Z ·  ─────┬───── 2026-10-24T20:31:55.8727164Z · ╰── 'layerDaemon' is declared here 2026-10-24T20:31:55.8727253Z 915 │ runDaemon.pipe(Effect.forkScoped), 2026-10-24T20:31:55.8727306Z ╰──── 2026-10-24T20:31:55.8727414Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8727417Z 2026-10-24T20:31:55.8727609Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8727788Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70] 2026-10-24T20:31:55.8727871Z 554 │ assert.deepStrictEqual( 2026-10-24T20:31:55.8728038Z 555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T20:31:55.8728163Z ·  ┬ 2026-10-24T20:31:55.8728330Z · ╰── '_' is declared here 2026-10-24T20:31:55.8728394Z 556 │ [ 2026-10-24T20:31:55.8728445Z ╰──── 2026-10-24T20:31:55.8728551Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8728554Z 2026-10-24T20:31:55.8728747Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8728928Z ╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70] 2026-10-24T20:31:55.8729012Z 1154 │ assert.deepStrictEqual( 2026-10-24T20:31:55.8729180Z 1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest), 2026-10-24T20:31:55.8729303Z ·  ┬ 2026-10-24T20:31:55.8729472Z · ╰── '_' is declared here 2026-10-24T20:31:55.8729534Z 1156 │ [ 2026-10-24T20:31:55.8729588Z ╰──── 2026-10-24T20:31:55.8729691Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8729693Z 2026-10-24T20:31:55.8729901Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8730020Z ╭─[apps/mobile/src/state/thread-order.ts:29:7] 2026-10-24T20:31:55.8730094Z 28 │ getPendingThreadOrder(); 2026-10-24T20:31:55.8730177Z 29 │ }, [nowMinute, snoozeWakeTick]); 2026-10-24T20:31:55.8730302Z ·  ────┬──── ───────┬────── 2026-10-24T20:31:55.8730500Z · │ ╰── Unnecessary dependency `snoozeWakeTick` 2026-10-24T20:31:55.8730639Z · ╰── Unnecessary dependency `nowMinute` 2026-10-24T20:31:55.8730709Z 30 │ return pending; 2026-10-24T20:31:55.8730761Z ╰──── 2026-10-24T20:31:55.8731115Z  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-24T20:31:55.8731463Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8731466Z 2026-10-24T20:31:55.8731690Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:31:55.8731830Z ╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7] 2026-10-24T20:31:55.8731896Z 20 │ [instanceId]: { 2026-10-24T20:31:55.8731976Z 21 │ ...(state[instanceId] ?? {}), 2026-10-24T20:31:55.8732082Z ·  ──────────────────────────── 2026-10-24T20:31:55.8732152Z 22 │ [model]: options, 2026-10-24T20:31:55.8732205Z ╰──── 2026-10-24T20:31:55.8732488Z  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-24T20:31:55.8732495Z 2026-10-24T20:31:55.8732783Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8732939Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5] 2026-10-24T20:31:55.8732993Z 55 │ 2026-10-24T20:31:55.8733057Z 56 │ useEffect(() => { 2026-10-24T20:31:55.8733127Z ·  ────┬──── 2026-10-24T20:31:55.8733257Z · ╰── This is the containing effect 2026-10-24T20:31:55.8733331Z 57 │ setDecodedSize(null); 2026-10-24T20:31:55.8733410Z ·  ───────┬────── 2026-10-24T20:31:55.8733586Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8733660Z 58 │ }, [props.sourceKey]); 2026-10-24T20:31:55.8733712Z ╰──── 2026-10-24T20:31:55.8734323Z  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-24T20:31:55.8734651Z  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-24T20:31:55.8734653Z 2026-10-24T20:31:55.8734913Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8735071Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5] 2026-10-24T20:31:55.8735128Z 59 │ 2026-10-24T20:31:55.8735192Z 60 │ useEffect(() => { 2026-10-24T20:31:55.8735273Z ·  ────┬──── 2026-10-24T20:31:55.8735671Z · ╰── This is the containing effect 2026-10-24T20:31:55.8735741Z 61 │ setFailedUri(null); 2026-10-24T20:31:55.8735817Z ·  ──────┬───── 2026-10-24T20:31:55.8735984Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8736050Z 62 │ }, [props.uri]); 2026-10-24T20:31:55.8736102Z ╰──── 2026-10-24T20:31:55.8736780Z  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-24T20:31:55.8737145Z  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-24T20:31:55.8737148Z 2026-10-24T20:31:55.8737368Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used. 2026-10-24T20:31:55.8737521Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10] 2026-10-24T20:31:55.8737649Z 6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg"; 2026-10-24T20:31:55.8737829Z 7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native"; 2026-10-24T20:31:55.8737918Z ·  ────────┬──────── 2026-10-24T20:31:55.8738075Z · ╰── 'ActivityIndicator' is imported here 2026-10-24T20:31:55.8738131Z 8 │ 2026-10-24T20:31:55.8738182Z ╰──── 2026-10-24T20:31:55.8738285Z  help: Consider removing this import. 2026-10-24T20:31:55.8738288Z 2026-10-24T20:31:55.8738490Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8738644Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7] 2026-10-24T20:31:55.8738713Z 57 │ setDecodedSize(null); 2026-10-24T20:31:55.8738783Z 58 │ }, [props.sourceKey]); 2026-10-24T20:31:55.8738868Z ·  ───────┬─────── 2026-10-24T20:31:55.8739022Z · ╰── Unnecessary dependency `props.sourceKey` 2026-10-24T20:31:55.8739075Z 59 │ 2026-10-24T20:31:55.8739132Z ╰──── 2026-10-24T20:31:55.8739439Z  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-24T20:31:55.8739757Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8739760Z 2026-10-24T20:31:55.8739961Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8740112Z ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7] 2026-10-24T20:31:55.8740182Z 61 │ setFailedUri(null); 2026-10-24T20:31:55.8740247Z 62 │ }, [props.uri]); 2026-10-24T20:31:55.8740323Z ·  ────┬──── 2026-10-24T20:31:55.8740512Z · ╰── Unnecessary dependency `props.uri` 2026-10-24T20:31:55.8740594Z 63 │ 2026-10-24T20:31:55.8740646Z ╰──── 2026-10-24T20:31:55.8740942Z  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-24T20:31:55.8741256Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8741259Z 2026-10-24T20:31:55.8741545Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8741703Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7] 2026-10-24T20:31:55.8741756Z 14 │ 2026-10-24T20:31:55.8741828Z 15 │ const legacyCredentials = { 2026-10-24T20:31:55.8741918Z ·  ────────┬──────── 2026-10-24T20:31:55.8742068Z · ╰── 'legacyCredentials' is declared here 2026-10-24T20:31:55.8742138Z 16 │ version: 1 as const, 2026-10-24T20:31:55.8742189Z ╰──── 2026-10-24T20:31:55.8742298Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8742301Z 2026-10-24T20:31:55.8742587Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8742730Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5] 2026-10-24T20:31:55.8742784Z 150 │ 2026-10-24T20:31:55.8742850Z 151 │ useEffect(() => { 2026-10-24T20:31:55.8742923Z ·  ────┬──── 2026-10-24T20:31:55.8743054Z · ╰── This is the containing effect 2026-10-24T20:31:55.8743144Z 152 │ if (!controlledSelectedPath) { 2026-10-24T20:31:55.8743210Z 153 │ return; 2026-10-24T20:31:55.8743264Z 154 │ } 2026-10-24T20:31:55.8743349Z 155 │ setExpandedPaths((current) => { 2026-10-24T20:31:55.8743429Z ·  ────────┬─────── 2026-10-24T20:31:55.8743601Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8743727Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath); 2026-10-24T20:31:55.8743781Z ╰──── 2026-10-24T20:31:55.8744387Z  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-24T20:31:55.8744716Z  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-24T20:31:55.8744725Z 2026-10-24T20:31:55.8744990Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts. 2026-10-24T20:31:55.8745135Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14] 2026-10-24T20:31:55.8745293Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) { 2026-10-24T20:31:55.8745373Z 12 │ this.onmessage = listener; 2026-10-24T20:31:55.8745455Z ·  ───────── 2026-10-24T20:31:55.8745512Z 13 │ } 2026-10-24T20:31:55.8745565Z ╰──── 2026-10-24T20:31:55.8745934Z  help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on` replaces any previously registered handler. 2026-10-24T20:31:55.8745972Z 2026-10-24T20:31:55.8746177Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable. 2026-10-24T20:31:55.8746320Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9] 2026-10-24T20:31:55.8746388Z 15 │ constructor() { 2026-10-24T20:31:55.8746455Z 16 │ source = this; 2026-10-24T20:31:55.8746526Z ·  ────── 2026-10-24T20:31:55.8746582Z 17 │ } 2026-10-24T20:31:55.8746634Z ╰──── 2026-10-24T20:31:55.8746913Z  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-24T20:31:55.8746918Z 2026-10-24T20:31:55.8747125Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8747270Z ╭─[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5] 2026-10-24T20:31:55.8747353Z 1320 │ queuedMessagesByThreadKey, 2026-10-24T20:31:55.8747423Z 1321 │ retryTick, 2026-10-24T20:31:55.8747499Z ·  ────┬──── 2026-10-24T20:31:55.8747642Z · ╰── Unnecessary dependency `retryTick` 2026-10-24T20:31:55.8747716Z 1322 │ restoreQueuedMessage, 2026-10-24T20:31:55.8747770Z ╰──── 2026-10-24T20:31:55.8748066Z  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-24T20:31:55.8748387Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8748393Z 2026-10-24T20:31:55.8748566Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8748704Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58] 2026-10-24T20:31:55.8748840Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })} 2026-10-24T20:31:55.8748989Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }} 2026-10-24T20:31:55.8749115Z ·  ─────┬──── 2026-10-24T20:31:55.8749288Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8749389Z 141 │ onSelect={(selected) => { 2026-10-24T20:31:55.8749446Z ╰──── 2026-10-24T20:31:55.8749730Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8750032Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8750035Z 2026-10-24T20:31:55.8750296Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8750427Z ╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5] 2026-10-24T20:31:55.8750537Z 83 │ const [nowMs, setNowMs] = useState(() => Date.now()); 2026-10-24T20:31:55.8750604Z 84 │ useEffect(() => { 2026-10-24T20:31:55.8750677Z ·  ────┬──── 2026-10-24T20:31:55.8750853Z · ╰── This is the containing effect 2026-10-24T20:31:55.8750972Z 85 │ if (!actionState.isRunning) return; 2026-10-24T20:31:55.8751042Z 86 │ setNowMs(Date.now()); 2026-10-24T20:31:55.8751116Z ·  ────┬─── 2026-10-24T20:31:55.8751282Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8751413Z 87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000); 2026-10-24T20:31:55.8751470Z ╰──── 2026-10-24T20:31:55.8752083Z  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-24T20:31:55.8752415Z  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-24T20:31:55.8752420Z 2026-10-24T20:31:55.8752674Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:31:55.8752813Z ╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15] 2026-10-24T20:31:55.8752882Z 1021 │ instanceId, 2026-10-24T20:31:55.8753028Z 1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models }, 2026-10-24T20:31:55.8753168Z ·  ────────────────────────────────────────────────── 2026-10-24T20:31:55.8753230Z 1023 │ ]), 2026-10-24T20:31:55.8753284Z ╰──── 2026-10-24T20:31:55.8753563Z  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-24T20:31:55.8753569Z 2026-10-24T20:31:55.8753776Z ⚠ typescript(no-extraneous-class): Unexpected class with only a constructor. 2026-10-24T20:31:55.8753903Z ╭─[apps/desktop/src/preview/Manager.test.ts:158:18] 2026-10-24T20:31:55.8754010Z 157 │ BrowserWindow: browserWindowConstructor, 2026-10-24T20:31:55.8754179Z 158 │ ╭─▶ ClipboardItem: class { 2026-10-24T20:31:55.8754312Z 159 │ │ constructor(data: Record) { 2026-10-24T20:31:55.8754431Z 160 │ │ clipboardItemConstructor(data); 2026-10-24T20:31:55.8754507Z 161 │ │ } 2026-10-24T20:31:55.8754642Z 162 │ ╰─▶ }, 2026-10-24T20:31:55.8754711Z 163 │ clipboard: { 2026-10-24T20:31:55.8754763Z ╰──── 2026-10-24T20:31:55.8754937Z  help: Try replacing this class with a standalone function or deleting it entirely 2026-10-24T20:31:55.8754939Z 2026-10-24T20:31:55.8755110Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:31:55.8755304Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14] 2026-10-24T20:31:55.8755355Z 52 │ 2026-10-24T20:31:55.8755422Z 53 │ for (const {} of [ 2026-10-24T20:31:55.8755494Z ·  ── 2026-10-24T20:31:55.8755562Z 54 │ { healthy: true }, 2026-10-24T20:31:55.8755612Z ╰──── 2026-10-24T20:31:55.8755849Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:31:55.8755917Z 2026-10-24T20:31:55.8756172Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:31:55.8756304Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11] 2026-10-24T20:31:55.8756372Z 113 │ const declared = { 2026-10-24T20:31:55.8756470Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T20:31:55.8756585Z ·  ──────────────────────────────── 2026-10-24T20:31:55.8756692Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T20:31:55.8756743Z ╰──── 2026-10-24T20:31:55.8757016Z  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-24T20:31:55.8757019Z 2026-10-24T20:31:55.8757246Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:31:55.8757377Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11] 2026-10-24T20:31:55.8757468Z 114 │ ...(manifest.dependencies ?? {}), 2026-10-24T20:31:55.8757573Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T20:31:55.8757697Z ·  ──────────────────────────────────────── 2026-10-24T20:31:55.8757797Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T20:31:55.8757849Z ╰──── 2026-10-24T20:31:55.8758117Z  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-24T20:31:55.8758120Z 2026-10-24T20:31:55.8758342Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary 2026-10-24T20:31:55.8758476Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11] 2026-10-24T20:31:55.8758583Z 115 │ ...(manifest.optionalDependencies ?? {}), 2026-10-24T20:31:55.8758678Z 116 │ ...(manifest.peerDependencies ?? {}), 2026-10-24T20:31:55.8758796Z ·  ──────────────────────────────────── 2026-10-24T20:31:55.8758857Z 117 │ }; 2026-10-24T20:31:55.8758910Z ╰──── 2026-10-24T20:31:55.8759177Z  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-24T20:31:55.8759179Z 2026-10-24T20:31:55.8759463Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8759612Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9] 2026-10-24T20:31:55.8759718Z 60 │ ) { 2026-10-24T20:31:55.8759922Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded"; 2026-10-24T20:31:55.8760006Z ·  ──────┬────── 2026-10-24T20:31:55.8760150Z · ╰── 'useDragRegion' is declared here 2026-10-24T20:31:55.8760244Z 62 │ const isInline = props.mode === "inline"; 2026-10-24T20:31:55.8760295Z ╰──── 2026-10-24T20:31:55.8760401Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8760404Z 2026-10-24T20:31:55.8760665Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8760808Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7] 2026-10-24T20:31:55.8760863Z 3754 │ 2026-10-24T20:31:55.8761074Z 3755 │ const layer: Layer.Layer = 2026-10-24T20:31:55.8761150Z ·  ──┬── 2026-10-24T20:31:55.8761278Z · ╰── 'layer' is declared here 2026-10-24T20:31:55.8761343Z 3756 │ Layer.effect( 2026-10-24T20:31:55.8761398Z ╰──── 2026-10-24T20:31:55.8761503Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8761505Z 2026-10-24T20:31:55.8761986Z ⚠ 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-24T20:31:55.8762139Z ╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11] 2026-10-24T20:31:55.8762277Z 132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor; 2026-10-24T20:31:55.8762438Z 133 │ ╭─▶ for ( 2026-10-24T20:31:55.8762573Z 134 │ │ let attempt = 0; 2026-10-24T20:31:55.8762745Z 135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true"; 2026-10-24T20:31:55.8762847Z 136 │ │ attempt += 1 2026-10-24T20:31:55.8762932Z 137 │ │ ) { 2026-10-24T20:31:55.8763047Z 138 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8763184Z 139 │ ╰─▶ } 2026-10-24T20:31:55.8763310Z 140 │ expect((yield* monitor.snapshot).onBattery).toBe("true"); 2026-10-24T20:31:55.8763364Z ╰──── 2026-10-24T20:31:55.8763372Z 2026-10-24T20:31:55.8763588Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed 2026-10-24T20:31:55.8763761Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13] 2026-10-24T20:31:55.8763835Z 14 │ } from "@t3tools/contracts"; 2026-10-24T20:31:55.8763930Z 15 │ import type {} from "@t3tools/contracts"; 2026-10-24T20:31:55.8764003Z ·  ── 2026-10-24T20:31:55.8764057Z 16 │ 2026-10-24T20:31:55.8764108Z ╰──── 2026-10-24T20:31:55.8764193Z  help: Remove empty braces 2026-10-24T20:31:55.8764196Z 2026-10-24T20:31:55.8764459Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8764693Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7] 2026-10-24T20:31:55.8764781Z 328 │ }; 2026-10-24T20:31:55.8764849Z 329 │ useEffect(() => { 2026-10-24T20:31:55.8764922Z ·  ────┬──── 2026-10-24T20:31:55.8765055Z · ╰── This is the containing effect 2026-10-24T20:31:55.8765156Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T20:31:55.8765253Z 331 │ requestedSection.current = "overview"; 2026-10-24T20:31:55.8767261Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T20:31:55.8767347Z 333 │ setSection("overview"); 2026-10-24T20:31:55.8767429Z ·  ─────┬──── 2026-10-24T20:31:55.8767606Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8767663Z 334 │ } 2026-10-24T20:31:55.8767717Z ╰──── 2026-10-24T20:31:55.8768336Z  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-24T20:31:55.8768673Z  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-24T20:31:55.8768676Z 2026-10-24T20:31:55.8768886Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:31:55.8769062Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6] 2026-10-24T20:31:55.8769164Z 330 │ if (!guidesEnabled && section === "guide") { 2026-10-24T20:31:55.8769264Z 331 │ requestedSection.current = "overview"; 2026-10-24T20:31:55.8769352Z ·  ────────┬─────── 2026-10-24T20:31:55.8769806Z · ╰── 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-24T20:31:55.8769973Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top; 2026-10-24T20:31:55.8770123Z ·  ─────────┬───────── ──────┬────── 2026-10-24T20:31:55.8770640Z · │ ╰── 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-24T20:31:55.8771098Z · ╰── 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-24T20:31:55.8771174Z 333 │ setSection("overview"); 2026-10-24T20:31:55.8771230Z 334 │ } 2026-10-24T20:31:55.8771324Z 335 │ }, [guidesEnabled, section, insets.top]); 2026-10-24T20:31:55.8771437Z ·  ──────────────────┬───────────────── 2026-10-24T20:31:55.8771631Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8771720Z 336 │ const tabContent = activityContent; 2026-10-24T20:31:55.8771771Z ╰──── 2026-10-24T20:31:55.8772017Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:31:55.8772369Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8772372Z 2026-10-24T20:31:55.8772612Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies 2026-10-24T20:31:55.8772786Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6] 2026-10-24T20:31:55.8772845Z 860 │ if ( 2026-10-24T20:31:55.8772963Z 861 │ lastSelection.current.path === route.params.path && 2026-10-24T20:31:55.8773043Z ·  ──────┬────── 2026-10-24T20:31:55.8773484Z · ╰── 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-24T20:31:55.8773615Z 862 │ lastSelection.current.id === route.params.fileSelectionId 2026-10-24T20:31:55.8773669Z 863 │ ) 2026-10-24T20:31:55.8773731Z 864 │ return; 2026-10-24T20:31:55.8773910Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId }; 2026-10-24T20:31:55.8774045Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined }); 2026-10-24T20:31:55.8774133Z 867 │ setJumpPath(route.params.path); 2026-10-24T20:31:55.8774205Z 868 │ setSelectedRowId(null); 2026-10-24T20:31:55.8774285Z 869 │ jumpStarted.current = false; 2026-10-24T20:31:55.8774432Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path); 2026-10-24T20:31:55.8774532Z 871 │ if (!file || !nativeView.current) return; 2026-10-24T20:31:55.8774624Z ·  ─────┬──── 2026-10-24T20:31:55.8775062Z · ╰── 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-24T20:31:55.8775188Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id)); 2026-10-24T20:31:55.8775312Z 873 │ jumpStarted.current = true; 2026-10-24T20:31:55.8775448Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => { 2026-10-24T20:31:55.8775528Z 875 │ jumpStarted.current = false; 2026-10-24T20:31:55.8775587Z 876 │ }); 2026-10-24T20:31:55.8775785Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]); 2026-10-24T20:31:55.8775990Z ·  ──────────────────────────────────────────────┬────────────────────────────────────────────── 2026-10-24T20:31:55.8776213Z · ╰── This dependency list is missing values used by the callback 2026-10-24T20:31:55.8776325Z 878 │ const appliedFilter = useRef(filter.hideTestFiles); 2026-10-24T20:31:55.8776376Z ╰──── 2026-10-24T20:31:55.8776546Z  help: Missing dependencies can cause an effect to fire less often than it should 2026-10-24T20:31:55.8776865Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8776867Z 2026-10-24T20:31:55.8777103Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used. 2026-10-24T20:31:55.8777288Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10] 2026-10-24T20:31:55.8777380Z 11 │ 2026-10-24T20:31:55.8777477Z 12 │ function resolveThreadWorkspaceCwd(input: { 2026-10-24T20:31:55.8777580Z ·  ────────────┬──────────── 2026-10-24T20:31:55.8777749Z · ╰── 'resolveThreadWorkspaceCwd' is declared here 2026-10-24T20:31:55.8777818Z 13 │ readonly thread: { 2026-10-24T20:31:55.8777871Z ╰──── 2026-10-24T20:31:55.8777977Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8777979Z 2026-10-24T20:31:55.8778245Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8778362Z ╭─[apps/server/src/usage/UsageService.ts:169:7] 2026-10-24T20:31:55.8778421Z 168 │ 2026-10-24T20:31:55.8778504Z 169 │ const layerTest = Layer.succeed( 2026-10-24T20:31:55.8778578Z ·  ────┬──── 2026-10-24T20:31:55.8778711Z · ╰── 'layerTest' is declared here 2026-10-24T20:31:55.8778777Z 170 │ UsageService, 2026-10-24T20:31:55.8778833Z ╰──── 2026-10-24T20:31:55.8778936Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8778938Z 2026-10-24T20:31:55.8779390Z ⚠ 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-24T20:31:55.8779517Z ╭─[apps/server/src/serverSettings.test.ts:1741:32] 2026-10-24T20:31:55.8779694Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5"); 2026-10-24T20:31:55.8779884Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T20:31:55.8779998Z ·  ─────────────────── 2026-10-24T20:31:55.8780107Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T20:31:55.8780159Z ╰──── 2026-10-24T20:31:55.8780162Z 2026-10-24T20:31:55.8780609Z ⚠ 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-24T20:31:55.8780732Z ╭─[apps/server/src/serverSettings.test.ts:1742:34] 2026-10-24T20:31:55.8780916Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model); 2026-10-24T20:31:55.8781027Z 1742 │ const scriptsJson = yield* Schema.encodeEffect( 2026-10-24T20:31:55.8781147Z ·  ─────────────────── 2026-10-24T20:31:55.8781265Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)), 2026-10-24T20:31:55.8781318Z ╰──── 2026-10-24T20:31:55.8781320Z 2026-10-24T20:31:55.8781792Z ⚠ 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-24T20:31:55.8781923Z ╭─[apps/server/src/usage/UsageService.test.ts:2615:7] 2026-10-24T20:31:55.8782022Z 2614 │ let orphanedAt: number | undefined; 2026-10-24T20:31:55.8782305Z 2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) { 2026-10-24T20:31:55.8782494Z 2616 │ │ const tasks: Array<() => void> = []; 2026-10-24T20:31:55.8782651Z 2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = { 2026-10-24T20:31:55.8782786Z 2618 │ │ scheduleTask: (task) => tasks.push(task), 2026-10-24T20:31:55.8782887Z 2619 │ │ flush: () => { 2026-10-24T20:31:55.8783013Z 2620 │ │ let task: (() => void) | undefined; 2026-10-24T20:31:55.8783162Z 2621 │ │ while ((task = tasks.shift()) !== undefined) task(); 2026-10-24T20:31:55.8783247Z 2622 │ │ }, 2026-10-24T20:31:55.8783327Z 2623 │ │ }; 2026-10-24T20:31:55.8783399Z 2624 │ │ 2026-10-24T20:31:55.8783566Z 2625 │ │ let requestFiber: Fiber.Fiber | undefined; 2026-10-24T20:31:55.8783675Z 2626 │ │ let requestChecks = 0; 2026-10-24T20:31:55.8783804Z 2627 │ │ const scheduler: Scheduler.Scheduler = { 2026-10-24T20:31:55.8783914Z 2628 │ │ executionMode: "async", 2026-10-24T20:31:55.8784034Z 2629 │ │ makeDispatcher: () => dispatcher, 2026-10-24T20:31:55.8784147Z 2630 │ │ shouldYield: (fiber) => { 2026-10-24T20:31:55.8784282Z 2631 │ │ if (fiber !== requestFiber) return false; 2026-10-24T20:31:55.8784387Z 2632 │ │ requestChecks += 1; 2026-10-24T20:31:55.8784535Z 2633 │ │ if (requestChecks !== interruptAt) return false; 2026-10-24T20:31:55.8784654Z 2634 │ │ fiber.interruptUnsafe(); 2026-10-24T20:31:55.8784752Z 2635 │ │ return true; 2026-10-24T20:31:55.8784833Z 2636 │ │ }, 2026-10-24T20:31:55.8784913Z 2637 │ │ }; 2026-10-24T20:31:55.8784984Z 2638 │ │ 2026-10-24T20:31:55.8785107Z 2639 │ │ const input: UsageSummaryInput = { 2026-10-24T20:31:55.8785199Z 2640 │ │ ...WINDOW, 2026-10-24T20:31:55.8785328Z 2641 │ │ sinceDay: UsageDay.make("2026-09-01"), 2026-10-24T20:31:55.8785521Z 2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`), 2026-10-24T20:31:55.8785602Z 2643 │ │ }; 2026-10-24T20:31:55.8785766Z 2644 │ │ const first = yield* service 2026-10-24T20:31:55.8785900Z 2645 │ │ .readSummary(input) 2026-10-24T20:31:55.8785989Z 2646 │ │ .pipe( 2026-10-24T20:31:55.8786087Z 2647 │ │ Effect.exit, 2026-10-24T20:31:55.8786243Z 2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T20:31:55.8786348Z 2649 │ │ Effect.forkChild, 2026-10-24T20:31:55.8786434Z 2650 │ │ ); 2026-10-24T20:31:55.8786537Z 2651 │ │ requestFiber = first; 2026-10-24T20:31:55.8786642Z 2652 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8786746Z 2653 │ │ dispatcher.flush(); 2026-10-24T20:31:55.8786822Z 2654 │ │ 2026-10-24T20:31:55.8786977Z 2655 │ │ const second = yield* service.readSummary(input).pipe( 2026-10-24T20:31:55.8787074Z 2656 │ │ Effect.match({ 2026-10-24T20:31:55.8787198Z 2657 │ │ onFailure: (error) => error.reason, 2026-10-24T20:31:55.8787322Z 2658 │ │ onSuccess: () => "success" as const, 2026-10-24T20:31:55.8787406Z 2659 │ │ }), 2026-10-24T20:31:55.8787560Z 2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler), 2026-10-24T20:31:55.8787661Z 2661 │ │ Effect.forkChild, 2026-10-24T20:31:55.8787741Z 2662 │ │ ); 2026-10-24T20:31:55.8787852Z 2663 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8787955Z 2664 │ │ dispatcher.flush(); 2026-10-24T20:31:55.8788082Z 2665 │ │ const secondExit = second.pollUnsafe(); 2026-10-24T20:31:55.8788199Z 2666 │ │ if (secondExit === undefined) { 2026-10-24T20:31:55.8788315Z 2667 │ │ second.interruptUnsafe(); 2026-10-24T20:31:55.8788425Z 2668 │ │ orphanedAt = interruptAt; 2026-10-24T20:31:55.8788514Z 2669 │ │ break; 2026-10-24T20:31:55.8788594Z 2670 │ │ } 2026-10-24T20:31:55.8788714Z 2671 │ │ if (Exit.isFailure(secondExit)) { 2026-10-24T20:31:55.8788870Z 2672 │ │ assert.fail("the matching request fiber was interrupted"); 2026-10-24T20:31:55.8788956Z 2673 │ │ } 2026-10-24T20:31:55.8789110Z 2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow"); 2026-10-24T20:31:55.8789244Z 2675 │ ╰─▶ } 2026-10-24T20:31:55.8789299Z 2676 │ 2026-10-24T20:31:55.8789351Z ╰──── 2026-10-24T20:31:55.8789354Z 2026-10-24T20:31:55.8789550Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8789709Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15] 2026-10-24T20:31:55.8789775Z 71 │ { 2026-10-24T20:31:55.8791063Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload); 2026-10-24T20:31:55.8791169Z ·  ──────────────────────── 2026-10-24T20:31:55.8791307Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch); 2026-10-24T20:31:55.8791358Z ╰──── 2026-10-24T20:31:55.8791361Z 2026-10-24T20:31:55.8791732Z ⚠ 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-24T20:31:55.8791859Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26] 2026-10-24T20:31:55.8791960Z 255 │ if (method === WS_METHODS.assetsCreateUrl) { 2026-10-24T20:31:55.8792118Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload); 2026-10-24T20:31:55.8792233Z ·  ──────────────────────── 2026-10-24T20:31:55.8792295Z 257 │ return [ 2026-10-24T20:31:55.8792348Z ╰──── 2026-10-24T20:31:55.8792350Z 2026-10-24T20:31:55.8792559Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:31:55.8792705Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12] 2026-10-24T20:31:55.8792763Z 185 │ 2026-10-24T20:31:55.8792868Z 186 │ for (const {} of ["darwin", "linux"] as const) { 2026-10-24T20:31:55.8792939Z ·  ── 2026-10-24T20:31:55.8792993Z 187 │ } 2026-10-24T20:31:55.8793044Z ╰──── 2026-10-24T20:31:55.8793281Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:31:55.8793284Z 2026-10-24T20:31:55.8793449Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:31:55.8793588Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12] 2026-10-24T20:31:55.8793646Z 188 │ 2026-10-24T20:31:55.8793713Z 189 │ for (const {} of [ 2026-10-24T20:31:55.8793784Z ·  ── 2026-10-24T20:31:55.8793881Z 190 │ { kind: "browser", folderVerb: "none" }, 2026-10-24T20:31:55.8793936Z ╰──── 2026-10-24T20:31:55.8794168Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:31:55.8794171Z 2026-10-24T20:31:55.8794336Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:31:55.8794475Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12] 2026-10-24T20:31:55.8794529Z 310 │ 2026-10-24T20:31:55.8794661Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) { 2026-10-24T20:31:55.8794730Z ·  ── 2026-10-24T20:31:55.8794782Z 312 │ } 2026-10-24T20:31:55.8794834Z ╰──── 2026-10-24T20:31:55.8795115Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:31:55.8795217Z 2026-10-24T20:31:55.8795384Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:31:55.8795520Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12] 2026-10-24T20:31:55.8795573Z 313 │ 2026-10-24T20:31:55.8795639Z 314 │ for (const {} of [ 2026-10-24T20:31:55.8795708Z ·  ── 2026-10-24T20:31:55.8795761Z 315 │ { 2026-10-24T20:31:55.8795813Z ╰──── 2026-10-24T20:31:55.8796042Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:31:55.8796044Z 2026-10-24T20:31:55.8796312Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8796488Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5] 2026-10-24T20:31:55.8796544Z 638 │ 2026-10-24T20:31:55.8796611Z 639 │ useEffect(() => { 2026-10-24T20:31:55.8796683Z ·  ────┬──── 2026-10-24T20:31:55.8796816Z · ╰── This is the containing effect 2026-10-24T20:31:55.8796929Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) { 2026-10-24T20:31:55.8796991Z 641 │ return; 2026-10-24T20:31:55.8797047Z 642 │ } 2026-10-24T20:31:55.8797120Z 643 │ setPendingLaunchEntry({ 2026-10-24T20:31:55.8797210Z ·  ──────────┬────────── 2026-10-24T20:31:55.8797387Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8797459Z 644 │ key: launchTargetKey, 2026-10-24T20:31:55.8797509Z ╰──── 2026-10-24T20:31:55.8798129Z  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-24T20:31:55.8798462Z  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-24T20:31:55.8798465Z 2026-10-24T20:31:55.8798725Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8798896Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5] 2026-10-24T20:31:55.8798948Z 648 │ 2026-10-24T20:31:55.8799021Z 649 │ useEffect(() => { 2026-10-24T20:31:55.8799095Z ·  ────┬──── 2026-10-24T20:31:55.8799225Z · ╰── This is the containing effect 2026-10-24T20:31:55.8799344Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) { 2026-10-24T20:31:55.8799407Z 651 │ return; 2026-10-24T20:31:55.8799461Z 652 │ } 2026-10-24T20:31:55.8799543Z 653 │ setInitialAttachGridEntry({ 2026-10-24T20:31:55.8799635Z ·  ────────────┬──────────── 2026-10-24T20:31:55.8799812Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8799883Z 654 │ key: launchTargetKey, 2026-10-24T20:31:55.8799934Z ╰──── 2026-10-24T20:31:55.8800603Z  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-24T20:31:55.8800976Z  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-24T20:31:55.8800978Z 2026-10-24T20:31:55.8801244Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8801413Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7] 2026-10-24T20:31:55.8801466Z 743 │ 2026-10-24T20:31:55.8801530Z 744 │ useEffect(() => { 2026-10-24T20:31:55.8801601Z ·  ────┬──── 2026-10-24T20:31:55.8801734Z · ╰── This is the containing effect 2026-10-24T20:31:55.8801840Z 745 │ if (!routeEnvironmentId || !routeThreadId) { 2026-10-24T20:31:55.8801908Z 746 │ setLastGridSize({ 2026-10-24T20:31:55.8801992Z ·  ───────┬─────── 2026-10-24T20:31:55.8802168Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8802253Z 747 │ cols: DEFAULT_TERMINAL_COLS, 2026-10-24T20:31:55.8802305Z ╰──── 2026-10-24T20:31:55.8802950Z  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-24T20:31:55.8803283Z  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-24T20:31:55.8803288Z 2026-10-24T20:31:55.8803494Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8803667Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24] 2026-10-24T20:31:55.8803723Z 537 │ }); 2026-10-24T20:31:55.8803847Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]); 2026-10-24T20:31:55.8803957Z ·  ───────────┬────────── 2026-10-24T20:31:55.8804207Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead 2026-10-24T20:31:55.8804379Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null; 2026-10-24T20:31:55.8804434Z ╰──── 2026-10-24T20:31:55.8804735Z  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-24T20:31:55.8805051Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8805054Z 2026-10-24T20:31:55.8805255Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8805424Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7] 2026-10-24T20:31:55.8805523Z 708 │ sentInitialInputKeyRef.current = null; 2026-10-24T20:31:55.8805590Z 709 │ }, [terminalKey]); 2026-10-24T20:31:55.8805719Z ·  ─────┬───── 2026-10-24T20:31:55.8805891Z · ╰── Unnecessary dependency `terminalKey` 2026-10-24T20:31:55.8805944Z 710 │ 2026-10-24T20:31:55.8805995Z ╰──── 2026-10-24T20:31:55.8806291Z  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-24T20:31:55.8806606Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8806609Z 2026-10-24T20:31:55.8806811Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8806986Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52] 2026-10-24T20:31:55.8807043Z 799 │ }; 2026-10-24T20:31:55.8807230Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]); 2026-10-24T20:31:55.8807413Z ·  ────────────┬──────────── ─────┬───── 2026-10-24T20:31:55.8807647Z · │ ╰── Unnecessary dependency `terminalKey` 2026-10-24T20:31:55.8807861Z · ╰── Unnecessary dependency `terminal.lifecycleVersion` 2026-10-24T20:31:55.8807914Z 801 │ 2026-10-24T20:31:55.8807964Z ╰──── 2026-10-24T20:31:55.8808263Z  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-24T20:31:55.8808586Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8808591Z 2026-10-24T20:31:55.8808739Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8808908Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24] 2026-10-24T20:31:55.8808963Z 792 │ } 2026-10-24T20:31:55.8809075Z 793 │ const pasteSession = pasteSessionRef.current; 2026-10-24T20:31:55.8809190Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8809353Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8809408Z 794 │ 2026-10-24T20:31:55.8809459Z ╰──── 2026-10-24T20:31:55.8809989Z  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-24T20:31:55.8810317Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8810320Z 2026-10-24T20:31:55.8810581Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8810742Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5] 2026-10-24T20:31:55.8810915Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate })); 2026-10-24T20:31:55.8810983Z 113 │ useEffect(() => { 2026-10-24T20:31:55.8811057Z ·  ────┬──── 2026-10-24T20:31:55.8811189Z · ╰── This is the containing effect 2026-10-24T20:31:55.8811357Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) { 2026-10-24T20:31:55.8811419Z 115 │ return; 2026-10-24T20:31:55.8811472Z 116 │ } 2026-10-24T20:31:55.8811594Z 117 │ setEntry({ key: input.targetKey, location: candidate }); 2026-10-24T20:31:55.8811666Z ·  ────┬─── 2026-10-24T20:31:55.8811834Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8811956Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]); 2026-10-24T20:31:55.8812010Z ╰──── 2026-10-24T20:31:55.8812667Z  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-24T20:31:55.8813002Z  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-24T20:31:55.8813004Z 2026-10-24T20:31:55.8813192Z ⚠ react(static-components): Cannot create components during render 2026-10-24T20:31:55.8813356Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10] 2026-10-24T20:31:55.8813447Z 196 │ const { onInput, onResize } = props; 2026-10-24T20:31:55.8813598Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView(); 2026-10-24T20:31:55.8813733Z ·  ────────────────┬─────────────── 2026-10-24T20:31:55.8813923Z · ╰── The component is created during render here 2026-10-24T20:31:55.8814052Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView); 2026-10-24T20:31:55.8814106Z 199 │ 2026-10-24T20:31:55.8814172Z 200 │ useEffect(() => { 2026-10-24T20:31:55.8814261Z 201 │ terminalDebugLog("native:surface", { 2026-10-24T20:31:55.8814350Z 202 │ terminalKey: props.terminalKey, 2026-10-24T20:31:55.8814429Z 203 │ native: hasNativeSurface, 2026-10-24T20:31:55.8814565Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(), 2026-10-24T20:31:55.8814652Z 205 │ bufferLen: props.buffer.length, 2026-10-24T20:31:55.8814737Z 206 │ isRunning: props.isRunning, 2026-10-24T20:31:55.8814848Z 207 │ }); 2026-10-24T20:31:55.8815042Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]); 2026-10-24T20:31:55.8815130Z 209 │ const handleNativeInput = useCallback( 2026-10-24T20:31:55.8815296Z 210 │ (event: NativeSyntheticEvent) => { 2026-10-24T20:31:55.8815395Z 211 │ if (!props.isRunning || props.readOnly) { 2026-10-24T20:31:55.8815459Z 212 │ return; 2026-10-24T20:31:55.8815514Z 213 │ } 2026-10-24T20:31:55.8815606Z 214 │ terminalDebugLog("native:onInput", { 2026-10-24T20:31:55.8815760Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)), 2026-10-24T20:31:55.8815820Z 216 │ }); 2026-10-24T20:31:55.8815908Z 217 │ onInput(event.nativeEvent.data); 2026-10-24T20:31:55.8815966Z 218 │ }, 2026-10-24T20:31:55.8816073Z 219 │ [onInput, props.isRunning, props.readOnly], 2026-10-24T20:31:55.8816129Z 220 │ ); 2026-10-24T20:31:55.8816219Z 221 │ const handleNativeResize = useCallback( 2026-10-24T20:31:55.8816337Z 222 │ (event: NativeSyntheticEvent) => { 2026-10-24T20:31:55.8816402Z 223 │ onResize({ 2026-10-24T20:31:55.8816486Z 224 │ cols: event.nativeEvent.cols, 2026-10-24T20:31:55.8816570Z 225 │ rows: event.nativeEvent.rows, 2026-10-24T20:31:55.8816629Z 226 │ }); 2026-10-24T20:31:55.8816684Z 227 │ }, 2026-10-24T20:31:55.8816747Z 228 │ [onResize], 2026-10-24T20:31:55.8816803Z 229 │ ); 2026-10-24T20:31:55.8816856Z 230 │ 2026-10-24T20:31:55.8816940Z 231 │ if (NativeTerminalSurfaceView) { 2026-10-24T20:31:55.8817000Z 232 │ return ( 2026-10-24T20:31:55.8817078Z 233 │ 2026-10-24T20:31:55.8817167Z 234 │ 2026-10-24T20:31:55.8820345Z 800 │ 2026-10-24T20:31:55.8820468Z ·  ──────────────────── 2026-10-24T20:31:55.8820570Z 801 │ 2026-10-24T20:31:55.8820621Z ╰──── 2026-10-24T20:31:55.8820851Z  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders. 2026-10-24T20:31:55.8820994Z Alternatively, move the value outside the render function if it doesn't depend on props or state. 2026-10-24T20:31:55.8820997Z 2026-10-24T20:31:55.8821160Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8821325Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5] 2026-10-24T20:31:55.8821382Z 35 │ 2026-10-24T20:31:55.8821524Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0); 2026-10-24T20:31:55.8821612Z ·  ────────┬──────── 2026-10-24T20:31:55.8821762Z · ╰── `inspectorProgress` originates here 2026-10-24T20:31:55.8821857Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T20:31:55.8821992Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T20:31:55.8822045Z 39 │ 2026-10-24T20:31:55.8822126Z 40 │ const onClosed = props.onClosed; 2026-10-24T20:31:55.8822191Z 41 │ useEffect(() => { 2026-10-24T20:31:55.8822289Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T20:31:55.8822375Z ·  ────────┬──────── 2026-10-24T20:31:55.8822555Z · ╰── `inspectorProgress` cannot be modified 2026-10-24T20:31:55.8822634Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T20:31:55.8822687Z ╰──── 2026-10-24T20:31:55.8822960Z  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-24T20:31:55.8823272Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8823276Z 2026-10-24T20:31:55.8823432Z ⚠ react(immutability): This value cannot be modified 2026-10-24T20:31:55.8823598Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7] 2026-10-24T20:31:55.8823696Z 37 │ const { renderedInspectorWidth } = props; 2026-10-24T20:31:55.8823829Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0); 2026-10-24T20:31:55.8823920Z ·  ──────────┬───────── 2026-10-24T20:31:55.8824076Z · ╰── `renderedContentWidth` originates here 2026-10-24T20:31:55.8824128Z 39 │ 2026-10-24T20:31:55.8824208Z 40 │ const onClosed = props.onClosed; 2026-10-24T20:31:55.8824272Z 41 │ useEffect(() => { 2026-10-24T20:31:55.8824362Z 42 │ inspectorProgress.value = withTiming( 2026-10-24T20:31:55.8824439Z 43 │ inspectorVisible ? 1 : 0, 2026-10-24T20:31:55.8824510Z 44 │ WORKSPACE_PANE_TIMING, 2026-10-24T20:31:55.8824577Z 45 │ (finished) => { 2026-10-24T20:31:55.8824776Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) { 2026-10-24T20:31:55.8824880Z 47 │ runOnJS(onClosed)(); 2026-10-24T20:31:55.8824936Z 48 │ } 2026-10-24T20:31:55.8824992Z 49 │ }, 2026-10-24T20:31:55.8825048Z 50 │ ); 2026-10-24T20:31:55.8825182Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0; 2026-10-24T20:31:55.8825262Z 52 │ renderedInspectorWidth.set( 2026-10-24T20:31:55.8825410Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING), 2026-10-24T20:31:55.8825465Z 54 │ ); 2026-10-24T20:31:55.8825519Z 55 │ }, [ 2026-10-24T20:31:55.8825587Z 56 │ inspectorProgress, 2026-10-24T20:31:55.8825655Z 57 │ inspectorVisible, 2026-10-24T20:31:55.8825719Z 58 │ inspectorWidth, 2026-10-24T20:31:55.8825780Z 59 │ onClosed, 2026-10-24T20:31:55.8825852Z 60 │ renderedInspectorWidth, 2026-10-24T20:31:55.8825917Z 61 │ resizing, 2026-10-24T20:31:55.8825974Z 62 │ ]); 2026-10-24T20:31:55.8826024Z 63 │ 2026-10-24T20:31:55.8826087Z 64 │ useEffect(() => { 2026-10-24T20:31:55.8826181Z 65 │ const targetWidth = inspectorWidth ?? 0; 2026-10-24T20:31:55.8826268Z 66 │ if (!inspectorVisible || resizing) { 2026-10-24T20:31:55.8826367Z 67 │ renderedContentWidth.value = targetWidth; 2026-10-24T20:31:55.8826457Z ·  ──────────┬───────── 2026-10-24T20:31:55.8826619Z · ╰── `renderedContentWidth` cannot be modified 2026-10-24T20:31:55.8826680Z 68 │ return; 2026-10-24T20:31:55.8826730Z ╰──── 2026-10-24T20:31:55.8827002Z  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-24T20:31:55.8827322Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability 2026-10-24T20:31:55.8827327Z 2026-10-24T20:31:55.8827475Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8827636Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39] 2026-10-24T20:31:55.8827690Z 276 │ 2026-10-24T20:31:55.8827875Z 277 │ ╭─▶ return createElement(RawNativeView, { 2026-10-24T20:31:55.8827972Z 278 │ │ ...nativeProps, 2026-10-24T20:31:55.8828120Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined, 2026-10-24T20:31:55.8828215Z 280 │ │ ref: nativeRef, 2026-10-24T20:31:55.8828352Z 281 │ ├─▶ }); 2026-10-24T20:31:55.8828595Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8828651Z 282 │ } 2026-10-24T20:31:55.8828702Z ╰──── 2026-10-24T20:31:55.8829182Z  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-24T20:31:55.8829480Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8829483Z 2026-10-24T20:31:55.8829821Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead. 2026-10-24T20:31:55.8830009Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24] 2026-10-24T20:31:55.8830066Z 162 │ keys, 2026-10-24T20:31:55.8830140Z 163 │ overridingProjects = [], 2026-10-24T20:31:55.8830225Z ·  ── 2026-10-24T20:31:55.8830293Z 164 │ onClearOverrides, 2026-10-24T20:31:55.8830344Z ╰──── 2026-10-24T20:31:55.8830668Z  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-24T20:31:55.8830671Z 2026-10-24T20:31:55.8830840Z ⚠ eslint(no-empty-pattern): Empty object binding pattern 2026-10-24T20:31:55.8830962Z ╭─[apps/server/src/processRunner.test.ts:266:14] 2026-10-24T20:31:55.8831015Z 265 │ 2026-10-24T20:31:55.8831129Z 266 │ for (const {} of ["timeout", "success"] as const) { 2026-10-24T20:31:55.8831205Z ·  ── 2026-10-24T20:31:55.8831259Z 267 │ } 2026-10-24T20:31:55.8831310Z ╰──── 2026-10-24T20:31:55.8831545Z  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured. 2026-10-24T20:31:55.8831547Z 2026-10-24T20:31:55.8831887Z ⚠ 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-24T20:31:55.8832035Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:50:18] 2026-10-24T20:31:55.8832200Z 49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) { 2026-10-24T20:31:55.8832379Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T20:31:55.8832497Z ·  ───────── 2026-10-24T20:31:55.8832680Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T20:31:55.8832731Z ╰──── 2026-10-24T20:31:55.8832734Z 2026-10-24T20:31:55.8833070Z ⚠ 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-24T20:31:55.8833218Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:51:18] 2026-10-24T20:31:55.8833388Z 50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true); 2026-10-24T20:31:55.8833568Z 51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true); 2026-10-24T20:31:55.8833703Z ·  ───────── 2026-10-24T20:31:55.8833787Z 52 │ } 2026-10-24T20:31:55.8833839Z ╰──── 2026-10-24T20:31:55.8833842Z 2026-10-24T20:31:55.8834180Z ⚠ 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-24T20:31:55.8834322Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:55:5] 2026-10-24T20:31:55.8834386Z 54 │ assert.equal( 2026-10-24T20:31:55.8834561Z 55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T20:31:55.8834634Z ·  ───────── 2026-10-24T20:31:55.8834691Z 56 │ true, 2026-10-24T20:31:55.8834742Z ╰──── 2026-10-24T20:31:55.8834745Z 2026-10-24T20:31:55.8835085Z ⚠ 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-24T20:31:55.8835231Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:59:5] 2026-10-24T20:31:55.8835292Z 58 │ assert.equal( 2026-10-24T20:31:55.8835478Z 59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"), 2026-10-24T20:31:55.8835549Z ·  ───────── 2026-10-24T20:31:55.8835606Z 60 │ true, 2026-10-24T20:31:55.8835657Z ╰──── 2026-10-24T20:31:55.8835659Z 2026-10-24T20:31:55.8835994Z ⚠ 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-24T20:31:55.8836145Z ╭─[packages/effect-codex-app-server/src/schema.test.ts:103:16] 2026-10-24T20:31:55.8836199Z 102 │ 2026-10-24T20:31:55.8836374Z 103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true); 2026-10-24T20:31:55.8836463Z ·  ───────── 2026-10-24T20:31:55.8836517Z 104 │ }); 2026-10-24T20:31:55.8836569Z ╰──── 2026-10-24T20:31:55.8836572Z 2026-10-24T20:31:55.8836834Z ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used. 2026-10-24T20:31:55.8836989Z ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10] 2026-10-24T20:31:55.8837046Z 1619 │ 2026-10-24T20:31:55.8837264Z 1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean { 2026-10-24T20:31:55.8837385Z ·  ──────────────────┬────────────────── 2026-10-24T20:31:55.8837597Z · ╰── 'promptResponseHasMissingXAiStopReason' is declared here 2026-10-24T20:31:55.8837679Z 1621 │ const meta = response._meta; 2026-10-24T20:31:55.8837732Z ╰──── 2026-10-24T20:31:55.8837841Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8837844Z 2026-10-24T20:31:55.8837999Z ⚠ eslint(no-new): Do not use 'new' for side effects. 2026-10-24T20:31:55.8838127Z ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3] 2026-10-24T20:31:55.8838244Z 167 │ // @ts-expect-error a declaration constructed directly 2026-10-24T20:31:55.8838343Z 168 │ new McpToolAccess.Declaration(unchecked); 2026-10-24T20:31:55.8838440Z ·  ───────────────────────────── 2026-10-24T20:31:55.8838571Z 169 │ // @ts-expect-error a handlers layer built outside McpToolAccess 2026-10-24T20:31:55.8838624Z ╰──── 2026-10-24T20:31:55.8838847Z  help: Assign the result of 'new' to a variable or compare it to a reference. 2026-10-24T20:31:55.8838880Z 2026-10-24T20:31:55.8839178Z ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8839308Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7] 2026-10-24T20:31:55.8839364Z 217 │ 2026-10-24T20:31:55.8839514Z 218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect => 2026-10-24T20:31:55.8839604Z ·  ──────────┬────────── 2026-10-24T20:31:55.8839767Z · ╰── 'revokeActiveMcpThread' is declared here 2026-10-24T20:31:55.8839957Z 219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void; 2026-10-24T20:31:55.8840009Z ╰──── 2026-10-24T20:31:55.8840119Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8840126Z 2026-10-24T20:31:55.8840443Z ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8840569Z ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7] 2026-10-24T20:31:55.8840621Z 220 │ 2026-10-24T20:31:55.8840758Z 221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect => 2026-10-24T20:31:55.8840862Z ·  ──────────────┬────────────── 2026-10-24T20:31:55.8841044Z · ╰── 'revokeAllActiveMcpCredentials' is declared here 2026-10-24T20:31:55.8841209Z 222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void; 2026-10-24T20:31:55.8841261Z ╰──── 2026-10-24T20:31:55.8841370Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8841376Z 2026-10-24T20:31:55.8841573Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8841720Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9] 2026-10-24T20:31:55.8841810Z 35 │ event.type === "snapshot").at(-1)?.snapshot; 2026-10-24T20:31:55.8844034Z ·  ────── 2026-10-24T20:31:55.8844151Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND"); 2026-10-24T20:31:55.8844203Z ╰──── 2026-10-24T20:31:55.8844379Z  help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns. 2026-10-24T20:31:55.8844381Z 2026-10-24T20:31:55.8844867Z ⚠ 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-24T20:31:55.8845006Z ╭─[apps/server/src/project/ProjectService.test.ts:94:3] 2026-10-24T20:31:55.8845063Z 93 │ ) { 2026-10-24T20:31:55.8845274Z 94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:31:55.8845455Z 95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId)); 2026-10-24T20:31:55.8845578Z 96 │ │ if (predicate(project)) return project; 2026-10-24T20:31:55.8845684Z 97 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8845810Z 98 │ ╰─▶ } 2026-10-24T20:31:55.8845963Z 99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`); 2026-10-24T20:31:55.8846017Z ╰──── 2026-10-24T20:31:55.8846020Z 2026-10-24T20:31:55.8846211Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8846356Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27] 2026-10-24T20:31:55.8846524Z 120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"])); 2026-10-24T20:31:55.8846616Z 121 │ const dispatch = vi.fn((_: unknown) => 2026-10-24T20:31:55.8846700Z ·  ┬ 2026-10-24T20:31:55.8846833Z · ╰── '_' is declared here 2026-10-24T20:31:55.8846938Z 122 │ (options.dispatchGate ?? Effect.void).pipe( 2026-10-24T20:31:55.8846992Z ╰──── 2026-10-24T20:31:55.8847099Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8847101Z 2026-10-24T20:31:55.8847292Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8847434Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39] 2026-10-24T20:31:55.8847498Z 133 │ ); 2026-10-24T20:31:55.8847611Z 134 │ const listLocalBranchNames = vi.fn((_: string) => 2026-10-24T20:31:55.8847711Z ·  ┬ 2026-10-24T20:31:55.8847855Z · ╰── '_' is declared here 2026-10-24T20:31:55.8847925Z 135 │ Effect.succeed( 2026-10-24T20:31:55.8847978Z ╰──── 2026-10-24T20:31:55.8848080Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8848083Z 2026-10-24T20:31:55.8848268Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8848406Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31] 2026-10-24T20:31:55.8848463Z 177 │ }); 2026-10-24T20:31:55.8848563Z 178 │ const sendToThread = vi.fn((_: unknown) => { 2026-10-24T20:31:55.8848703Z ·  ┬ 2026-10-24T20:31:55.8848884Z · ╰── '_' is declared here 2026-10-24T20:31:55.8848988Z 179 │ switch (options.continuation ?? "queued") { 2026-10-24T20:31:55.8849040Z ╰──── 2026-10-24T20:31:55.8849144Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8849147Z 2026-10-24T20:31:55.8849331Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8849468Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33] 2026-10-24T20:31:55.8849522Z 202 │ ); 2026-10-24T20:31:55.8849623Z 203 │ const removeWorktree = vi.fn((_: unknown) => 2026-10-24T20:31:55.8849716Z ·  ┬ 2026-10-24T20:31:55.8849862Z · ╰── '_' is declared here 2026-10-24T20:31:55.8849950Z 204 │ options.removeWorktreeFails 2026-10-24T20:31:55.8850002Z ╰──── 2026-10-24T20:31:55.8850104Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8850107Z 2026-10-24T20:31:55.8850292Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8850429Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36] 2026-10-24T20:31:55.8850484Z 207 │ ); 2026-10-24T20:31:55.8850589Z 208 │ const deleteLocalBranch = vi.fn((_: unknown) => 2026-10-24T20:31:55.8850686Z ·  ┬ 2026-10-24T20:31:55.8850827Z · ╰── '_' is declared here 2026-10-24T20:31:55.8850918Z 209 │ options.deleteLocalBranchFails 2026-10-24T20:31:55.8850973Z ╰──── 2026-10-24T20:31:55.8851075Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8851078Z 2026-10-24T20:31:55.8851260Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8851397Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42] 2026-10-24T20:31:55.8851453Z 212 │ ); 2026-10-24T20:31:55.8851569Z 213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) => 2026-10-24T20:31:55.8851671Z ·  ┬ 2026-10-24T20:31:55.8851815Z · ╰── '_' is declared here 2026-10-24T20:31:55.8851903Z 214 │ options.fetchWorktreeBaseFails 2026-10-24T20:31:55.8851954Z ╰──── 2026-10-24T20:31:55.8852061Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8852067Z 2026-10-24T20:31:55.8852247Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8852384Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30] 2026-10-24T20:31:55.8852452Z 253 │ ); 2026-10-24T20:31:55.8852574Z 254 │ const localStatus = vi.fn((_: unknown) => 2026-10-24T20:31:55.8852662Z ·  ┬ 2026-10-24T20:31:55.8852798Z · ╰── '_' is declared here 2026-10-24T20:31:55.8852868Z 255 │ Effect.succeed({ 2026-10-24T20:31:55.8852923Z ╰──── 2026-10-24T20:31:55.8853023Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8853026Z 2026-10-24T20:31:55.8853261Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used. 2026-10-24T20:31:55.8853435Z ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32] 2026-10-24T20:31:55.8853491Z 263 │ ); 2026-10-24T20:31:55.8853644Z 264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub")); 2026-10-24T20:31:55.8853739Z ·  ┬ 2026-10-24T20:31:55.8853877Z · ╰── '_' is declared here 2026-10-24T20:31:55.8854027Z 265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => { 2026-10-24T20:31:55.8854078Z ╰──── 2026-10-24T20:31:55.8854179Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8854182Z 2026-10-24T20:31:55.8854666Z ⚠ 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-24T20:31:55.8854830Z ╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3] 2026-10-24T20:31:55.8854885Z 27 │ ) { 2026-10-24T20:31:55.8855089Z 28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) { 2026-10-24T20:31:55.8855271Z 29 │ │ const available = yield* service.peek(workspaceRoot); 2026-10-24T20:31:55.8855401Z 30 │ │ if (predicate(available)) return available; 2026-10-24T20:31:55.8855503Z 31 │ │ yield* Effect.yieldNow; 2026-10-24T20:31:55.8855628Z 32 │ ╰─▶ } 2026-10-24T20:31:55.8855815Z 33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`); 2026-10-24T20:31:55.8855870Z ╰──── 2026-10-24T20:31:55.8855873Z 2026-10-24T20:31:55.8856080Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used. 2026-10-24T20:31:55.8856248Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8] 2026-10-24T20:31:55.8856326Z 3 │ AuthProvidersManageScope, 2026-10-24T20:31:55.8856397Z 4 │ type AuthSessionState, 2026-10-24T20:31:55.8856483Z ·  ────────┬─────── 2026-10-24T20:31:55.8856630Z · ╰── 'AuthSessionState' is imported here 2026-10-24T20:31:55.8856700Z 5 │ type EnvironmentId, 2026-10-24T20:31:55.8856753Z ╰──── 2026-10-24T20:31:55.8856851Z  help: Consider removing this import. 2026-10-24T20:31:55.8856854Z 2026-10-24T20:31:55.8857124Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8857313Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7] 2026-10-24T20:31:55.8857413Z 256 │ return () => cancelAnimationFrame(frame); 2026-10-24T20:31:55.8857495Z 257 │ }, [props.path, targetIndex]); 2026-10-24T20:31:55.8857572Z ·  ─────┬──── 2026-10-24T20:31:55.8857719Z · ╰── Unnecessary dependency `props.path` 2026-10-24T20:31:55.8857774Z 258 │ 2026-10-24T20:31:55.8857828Z ╰──── 2026-10-24T20:31:55.8858129Z  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-24T20:31:55.8858458Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8858463Z 2026-10-24T20:31:55.8858662Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8858813Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23] 2026-10-24T20:31:55.8858889Z 292 │ 2026-10-24T20:31:55.8860003Z ·  ─────────── 2026-10-24T20:31:55.8860070Z 310 │ {body} 2026-10-24T20:31:55.8860123Z ╰──── 2026-10-24T20:31:55.8860270Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:31:55.8860273Z 2026-10-24T20:31:55.8860560Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'. 2026-10-24T20:31:55.8860692Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20] 2026-10-24T20:31:55.8860754Z 248 │ }, 2026-10-24T20:31:55.8860840Z 249 │ (effect, flow, stopSessions) => 2026-10-24T20:31:55.8860934Z ·  ──────┬───── 2026-10-24T20:31:55.8861089Z · ╰── 'stopSessions' is declared here 2026-10-24T20:31:55.8861156Z 250 │ effect.pipe( 2026-10-24T20:31:55.8861207Z ╰──── 2026-10-24T20:31:55.8861310Z  help: Consider removing this parameter. 2026-10-24T20:31:55.8861313Z 2026-10-24T20:31:55.8861481Z ⚠ eslint(no-control-regex): Unexpected control character 2026-10-24T20:31:55.8861677Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46] 2026-10-24T20:31:55.8861818Z 219 │ 2026-10-24T20:31:55.8862012Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")} 2026-10-24T20:31:55.8862154Z ·  ──┬─ 2026-10-24T20:31:55.8862324Z · ╰── 'U+001B' is a control character. 2026-10-24T20:31:55.8862388Z 221 │ 2026-10-24T20:31:55.8862468Z ╰──── 2026-10-24T20:31:55.8862708Z  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression. 2026-10-24T20:31:55.8862710Z 2026-10-24T20:31:55.8862895Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:31:55.8863061Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85] 2026-10-24T20:31:55.8863172Z  99 │ const startEditor = startScheduledTaskEditor; 2026-10-24T20:31:55.8863358Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]); 2026-10-24T20:31:55.8863504Z ·  ─────┬───── 2026-10-24T20:31:55.8863708Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T20:31:55.8863788Z 101 │ const readEditor = useCallback( 2026-10-24T20:31:55.8863840Z ╰──── 2026-10-24T20:31:55.8864163Z  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-24T20:31:55.8864488Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8864493Z 2026-10-24T20:31:55.8864676Z ⚠ react(memo-dependencies): Found extra memoization dependencies 2026-10-24T20:31:55.8864838Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7] 2026-10-24T20:31:55.8864904Z 120 │ setEditor, 2026-10-24T20:31:55.8864969Z 121 │ startEditor, 2026-10-24T20:31:55.8865046Z ·  ─────┬───── 2026-10-24T20:31:55.8865192Z · ╰── Unnecessary dependency `startEditor` 2026-10-24T20:31:55.8865257Z 122 │ hasChanges, 2026-10-24T20:31:55.8865313Z ╰──── 2026-10-24T20:31:55.8865632Z  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-24T20:31:55.8865955Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8865961Z 2026-10-24T20:31:55.8866129Z ⚠ eslint(no-empty-pattern): Empty array binding pattern 2026-10-24T20:31:55.8866290Z ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12] 2026-10-24T20:31:55.8866346Z 1436 │ 2026-10-24T20:31:55.8866411Z 1437 │ for (const [] of [ 2026-10-24T20:31:55.8866485Z ·  ── 2026-10-24T20:31:55.8866558Z 1438 │ ["github", "github.com"], 2026-10-24T20:31:55.8866611Z ╰──── 2026-10-24T20:31:55.8866896Z  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable. 2026-10-24T20:31:55.8866899Z 2026-10-24T20:31:55.8867289Z ⚠ 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-24T20:31:55.8867500Z ╭─[packages/effect-acp/src/schema.test.ts:18:12] 2026-10-24T20:31:55.8867666Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } }; 2026-10-24T20:31:55.8867789Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true); 2026-10-24T20:31:55.8867870Z ·  ───────── 2026-10-24T20:31:55.8867932Z 19 │ expect( 2026-10-24T20:31:55.8867984Z ╰──── 2026-10-24T20:31:55.8867987Z 2026-10-24T20:31:55.8868325Z ⚠ 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-24T20:31:55.8868449Z ╭─[packages/effect-acp/src/schema.test.ts:20:7] 2026-10-24T20:31:55.8868511Z 19 │ expect( 2026-10-24T20:31:55.8868682Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }), 2026-10-24T20:31:55.8868757Z ·  ───────── 2026-10-24T20:31:55.8868818Z 21 │ ).toBe(true); 2026-10-24T20:31:55.8868872Z ╰──── 2026-10-24T20:31:55.8868874Z 2026-10-24T20:31:55.8869252Z ⚠ 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-24T20:31:55.8869369Z ╭─[packages/effect-acp/src/client.ts:1269:11] 2026-10-24T20:31:55.8869522Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) => 2026-10-24T20:31:55.8869708Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe( 2026-10-24T20:31:55.8869817Z ·  ────────────────────────── 2026-10-24T20:31:55.8869964Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()), 2026-10-24T20:31:55.8870017Z ╰──── 2026-10-24T20:31:55.8870019Z 2026-10-24T20:31:55.8870488Z ⚠ 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-24T20:31:55.8870612Z ╭─[packages/effect-acp/src/errors.test.ts:129:28] 2026-10-24T20:31:55.8870708Z 128 │ const secret = "acp-summary-secret"; 2026-10-24T20:31:55.8870819Z 129 │ const cause = yield* Schema.decodeUnknownEffect( 2026-10-24T20:31:55.8870944Z ·  ────────────────────────── 2026-10-24T20:31:55.8871017Z 130 │ Schema.Struct({ 2026-10-24T20:31:55.8871069Z ╰──── 2026-10-24T20:31:55.8871072Z 2026-10-24T20:31:55.8871538Z ⚠ 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-24T20:31:55.8871662Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31] 2026-10-24T20:31:55.8871717Z 499 │ 2026-10-24T20:31:55.8871834Z 500 │ const response = yield* Schema.decodeUnknownEffect( 2026-10-24T20:31:55.8871954Z ·  ────────────────────────── 2026-10-24T20:31:55.8872063Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse), 2026-10-24T20:31:55.8872115Z ╰──── 2026-10-24T20:31:55.8872169Z 2026-10-24T20:31:55.8872598Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8872790Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10] 2026-10-24T20:31:55.8872843Z 117 │ 2026-10-24T20:31:55.8872911Z 118 │ useEffect(() => { 2026-10-24T20:31:55.8872986Z ·  ────┬──── 2026-10-24T20:31:55.8873119Z · ╰── This is the containing effect 2026-10-24T20:31:55.8873199Z 119 │ void refreshNotifications(); 2026-10-24T20:31:55.8873291Z ·  ──────────┬───────── 2026-10-24T20:31:55.8873470Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8873623Z 120 │ const subscription = AppState.addEventListener("change", (state) => { 2026-10-24T20:31:55.8873677Z ╰──── 2026-10-24T20:31:55.8874292Z  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-24T20:31:55.8874627Z  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-24T20:31:55.8874630Z 2026-10-24T20:31:55.8874893Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8875088Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7] 2026-10-24T20:31:55.8875144Z 125 │ 2026-10-24T20:31:55.8875211Z 126 │ useEffect(() => { 2026-10-24T20:31:55.8875284Z ·  ────┬──── 2026-10-24T20:31:55.8875415Z · ╰── This is the containing effect 2026-10-24T20:31:55.8875481Z 127 │ if (!isLoaded) { 2026-10-24T20:31:55.8875574Z 128 │ setLiveActivityStatus("checking"); 2026-10-24T20:31:55.8875667Z ·  ──────────┬────────── 2026-10-24T20:31:55.8875841Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8875902Z 129 │ return; 2026-10-24T20:31:55.8875954Z ╰──── 2026-10-24T20:31:55.8876573Z  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-24T20:31:55.8876904Z  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-24T20:31:55.8876906Z 2026-10-24T20:31:55.8877166Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8877341Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5] 2026-10-24T20:31:55.8877395Z 55 │ 2026-10-24T20:31:55.8877461Z 56 │ useEffect(() => { 2026-10-24T20:31:55.8877534Z ·  ────┬──── 2026-10-24T20:31:55.8877718Z · ╰── This is the containing effect 2026-10-24T20:31:55.8877816Z 57 │ scheduler.reset(); 2026-10-24T20:31:55.8877917Z 58 │ highlightedRowIdsRef.current = new Set(); 2026-10-24T20:31:55.8878005Z 59 │ visibleChunkIndexRef.current = 0; 2026-10-24T20:31:55.8878123Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 }); 2026-10-24T20:31:55.8878204Z ·  ───────┬─────── 2026-10-24T20:31:55.8878376Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8878492Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey)); 2026-10-24T20:31:55.8878543Z ╰──── 2026-10-24T20:31:55.8879155Z  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-24T20:31:55.8879486Z  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-24T20:31:55.8879489Z 2026-10-24T20:31:55.8879695Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8879872Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7] 2026-10-24T20:31:55.8879954Z 62 │ return () => scheduler.cancel(); 2026-10-24T20:31:55.8880058Z 63 │ }, [enabled, resetKey, rows.length, scheduler]); 2026-10-24T20:31:55.8880187Z ·  ───┬─── ─────┬───── 2026-10-24T20:31:55.8880387Z · │ ╰── Unnecessary dependency `rows.length` 2026-10-24T20:31:55.8880526Z · ╰── Unnecessary dependency `enabled` 2026-10-24T20:31:55.8880582Z 64 │ 2026-10-24T20:31:55.8880634Z ╰──── 2026-10-24T20:31:55.8880936Z  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-24T20:31:55.8881254Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8881258Z 2026-10-24T20:31:55.8881529Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'. 2026-10-24T20:31:55.8881713Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7] 2026-10-24T20:31:55.8881794Z 339 │ 2026-10-24T20:31:55.8881900Z 340 │ const layerTest = AnalyticsService.layerTest; 2026-10-24T20:31:55.8881975Z ·  ────┬──── 2026-10-24T20:31:55.8882109Z · ╰── 'layerTest' is declared here 2026-10-24T20:31:55.8882162Z ╰──── 2026-10-24T20:31:55.8882268Z  help: Consider removing this declaration. 2026-10-24T20:31:55.8882272Z 2026-10-24T20:31:55.8882569Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8882760Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5] 2026-10-24T20:31:55.8882814Z 104 │ 2026-10-24T20:31:55.8882880Z 105 │ useEffect(() => { 2026-10-24T20:31:55.8882953Z ·  ────┬──── 2026-10-24T20:31:55.8883089Z · ╰── This is the containing effect 2026-10-24T20:31:55.8883174Z 106 │ clearReviewCommentTarget(); 2026-10-24T20:31:55.8883275Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T20:31:55.8883381Z ·  ────────────────┬─────────────── 2026-10-24T20:31:55.8883560Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8883636Z 108 │ }, [selectedSection?.id]); 2026-10-24T20:31:55.8883688Z ╰──── 2026-10-24T20:31:55.8884304Z  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-24T20:31:55.8884636Z  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-24T20:31:55.8884639Z 2026-10-24T20:31:55.8884899Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8885088Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7] 2026-10-24T20:31:55.8885142Z 109 │ 2026-10-24T20:31:55.8885207Z 110 │ useEffect(() => { 2026-10-24T20:31:55.8885280Z ·  ────┬──── 2026-10-24T20:31:55.8885410Z · ╰── This is the containing effect 2026-10-24T20:31:55.8885501Z 111 │ if (activeCommentTarget === null) { 2026-10-24T20:31:55.8885606Z 112 │ setPendingNativeCommentSelection(null); 2026-10-24T20:31:55.8885720Z ·  ────────────────┬─────────────── 2026-10-24T20:31:55.8885900Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8885957Z 113 │ } 2026-10-24T20:31:55.8886008Z ╰──── 2026-10-24T20:31:55.8886615Z  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-24T20:31:55.8886942Z  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-24T20:31:55.8886944Z 2026-10-24T20:31:55.8887206Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8887426Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7] 2026-10-24T20:31:55.8887525Z 107 │ setPendingNativeCommentSelection(null); 2026-10-24T20:31:55.8887600Z 108 │ }, [selectedSection?.id]); 2026-10-24T20:31:55.8887690Z ·  ─────────┬───────── 2026-10-24T20:31:55.8887855Z · ╰── Unnecessary dependency `selectedSection?.id` 2026-10-24T20:31:55.8887908Z 109 │ 2026-10-24T20:31:55.8887964Z ╰──── 2026-10-24T20:31:55.8888264Z  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-24T20:31:55.8888589Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8888595Z 2026-10-24T20:31:55.8888791Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8888947Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31] 2026-10-24T20:31:55.8889057Z 222 │ ? snippetTokens.map((line, lineIndex) => ( 2026-10-24T20:31:55.8889156Z 223 │ 2026-10-24T20:31:55.8889264Z ·  ─────────────── 2026-10-24T20:31:55.8889360Z 224 │ {lineIndex > 0 ? "\n" : ""} 2026-10-24T20:31:55.8889416Z ╰──── 2026-10-24T20:31:55.8889568Z  help: Use a unique data-dependent key to avoid unnecessary rerenders 2026-10-24T20:31:55.8889576Z 2026-10-24T20:31:55.8889775Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8889929Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25] 2026-10-24T20:31:55.8890008Z 226 │ file.path === path)!; 2026-10-24T20:31:55.8891292Z 1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({ 2026-10-24T20:31:55.8891411Z ·  ─────────────────── 2026-10-24T20:31:55.8891477Z 1787 │ cwd, 2026-10-24T20:31:55.8891533Z ╰──── 2026-10-24T20:31:55.8891536Z 2026-10-24T20:31:55.8891783Z ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret. 2026-10-24T20:31:55.8891911Z ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11] 2026-10-24T20:31:55.8892074Z 516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) || 2026-10-24T20:31:55.8892244Z 517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)), 2026-10-24T20:31:55.8892333Z ·  ─────────────── 2026-10-24T20:31:55.8892391Z 518 │ ) 2026-10-24T20:31:55.8892455Z ╰──── 2026-10-24T20:31:55.8892645Z  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`. 2026-10-24T20:31:55.8892649Z 2026-10-24T20:31:55.8892857Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8893024Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33] 2026-10-24T20:31:55.8893123Z 113 │ return () => cancelAnimationFrame(frame); 2026-10-24T20:31:55.8893224Z 114 │ }, [restoreSearch, tabActive, bottomSearch]); 2026-10-24T20:31:55.8893337Z ·  ──────┬───── 2026-10-24T20:31:55.8893512Z · ╰── Unnecessary dependency `bottomSearch` 2026-10-24T20:31:55.8893618Z 115 │ const composeButton = nativeToolbarCompose ? ( 2026-10-24T20:31:55.8893672Z ╰──── 2026-10-24T20:31:55.8893973Z  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-24T20:31:55.8894290Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8894293Z 2026-10-24T20:31:55.8894496Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8894635Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7] 2026-10-24T20:31:55.8894727Z 453 │ showAuxiliaryPane("inspector"); 2026-10-24T20:31:55.8894837Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]); 2026-10-24T20:31:55.8894986Z ·  ──────┬────── ────┬─── 2026-10-24T20:31:55.8895187Z · │ ╰── Unnecessary dependency `threadId` 2026-10-24T20:31:55.8895389Z · ╰── Unnecessary dependency `environmentId` 2026-10-24T20:31:55.8895452Z 455 │ const { 2026-10-24T20:31:55.8895506Z ╰──── 2026-10-24T20:31:55.8895803Z  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-24T20:31:55.8896127Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8896133Z 2026-10-24T20:31:55.8896322Z ⚠ react(static-components): Cannot create components during render 2026-10-24T20:31:55.8896463Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20] 2026-10-24T20:31:55.8896529Z 492 │ // same check. 2026-10-24T20:31:55.8896659Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView(); 2026-10-24T20:31:55.8896784Z ·  ─────────────┬───────────── 2026-10-24T20:31:55.8896971Z · ╰── The component is created during render here 2026-10-24T20:31:55.8897127Z 494 │ const nativeReviewDiffViewRef = useRef(null); 2026-10-24T20:31:55.8897315Z 495 │ const showcasedReviewDrawRef = useRef(null); 2026-10-24T20:31:55.8897492Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false); 2026-10-24T20:31:55.8897587Z 497 │ const handlePullToRefresh = async () => { 2026-10-24T20:31:55.8897668Z 498 │ setIsPullRefreshing(true); 2026-10-24T20:31:55.8897753Z 499 │ await refreshSelectedSection(); 2026-10-24T20:31:55.8897833Z 500 │ setIsPullRefreshing(false); 2026-10-24T20:31:55.8897891Z 501 │ }; 2026-10-24T20:31:55.8898042Z 502 │ const reviewFileNavigatorRef = useRef(null); 2026-10-24T20:31:55.8898189Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : []; 2026-10-24T20:31:55.8898301Z 504 │ const fileVisibility = useReviewFileVisibility({ 2026-10-24T20:31:55.8898390Z 505 │ threadKey: reviewCache.threadKey, 2026-10-24T20:31:55.8898490Z 506 │ sectionId: selectedSection?.id ?? null, 2026-10-24T20:31:55.8898562Z 507 │ files: reviewFiles, 2026-10-24T20:31:55.8898666Z 508 │ cachedExpandedFileIds: selectedSection?.id 2026-10-24T20:31:55.8898800Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id] 2026-10-24T20:31:55.8898867Z 510 │ : undefined, 2026-10-24T20:31:55.8898964Z 511 │ cachedViewedFileIds: selectedSection?.id 2026-10-24T20:31:55.8899092Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id] 2026-10-24T20:31:55.8899158Z 513 │ : undefined, 2026-10-24T20:31:55.8899215Z 514 │ }); 2026-10-24T20:31:55.8899408Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility; 2026-10-24T20:31:55.8899543Z 516 │ const commentSelection = useReviewCommentSelectionController({ 2026-10-24T20:31:55.8899609Z 517 │ environmentId, 2026-10-24T20:31:55.8899681Z 518 │ threadId, 2026-10-24T20:31:55.8899750Z 519 │ selectedSection, 2026-10-24T20:31:55.8899825Z 520 │ nativeReviewDiffData, 2026-10-24T20:31:55.8899881Z 521 │ }); 2026-10-24T20:31:55.8899989Z 522 │ const nativeBridge = useNativeReviewDiffBridge({ 2026-10-24T20:31:55.8900080Z 523 │ threadKey: reviewCache.threadKey, 2026-10-24T20:31:55.8900174Z 524 │ sectionId: selectedSection?.id ?? null, 2026-10-24T20:31:55.8900254Z 525 │ diff: selectedSection?.diff, 2026-10-24T20:31:55.8900332Z 526 │ data: nativeReviewDiffData, 2026-10-24T20:31:55.8900403Z 527 │ collapsedFileIds, 2026-10-24T20:31:55.8900467Z 528 │ viewedFileIds, 2026-10-24T20:31:55.8900581Z 529 │ selectedRowIds: commentSelection.selectedRowIds, 2026-10-24T20:31:55.8900680Z 530 │ canHighlight: parsedDiff.kind === "files", 2026-10-24T20:31:55.8900738Z 531 │ }); 2026-10-24T20:31:55.8900819Z 532 │ const showcaseReviewKey = 2026-10-24T20:31:55.8900956Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection 2026-10-24T20:31:55.8901166Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}` 2026-10-24T20:31:55.8901229Z 535 │ : null; 2026-10-24T20:31:55.8901401Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent>) => { 2026-10-24T20:31:55.8901482Z 537 │ nativeBridge.onDebug(event); 2026-10-24T20:31:55.8901539Z 538 │ if ( 2026-10-24T20:31:55.8901622Z 539 │ showcaseReviewKey === null || 2026-10-24T20:31:55.8901749Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey || 2026-10-24T20:31:55.8901862Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent) 2026-10-24T20:31:55.8901918Z 542 │ ) { 2026-10-24T20:31:55.8902034Z 543 │ return; 2026-10-24T20:31:55.8902121Z 544 │ } 2026-10-24T20:31:55.8902236Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey; 2026-10-24T20:31:55.8902400Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId }); 2026-10-24T20:31:55.8902485Z 547 │ }; 2026-10-24T20:31:55.8902539Z 548 │ 2026-10-24T20:31:55.8902657Z 549 │ const handleSelectFile = async (fileId: string | null) => { 2026-10-24T20:31:55.8902743Z 550 │ loadVisibleFile(fileId, true); 2026-10-24T20:31:55.8902834Z 551 │ commentSelection.clearSelection(); 2026-10-24T20:31:55.8902959Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) { 2026-10-24T20:31:55.8903039Z 553 │ toggleExpandedFile(fileId); 2026-10-24T20:31:55.8903095Z 554 │ } 2026-10-24T20:31:55.8903210Z 555 │ const nativeView = nativeReviewDiffViewRef.current; 2026-10-24T20:31:55.8903292Z 556 │ if (!nativeView) return; 2026-10-24T20:31:55.8903389Z 557 │ const result = await settlePromise(() => 2026-10-24T20:31:55.8903569Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true), 2026-10-24T20:31:55.8903627Z 559 │ ); 2026-10-24T20:31:55.8903719Z 560 │ if (AsyncResult.isFailure(result)) { 2026-10-24T20:31:55.8903902Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result)); 2026-10-24T20:31:55.8903959Z 562 │ } 2026-10-24T20:31:55.8904015Z 563 │ }; 2026-10-24T20:31:55.8904100Z 564 │ const handleVisibleFileChange = ( 2026-10-24T20:31:55.8904234Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>, 2026-10-24T20:31:55.8904294Z 566 │ ) => { 2026-10-24T20:31:55.8904406Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T20:31:55.8904583Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null); 2026-10-24T20:31:55.8904638Z 569 │ }; 2026-10-24T20:31:55.8904720Z 570 │ const renderInspector = () => ( 2026-10-24T20:31:55.8904791Z 571 │ void handleSelectFile(fileId)} 2026-10-24T20:31:55.8905318Z 577 │ /> 2026-10-24T20:31:55.8905373Z 578 │ ); 2026-10-24T20:31:55.8905427Z 579 │ 2026-10-24T20:31:55.8905617Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => { 2026-10-24T20:31:55.8905756Z 581 │ const { fileId } = event.nativeEvent; 2026-10-24T20:31:55.8905857Z 582 │ if (fileId) { 2026-10-24T20:31:55.8905941Z 583 │ loadVisibleFile(fileId, true); 2026-10-24T20:31:55.8906022Z 584 │ toggleExpandedFile(fileId); 2026-10-24T20:31:55.8906085Z 585 │ } 2026-10-24T20:31:55.8906139Z 586 │ }; 2026-10-24T20:31:55.8906194Z 587 │ 2026-10-24T20:31:55.8906285Z 588 │ const handleNativeToggleViewedFile = ( 2026-10-24T20:31:55.8906409Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>, 2026-10-24T20:31:55.8906468Z 590 │ ) => { 2026-10-24T20:31:55.8906556Z 591 │ const { fileId } = event.nativeEvent; 2026-10-24T20:31:55.8906618Z 592 │ if (fileId) { 2026-10-24T20:31:55.8906696Z 593 │ toggleViewedFile(fileId); 2026-10-24T20:31:55.8906750Z 594 │ } 2026-10-24T20:31:55.8906806Z 595 │ }; 2026-10-24T20:31:55.8906862Z 596 │ 2026-10-24T20:31:55.8906940Z 597 │ const parsedDiffNotice = 2026-10-24T20:31:55.8907105Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null; 2026-10-24T20:31:55.8907231Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null; 2026-10-24T20:31:55.8907391Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null); 2026-10-24T20:31:55.8907516Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections); 2026-10-24T20:31:55.8907678Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({ 2026-10-24T20:31:55.8907792Z 603 │ hasEnvironmentPresentation: environment.isReady, 2026-10-24T20:31:55.8907896Z 604 │ isEnvironmentConnected: isEnvironmentReady, 2026-10-24T20:31:55.8907969Z 605 │ hasCachedSelectedDiff, 2026-10-24T20:31:55.8908037Z 606 │ hasAnyCachedDiff, 2026-10-24T20:31:55.8908097Z 607 │ }); 2026-10-24T20:31:55.8908187Z 608 │ const handleRetryEnvironment = () => { 2026-10-24T20:31:55.8908276Z 609 │ void retryEnvironment(environmentId); 2026-10-24T20:31:55.8908331Z 610 │ }; 2026-10-24T20:31:55.8908416Z 611 │ const handleReturnToThread = () => { 2026-10-24T20:31:55.8908496Z 612 │ if (navigation.canGoBack()) { 2026-10-24T20:31:55.8908569Z 613 │ navigation.goBack(); 2026-10-24T20:31:55.8908631Z 614 │ return; 2026-10-24T20:31:55.8908683Z 615 │ } 2026-10-24T20:31:55.8908767Z 616 │ navigation.navigate("Thread", { 2026-10-24T20:31:55.8908860Z 617 │ environmentId: String(environmentId), 2026-10-24T20:31:55.8908940Z 618 │ threadId: String(threadId), 2026-10-24T20:31:55.8908996Z 619 │ }); 2026-10-24T20:31:55.8909052Z 620 │ }; 2026-10-24T20:31:55.8909141Z 621 │ const androidHeaderSubtitle = [ 2026-10-24T20:31:55.8909218Z 622 │ selectedSection?.title, 2026-10-24T20:31:55.8909300Z 623 │ headerDiffSummary.additions, 2026-10-24T20:31:55.8909382Z 624 │ headerDiffSummary.deletions, 2026-10-24T20:31:55.8909440Z 625 │ ] 2026-10-24T20:31:55.8909545Z 626 │ .filter((part): part is string => Boolean(part)) 2026-10-24T20:31:55.8909612Z 627 │ .join(" · "); 2026-10-24T20:31:55.8909665Z 628 │ 2026-10-24T20:31:55.8909747Z 629 │ const showChangedFilesPane = 2026-10-24T20:31:55.8909820Z 630 │ !showConnectionNotice && 2026-10-24T20:31:55.8909897Z 631 │ selectedSection !== null && 2026-10-24T20:31:55.8909979Z 632 │ parsedDiff.kind === "files" && 2026-10-24T20:31:55.8910061Z 633 │ NativeReviewDiffView !== null; 2026-10-24T20:31:55.8910234Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined); 2026-10-24T20:31:55.8910468Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane; 2026-10-24T20:31:55.8910556Z 636 │ 2026-10-24T20:31:55.8910630Z 637 │ const listHeader = (() => { 2026-10-24T20:31:55.8910717Z 638 │ const children: ReactElement[] = []; 2026-10-24T20:31:55.8910772Z 639 │ 2026-10-24T20:31:55.8910836Z 640 │ if (error) { 2026-10-24T20:31:55.8910904Z 641 │ children.push( 2026-10-24T20:31:55.8910965Z 642 │ 2026-10-24T20:31:55.8911639Z 649 │ Review unavailable 2026-10-24T20:31:55.8911801Z 650 │ {error} 2026-10-24T20:31:55.8911865Z 651 │ , 2026-10-24T20:31:55.8911922Z 652 │ ); 2026-10-24T20:31:55.8911977Z 653 │ } 2026-10-24T20:31:55.8912031Z 654 │ 2026-10-24T20:31:55.8912107Z 655 │ if (parsedDiffNotice) { 2026-10-24T20:31:55.8912271Z 656 │ children.push(); 2026-10-24T20:31:55.8912327Z 657 │ } 2026-10-24T20:31:55.8912381Z 658 │ 2026-10-24T20:31:55.8912487Z 659 │ if (children.length === 0) { 2026-10-24T20:31:55.8912552Z 660 │ return null; 2026-10-24T20:31:55.8912606Z 661 │ } 2026-10-24T20:31:55.8912660Z 662 │ 2026-10-24T20:31:55.8912738Z 663 │ return <>{children}; 2026-10-24T20:31:55.8912797Z 664 │ })(); 2026-10-24T20:31:55.8912867Z 665 │ const headerSubtitle = [ 2026-10-24T20:31:55.8912949Z 666 │ headerDiffSummary.additions, 2026-10-24T20:31:55.8913030Z 667 │ headerDiffSummary.deletions, 2026-10-24T20:31:55.8913111Z 668 │ pendingReviewCommentCount > 0 2026-10-24T20:31:55.8913288Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}` 2026-10-24T20:31:55.8913350Z 670 │ : null, 2026-10-24T20:31:55.8913407Z 671 │ ] 2026-10-24T20:31:55.8913472Z 672 │ .filter(Boolean) 2026-10-24T20:31:55.8913541Z 673 │ .join(" · "); 2026-10-24T20:31:55.8913680Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes"; 2026-10-24T20:31:55.8913733Z 675 │ 2026-10-24T20:31:55.8913792Z 676 │ return ( 2026-10-24T20:31:55.8913851Z 677 │ <> 2026-10-24T20:31:55.8913924Z 678 │ 2026-10-24T20:31:55.8915359Z 694 │ 2026-10-24T20:31:55.8915425Z 695 │ 2026-10-24T20:31:55.8915550Z 696 │ 2026-10-24T20:31:55.8915632Z 697 │ {showConnectionNotice ? ( 2026-10-24T20:31:55.8915777Z 698 │ 2026-10-24T20:31:55.8915868Z 699 │ 2026-10-24T20:31:55.8916903Z 711 │ 2026-10-24T20:31:55.8917064Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? ( 2026-10-24T20:31:55.8917127Z 713 │ 2026-10-24T20:31:55.8917581Z 719 │ 2026-10-24T20:31:55.8917949Z 723 │ {listHeader} 2026-10-24T20:31:55.8918077Z 724 │ 2026-10-24T20:31:55.8918165Z 725 │ { 2026-10-24T20:31:55.8921535Z ·  ────┬──── 2026-10-24T20:31:55.8921669Z · ╰── This is the containing effect 2026-10-24T20:31:55.8921773Z 102 │ if (!target || selectedLines.length === 0) { 2026-10-24T20:31:55.8921856Z 103 │ setHighlightedLinesById({}); 2026-10-24T20:31:55.8921950Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8922129Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8922191Z 104 │ return; 2026-10-24T20:31:55.8922243Z ╰──── 2026-10-24T20:31:55.8922898Z  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-24T20:31:55.8923235Z  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-24T20:31:55.8923237Z 2026-10-24T20:31:55.8923386Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8923544Z ╭─[apps/mobile/src/features/home/thread-swipe-actions.tsx:494:27] 2026-10-24T20:31:55.8923602Z 493 │ > 2026-10-24T20:31:55.8923681Z 494 │ {props.children(close)} 2026-10-24T20:31:55.8923774Z ·  ──┬── 2026-10-24T20:31:55.8923935Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8924018Z 495 │ 2026-10-24T20:31:55.8924072Z ╰──── 2026-10-24T20:31:55.8924554Z  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-24T20:31:55.8924854Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8924857Z 2026-10-24T20:31:55.8925120Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8925255Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5] 2026-10-24T20:31:55.8925454Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState(null); 2026-10-24T20:31:55.8925528Z 168 │ useLayoutEffect(() => { 2026-10-24T20:31:55.8925607Z ·  ───────┬─────── 2026-10-24T20:31:55.8925741Z · ╰── This is the containing effect 2026-10-24T20:31:55.8925832Z 169 │ if (faviconRequest === null) return; 2026-10-24T20:31:55.8925888Z 170 │ 2026-10-24T20:31:55.8926024Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest); 2026-10-24T20:31:55.8926123Z 172 │ setActiveFaviconRequest(faviconRequest); 2026-10-24T20:31:55.8926216Z ·  ───────────┬─────────── 2026-10-24T20:31:55.8926389Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8926459Z 173 │ return endRequest; 2026-10-24T20:31:55.8926511Z ╰──── 2026-10-24T20:31:55.8927175Z  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-24T20:31:55.8927542Z  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-24T20:31:55.8927545Z 2026-10-24T20:31:55.8927742Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed 2026-10-24T20:31:55.8927893Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25] 2026-10-24T20:31:55.8928003Z 271 │ {record.elements?.map((element, index) => ( 2026-10-24T20:31:55.8928176Z 272 │ 2026-10-24T20:31:55.8928338Z ·  ─────────────────────────────────────────────────────── 2026-10-24T20:31:55.8928414Z 273 │ { 2026-10-24T20:31:55.8929241Z ·  ────┬──── 2026-10-24T20:31:55.8929375Z · ╰── This is the containing effect 2026-10-24T20:31:55.8929525Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl); 2026-10-24T20:31:55.8929652Z ·  ───────┬────── 2026-10-24T20:31:55.8929860Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8929941Z 64 │ }, [playbackUrl, resolvedUrl]); 2026-10-24T20:31:55.8929992Z ╰──── 2026-10-24T20:31:55.8930612Z  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-24T20:31:55.8930942Z  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-24T20:31:55.8930945Z 2026-10-24T20:31:55.8931151Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8931283Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6] 2026-10-24T20:31:55.8931337Z 81 │ }, 2026-10-24T20:31:55.8931401Z 82 │ [draftKey], 2026-10-24T20:31:55.8931474Z ·  ────┬─── 2026-10-24T20:31:55.8931614Z · ╰── Unnecessary dependency `draftKey` 2026-10-24T20:31:55.8931669Z 83 │ ); 2026-10-24T20:31:55.8931720Z ╰──── 2026-10-24T20:31:55.8932072Z  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-24T20:31:55.8932421Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8932424Z 2026-10-24T20:31:55.8932716Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8932852Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5] 2026-10-24T20:31:55.8932905Z 57 │ 2026-10-24T20:31:55.8932970Z 58 │ useEffect(() => { 2026-10-24T20:31:55.8933040Z ·  ────┬──── 2026-10-24T20:31:55.8933171Z · ╰── This is the containing effect 2026-10-24T20:31:55.8933272Z 59 │ const controller = new AbortController(); 2026-10-24T20:31:55.8933348Z 60 │ setLoadState("pending"); 2026-10-24T20:31:55.8933424Z ·  ──────┬───── 2026-10-24T20:31:55.8933591Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8933756Z 61 │ // A renewed signature is used on Retry, not as a reason to reset the native player. 2026-10-24T20:31:55.8933809Z ╰──── 2026-10-24T20:31:55.8934412Z  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-24T20:31:55.8934740Z  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-24T20:31:55.8934745Z 2026-10-24T20:31:55.8934949Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8935083Z ╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:71:7] 2026-10-24T20:31:55.8935165Z 70 │ return () => controller.abort(); 2026-10-24T20:31:55.8935323Z 71 │ }, [player, props.playRequested, attempt]); 2026-10-24T20:31:55.8935497Z ·  ───┬── ─────────┬───────── ───┬─── 2026-10-24T20:31:55.8935727Z · │ │ ╰── Unnecessary dependency `attempt` 2026-10-24T20:31:55.8935996Z · │ ╰── Unnecessary dependency `props.playRequested` 2026-10-24T20:31:55.8936173Z · ╰── Unnecessary dependency `player_0` 2026-10-24T20:31:55.8936226Z 72 │ 2026-10-24T20:31:55.8936277Z ╰──── 2026-10-24T20:31:55.8936574Z  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-24T20:31:55.8936893Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8936895Z 2026-10-24T20:31:55.8937152Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders 2026-10-24T20:31:55.8937289Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5] 2026-10-24T20:31:55.8937400Z 66 │ const { id: attachmentId, fileUri } = attachment; 2026-10-24T20:31:55.8937468Z 67 │ useEffect(() => { 2026-10-24T20:31:55.8937539Z ·  ────┬──── 2026-10-24T20:31:55.8937667Z · ╰── This is the containing effect 2026-10-24T20:31:55.8937730Z 68 │ setUri(null); 2026-10-24T20:31:55.8937800Z ·  ───┬── 2026-10-24T20:31:55.8937963Z · ╰── Avoid calling setState() directly within an effect 2026-10-24T20:31:55.8938027Z 69 │ setError(null); 2026-10-24T20:31:55.8938079Z ╰──── 2026-10-24T20:31:55.8938695Z  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-24T20:31:55.8939022Z  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-24T20:31:55.8939025Z 2026-10-24T20:31:55.8939227Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies 2026-10-24T20:31:55.8939363Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7] 2026-10-24T20:31:55.8939417Z 90 │ }; 2026-10-24T20:31:55.8939492Z 91 │ }, [attachmentId, fileUri]); 2026-10-24T20:31:55.8939610Z ·  ──────┬───── ───┬─── 2026-10-24T20:31:55.8939792Z · │ ╰── Unnecessary dependency `fileUri` 2026-10-24T20:31:55.8939950Z · ╰── Unnecessary dependency `attachmentId` 2026-10-24T20:31:55.8940089Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType; 2026-10-24T20:31:55.8940139Z ╰──── 2026-10-24T20:31:55.8940436Z  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-24T20:31:55.8940749Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8940751Z 2026-10-24T20:31:55.8940966Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies 2026-10-24T20:31:55.8941107Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34] 2026-10-24T20:31:55.8941222Z 212 │ useEffect(() => { 2026-10-24T20:31:55.8941365Z 213 │ if (!isFocused && hasSource) props.onRequestClose(); 2026-10-24T20:31:55.8941465Z ·  ──┬── 2026-10-24T20:31:55.8941617Z · ╰── Missing dependency `props` 2026-10-24T20:31:55.8941724Z 214 │ }, [isFocused, hasSource, props.onRequestClose]); 2026-10-24T20:31:55.8941838Z ·  ──────────┬───────── 2026-10-24T20:31:55.8942068Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead 2026-10-24T20:31:55.8942141Z 215 │ const { source } = props; 2026-10-24T20:31:55.8942192Z ╰──── 2026-10-24T20:31:55.8942665Z  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-24T20:31:55.8942981Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8942983Z 2026-10-24T20:31:55.8943130Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8943251Z ╭─[apps/mobile/src/components/ui/Menu.tsx:54:36] 2026-10-24T20:31:55.8943429Z 53 │ const child = children as ReactElement>; 2026-10-24T20:31:55.8943603Z 54 │ ╭─▶ children = cloneElement(child, { 2026-10-24T20:31:55.8943711Z 55 │ │ onTouchStart: (event) => { 2026-10-24T20:31:55.8943876Z 56 │ │ // Reset for a new touch, not onPressIn, which also fires when a 2026-10-24T20:31:55.8944035Z 57 │ │ // finger moves out of the row and back during the same gesture. 2026-10-24T20:31:55.8944165Z 58 │ │ menuPress.current.isPreparing = false; 2026-10-24T20:31:55.8944334Z 59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen; 2026-10-24T20:31:55.8944447Z 60 │ │ pendingPress.current = null; 2026-10-24T20:31:55.8944566Z 61 │ │ child.props.onTouchStart?.(event); 2026-10-24T20:31:55.8944643Z 62 │ │ }, 2026-10-24T20:31:55.8944744Z 63 │ │ onPress: (event) => { 2026-10-24T20:31:55.8944921Z 64 │ │ // Accessibility clicks have no touch identifier and must not inherit 2026-10-24T20:31:55.8945063Z 65 │ │ // cancellation from a previous physical gesture. 2026-10-24T20:31:55.8945230Z 66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number"; 2026-10-24T20:31:55.8945421Z 67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) { 2026-10-24T20:31:55.8945508Z 68 │ │ return; 2026-10-24T20:31:55.8945586Z 69 │ │ } 2026-10-24T20:31:55.8945725Z 70 │ │ if (isTouch && menuPress.current.isPreparing) { 2026-10-24T20:31:55.8945898Z 71 │ │ // A release can arrive between native menu preparation and display. 2026-10-24T20:31:55.8946115Z 72 │ │ // Let UIKit's display/cancel callback decide this press's outcome. 2026-10-24T20:31:55.8946250Z 73 │ │ event.persist(); 2026-10-24T20:31:55.8946409Z 74 │ │ pendingPress.current = () => child.props.onPress?.(event); 2026-10-24T20:31:55.8946496Z 75 │ │ return; 2026-10-24T20:31:55.8946577Z 76 │ │ } 2026-10-24T20:31:55.8946691Z 77 │ │ child.props.onPress?.(event); 2026-10-24T20:31:55.8946766Z 78 │ │ }, 2026-10-24T20:31:55.8946899Z 79 │ ├─▶ }); 2026-10-24T20:31:55.8947141Z · ╰──── Passing a ref to a function may read its value during render 2026-10-24T20:31:55.8947247Z 80 │ menuProps.onMenuInteractionStart = () => { 2026-10-24T20:31:55.8947304Z ╰──── 2026-10-24T20:31:55.8947787Z  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-24T20:31:55.8948083Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8948086Z 2026-10-24T20:31:55.8948233Z ⚠ react(refs): Cannot access refs during render 2026-10-24T20:31:55.8948387Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27] 2026-10-24T20:31:55.8948565Z 151 │ 2026-10-24T20:31:55.8948650Z 152 │ {props.children(open)} 2026-10-24T20:31:55.8948743Z ·  ──┬─ 2026-10-24T20:31:55.8948903Z · ╰── Cannot access ref value during render 2026-10-24T20:31:55.8948966Z 153 │ 2026-10-24T20:31:55.8949018Z ╰──── 2026-10-24T20:31:55.8949494Z  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-24T20:31:55.8949789Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs 2026-10-24T20:31:55.8949792Z 2026-10-24T20:31:55.8949996Z ⚠ react(memo-dependencies): Found missing/extra memoization dependencies 2026-10-24T20:31:55.8950149Z ╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9] 2026-10-24T20:31:55.8950234Z 139 │ if (action.id !== undefined) { 2026-10-24T20:31:55.8950313Z 140 │ props.onPressAction?.({ 2026-10-24T20:31:55.8950387Z ·  ──┬── 2026-10-24T20:31:55.8950518Z · ╰── Missing dependency `props` 2026-10-24T20:31:55.8950612Z 141 │ nativeEvent: { event: action.id }, 2026-10-24T20:31:55.8950759Z 142 │ } as Parameters>[0]); 2026-10-24T20:31:55.8950817Z 143 │ } 2026-10-24T20:31:55.8950872Z 144 │ }, 2026-10-24T20:31:55.8950955Z 145 │ [close, props.onPressAction], 2026-10-24T20:31:55.8951051Z ·  ─────────┬───────── 2026-10-24T20:31:55.8951391Z · ╰── Overly precise dependency `props.onPressAction`, use `props` instead 2026-10-24T20:31:55.8951480Z 146 │ ); 2026-10-24T20:31:55.8951531Z ╰──── 2026-10-24T20:31:55.8952019Z  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-24T20:31:55.8952339Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps 2026-10-24T20:31:55.8952342Z 2026-10-24T20:31:55.8952522Z ⚠ react(purity): Cannot call impure function during render 2026-10-24T20:31:55.8952688Z ╭─[apps/web/src/components/CommandPalette.tsx:2037:20] 2026-10-24T20:31:55.8952811Z 2036 │ title: inferProjectTitleFromPath(destinationPath), 2026-10-24T20:31:55.8952906Z 2037 │ createdAt: new Date().toISOString(), 2026-10-24T20:31:55.8952997Z ·  ─────┬──── 2026-10-24T20:31:55.8953145Z · ╰── Cannot call impure function 2026-10-24T20:31:55.8953254Z 2038 │ remoteUrl: addProjectCloneFlow.remoteUrl, 2026-10-24T20:31:55.8953308Z ╰──── 2026-10-24T20:31:55.8953592Z  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders 2026-10-24T20:31:55.8953892Z  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity 2026-10-24T20:31:55.8953899Z 2026-10-24T20:31:55.8953988Z Found 0 errors and 367 warnings in 5477 files (5.8s, 8 threads) 2026-10-24T20:31:55.9363674Z Post job cleanup. 2026-10-24T20:31:55.9950129Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache. 2026-10-24T20:31:56.0015889Z Post job cleanup. 2026-10-24T20:31:56.0029876Z ##[start-action display=Cache full pnpm store;id=__77dfdaa9-e6db-4945-8b73-b7ba2ecb681e.__actions_cache] 2026-10-24T20:31:56.0355956Z Post job cleanup. 2026-10-24T20:31:56.0964459Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache. 2026-10-24T20:31:56.0992291Z ##[end-action id=__77dfdaa9-e6db-4945-8b73-b7ba2ecb681e.__actions_cache;outcome=success;conclusion=success;duration_ms=96] 2026-10-24T20:31:56.0994006Z ##[start-action display=Cache Vite+;id=__77dfdaa9-e6db-4945-8b73-b7ba2ecb681e.vp_cache] 2026-10-24T20:31:56.1013181Z Post job cleanup. 2026-10-24T20:31:56.1614067Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache. 2026-10-24T20:31:56.1642073Z ##[end-action id=__77dfdaa9-e6db-4945-8b73-b7ba2ecb681e.vp_cache;outcome=success;conclusion=success;duration_ms=64] 2026-10-24T20:31:56.1687945Z Post job cleanup. 2026-10-24T20:31:56.2104424Z [command]/usr/local/bin/git version 2026-10-24T20:31:56.2130493Z git version 2.55.0 2026-10-24T20:31:56.2147229Z Temporarily overriding HOME='/home/runner/_work/_temp/37438e74-43b1-4c3a-8d41-3b67d0ff0f75' before making global git config changes 2026-10-24T20:31:56.2147826Z Adding repository directory to the temporary git global config as a safe directory 2026-10-24T20:31:56.2149934Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code 2026-10-24T20:31:56.2170040Z Removing SSH command configuration 2026-10-24T20:31:56.2173237Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand 2026-10-24T20:31:56.2193272Z [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-24T20:31:56.2305224Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules 2026-10-24T20:31:56.2328050Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128 2026-10-24T20:31:56.2363580Z A job completed hook has been configured by the self-hosted runner administrator 2026-10-24T20:31:56.2379447Z ##[group]Run '/job_completed.sh' 2026-10-24T20:31:56.2387214Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} 2026-10-24T20:31:56.2387403Z env: 2026-10-24T20:31:56.2387527Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 164 2026-10-24T20:31:56.2387681Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 436 2026-10-24T20:31:56.2387825Z BLACKSMITH_CHECK_RUN_ID: 120979910217 2026-10-24T20:31:56.2387970Z BLACKSMITH_JOB_DISPLAY_NAME: Lint 2026-10-24T20:31:56.2388119Z GITHUB_ACTIONS_CACHE_MODE: write 2026-10-24T20:31:56.2388269Z ##[endgroup] 2026-10-24T20:31:56.2457266Z Docker container cache not activated, skipping hash computation. 2026-10-24T20:31:56.2702525Z No active SSH sessions detected. Proceeding with shutdown immediately. 2026-10-24T20:31:56.2743271Z Cleaning up orphan processes